블로그 이미지
안녕하세요~ iolate(isho) 의 블로그 입니다~! iolate

카테고리

분류 전체보기 (164)
Server, Cloud (7)
끄적끄적 (9)
Linux, Ubuntu (22)
개발질 (44)
Mac (18)
iOS (23)
IoT (13)
NAS (1)
Web (5)
Network (3)
Review (10)
기타 (9)
비공개글 (0)
Total588,166
Today161
Yesterday199

Ubuntu 12.04 에서 openswan 을 사용하여 l2tp 서버를 설치한 글은 - 우분투 L2TP VPN 설치/설정법



요즘에 IKEv2 라는거 사용을 권장하는 것 같긴 하지만, 일단 귀찮으니 그냥 L2TP 를 사용해보도록 하자.


1. IPSEC

Ubuntu 16.04 부터는 openswan 이 기본 repository 에 제공되지 않는다. 대체품으로 strongswan 을 설치하자.

strongswan 을 사용하면서 설정이 조금 다른데, 이걸 제외하면 이전 글과 동일하다.


# apt-get install strongswan

# vi /etc/ipsec.conf

더보기


# vi /etc/ipsec.secrets

더보기


# service ipsec restart


2. xl2tpd

이전 글과 똑같다. 귀찮으니 딱 필요한 부분만 적겠음.


# apt-get install xl2tpd ppp

# vi /etc/xl2tpd/xl2tpd.conf

더보기


# vi /etc/ppp/options.xl2tpd

더보기


# vi /etc/ppp/chap-secrets

더보기


# service xl2tpd restart


3. iptables

# iptables -A FORWARD -s 10.7.0.0/24 -j ACCEPT

# iptables -t nat -A POSTROUTING -s 10.7.0.0/24 -o eth0 -j MASQUERADE


$ echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf




* 안되면 재부팅을 해보자. 아마 IPSEC 설치 후 재부팅을 해야하는 것으로 안다.(아닐수도)

Posted by iolate


쓸일이 있어서... 응시를 했다. (무쓸모가 될 가능성이 높지만)


LPIC-1 은 101-400, 102-400 두개의 시험을 쳐서 통과하면 자격을 준다.

왜 아직 Certifications 에 아무것도 없는진 모르겠지만 시간이 지나면 넣어주겠지...

글 수정하는 동안에 Certificate 메일이 왔다.


시험당 60문제, 800점 만점에 500점 이상시 통과. 60문제인데 문제마다 배점이 다르다.

시험당 $170 였는데, 난 결제하니 한화로 20만 9천원 정도 나오더라.. 두개보면 42만원..ㅠㅠ


원래 리눅스를 쓰던 사람이라면 대부분의 문제의 답을 이미 알거나, 한번 보면 바로 알 정도의 난이도?

물론 주로 사용하는 배포판에 따라 좀 갈리긴 할 듯.


근데 그런거 상관없이 덤프에서 보기 순서 안바꾸고 나오니 암기만 잘하면 딸 수 있다... 그래서 더 돈이 아깝다..



시험 응시

1. lpi.org 에서 회원가입 및 LPI ID 를 발급받는다.

2. Pearson VUE 에서 시험 신청을 한다

1) 회원가입 및 로그인

2) For test taker

3) LPI 검색

4) LPI ID 입력

5) 원하는 시험장소 및 시험시간 선택 (시험 장소에 따라 가능일자 / 시간이 다르다)

6) 결제

3. 시험장소(보통 학원)에 응시하러 간다

1) 시험치러 왔다고 말한다

2) 신분증, 같은 이름의 카드(영문 이름 때문인 듯)가 필요

3) 서명하고 사진촬영

4) 컴터 앞에 앉아서 시험치고 끝


시험 시간은 응시 장소에 따라 꼭 정해진 시간을 지킬 필요는 없는 것 같다. 30분 일찍 갔는데 그냥 쳤음.



덤프

내가 구한 덤프는

- 2015년 4/8월자 덤프(101-400, 102-400). 85~120문제 정도로 구성

- 2012년 12월 28일자 덤프(117-101, 117-102). 50여문제를 한 Exam 으로 해서, 여러개 시험으로 구성. 70~110페이지


* 원래 117-101, 117-102 란 이름이였는데 각 101-400, 102-400 으로 바뀌었다.


인데, 첫번째꺼만 봐도 될 듯. 두번째껀 그냥 앞쪽 시험 2개 정도만 훑어보고 들어갔다.



101-400

커널과 관련된 부분은 그냥 외웠고, 그걸 제하면 한번씩 해봐서 알거나, 새로운 명령어 하나 배운다는 기분으로 공부했다.

물론 덤프에 나오는 문제 위주로.


117-101 덤프에서도 몇문제 나왔는데, 뭐 몰라도 통과할 수 있거나 안봤어도 맞출 수 있었을 듯

8분만에 풀고 나왔다. 너무 일찍 나왔다고 다음 시험은 그러지 말라더라.


+ 1월 9일 오늘 아는 사람이 응시하고 왔는데, 101-400 덤프에서 1문제 정도 나오고 다 달라서 당황하셨다고 한다. 다행히 500/500 으로 통과하셨다지만... 102-400 은 그대로 나왔다고 하네... 왜지?;;


102-400

xwindows, 프린터(cups) 같은 것들이 나오는데 난 거의 안써본 것들이라 외웠다.

쉘스크립트나 네트워크 쪽 문제들은 그냥저냥...

뜬금없이 SQL 쿼리가 나오는데(리눅스 시험에서 대체 왜?) 뭐... 어렵진 않다.


전체적으로 101-400 에 비하면 덤프를 처음 봤을때 답을 모르겠는 문제들이 많았음.

근데 어차피 덤프보고 공부/외우면 된다. 102-400 덤프에서 다 나온 것 같다.


102-400 덤프에 문제 오류가 3~4개 정도 있었던 것 같은데.. 그냥 스스로 고칠 수 있거나 틀려도 탈락 안한다.

117-102 덤프는 설명이 다 달려있어서 좋더라.


마찬가지로 8분만에 다 풀었는데, 앞시험에서 나오고 나니 30분 정도는 앉아있어 달라고 하셔서 나머지 20분을 멍하게 시간때우다가 나왔다.



총평

시험치기 전날 2~3시간 정도 보면 매우 쉽고 무난하게 통과한다.

리눅스 시스템을 처음 접한 사람이라면 잘 모르겠다.


뭐 틀렸는지 안 알려준다. 궁금하다.


Posted by iolate

교내망에 있는 서버 하나가 접근이 꼬여서 원인을 찾다가 기록함.


우선 서버들의 네트워크 구성


메인서버 - Windows Server 2012 R2    - 교내망(10.x.x.5), 가상 스위치(192.168.137.1, host)

서버 A - Ubuntu 14.04                  - 교내망(10.x.x.6), 가상 스위치(192.168.137.6), 도커

서버 B - Ubuntu 14.04                  - 교내망(10.x.x.7), 가상 스위치(192.168.137.7)

서버 C - CentOS                            - 가상 스위치(192.168.137.2)


교내 다른 장비에서 메인서버, 서버 B 로는 교내망 주소로 바로 접근이 되는데,

서버 A 는 교내망 주소를 사용해도 서버 B 를 거쳐야만 접속이 되었다.

똑같은 교내망 IP 인데 말이지..


원인을 찾아보다가 서버 A의 outbound ip 가 메인서버의 ip 로 찍히는 것을 발견,

기본 라우터 설정을 바꿔주면 왠지 해결될 것 같은 느낌이 왔다.


서버 A:~$ ip route list

default via 192.168.137.1 dev eth1 

10.x.x.0/23 dev eth0  proto kernel  scope link  src 10.x.x.6 

172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 

192.168.137.0/24 dev eth1  proto kernel  scope link  src 192.168.137.6

서버 B:~$ ip route list

default via 10.x.x.1 dev eth0 

10.x.x.0/23 dev eth0  proto kernel  scope link  src 10.x.x.7 

192.168.137.0/24 dev eth1  proto kernel  scope link  src 192.168.137.7 


이유는 모르겠지만 서버 A의 기본 라우터가 eth1 로 되어있다. 바꿔주자.


서버 A:~$ sudo ip route change to default dev eth0 via 10.x.x.1

서버 A:~$ ip route list

default via 10.x.x.1 dev eth0 

10.x.x.0/23 dev eth0  proto kernel  scope link  src 10.x.x.6 

172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 

192.168.137.0/24 dev eth1  proto kernel  scope link  src 192.168.137.6



via 뒤의 아이피는 eth0 의 gateway 주소를 적어주면 된다.


이후 ssh 접속이 잘됨을 확인.

재부팅해도 유지된다.


왜 바뀌었는지 모르니 다음에 또 바뀔 가능성이 있을 수 있지만.... 일단 해결!

Posted by iolate

NFS 설치

# yum install nfs-utils


NFS 서버 설정

# vi /etc/exports

[Path]    [Client IP]([Options])


Options

ro - 읽기 전용 (기본값)

rw - 읽기/쓰기 모드

root_squash - Client의 root를 익명 사용자(nobody)로 매핑 (기본값)

no_root_squash - Client의 root를 NFS 서버의 root로 매핑

all_squash - 모든 사용자를 익명 사용자(nobody)로 매핑

sync - Client와 NFS 서버간 동기적 통신 모드 (기본값, 안전성 향상)

async - Client와 NFS 서버간 비동기 통신 모드 (속도 향상)

secure - 마운트 요청 시 포트를 1024 이하로 할당 허용 (기본값, 1024 이하 포트는 root만 설정 가능)

insecure - 마운트 요청 시 1024 포트 이상도 할당 허용

anonuid=<uid>

anongid=<gid>



설정 후

# systemctl restart nfs-server


재부팅 후에도 자동으로 실행되게끔
# systemctl enable nfs-server
도 해준다.


* 서버에서

# showmount -e 127.0.0.1

을 실행해보고,

clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused)

에러가 나온다면,
# service rpcbind start
을 해주자.



클라이언트에서

$ showmount -e <Server IP>

로 서버의 exports 리스트를 확인할 수 있다.


테스트 마운트는

# mount -t nfs <Server IP>:<Server Path> <Client Path>

로 가능.


/etc/fstab 설정도 가능하다.

<Server IP>:<Server Path> <Client Path> nfs hard,intr 0 0


이때 옵션(예시에서 hard,intr)은 

19.4. Common NFS Mount Options

여기서 찾아보자.



참고

NFS 서버 구성 - http://blog.helperchoi.com/76

http://unix.stackexchange.com/questions/64915/nfs-connection-refused

http://www.unixmen.com/setting-nfs-server-client-centos-7/

Posted by iolate
TAG centos, nfs, RPC


/etc/sysconfig/network-scripts/ifcfg-eth?


파일을 수정하면 된다.


* DHCP 설정

BOOTPROTO=dhcp


* STATIC 설정

BOOTPROTO=none

IPADDR = "192.168.137.2"

NETMASK = "255.255.255.0"

GATEWAY = "192.168.137.1"

DNS1 = "192.168.137.1"


** 변경 후 네트워크 재시작

# systemctl restart NetworkManager

# systemctl restart network



재부팅시 네트워크 어댑터가 자동으로 시작되지 않는다면,

ONBOOT=no

ONBOOT=yes 로 바꿔준다.


수동으로는

시작: # ifup eth?

종료: # ifdown eth?



참고

CentOS 7.0에서 네트워크 설정 - http://manseok.blogspot.kr/2014/08/centos-70.html

CentOS - eth0 자동 활성화 시키기 - http://avisynth.tistory.com/10

Posted by iolate

CentOS7 에서 XFS 로 포맷을 진행하려 하는데, 2TB 까지밖에 파티션이 생성안되는 문제가 있었다.


대충 찾아보니 fdisk가 하위호환때문에 2TiB 로 고정한다는 듯.

수정된 fdisk 를 사용하면 된다고 한다.


딴걸 설치하기는 귀찮고...

http://unix.stackexchange.com/questions/29078/how-to-partition-22tb-disk

글에서 주는 해결책을 옮기면서 조금 수정해봄.



1. xfs 설치 확인

mkfs.xfs 를 그냥 실행하여 설치가 되어있는지 확인해본다. 없다면 설치.

# yum install xfsprogs


2. 디스크 확인

# fdisk -l


나의 경우(그리고 글에서 설명하는 경우)는 /dev/sdb 이다.

본인 상황에 맞게 아래 예시에서 알아서 바꾸자.


3. 파티션 만들기

# parted /dev/sdb mklabel gpt

# parted /dev/sdb mkpart primary xfs 1 -1


나의 경우 두번째 명령어가 실행이 안되는 것 같았는데....


이 과정을 스킵해도 된다고 한다.

스킵할 경우 아래 예시에서 /dev/sdb1 대신에 /dev/sdb 를 사용할 것.


스킵할 경우 sector alignment 문제(나도 뭔지 모름)가 없는 대신 윈도우나 맥 등에 연결할 경우 매번 포맷하라는 메세지가 뜬다고 한다.



4. 파티션 포맷

# mkfs.xfs -f -L somelabel /dev/sdb1


라벨(L 옵션)은 fstab 에 기록할때 대신 사용될 수 있는 것 같다.


5. 디렉토리 생성 & 테스트 마운트

# mkdir /storage

# mount -t xfs /dev/sdb1 /storage


마운트가 되었다면

# df -Th /storage

로 확인해보자!


6. fstab 수정

# vi /etc/fstab

파일 가장 하단에

LABEL=somelabel    /storage        xfs    defaults    0 0

추가


7. mount / umount

이후에는

# mount /storage

만 입력해도 마운트할 수 있다.


마운트 해제는

# umount /storage



참고

http://unix.stackexchange.com/questions/29078/how-to-partition-22tb-disk


일반적인 포맷은 여기!

http://ask.xmodulo.com/create-mount-xfs-file-system-linux.html


Posted by iolate

Docker 의 설치 및 간략 사용법 정리.

UBUNTU 14.04 64bit 에서 작업하였음.


1. docker 설치

$ sudo curl -fsSL https://get.docker.com/ | sh

# apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D

# apt-add-repository 'deb https://apt.dockerproject.org/repo ubuntu-xenial main'

# apt-get update

# apt-get install docker-engine


2. (선택)현재 사용자를 docker 그룹에 추가

$ sudo usermod -aG docker $(whoami)


추가한 후엔 로그아웃하고 다시 들어와야, 정상적으로 작동한다.

추가하지 않을 경우 아래 모든 docker 커맨드를 root 권한(sudo)로 실행해야 함.


3. 이미지 받기

docker pull <이미지 이름>:<태그(보통 버전)>

형태로 받을 수 있다.


난 Ubuntu 14.04 를 설치할 예정이므로,

$ docker pull ubuntu:14.04


4. 이후엔 자유.


========================================================


= 명령어 정리 =


$ docker <command>

images: 이미지 목록 출력

ps: 컨테이너 목록 출력

start, stop, restart: 이름 그대로.

attach: 컨테이너 접속

Ctrl+D : 컨테이너 정지 후 빠져나오기

Ctrl+P, Q: 정지하지 않고 빠져나오기

exec: 컨테이너 안에 명령어 실행

rm: 컨테이너 삭제

rmi: 이미지 삭제


$ docker run -i -t --name test ubuntu:14.04 /bin/bash

ubuntu 이미지로 test 이름의 컨테이너를 만들고 bash 실행, 접속

태그를 생략할 경우 latest 이미지를 사용하게 되며, 없을 경우 다운로드 받는다.



참고

Install Docker - https://docs.docker.com/linux/step_one/

Docker 기본 사용법 - http://pyrasis.com/Docker/Docker-HOWTO

Posted by iolate

iOS 만 서비스 할때는 그냥 대충 php + cron 으로 push 를 돌렸었는데,

이게 백명 단위만 되어도 delay 문제가 생겨서... async 방식으로 언젠가 도입을 해야지.. 생각만 했었다.


이번에 안드로이드때문에 하게 되었으니.. 겸사겸사...

GCM 으로 iOS 도 사용할 수 있는 방법이 있다는건 봤지만,, 클라를 수정해야 했고..

이미 있는 앱도 같이 적용 + 클라 더 손대기가 귀찮아서 서버쪽을 잘 만들어보기로 했다.



APNS

우선 APNS 는 pyapns 라는 녀석으로 쉽게 asynchronous 한 push 를 구현가능하다.


pyapns 설치하기


pyapns 서버를 구축한 후 python 에서


import pyapns

pem_path = 'path_to_push_pem'

pyapns.configure({'HOST': 'http://localhost:7077/'})

pyapns.provision('com.example.appid', pem_path, 'production') #sandbox

push = {'aps': {'alert':'푸시 테스트', 'sound':'default'}}

pyapns.notify('com.example.appid', '### push token ###', push, async=True)


이렇게 사용하면 된다.



GCM

GCM 은 주로 node.js 로 했던 듯 하나... 난 시스템을 통일시키고 싶었다.

찾아보니, 위 pyapns 처럼 로컬에 서버를 열어두고 request를 보내면 되는 방식의 GoCM 이라는 라이브러리가 있었다.

Golang 으로 짜져 있음.


GoCM 설치하기


GCM 은 인증서가 필요없고 sandbox / production 구분이 없어서 더 간편하다.

간단히 POST request 만 구현하면 어떻게든 가능하지만, 난 requests 라이브러리 사용을 선호함.


import requests, json

GCM_SEND_ENDPOINT = 'http://localhost:5601/gcm/send'

token = '### token ###'

msg = {'title': '[title]', 'message': 'message'}

requests.post(GCM_SEND_ENDPOINT, data={'tokens': [token], 'payload': json.dumps(msg)})



Daemonize

위 방법대로 하면 이제 APNS / GCM 을 둘다 이용할 수 있게 되지만, 각각 웹서버를 하나 돌려야 해서 귀찮다.

당장은 그냥 쓴다고 해도 재부팅을 한다거나.. 프로세스 유지해주기가 귀찮으니까 데몬으로 만들어버리자.


pyapns 는 python-twistd :: daemon 으로 만들기

GoCM 은 GoCM :: daemon 으로 만들기


글을 각각 참고하면 된다.



Feedback / Report

APNS / GCM 각각 삭제되었거나 더이상 사용되지 않는 token 에 대한 feedback 을 제공해준다.


APNS

pyapns.feedback('com.example.appid') 를 호출하면 

[(timestamp, token), ] 

형태로 반환해준다.


token 으로 uninstalled 처리를 해주면 됨.


GCM

canonicals / notregistered 두가지 feedback 이 존재한다.

전자는 token 이 변경되었을 경우(인 것 같다. 사실 레퍼런스를 안봐서..), 후자는 앱이 삭제된 경우.


이건 그냥 GoCM README 를 보자.



Fin

드디어 Python 만을 사용하여(Go 는 컴파일 한번 하고 끝이니 논외), 하나의 시스템만으로 Asynchronous APNS / GCM 둘다 사용할 수 있게 되었다.


여기선 다루지 않았지만, 동일한 DB에 os 구분하여 token 을 저장하고, os 를 알아서 구분해서 메세지를 보내도록 하면 좀 더 관리가 쉽다.


분명히 두 OS를 같이 서비스하는 사람/업체가 많은데 내가 못찾는건지 다른 방법이 있는건지...

생각처럼 깔끔하고 쉬운 방법이 눈에 안보이네.. 흑

Posted by iolate
TAG APNS, GCM, GoCM, Push, pyapns

자, 이번엔 GoCM (https://github.com/Flyclops/GoCM) 을 데몬으로 만들어두는 방법.


twistd 와 다르게 단일 컴파일된 실행프로그램이므로.. 조금 golang 이라던가.. 그게 아니라 그냥 별개로 생각하자...

뭐 조금 수정하면 다른 방법에서도 쓸 수 있다.

나도 앞에서 글 쓴 twistd 데몬 스크립트를 수정하였음.


1. GoCM 을 컴파일, 바이너리를 적당히 옮겨둔다. 나의 경우 /usr/bin/GoCM

2. /etc/init.d/GoCMd (뭐 데몬이름은 알아서..) 을 작성한다. 내용은 아래 더보기..

더보기


3. 위 파일에서, GoCM 경로와 DAEMON_ARGS 에서 api key 를 수정해준다.

4. $ sudo chmod +x /etc/init.d/GoCMd

5. $ sudo update-rc.d GoCMd defaults

6. $ service GoCMd start

Posted by iolate
TAG GCM, GoCM

twistd 를 daemon 화 하는 방법.

https://github.com/eagafonov/python-twisted-startup-script 의 방법을 이용한다.


1. /etc/python-twistd.d/ 디렉토리를 생성한다.

2. 위 git 에서 python-twisted-web 파일을 받는다. 그리고 파일 이름과 내용을 필요에 따라 수정. 아래부턴 편의상 그냥 python-twisted-web 이라고 쓰겠지만, 알아서 바꾼 이름을 사용하자.

3. git 에서 python-twisted-startup-script 를 위 python-twisted-web 파일과 이름을 똑같이 만들어서 /etc/init.d/ 에 넣는다.

4. $ sudo chmod +x /etc/init.d/python-twisted-web

5. $ sudo update-rc.d python-twisted-web defaults

6. $ service python-twisted-web start

Posted by iolate

최근에 달린 댓글

최근에 받은 트랙백

글 보관함