Ubuntu 에 OpenVPN 설치하기 ----------- 우분투 16.04 LTS 버전을 기준으로, OpenVPN 설치하는 방법을 정리해본다. 필요한 패키지 설치 * sudo apt-get update && sudo apt-get upgrade * sudo apt-get install openvpn easy-rsa * CA (Certificate Authority) 빌드 mkdir openvpn-ca cd openvpn-ca * 변수 수정하기, 아래에 있는 것이 vars 파일에 들어 있는데, 적당히 바꾸면 된다. (안 바꿔도 별일은 없지만 ..) * vi vars export KEY_COUNTRY="US" export KEY_PROVINCE="CA" export KEY_CITY="SanFrancisco" export KEY_ORG="Fort-Funston" export KEY_EMAIL="me@myhost.mydomain" export KEY_OU="MyOrganizationalUnit" export KEY_NAME="server" * ln -s openssl-1.0.0.cnf openssl.cnf * source vars (또는 source ./vars) * NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/.../openvpn-ca/keys 이라고 나오면 정상적이다. ./clean-all * ./build-ca 를 실행하면 몇가지 물어보는데, 그냥 엔터키만 눌러서 쭉 넘어가고 버전에 따라 다른데, 끝에 가서 진짜로 할 거냐 (y/n)를 물어보는데, y 를 누르면 계산을 하면서 CA 파일을 만든다. 아참, challenge password 라는 게 보이면 비밀번호를 굳이 입력하지 않고 엔터 치면 된다. * DH (Diffie-Hellman) 키를 생성하자. 이건 좀 오래 걸린다. ./build-dh * HMAC(Hash-based Message Authentication Code) 키를 만들자. openvpn --genkey --secret keys/ta.key * 서버 설정 cd ~/openvpn-ca/keys sudo cp ca.crt server.crt server.key ta.key dh2048.pem /etc/openvpn gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf * server.conf 파일을 변경하자. 마지막 두줄은 추가해야 한다. * sudo vi /etc/openvpn/server.conf proto tcp # udp 는 주석 처리 push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 168.126.63.2" push "dhcp-option DNS 8.8.8.8" tls-auth ta.key 0 cipher AES-128-CBC user nobody group nogroup key-direction 0 auth SHA256 * 서버 네트워크 설정 sudo vi /etc/sysctl.conf net.ipv4.ip_forward=1 앞에 #이 붙어 있을텐데, #을 지우자. 저장하고 나와서 .. sudo sysctl -p sudo iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE * iptables 설정을 부팅때마다 실행시키기 위해서는 몇가지 방법이 있는데, /etc/rc.local 파일 정도에 윗줄의 명령에서 sudo 를 빼고 입력하거나 sudo apt-get install iptables-persistent 를 실행하여 현재의 iptables 규칙을 저장하느냐의 방법이 있는데, 내 경우는 /etc/rc.local 파일에 적는 것을 추천한다. * 혹시라도 서버 앞단에 있는 방화벽이나 공유기 등에서 1194 포트가 막혀 있는지 확인해보고, 막혀 있다면 포트포워딩이나 열어야 하며, 그게 불가능하다면 다른 열려 있는 포트로 바꾸자. 바꾸려면 위에서 설명한 server.conf 파일과 아래에 설명할 클라이언트에서 포트를 바꿔서 적어주어야 한다. * 서버 실행 sudo systemctl start openvpn@server sudo systemctl status openvpn@server ip addr show tun0 * tun0 가 뜨는지를 보자. 이게 안 뜬다면 설정이 제대로 안된 거다. * 클라이언트 키 생성 cd openvpn-ca source vars (또는 source ./vars) ./build-key akpil akpil 대신 다른 이름을 써도 된다. mkkdir -p client-configs/files cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf vi ~/client-configs/base.conf 아래 세줄은 추가하여야 한다. remote 서버 ip 주소 또는 도메인 이름 1194 proto tcp # udp 는 주석 처리 user nobody # 주석 해제 group nogroup # 주석 해제 #ca ca.crt # 붙여서 주석처리 #cert client.crt # 붙여서 주석처리 #key client.key # 붙여서 주석처리 key-direction 1 cipher AES-128-CBC auth SHA256 * 클라이언트 인증서를 만들기 위한 스크립트 파일을 하나 만들자. vi ~/client-configs/make_config.sh #!/bin/bash # First argument: Client identifier KEY_DIR=~/openvpn-ca/keys OUTPUT_DIR=~/client-configs/files BASE_CONFIG=~/client-configs/base.conf cat ${BASE_CONFIG} \ <(echo -e '') \ ${KEY_DIR}/ca.crt \ <(echo -e '\n') \ ${KEY_DIR}/${1}.crt \ <(echo -e '\n') \ ${KEY_DIR}/${1}.key \ <(echo -e '\n') \ ${KEY_DIR}/ta.key \ <(echo -e '') \ > ${OUTPUT_DIR}/${1}.ovpn chmod 700 ~/client-configs/make_config.sh ~/client-configs/make_config.sh akpil 이렇게 하면 akpil.ovpn 파일이 생성된다. 이 파일을 클라이언트 디바이스에 전송하여 적용시키면 된다. ----------- 2018/03/14 akpil