웹사이트 검색

FreeBSD 10.1에서 개인 OpenVPN 서버를 구성하고 연결하는 방법


소개

OpenVPN은 오픈 소스 VPN(가상 사설망) 서버/클라이언트 애플리케이션으로, 가상 네트워크(LAN과 유사)에 안전하게 연결할 수 있습니다.

이 튜토리얼에서는 IPv4 NAT 및 라우팅을 사용하여 FreeBSD 10.1 시스템에 OpenVPN 서버를 설치하고 구성하는 방법을 설명합니다. 여기에는 다양한 구성 옵션에 대한 간단한 설명이 포함되어 있습니다.

이 튜토리얼이 끝나면 자신의 OpenVPN 서버를 실행하고 이 네트워크에 연결하기 위해 클라이언트 구성 파일을 다운로드할 준비가 됩니다.

참고: 2022년 7월 1일부터 DigitalOcean은 제어판 또는 API를 통한 새로운 FreeBSD Droplet 생성을 더 이상 지원하지 않습니다. 그러나 여전히 사용자 지정 이미지를 사용하여 FreeBSD Droplets를 스핀업할 수 있습니다. 제품 설명서에 따라 사용자 지정 이미지를 DigitalOcean으로 가져오는 방법을 알아보세요.

전제 조건

  • FreeBSD 10.1 서버. 서버 크기는 VPN에 연결하려는 클라이언트 수에 따라 다릅니다. 일부 클라이언트에는 519MB가 적당합니다.
  • 루트 액세스

이 튜토리얼은 루트 액세스가 필요합니다. 이 튜토리얼에서 우리가 사용하는 서버는 기본 freebsd 사용자를 참조한 다음 루트 셸에 액세스합니다.

sudo tcsh

1단계 - OpenVPN 설치

pkg 시스템으로 OpenVPN을 설치하는 것은 매우 간단합니다. 패키지 목록을 업데이트하고 VPN 소프트웨어를 설치하려면 다음 명령을 실행하기만 하면 됩니다.

pkg update
pkg install openvpn

SSL 키 쌍을 생성하는 데 사용할 easy-rsa 패키지도 설치해야 합니다.

2단계 - OpenVPN 서버 구성

이 자습서에서는 구성 파일을 OpenVPN에서 제공하는 샘플 파일을 기반으로 합니다. OpenVPN에 대한 구성 폴더를 생성합니다.

mkdir /usr/local/etc/openvpn

예제 server.conf 파일을 새 디렉터리에 복사합니다.

cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /usr/local/etc/openvpn/server.conf

nano 또는 선호하는 텍스트 편집기를 설치합니다.

pkg install nano

편집을 위해 구성 파일을 엽니다.

nano /usr/local/etc/openvpn/server.conf

참고: OpenVPN 구성 파일 형식은 주석 앞에 세미콜론(;) 또는 해시(#)를 붙입니다. 예제에서 세미콜론은 구성 옵션을 설명(비활성화)하는 데 사용되며 해시는 설명에 사용됩니다.

수정하려는 구성 옵션을 알고 있는 경우 이 시점에서 수정할 수 있습니다.

  • 선택적 포트: 기본 포트는 1194이지만 원하는 포트로 변경할 수 있습니다.
  • 선택적 proto: tcp 또는 udp를 선택합니다. 기본값은 괜찮습니다
  • usergroup: 행의 주석을 제거하여 nobody로 설정합니다. 이렇게 하면 보안을 위해 OpenVPN이 더 적은 권한으로 실행됩니다.

user nobody
group nobody

참고: 각 구성은 한 번에 하나의 포트와 프로토콜만 실행할 수 있습니다.

마지막으로 변경 사항을 저장해야 합니다.

3단계 - 서버 인증서 및 키 생성

easy-rsa는 인증서 및 키 생성을 간단하게 만듭니다.

먼저 값을 수정할 것이기 때문에 프로그램을 구성 디렉토리에 복사합니다.

cp -r /usr/local/share/easy-rsa /usr/local/etc/openvpn/easy-rsa

편집을 위해 vars 파일을 엽니다.

nano /usr/local/etc/openvpn/easy-rsa/vars

다음 줄을 수정하여 키 크기를 변경합니다.

export KEY_SIZE=2048

요즘 표준은 2048비트 키이지만 더 안전하지만 협상 속도가 느린 4096비트를 사용할 수도 있습니다.

원하는 경우 나중에 입력할 필요가 없도록 이 파일에서 기본 인증서 및 키 값을 설정할 수도 있습니다.

우리가 사용하는 셸은 tcsh이므로 export 줄을 setenv로 교체해야 합니다. 이것은 source 앞에 있는 sed로 수행됩니다. easy-rsa 디렉토리로 이동합니다(필수).

cd /usr/local/etc/openvpn/easy-rsa/

줄 바꾸기:

cat ./vars | sed -e 's/export /setenv /g' -e 's/=/ /g' | source /dev/stdin

여전히 /usr/local/etc/openvpn/easy-rsa/ 디렉토리에서 먼저 디렉토리를 정리한 다음 인증 기관(CA)을 빌드합니다.

./clean-all
./build-ca

CA 옵션을 설정하라는 메시지가 표시됩니다. 귀하의 세부 정보를 입력하십시오.

Country Name (2 letter code) [US]:GB
State or Province Name (full name) [CA]:Somerset
Locality Name (eg, city) [SanFrancisco]:Bath
Organization Name (eg, company) [Fort-Funston]:Callum
Organizational Unit Name (eg, section) [changeme]:VPN
Common Name (eg, your name or your server's hostname) [changeme]:vpn.example.com
Name [changeme]:Callum's VPN CA
Email Address [mail@host.domain]:callum@example.com

이제 서버 키를 빌드합니다.

./build-key-server server

다시 옵션을 설정합니다. 비밀번호나 선택적 회사 이름이 필요하지 않습니다.

y를 입력하여 키에 서명하고 커밋합니다.

Country Name (2 letter code) [US]:GB
State or Province Name (full name) [CA]:Somerset
Locality Name (eg, city) [SanFrancisco]:Bath
Organization Name (eg, company) [Fort-Funston]:Callum
Organizational Unit Name (eg, section) [changeme]:VPN
Common Name (eg, your name or your server's hostname) [server]:vpn.example.com
Name [changeme]:Callum's VPN Server
Email Address [mail@host.domain]:callum@example.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ENTER
An optional company name []: ENTER

Certificate is to be certified until Feb  5 14:40:15 2025 GMT (3650 days)
Sign the certificate? [y/n]: y

1 out of 1 certificate requests certified, commit? [y/n] y
Write out database with 1 new entries
Data Base Updated

마지막으로 Diffie-Hellman 키를 생성해야 합니다. 키 크기에 따라 다소 시간이 걸릴 수 있습니다.

./build-dh

이제 모든 서버 키와 인증서가 생성되었으므로 OpenVPN 구성 디렉터리에 복사해야 합니다.

cd /usr/local/etc/openvpn/easy-rsa/keys/
cp dh*.pem ca.crt server.crt server.key /usr/local/etc/openvpn/

서버 인증서가 완료되었습니다! 이제 클라이언트 인증서로 넘어갑니다.

4단계 - 클라이언트 인증서 생성

또한 각 클라이언트는 VPN을 인증하고 연결하기 위해 각각 인증서와 키가 필요합니다. /usr/local/etc/openvpn/easy-rsa/ 디렉토리에 있는지 확인하십시오.

cd /usr/local/etc/openvpn/easy-rsa/

다음 명령을 실행합니다. 여기서 clientName은 이 특정 클라이언트 인증서에 사용하려는 이름입니다.

./build-key clientName

국가 이름, 도시 이름 등을 다시 입력하라는 메시지가 표시됩니다. 프로세스는 서버 키 생성과 동일합니다. 이것은 클라이언트의 정보가 되기 위한 것이지만 실제로는 중요하지 않습니다.

암호나 회사 이름이 필요하지 않습니다. y를 입력하여 인증서에 서명하고 커밋합니다.

참고: 각 클라이언트에 대해 서로 다른 인증서를 사용하는 것이 좋으며 이는 기본적으로 OpenVPN에 의해 시행됩니다. 그러나 필요한 경우 OpenVPN 구성에서 비활성화할 수 있습니다(나중에 설명).

2048과 다른 키 크기를 사용한 경우 사용한 키 크기의 파일 이름과 일치하도록 OpenVPN 구성을 수정해야 합니다. 기억이 나지 않는 경우 다음 명령을 사용하여 dh 파일의 올바른 파일 이름을 볼 수 있습니다.

ls /usr/local/etc/openvpn/easy-rsa/keys/dh*.pem

server.conf를 편집합니다.

nano /usr/local/etc/openvpn/server.conf

dh dh2048.pem 줄을 다음으로 바꿉니다.

dh dhSIZE.pem

이전에 2048비트 키에 대한 권장 사항을 따랐다면 변경할 필요가 없습니다.

만들려는 개별 클라이언트 인증서 각각에 대해 이 섹션을 반복합니다.

5단계 - IPv4 NAT 라우팅 구성

FreeBSD는 NAT 라우팅을 허용하고 OpenVPN에 사용할 수 있는 ipfw 방화벽의 일부로 natd를 포함합니다. 이를 사용하려면 /etc/rc.conf를 편집하십시오.

nano /etc/rc.conf

하단에 다음 내용을 추가하십시오.

firewall_enable="YES"
firewall_type="open"

gateway_enable="YES"
natd_enable="YES"
natd_interface="vtnet0"
natd_flags="-dynamic -m"

  • firewall_enablenatd
  • 에 필요한 ipfw 방화벽을 활성화합니다.\n
  • firewall_type=\open\은 방화벽이 기본적으로 트래픽을 허용하도록 합니다.
  • gateway_enablenet.inet.ip.forwarding을 시스템에서 IPv4 라우팅을 허용하는 1로 설정합니다.
  • natd_enable은 실제 NAT 라우터를 활성화합니다.
  • natd_interface는 인터넷에 대한 외부 인터페이스입니다.
  • natd_flags는 NAT를 동적으로 만들고 -m은 포트 번호를 유지합니다

이제 서버를 재부팅하여 ipfwnatd를 로드합니다.

reboot

다시 로그인하십시오. 재부팅 후 sudo tcsh를 다시 실행하여 아직 루트가 아닌 경우 루트가 되십시오.

6단계 - OpenVPN 라우팅 구성 및 DNS 구성

기본적으로 OpenVPN은 VPN을 통해 인터넷 트래픽을 라우팅하도록 클라이언트에 지시하도록 구성되어 있지 않습니다. /usr/local/etc/openvpn/server.conf에서 일부 줄의 주석을 제거하여 OpenVPN을 통해 트래픽을 라우팅하는지 확인합니다.

nano /usr/local/etc/openvpn/server.conf

다음 세 줄을 찾아 주석 처리를 제거하십시오.

push "redirect-gateway def1 bypass-dhcp"

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

미리 설정된 DNS 서버는 OpenDNS용이지만 원하는 DNS로 설정할 수 있습니다(예: 8.8.8.88.8.4.4가 있는 Google DNS).

선택적 설정:

주석을 제거하여 클라이언트가 서로의 IP와 직접 통신하도록 허용할 수도 있습니다.

client-to-client

앞에서 언급한 것처럼 여러 클라이언트에 대해 동일한 키와 인증서를 사용하려는 경우(약간 덜 안전함) 이 행의 주석을 제거하십시오.

duplicate-cn

다음 줄을 사용하여 압축을 활성화 및 비활성화할 수 있습니다.

comp-lzo

다음 줄 중 하나의 주석을 제거하여 암호를 수동으로 설정할 수 있습니다.

cipher BF-CBC        # Blowfish (default)
cipher AES-128-CBC   # AES
cipher DES-EDE3-CBC  # Triple-DES

참고: 어떤 암호를 사용하든 나중에 생성할 클라이언트 구성 파일에도 정의해야 합니다.

aes-256-cbc와 같은 추가 암호도 사용할 수 있습니다.

7단계 - OpenVPN 시작하기

다음 줄을 /etc/rc.conf에 추가하여 부팅 시 OpenVPN을 로드하고 service 명령으로 로드하도록 활성화합니다.

nano /etc/rc.conf

파일 맨 아래에 다음 행을 추가하십시오.

openvpn_enable="YES"
openvpn_configfile="/usr/local/etc/openvpn/server.conf"

이제 OpenVPN 서버가 완전히 구성되었으며 부팅 시 로드됩니다.

다음을 사용하여 서버를 수동으로 시작합니다.

service openvpn start

예상 출력:

add net 10.8.0.0: gateway 10.8.0.2

이제 OpenVPN 서버가 실행 중입니다.

8단계 - 클라이언트 파일 구성

서버에서 각 클라이언트에 대한 구성 파일을 생성합니다.

먼저 작업할 폴더를 만듭니다.

mkdir -p /usr/local/etc/openvpn/clients/clientName

clientName을 이전에 인증서를 생성하는 동안 설정한 클라이언트 이름으로 만듭니다. (작업 디렉토리일 뿐이므로 정확히 어떻게 설정하는지는 중요하지 않습니다.)

새 디렉터리로 이동합니다.

cd /usr/local/etc/openvpn/clients/clientName/

easy-rsa로 생성한 클라이언트 키 및 인증서와 샘플 client.conf 파일을 복사합니다. clientName을 이전에 .key.crt 파일에 사용한 이름으로 바꾸십시오.

cp /usr/local/etc/openvpn/easy-rsa/keys/clientName.crt /usr/local/etc/openvpn/easy-rsa/keys/clientName.key ./
cp /usr/local/share/examples/openvpn/sample-config-files/client.conf ./client.conf
cp /usr/local/etc/openvpn/ca.crt ./

다시 말하지만 clientName은 이전에 사용했던 것입니다.

client.conf 파일을 편집합니다.

nano ./client.conf

서버의 IP 주소(ifconfig로 얻을 수 있음)와 포트 번호를 포함하도록 remote 줄을 업데이트합니다. 1194가 기본값입니다.

remote your_server_ip 1194

참고: 서버의 cipher 또는 comp-lzo 설정을 수정한 경우 client.conf 파일에 반영되어야 합니다. 이전에 수행한 것과 동일한 설정을 사용합니다. 예를 들어:

cipher aes-256-cbc
;comp-lzo

이 설정은 aes-256-cbc 암호를 사용하고 압축을 비활성화합니다.

서버 구성에서 proto 줄을 변경한 경우 클라이언트에도 반영해야 합니다.

이 줄이 이전에 설정한 것과 일치하는지 확인하십시오. 서버 측에서 아무 것도 변경하지 않은 경우 여기에서 변경하지 마십시오.

이제 약간의 가사일입니다. 단일 구성 파일에 인증서와 키를 포함할 것입니다. 이렇게 하면 개별 고객에게 더 쉽게 전송할 수 있습니다. 또는 구성 파일과 키 및 두 개의 인증서 파일을 클라이언트에 별도로 다운로드할 수 있습니다.

동일한 client.conf 파일에서 인증서 및 키 파일 이름을 주석 처리합니다.

;ca ca.crt
;cert client.crt
;key client.key

변경 사항을 저장합니다.

마지막으로 ca.crt, clientName.crtclientName.key 를 삽입해야 합니다. 구성 파일의 파일. cat 또는 nano 또는 가장 편한 것을 사용하고 OpenVPN에 적절한 변수를 사용하여 내용을 복사하여 붙여넣거나 한 줄을 사용할 수 있습니다. 아래에 표시된 스크립트.

이 스크립트를 실행하고 메시지가 표시되면 clientName을(를) 입력하십시오. 스크립트는 인증서와 키 파일을 client.conf 파일에 추가하고 적절한 변수 이름과 OpenVPN이 기대하는 줄바꿈을 추가합니다.

echo "Enter clientName:" && set CLIENTNAME = $< && printf "\n<ca>\n" >> ./client.conf && cat ./ca.crt >> ./client.conf && printf "</ca>\n" >> ./client.conf && printf "\n<cert>" >> ./client.conf && grep -v '^ ' ./$CLIENTNAME.crt | grep -v 'Certificate' >> ./client.conf && printf "</cert>\n" >> ./client.conf && printf "\n<key>\n" >> ./client.conf && cat ./$CLIENTNAME.key >> ./client.conf && printf "</key>\n" >> ./client.conf

이것은 긴 명령이므로 오른쪽 끝까지 스크롤해야 합니다.

nano 또는 cat로 완성된 client.conf 파일을 살펴보세요. 하단의 파일에 추가된 키와 인증서가 표시되어야 합니다.

완료되었습니다! 지금 해야 할 일은 client.conf 파일을 클라이언트에 배포하는 것입니다. 대부분의 클라이언트는 .conf보다 .ovpn 확장자를 선호하므로 로컬에서 파일 이름을 my_vpn.ovpn 또는 이와 유사한 이름으로 바꾸는 것이 좋습니다.

각 클라이언트에 대해 이 섹션을 반복합니다. 기본적으로 별도의 인증서를 사용하거나 원하는 경우 각 클라이언트에서 동일한 클라이언트 인증서를 사용하십시오.

결론 및 클라이언트 설정

이제 작동하는 OpenVPN 서버가 있어야 합니다!

마지막 단계에서 생성한 클라이언트 구성 파일(/usr/local/etc/openvpn/clients/clientName/client.conf)을 로컬 시스템에 다운로드합니다. SCP 또는 SFTP와 같은 안전한 방법을 사용하여 파일을 다운로드하십시오.

또한 로컬 컴퓨터에 OpenVPN 클라이언트를 설치합니다. OpenVPN에는 Windows 클라이언트가 있습니다.

클라이언트 구성 파일의 이름이 예상대로 지정되었는지 확인하십시오. 이것은 일반적으로 my_vpn.ovpn과 같은 이름입니다.

파일을 두 번 클릭하거나 클라이언트의 예상 디렉토리로 이동하십시오.

클라이언트를 시작하고 적절한 OpenVPN 서버에 연결합니다.

VPN이 작동하는지 확인하려면 http://www.whatismyip.com/과 같은 IP 주소 검사기를 사용하십시오. 표시된 IP는 OpenVPN 서버의 IP와 일치해야 합니다.

축하해요! 새 OpenVPN 서버에 연결했습니다.