한줄공지
  • 등록된 공지내용이 없습니다.

FreeBSD 14.0에 Wireguard VPN 설치하는 방법

2024년 7월 8일
조회수 147
코멘트 0

목차

소개

WireGuard는 기기 간에 안전한 네트워크 연결을 만들기 위해 암호화 프로토콜을 활용하는 오픈 소스 모던 VPN (Virtual Private Network) 솔루션입니다. WireGuard는 효율적이며 IPsec와 같은 전통적인 VPN 프로토콜보다 향상된 신뢰성을 제공합니다. 본 안내서에서는 FreeBSD 14.0에 WireGuard VPN을 설치하고 서버에 안전한 네트워크 터널을 구성하는 방법을 설명합니다.

사전 요구 사항

시작하기 전에 다음과 같은 사전 조건을 충족해야 합니다:

  • Vultr에서 FreeBSD 14.0 서버 인스턴스를 배포합니다.
  • SSH를 사용하여 서버에 액세스합니다.
  • sudo 권한이 있는 루트가 아닌 사용자를 만들고 해당 계정으로 전환합니다.

WireGuard VPN 설치

다음 단계를 수행하여 서버에 최신 WireGuard VPN 패키지를 설치하세요:

  1. 서버의 패키지 저장소 정보를 업데이트합니다.
    $ sudo pkg update
    
  2. 모든 설치된 패키지를 최신 버전으로 업그레이드합니다.
    $ sudo pkg upgrade
    
  3. WireGuard를 설치합니다.
    $ sudo pkg install wireguard-tools
    

위 명령은 wireguard-tools 패키지를 설치하며, 해당 패키지에는 wireguard 패키지와 wg, wg-quick 등의 WireGuard 인터페이스 관리를 단순화하는 데 필요한 다른 패키지가 포함됩니다.

WireGuard 구성

WireGuard는 서버-클라이언트 아키텍처를 사용하여 네트워크 터널을 생성합니다. WireGuard 서버와 클라이언트는 인증 및 데이터 암호화에 개인 및 공개 키를 사용합니다. 클라이언트는 서버의 공개 키를 사용하여 데이터를 암호화하며 해당 데이터는 연결에만 디코딩할 수 있는 연관된 서버 개인 키를 사용하여 해독됩니다. 서버에 안전한 터널 통신을 활성화하기 위해 아래 단계를 따르세요:

  1. WireGuard의 /usr/local/etc/wireguard 디렉토리 권한을 소유자에게 읽기 및 쓰기 권한을 부여합니다.
       $ sudo chmod -R 770 /usr/local/etc/wireguard
    
  2. 해당 디렉토리로 이동합니다.
       $ cd /usr/local/etc/wireguard
    
  3. WireGuard 서버용 새로운 개인 키를 생성합니다.
       $ wg genkey | tee server_private.key
    

    위 명령은 아래와 같이 생성된 개인 키 값을 복사합니다.

       CHVDcFReVNu3vLwcCqpM3Wlu9mFEeJkQbVa4j4FBd2U=
    
  4. 생성된 개인 키를 기반으로 새로운 공개 키를 생성합니다.
       $ wg pubkey < server_private.key > server_public.key && cat server_public.key
    

    위 명령은 아래와 같이 생성된 공개 키 값을 복사합니다.

       uSYKhXf8rbJfZNtUNuRwzAOYmjBnre3O2T+Isv4f+k0=
    
  5. 텍스트 편집기(vi 등)를 사용하여 새로운 WireGuard 서버 구성을 생성합니다.
       $ sudo vi /usr/local/etc/wireguard/wg0.conf
    
  6. 다음 설정을 파일에 추가하세요. 앞서 생성한 실제 서버 개인 키로 CHVDcFReVNu3vLwcCqpM3Wlu9mFEeJkQbVa4j4FBd2U= 부분을 대체하세요.
       [Interface]
       Address = 192.168.100.1/24
       SaveConfig = true
       ListenPort = 51820
       PrivateKey = CHVDcFReVNu3vLwcCqpM3Wlu9mFEeJkQbVa4j4FBd2U=
    

    파일을 저장하고 닫습니다. 위 구성은 192.168.100.0/24 네트워크를 사용하며 서버 주소는 192.168.100.1입니다. 구성 내용은 다음과 같습니다:

    • Address : WireGuard 서버 인터페이스에서 사용할 사설 IP 서브넷을 설정합니다.
    • SaveConfig : 인터페이스가 다운될 때 실행 구성을 저장할 수 있게 합니다.
    • ListenPort : WireGuard 인터페이스로 들어오는 연결을 수신할 서버 포트를 설정합니다.
    • PrivateKey : WireGuard 서버의 개인 키를 설정합니다.

WireGuard 클라이언트 구성 생성

WireGuard 클라이언트 구성은 서버의 공개 키와 공용 IP 정보를 사용하여 WireGuard 서버 인터페이스에 터널 연결을 생성합니다. 각 WireGuard 클라이언트는 서버 인터페이스에 연결을 생성하기 위해 공개 키를 사용하는 고유한 공개 키를 실행합니다. WireGuard 클라이언트 구성 파일을 공유할 수 있도록 만들고 서버 인터페이스에서 활성화하려면 다음 단계를 따르세요:

  1. WireGuard 클라이언트용 새로운 개인 키를 생성합니다.
       $ wg genkey | tee client_private.key
    

    위 명령은 아래와 같이 생성된 개인 키 값을 복사합니다.

       uIsqtxRWeDusnNYTWHdznJWfBrYe24996pfQ9jqNYmg=
    
  2. 생성된 개인 키를 기반으로 새로운 공개 키를 생성합니다.
       $ wg pubkey < client_private.key > client_public.key && cat client_public.key
    

    위 명령은 아래와 같이 생성된 공개 키 값을 복사합니다.

       DPodowSBbXs+dvT4gKabLx7ecOZUhNlISPJEErOal28=
    
  3. WireGuard 클라이언트용 새로운 구성 파일을 생성합니다.
       $ sudo vi /usr/local/etc/wireguard/wg_client.conf
    
  4. 다음 설정을 파일에 추가하세요. 앞서 생성한 클라이언트 개인 키로 uIsqtxRWeDusnNYTWHdznJWfBrYe24996pfQ9jqNYmg= 부분을, 서버 공개 키로 uSYKhXf8rbJfZNtUNuRwzAOYmjBnre3O2T+Isv4f+k0= 부분을, WireGuard 서버의 공용 IP 주소로 139.180.144.36 부분을 대체하세요.
       [Interface]
       PrivateKey = uIsqtxRWeDusnNYTWHdznJWfBrYe24996pfQ9jqNYmg=
       Address = 192.168.100.2/24
    
       [Peer]
       PublicKey = uSYKhXf8rbJfZNtUNuRwzAOYmjBnre3O2T+Isv4f+k0=
       AllowedIPs = 0.0.0.0/0
       Endpoint = 139.180.144.36:51820
       PersistentKeepalive = 30
    

    파일을 저장하고 닫습니다. 위 구성은 모든 네트워크 트래픽 및 서브넷 0.0.0.0/0을 WireGuard VPN 터널을 통해 전달하는 새로운 WireGuard 클라이언트를 생성합니다. 또한 클라이언트는 WireGuard 서버에 연결될 때 사용할 192.168.100.2 사설 IP 주소를 사용합니다. 구성 내용은 다음과 같습니다:

    • PrivateKey: WireGuard 클라이언트 개인 키를 설정합니다.
    • Address: WireGuard 터널에 연결되었을 때 클라이언트의 사설 IP 주소 및 서브넷을 설정합니다.
    • PublicKey: WireGuard 서버의 공개 키를 설정합니다.
    • AllowedIPs: WireGuard VPN 연결을 통해 연결할 IP 주소 및 서브넷을 지정합니다. 0.0.0.0/0로 설정되어 있으므로 모든 IP 주소 및 네트워크 인터페이스가 VPN 연결을 통해 액세스할 수 있습니다.
    • Endpoint: 클라이언트가 연결할 WireGuard 서버의 공용 IP 주소와 포트를 설정합니다.
    • PersistentKeepalive: WireGuard 서버와의 연결을 유지하기 위해 30초마다 데이터 패킷을 전송합니다.
  5. WireGuard 서버 구성 파일을 엽니다.
       $ sudo vi /usr/local/etc/wireguard/wg0.conf
    
  6. 파일 맨 아래에 다음 구성을 추가하세요. 앞서 생성한 클라이언트 공개 키로 DPodowSBbXs+dvT4gKabLx7ecOZUhNlISPJEErOal28= 부분을 대체하세요.
       [Peer]
       # Client 1
       PublicKey = DPodowSBbXs+dvT4gKabLx7ecOZUhNlISPJEErOal28=
       AllowedIPs = 192.168.100.2/32
    

    위 구성은 WireGuard 클라이언트가 WireGuard 서버 인터페이스에 연결할 수 있도록 활성화합니다. 구성 내용은 다음과 같습니다:

    • PublicKey: WireGuard 클라이언트의 공개 키를 설정합니다.
    • AllowedIPs: 지정된 키를 사용하여 연결할 수 있는 클라이언트의 사설 IP 주소를 활성화합니다. 192.168.100.3과 같은 다른 주소는 해당 키를 사용하여 연결할 수 없으며 고유한 키를 가진 새로운 클라이언트 구성을 생성해야 합니다.
  7. 다음 명령을 사용하여 WireGuard 서버 인터페이스 wg0를 활성화하세요.
       $ sudo sysrc wireguard_interfaces="wg0"
    
  8. 안전한 전송 프로토콜 (예: scp)을 사용하여 WireGuard 클라이언트 구성 파일을 디바이스에 다운로드하세요. 예를 들어, Windows 컴퓨터에서 다음 명령을 실행하여 파일을 다운로드할 수 있습니다.
       PS > scp username@your_server_ip:/usr/local/etc/wireguard/wg_client.conf .
    

WireGuard VPN 시스템 프로세스 관리

다음 단계를 수행하여 WireGuard VPN이 부팅시 자동으로 시작되도록 설정하세요:

  1. WireGuard VPN이 부팅시 자동으로 시작되도록 설정합니다.
       $ sudo sysrc wireguard_enable="YES"
    
  2. WireGuard 서버를 시작합니다.
       $ sudo service wireguard start
    
  3. WireGuard 서버 상태를 확인하고 활성 인터페이스 정보를 확인합니다.
       $ sudo service wireguard status
    

    아래와 유사한 출력을 확인해야 합니다.

       interface: wg0
         public key: uSYKhXf8rbJfZNtUNuRwzAOYmjBnre3O2T+Isv4f+k0=
         private key: (hidden)
         listening port: 51820
    
       pvir: DPodowSBbXs+dvT4gKabLx7ecOZUhNlISPJEErOal28=
         allowed ips: 192.168.100.2/32
    

방화벽 규칙 설정

Packet Filter (pf) 방화벽은 Vultr FreeBSD 서버에서 기본적으로 활성화되어 있습니다. 서버를 보호하고 WireGuard 서버 인터페이스를 통한 네트워크 연결을 활성화하려면 다음 단계를 따르세요:

  1. 서버에서 IP 포워딩을 가능하게 하기 위해 sysctl.conf 파일을 수정합니다.
       $ echo 'net.inet.ip.forwarding=1' | sudo tee -a /etc/sysctl.conf
    
  2. 서버에서 sysctl.conf 변경 사항을 적용합니다.
       $ sudo sysctl -f /etc/sysctl.conf
    
  3. Packet Filter 방화벽을 활성화합니다.
       $ sudo sysrc pf_enable="YES"
    
  4. Packet Filter 로그를 활성화합니다.
       $ sudo sysrc pflog_enable="YES"
    
  5. 서버의 네트워크 인터페이스를 확인하고 wg0 WireGuard 인터페이스가 사용 가능한지 확인합니다.
       $ ifconfig
    

    다음과 유사한 출력을 확인해야 합니다.

       vtnet0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
           options=4c00ba<TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,VLAN_HWTSO,LINKSTATE,TXCSUM_IPV6>
           ether 56:00:04:fa:07:79
           inet 139.180.144.36 netmask 0xfffffe00 broadcast 139.180.145.255
           media: Ethernet autoselect (10Gbase-T <full-duplex>)
           status: active
           nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
       lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
           options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
           inet 127.0.0.1 netmask 0xff000000
           inet6 ::1 prefixlen 128
           inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
           groups: lo
           nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
       wg0: flags=10080c1<UP,RUNNING,NOARP,MULTICAST,LOWER_UP> metric 0 mtu 1420
           options=80000<LINKSTATE>
           inet 192.168.100.1 netmask 0xffffff00
           groups: wg
           nd6 options=109<PERFORMNUD,IFDISABLED,NO_DAD>
    
  6. Packet Filter 구성 파일을 연다.
       $ sudo vi /etc/pf.conf
    
  7. 다음 구성을 파일에 추가합니다. 실제 서버 공용 인터페이스 이름으로 vtnet0를 사용합니다.
       ext_if = "vtnet0"
       wg_if = "wg0"
       set skip on lo
    
       scrub in on $ext_if all fragment reassemble
       nat on $ext_if from $wg_if:network to any -> ($ext_if)
       pass in on $ext_if proto udp from any to ($ext_if) port 51820
       pass quick on $wg_if
       pass out keep state
    

    파일을 저장하고 닫습니다. 위 방화벽 규칙은 서버에 새로운 방화벽 규칙을 적용합니다. 구성 내용은 다음과 같습니다:

    • ext_if: 외부 서버 네트워크 인터페이스 vtnet0를 설정합니다.
    • wg_if: WireGuard 인터페이스를 wg0으로 설정합니다.
    • set skip on lo: 내부 트래픽 필터링을 피하기 위해 루프백 인터페이스에서 필터링을 건너뜁니다.
    • scrub in on $ext_if all fragment reassemble: 외부 네트워크 인터페이스에서 분할된 패킷을 재조립합니다.
    • nat on $ext_if from $wg_if:network to any -> ($ext_if): WireGuard 인터페이스에서 외부 인터페이스로 패킷 전달을 위해 NAT를 사용합니다.
    • pass in on $ext_if proto udp from any to ($ext_if) port 51820: WireGuard UDP 포트 51820의 들어오는 연결을 허용합니다.
    • pass quick on $wg_if: WireGuard 인터페이스에서 모든 유형의 트래픽을 허용합니다.
    • pass out keep state: 모든 아웃고잉 트래픽을 활성화하고 연결 상태를 추적합니다.
  8. Packet Filter 방화벽을 시작합니다.
       $ sudo service pf start
    
  9. 변경 사항을 적용하기 위해 Packet Filter 규칙을 다시 로드합니다.
       $ sudo pfctl -f /etc/pf.conf
    

설치 테스트

WireGuard 서버는 WireGuard 클라이언트 패키지와 같은 호환되는 응용프로그램에서 연결을 수락합니다. WireGuard 클라이언트 응용프로그램을 설치하고 서버에 연결하기 위해 다음 단계를 수행하세요:

  1. 기기에 최신 WireGuard VPN 클라이언트 응용프로그램을 다운로드하여 설치하세요. 예를 들어, Windows용 WireGuard VPN을 설치하세요.
  2. WireGuard VPN 클라이언트 응용프로그램을 여십시오.
  3. 터널 추가 또는 파일에서 터널 가져오기를 클릭하여 클라이언트 구성 파일을 로드하세요.
  4. 이전에 다운로드한 클라이언트 구성 파일을 찾아 엽니다.
  5. 활성화를 클릭하여 WireGuard VPN 서버에 연결하세요.
  6. WireGuard 서버에 대한 네트워크 연결이 설정되고 인터페이스에서 데이터 전송이 활성화되었는지 확인하세요.
  7. WireGuard 서버에서 연결된 클라이언트 수를 확인하려면 WireGuard 서버에서 다음 명령을 실행합니다.
       $ wg
    

결론

FreeBSD 14.0에 WireGuard VPN 서버를 설치하고 클라이언트를 설정하여 VPN 터널을 생성하는 방법에 대해 설명했습니다. WireGuard 설정을 통해 암호화된 데이터 전송, 안전한 액세스 및 여러 클라이언트 장치와 작업 시 필요한 효과적인 네트워크 트래픽 관리를 활성화할 수 있습니다. WireGuard VPN에 대한 자세한 내용은 WireGuard VPN 문서를 참조하세요.

 

출처: https://docs.vultr.com/how-to-install-wireguard-vpn-on-freebsd-14-0

안정적이고 저렴한 가상 서버(VPS) 안내

안정적인 서버 호스팅을 찾고 계신가요? 지금 Vultr 호스팅을 한번 이용 해 보세요. 지금 보고 계신 HaruLogs 사이트도 Vultr에서 VPS 호스팅 하고 있습니다. 한국, 일본, 미국등 다양한 국가에 클릭 몇번으로 안정적이고 저렴한 VPS를 운영 할 수 있습니다.

아래 배너를 통해 회원 가입을 하시면 100달러의 무료 크레딧을 받을 수 있습니다. 100달러의 무료 크레딧은 Vultr의 최소 사양 VPS를 20대 동시 운영가능한 크레딧입니다.

지금 무료로 Vultr $100 크레딧 선물 받기

 

Vultr 서비스 요약

  • VPS
    • 인스턴스
      • AMD 또는 Intel High Performance 인스턴스 최저 $6 - 1vCPU, 1GB Memory, 2TB Bandwidth, 25GB NVMe
    • 엣지
  • Block Storage
  • Object Storage (AWS S3 호환)
  • Firewall
  • Network
  • Load Balancers
  • Kubernetes
  • Databases
포스트 통계
지금 보고있는 포스트의 통계 데이터를 확인 해 보세요.
  • 총 조회수
    148
  • 최근 30일 조회수
    43
연관 포스트
코멘트 작성