프로토콜 비교

OpenVPN

가장 보편적으로 많이쓰는 프로토콜

  • 구성은 IKEv2 보다 간단하여 사용하기 쉬움
  • 별도 앱을 설치하여야 함
  • WireGuard 보다 속도 및 안정성에서 성능이 더 나쁨
    • VPN 터널에서에 TCP-on-TCP 사용 때문인듯

WireGuard

최근에 유행하는 프로토콜

  • 구성은 OpenVPN 보다는 좀까다롭긴 함
  • OpenVPN 과 마찬가지로 별도 앱 필요
  • VPN 터널에서 UDP만 사용하여 호환성 문제를 야기할 수 있지만 터널 자체에서 TCP 패킷을 UDP로 다시 캡슐링하기 때문에 HTTP 같은 TCP 통신에도 문제는 없음
  • 문제점 중 하나가 클라이언트 구성 파일을 돌려 쓰면 ip가 중복됨, 이 때문에 같은 구성 파일로 접속한 두 클라이언트간 통신이 안되는 문제가 있음 클라이언트 각각에 구성파일을 만들어 줘야함
  • 어떤 프로토콜 보다 속도 및 안정성에서 우월함

IKEv2 (네이티브)

안드로이드 및 윈도우에서 네이티브로 사용가능한 프로토콜

  • 별도 앱을 설치할 필요는 없어서 간편하긴 함
  • 다만 초기 구성이 매우 까다롭고 Docker 에서는 잘 작동안함
  • 다운로드 속도는 WireGuard 와 거의 동일하거나 조금 나쁨, 근데 업속도가 개판임

설치

OpenVPN

UDP 1194 포트로 포트포워딩 필요

참고자료

  1. 다음 스크립트로 openvpn 설치
    wget https://git.io/vpn -O openvpn-install.sh
    ./openvpn-install.sh
  2. 저장된 .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 포트로 포트포워딩 필요

  1. root 사용자로 변경

    sudo su
  2. 패키지 설치

    apt install wireguard
  3. 키 생성

    # 서버 측
    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
  4. 기본 NIC(네트워크 인터페이스) ID 확인

    ip -o -4 route show to default | awk '{print $5}'
  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  # 클라이언트와 동일하게
    
  6. IP 포워딩 활성화

    • /etc/sysctl.conf 파일 맨 아래 추가

      net.ipv4.ip_forward=1
      
    • 적용

      sysctl -p
  7. VPN 서버 시작

    # 시작
    sudo wg-quick up wg0
     
    # 서비스 자동시작 등록
    sudo systemctl enable wg-quick@wg0
  8. (추가) 서비스 관리

    # 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

클라이언트 구성

  1. 프로그램 설치 (Windows)

  2. 클라이언트 구성

    [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가 똑같아서 연결된 클라이언트 간에 통신에 장애가 발생함

즉 클라이언트별로 새로운 구성을 생성해야 이런 문제가 없음

  • 서버:

    1. 기존 서비스 종료

      sudo wg-quick down wg0
    2. 추가 클라이언트 키 발급

      wg genkey | sudo tee privatekey | wg pubkey | sudo tee publickey
    3. /etc/wireguard/wg0.conf 파일 수정

      ===추가===
      [Peer]
      PublicKey = 위에서 생성한 publickey 내용
      AllowedIPs = 10.0.0.3/32  # 이전과 다른 IP로 (대역은 똑같이)
      
    4. 서비스 다시시작

      sudo wg-quick up wg0
       
      # 파일 정리
      rm -rf privatekey publickey
  • 클라이언트:

    1. Interface PrivateKey 부분만 수정 (나머지 부분은 이전에 생성한것과 똑같이)

      [Interface]
      PrivateKey = 서버에서 생성한 privatekey 내용
      ===다른값 똑같이===
      

윈도우에서 서버 구성

사실 클라이언트 WireGuard 프로그램은 서버로도 사용가능 하다.

  1. WireGuard 프로그램에서 위에 방법대로 서버, 클라이언트 구성 파일 만듬
  2. 서버 구성파일을 Active 하면 서버 구동이 됨
  3. 클라이언트가 인터넷을 사용하려면 VPN 서버가 구동 된 상태에서 아래 작업을 진행
    1. 제어판 네트워크 및 공유 센터 실제 LAN(이더넷) 클릭 속성 공유
    2. 다른 네트워크 사용자가 이 컴퓨터… 이거 체크하고 확인 눌러서 마무리
    3. 이때 이미 체크가 되어있는 상태면 체크 해제하고 다시 진행
    4. 해당 과정은 1회성이 아닌 서버 재시작 마다 해줘야함
  4. 서버 종료하기 전 인터넷 연결 공유 기능은 끄고 종료 하는것이 좋음

IKEv2

UDP 500,4500 포트로 포트포워딩 필요

서버 구성

참고자료

  1. 필요 패키지 설치

    sudo apt install strongswan strongswan-pki libcharon-extra-plugins libcharon-extauth-plugins libstrongswan-extra-plugins libtss2-tcti-tabrmd0
  2. 인증서 발급

    # 인증서 생성 폴더 생성
    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}
  3. 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 "<암호>"
      
  4. strongswan-starter 재시작

    sudo systemctl restart strongswan-starter
ufw 사용 중 이라면
  1. 포트 허용

    sudo ufw allow OpenSSH
    sudo ufw allow 500,4500/udp
  2. 기본 NIC(네트워크 인터페이스) ID 확인

    ip -o -4 route show to default | awk '{print $5}'
  3. /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
    
  4. /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
    
  5. 적용

    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 MSCHAPv2
    • IPSec 식별자: 사용안함으로 그대로 두기
    • IPSec CA 인증서: 서버 인증 안 함 으로두기
    • IPSec 서버 인증서: 서버로 부터 수신
    • 사용자 이름 & 비밀번호: 설정한 걸로 잘 수정하기

(추가) No-ip DDNS 설정하기

no-ip 도메인 발급

  1. no-ip 홈페이지에서 도메인 발급
  2. DDNS Key 생성
  3. 생성한 DDNS Key 잘 간직하기

no-ip ddns 등록

참고

  1. 서버에 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
  2. 설치가 완료되면 해당명령으로 DDNS 서버 활성화 해보기

    • 스크립트가 포그라운드로 활성화 되는거라 서비스 등록해야함
    noip-duc -g all.ddnskey.com --username <DDNS Key username> --password <DDNS Key passwd>
  3. 서비스 등록하기

    1. /etc/systemd/system 에 서비스 파일 만들기

      cd /etc/systemd/system
      sudo nano
    2. 해당 파일에 이렇게 작성하고 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
      
  4. 서비스 시작하기

    # 서비스 파일 리로드
    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