이 글은 OpenVPN 을 설치 하여 모든 트래픽을 VPN서버로 우회 하여 사용하는 것을 목적으로 설명합니다.
서버로 Rasbian (Raspberry Pi), 클라이언트는 iOS 의 OpenVPN App을 사용했습니다.
(안드로이드에도 구글 플레이스토어에 동일한 앱이 있습니다)
[진행 순서]
1. 서버 설치
2. 인증서 생성
3. 서버 설정
3-1. server.conf
3-2. conf 파일명 설정4. 클라이언트 접속설정
5. 연결
6. 마무리 작업
7. 방화벽 설정 [추가 2015.04.10]
('#'은 root 권한을 의미 합니다.)
1. 서버 설치
# sudo apt-get install openvpn |
2. 인증서 생성
1 |
# cp /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn |
2 |
# cd /etc/openvpn |
3 |
# source vars |
4 |
# ./clean-all |
5 |
# ./build-ca |
6 |
# ./build-key-server server |
7 |
# ./build-key haebi |
8 | # ./build-dh |
- 1. 필요한 설정파일들을 /etc/openvpn 으로 복사합니다.
- 2. 현재 워킹 디렉토리 이동
- 3. 인증서 생성에 필요한 환경변수 등록
- 4. 새로 생성할 것이므로 /etc/openvpn/keys 의 내용을 모두 제거 (진행 중 잘못된 경우에 필요함)
- 5. CA 인증서 생성. (대충 엔터키만 눌러주시면 됩니다)
- 6. 서버 인증서 생성. (엔터키 눌러주다가 y? 라고 묻는 부분에 반드시 y 입력 후 엔터. y는 2번 물어봅니다.)
- 7. 사용자 인증서 생성. (OpenVPN에 접속할 사용자 수 만큼 생성합니다.)
- 8. 디피헬먼 암호화를 위한 키 생성
추후 사용자 인증서가 추가로 필요한 경우, [3번]과 [7번]을 반복해 주시면 되겠습니다.
4번 ./clean-all 해서 다 날려버리면 처음부터 다시 작업 & 기존 사용자의 인증서까지 무효가 됩니다. <-- 조심!!
3. 서버 설정
3-1. server.conf
1 |
# cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ |
2 |
# gunzip server.conf.gz |
- 1. 서버 설정파일을 /etc/openvpn 으로 복사.
- 2. 압축해제
# vim server.conf |
|
1 | port 1194 |
2 | proto udp |
3 | dev tun |
4 | ca /etc/openvpn/keys/ca.crt |
5 | cert /etc/openvpn/keys/server.crt |
6 | key /etc/openvpn/keys/server.key # This file should be kept secret |
7 | dh /etc/openvpn/keys/dh1024.pem |
8 | server 10.8.0.0 255.255.255.0 |
9 | push "route 10.8.0.0 255.255.255.0" |
10 | push "redirect-gateway def1" |
11 | push "dhcp-option DNS 10.8.0.1" |
12 | push "dhcp-option DNS 168.126.63.1" |
- 1. 포트설정
- 2. 프로토콜 설정 tcp 또는 udp 중에서 선택
- 3. tun 디바이스 사용. (tap 도 있는데 차이점은 모르겠다. 그냥 디폴트로 이거 쓰자)
- 4. CA 인증서 경로 지정
- 5. 서버 인증서 경로 지정
- 6. 서버 개인키 경로 지정
(이 파일은 비밀리에 지켜져야 한다. 라고 되어있죠? 유출되지 않도록 각별히 신경을 써 줍니다^^)
- 7. 디피헬먼 키 경로 지정
- 8. VPN 서버가 사용할 IP 대역 설정
- 9. 라우팅 경로 설정
(VPN서버 네트워크의 상위 레벨에 여러 서브넷이 존재하는 경우, 여기서 등록해줘야 접근이 가능한가 봅니다.)
- 10. 패킷의 리 다이렉션 설정. (중요!)
(이 옵션이 있으면 접속된 클라이언트의 모든 트래픽이 VPN을 거쳐 갑니다. 인터넷은 기존연결로 가고 내부 망 접속만 하고자 한다면 설정하지 않습니다.)
- 11 ~ 12. DNS 설정입니다.
(모든 패킷을 리다이렉션 하는 경우에, 12번 라인이 없으면 인터넷이 안됩니다. 12번의 DNS 주소는 꼭 저 주소일 필요는 없습니다. 사용하는 다른 DNS 주소가 있다는 그것을 기입합니다.)
3-2. conf 파일명 설정
# vim /etc/default/openvpn |
|
1 |
AUTOSTART="openvpn" |
- 1. openvpn config 파일명이 openvpn 임을 /etc/init.d/openvpn 에게 알려줍니다.
( 이제 /etc/init.d/openvpn start 하게 되면, /etc/openvpn/openvpn.conf 파일을 찾아서 읽게 됩니다.)
# mv server.conf openvpn.conf |
- config 파일명을 변경하여 준다.
서버시작
# /etc/init.d/openvpn restart |
- 만약 서버 로그가 보고 싶다면, stop 시키고 아래의 명령을 실행하면 실시간 로그를 확인할 수 있습니다.
openvpn --config /etc/openvpn/openvpn.conf |
4. 클라이언트 접속설정
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn |
- 클라이언트 접속 설정 샘플을 복사합니다.
# vim /etc/openvpn/client.conf |
|
1 |
client |
2 | dev tun |
3 | proto udp |
4 | remote 0.0.0.0 1194 |
5 | ca ca.crt |
6 | cert haebi.crt |
7 | key haebi.key |
- 1. client 모드임을 의미. (서버 설정파일에는 server 이라고 되어있다)
- 2. tun 디바이스 사용
- 3. udp 프로토콜 사용
- 4. 서버 접속 주소, 포트 설정 (0.0.0.0 대신 서버 IP나 도메인을 적는다)
- 5. ca 인증서 파일명 설정
- 6. 사용자 인증서 파일명 설정
- 7. 사용자 개인키 파일명 설정
2~4번 항목은 서버와 동일하게 설정해야 합니다.
5번은 서버의 ca 인증서와 동일한 것이어야 합니다.
현재 클라이언트 설정에 필요한 Key의 위치
/etc/openvpn/keys/ca.crt |
/etc/openvpn/keys/haebi.crt |
/etc/openvpn/keys/haebi.key |
/etc/openvpn/client.conf |
5. 연결
앱스토어에 OpenVPN 으로 검색하면 어플이 나옵니다.
제작자가 OpenVpn Technologies 라고 된것으로 다운 받습니다.
iTunes 에 연결 후, OpenVPN 앱의 도큐먼트에 4개 파일을 넣어줍니다.
ca.crt
haebi.crt
haebi.key
client.ovpn
(client.ovpn 은 client.conf 파일명을 변경한 것 입니다)
앱을 실행하면 + 버튼이 생기고 눌러서 추가하면 저 4개 파일이 사라지면서 설정이 추가 됩니다.
인 / 아웃 용량까지 제공하므로, 간에 데이터 사용량 측정? 도 가능하겠군요~호호호...(???)
팁 한가지 : 서버측 말고 클라이언트 측 로고를 볼수 있는 방법... 조기 위에 Connected 옆에 우측에 꺽쇠괄호 보이죠?
저거 누르면 클라이언트측 로그가 주욱~~~ 나옵니다
연결은 됐는데 인터넷이 안되면...?
NAT설정, ipforward 설정이 필요하다.
NAT 설정
# iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE |
ipforward 허용 설정
# vim /etc/sysctl.conf |
net.ipv4.ip_forward=1 |
6. 마무리 작업
이 설정을 재부팅 시에도 그대로 될수 있도록 하겠다.
openvpn은 알아서 시작하는데 nat 설정이 날아가 버려서 문제가 되었다.
그래서 찾아본 해결책이 외국 포럼에서 본것으로 iptables-save 로 현재 상태를 저장하고, 부팅시 불러오는 방법
# iptables-save > /etc/iptables.conf |
- 일단 현재 nat 상태를 저장한다.
# vim /etc/network/interfaces |
iface eth0 inet dhcp pre-up iptables-restore < /etc/iptables.conf |
- eth0 바로 아래부분에 iptables-restore 를 적용해 준다.
7. 방화벽 설정
iptables를 활용하여 방화벽 규칙을 적용한다. [추가 2015.04.10][변경1 2015.04.22]
iptables -P INPUT ACCEPT iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 iptables -P OUTPUT ACCEPT
|
- 차단된 접속시도는 /var/log/syslog 에 "iptables denied:" 으로 시작하는 로그가 쌓이게 된다.
- iptables -nL, iptables -t nat -nL 은 현재 규칙을 화면에 표시하여 주는 역할을 한다.
- INPUT (들어오는) 규칙은 기본적으로 DROP (갖다버림) 이며, -j ACCEPT 에 명시된 항목만 허용한다.
부팅시 이 방화벽 규칙을 유지 시키기 위해서 아래 작업을 추가한다.
# sudo iptables-save > iptables.conf # sudo cp iptables.conf /etc/ |
#sudo vim /etc/network/interfaces |
auto lo |
- eth0 아래에 iptables-restore 명령으로 방화벽 규칙을 적용 시켜준다.
[변경사항]
- 2015.04.22 : iptables 설정 중 deny 로그 남기는 부분의 설정 위치에 대한 오류가 있어 정정합니다.
[참고]
https://www.debian-administration.org/article/445/Getting_IPTables_to_survive_a_reboot
http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/System_management/VPN/OpenVPN
https://openvpn.net/index.php/open-source/documentation/howto.html
openvpn.net 의 링크에서 Routing all client traffic (including web-traffic) through the VPN 항목을 찾아 보면
모든 트래픽 보내기에 대한 설정 예시와 함께 상세한 설명이 있다.