프로토콜 비교
OpenVPN
가장 보편적으로 많이쓰는 프로토콜
- 구성은
IKEv2
보다 간단하여 사용하기 쉬움 - 별도 앱을 설치하여야 함
WireGuard
보다 속도 및 안정성에서 성능이 더 나쁨- VPN 터널에서에 TCP-on-TCP 사용 때문인듯
WireGuard
최근에 유행하는 프로토콜
- 구성은
OpenVPN
보다는 좀까다롭긴 함 - OpenVPN 과 마찬가지로 별도 앱 필요
- VPN 터널에서 UDP만 사용하여 호환성 문제를 야기할 수 있지만 터널 자체에서 TCP 패킷을 UDP로 다시 캡슐링하기 때문에 HTTP 같은 TCP 통신에도 문제는 없음
- 문제점 중 하나가 클라이언트 구성 파일을 돌려 쓰면 ip가 중복됨, 이 때문에 같은 구성 파일로 접속한 두 클라이언트간 통신이 안되는 문제가 있음 클라이언트 각각에 구성파일을 만들어 줘야함
- 어떤 프로토콜 보다 속도 및 안정성에서 우월함
IKEv2 (네이티브)
안드로이드 및 윈도우에서 네이티브로 사용가능한 프로토콜
- 별도 앱을 설치할 필요는 없어서 간편하긴 함
- 다만 초기 구성이 매우 까다롭고 Docker 에서는 잘 작동안함
- 다운로드 속도는
WireGuard
와 거의 동일하거나 조금 나쁨, 근데 업속도가 개판임
설치
OpenVPN
UDP
1194
포트로 포트포워딩 필요
참고자료
- 다음 스크립트로 openvpn 설치
wget https://git.io/vpn -O openvpn-install.sh ./openvpn-install.sh
- 저장된
.ovpn
파일을 연결하려는 클라이언트들에게 복사- root/ 폴더에 저장되서 권한 잘 해서 해야함
서버 구성
- 설정파일 위치:
/etc/openvpn/server/server.conf
- 설정적용하기
sudo systemctl stop openvpn-server@server.service sudo systemctl stop openvpn.service sudo systemctl start openvpn-server@server.service sudo systemctl start openvpn.service
WireGuard
서버 구성
참고
UDP
51820
포트로 포트포워딩 필요
-
root 사용자로 변경
sudo su
-
패키지 설치
apt install wireguard
-
키 생성
# 서버 측 wg genkey | sudo tee /etc/wireguard/privatekey_server | wg pubkey | sudo tee /etc/wireguard/publickey_server # 클라이언트 측 wg genkey | sudo tee /etc/wireguard/privatekey_client | wg pubkey | sudo tee /etc/wireguard/publickey_client
-
기본 NIC(네트워크 인터페이스) ID 확인
ip -o -4 route show to default | awk '{print $5}'
-
/etc/wireguard/wg0.conf
파일 생성 후 아래 내용 입력[Interface] Address = 10.0.0.1/24 # VPN NIC 용 CIDR SaveConfig = true PostUp = iptables -t nat -A POSTROUTING -o <확인된 NIC ID> -j MASQUERADE PostDown = iptables -t nat -D POSTROUTING -o <확인된 NIC ID> -j MASQUERADE ListenPort = 51820 PrivateKey = 서버 비밀키 (/etc/wireguard/privatekey_server 에서 확인) [Peer] PublicKey = 클라이언트 공개키 (/etc/wireguard/publickey_client 에서 확인) AllowedIPs = 10.0.0.2/32 # 클라이언트와 동일하게
-
IP 포워딩 활성화
-
/etc/sysctl.conf
파일 맨 아래 추가net.ipv4.ip_forward=1
-
적용
sysctl -p
-
-
VPN 서버 시작
# 시작 sudo wg-quick up wg0 # 서비스 자동시작 등록 sudo systemctl enable wg-quick@wg0
-
(추가) 서비스 관리
# VPN 시작 sudo wg-quick up wg0 # VPN 종료 sudo wg-quick down wg0 # VPN 상태 확인 sudo wg # systemctl 사용 sudo systemctl stop wg-quick@wg0
ufw 사용 중 이라면
-
/etc/sysctl.conf
에 PostUp, PostDown 부분을 이렇게 수정PostUp = ufw route allow in on wg0 out on <확인된 NIC ID>; iptables -t nat -A POSTROUTING -o <확인된 NIC ID> -j MASQUERADE PostDown = ufw route delete allow in on wg0 out on <확인된 NIC ID>; iptables -t nat -D POSTROUTING -o <확인된 NIC ID> -j MASQUERADE
-
51820
포트 열기ufw allow 51820/udp # 적용 ufw disable ufw enable
클라이언트 구성
-
클라이언트 구성
[Interface] PrivateKey = 클라이언트 비밀키 (/etc/wireguard/privatekey_client 에서 확인) Address = 10.0.0.2/32 DNS = <DNS 서버1>, <DNS 서버2> [Peer] PublicKey = 서버 공개키 (/etc/wireguard/publickey_server 에서 확인) AllowedIPs = 0.0.0.0/0 Endpoint = <서버 IP주소>:51820
(참고) 클라이언트 추가 방법
단순 연결은 문제가 없지만 하나의 클라이언트 구성으로 여러 클라이언트가 접속하면
IP가 똑같아서 연결된 클라이언트 간에 통신에 장애가 발생함
즉 클라이언트별로 새로운 구성을 생성해야 이런 문제가 없음
-
서버
:-
기존 서비스 종료
sudo wg-quick down wg0
-
추가 클라이언트 키 발급
wg genkey | sudo tee privatekey | wg pubkey | sudo tee publickey
-
/etc/wireguard/wg0.conf
파일 수정===추가=== [Peer] PublicKey = 위에서 생성한 publickey 내용 AllowedIPs = 10.0.0.3/32 # 이전과 다른 IP로 (대역은 똑같이)
-
서비스 다시시작
sudo wg-quick up wg0 # 파일 정리 rm -rf privatekey publickey
-
-
클라이언트
:-
Interface → PrivateKey 부분만 수정 (나머지 부분은 이전에 생성한것과 똑같이)
[Interface] PrivateKey = 서버에서 생성한 privatekey 내용 ===다른값 똑같이===
-
윈도우에서 서버 구성
사실 클라이언트 WireGuard 프로그램은 서버로도 사용가능 하다.
- WireGuard 프로그램에서 위에 방법대로 서버, 클라이언트 구성 파일 만듬
- 서버 구성파일을 Active 하면 서버 구동이 됨
- 클라이언트가 인터넷을 사용하려면 VPN 서버가 구동 된 상태에서 아래 작업을 진행
- 제어판 → 네트워크 및 공유 센터 → 실제 LAN(이더넷) 클릭 → 속성 → 공유
- 다른 네트워크 사용자가 이 컴퓨터… 이거 체크하고 확인 눌러서 마무리
- 이때 이미 체크가 되어있는 상태면 체크 해제하고 다시 진행
- 해당 과정은 1회성이 아닌 서버 재시작 마다 해줘야함
- 서버 종료하기 전 인터넷 연결 공유 기능은 끄고 종료 하는것이 좋음
IKEv2
UDP
500,4500
포트로 포트포워딩 필요
서버 구성
참고자료
-
필요 패키지 설치
sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd0
-
인증서 발급
# 인증서 생성 폴더 생성 mkdir -p ~/pki/{cacerts,certs,private} # ca-key 생성 pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/ca-key.pem # ca-key 인증 생성 pki --self --ca --lifetime 3650 --in ~/pki/private/ca-key.pem \ --type rsa --dn "CN=<인증서 이름>" --outform pem > ~/pki/cacerts/ca-cert.pem # server-key 생성 pki --gen --type rsa --size 4096 --outform pem > ~/pki/private/server-key.pem # server-key 인증 생성 pki --pub --in ~/pki/private/server-key.pem --type rsa \ | pki --issue --lifetime 1825 \ --cacert ~/pki/cacerts/ca-cert.pem \ --cakey ~/pki/private/ca-key.pem \ --dn "CN=<서버 도메인 또는 IP 주소>" --san <서버 도메인 또는 IP 주소> \ --flag serverAuth --flag ikeIntermediate --outform pem \ > ~/pki/certs/server-cert.pem # 결과물 옮기기 sudo cp -r ~/pki/* /etc/ipsec.d/ sudo mv /etc/ipsec.conf{,.original}
-
StrongSwan
수정하기-
/etc/ipsec.conf
수정 (추가 설명은 위 참고자료 보자)config setup charondebug="ike 1, knl 1, cfg 0" uniqueids=no conn ikev2-vpn auto=add compress=no type=tunnel keyexchange=ikev2 fragmentation=yes forceencaps=yes dpdaction=clear dpddelay=300s rekey=no left=%any leftid=@<서버 도메인 OR ip> leftcert=server-cert.pem leftsendcert=always leftsubnet=0.0.0.0/0 right=%any rightid=%any rightauth=eap-mschapv2 rightsourceip=10.10.10.0/24 rightdns=<DNS 주소1>,<DNS 주소2> rightsendcert=never eap_identity=%identity ike=chacha20poly1305-sha512-curve25519-prfsha512,aes256gcm16-sha384-prfsha384-ecp384,aes256-sha1-modp1024,aes128-sha1-modp1024,3des-sha1-modp1024! esp=chacha20poly1305-sha512,aes256gcm16-ecp384,aes256-sha256,aes256-sha1,3des-sha1!
leftid
: 도메인 주소가 아닌 IP 주소인경우 앞에@
없에야함
-
/etc/ipsec.secrets
수정:: RSA "server-key.pem" <사용자 이름> : EAP "<암호>"
-
-
strongswan-starter
재시작sudo systemctl restart strongswan-starter
ufw 사용 중 이라면
-
포트 허용
sudo ufw allow OpenSSH sudo ufw allow 500,4500/udp
-
기본 NIC(네트워크 인터페이스) ID 확인
ip -o -4 route show to default | awk '{print $5}'
-
/etc/ufw/before.rules
수정===*filter 위쪽에 추가=== *nat -A POSTROUTING -s 10.10.10.0/24 -o <확인된 NIC ID> -m policy --pol ipsec --dir out -j ACCEPT -A POSTROUTING -s 10.10.10.0/24 -o <확인된 NIC ID> -j MASQUERADE COMMIT *mangle -A FORWARD --match policy --pol ipsec --dir in -s 10.10.10.0/24 -o <확인된 NIC ID> -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1361:1536 -j TCPMSS --set-mss 1360 COMMIT ===*filter 내용 아래쪽에 추가=== -A ufw-before-forward --match policy --pol ipsec --dir in --proto esp -s 10.10.10.0/24 -j ACCEPT -A ufw-before-forward --match policy --pol ipsec --dir out --proto esp -d 10.10.10.0/24 -j ACCEPT
-
/etc/ufw/sysctl.conf
수정===맨 아래 추가=== net/ipv4/ip_forward=1 net/ipv4/conf/all/accept_redirects=0 net/ipv4/conf/all/send_redirects=0 net/ipv4/ip_no_pmtu_disc=1
-
적용
sudo ufw disable sudo ufw enable
클라이언트 구성
-
윈도우
:- 구성된 서버에서
/etc/ipsec.d/cacerts/ca-cert.pem
파일 내용을 복사하여ca-cert.pem
파일을 만듬 - 윈도우 검색에서
컴퓨터 인증서 관리
를 검색 해서 들어가기 - 왼쪽 항목에서
신뢰할 수 있는 루트 인증 기관
우클릭- 모든작업 → 가져오기 → 파일 선택 → 모든파일로 변경 하여
ca-cert.pem
파일을 선택하여 추가
- 모든작업 → 가져오기 → 파일 선택 → 모든파일로 변경 하여
- 이후 VPN 연결 설정 가서 구성한 대로 입력해 주면 됨 (이때 VPN종류는 자동으로)
- 구성된 서버에서
-
안드로이드
안드로이드 연결 시
StrongSwan
앱을 쓸 필요는 없음
특이하게 이쪽은 인증서 없이도 잘 작동하더라VPN 종류
: IKEv2/IPSec MSCHAPv2IPSec 식별자
: 사용안함으로 그대로 두기IPSec CA 인증서
: 서버 인증 안 함 으로두기IPSec 서버 인증서
: 서버로 부터 수신사용자 이름 & 비밀번호
: 설정한 걸로 잘 수정하기
(추가) No-ip DDNS 설정하기
no-ip 도메인 발급
- no-ip 홈페이지에서 도메인 발급
- DDNS Key 생성
- 생성한 DDNS Key 잘 간직하기
no-ip ddns 등록
참고
-
서버에 DCU 설치 (동적으로 도메인 바꿀 서버를 생성)
wget --content-disposition https://www.noip.com/download/linux/latest tar xf noip-duc_<버전>.tar.gz cd /home/<유저>/noip-duc_<버전>/binaries && sudo apt install ./noip-duc_<버전>_arm64.deb
-
설치가 완료되면 해당명령으로 DDNS 서버 활성화 해보기
- 스크립트가 포그라운드로 활성화 되는거라 서비스 등록해야함
noip-duc -g all.ddnskey.com --username <DDNS Key username> --password <DDNS Key passwd>
-
서비스 등록하기
-
/etc/systemd/system 에 서비스 파일 만들기
cd /etc/systemd/system sudo nano
-
해당 파일에 이렇게 작성하고
no-ip-ddns.service
로 저장[Unit] Description=no-ip-ddns [Service] ExecStart=noip-duc -g all.ddnskey.com --username <DDNS Key username> --password <DDNS Key passwd> Type=simple Restart=always [Install] WantedBy=default.target
-
-
서비스 시작하기
# 서비스 파일 리로드 sudo systemctl daemon-reload # 부팅시 서비스 자동시작 sudo systemctl enable no-ip-ddns.service # 서비스 시작 sudo systemctl start no-ip-ddns.service # 로그확인 sudo systemctl status no-ip-ddns.service