요즘 VPN 기술이 더 대중화되고 있습니다. 일반 사용자는 VPN을 사용하여 인터넷에 안전하게 액세스합니다. 또한 로컬에서 차단된 웹사이트와 서비스를 우회하고 외부의 악성 행위로부터 보호하는 데 도움이 됩니다. VPN 서버에 연결할 때 컴퓨터와 서버 사이에 외부에서 액세스할 수 없는 안전한 터널이 있으므로 VPN 서버가 인터넷 액세스 포인트가 됩니다. 무료와 유료를 포함하여 많은 VPN 서비스가 있지만 어떤 이유로 작동하지 않으면 항상 자신의 VPN 서버를 구성할 수 있습니다.
자체 VPN을 운영하려면 VPS 서버를 임대 해야 합니다 . VPN 연결을 생성할 수 있는 소프트웨어는 여러 가지가 있으며, 지원하는 운영 체제와 사용하는 알고리즘에 따라 차이가 있습니다. VPN 서버를 설정하는 두 가지 독립적인 접근 방식을 살펴보겠습니다. 첫 번째는 이미 구식으로 여겨지고 보안에 취약하지만 설정이 매우 간편한 PPTP 프로토콜 기반 방식입니다. 두 번째는 최신 보안 소프트웨어인 OpenVPN을 사용하지만, 타사 클라이언트 애플리케이션을 설치해야 하고 설정 과정이 더 복잡합니다.
테스트 환경에서는 Ubuntu Server 18.04로 구동되는 가상 서버를 사용할 것입니다. 방화벽은 서버에서 꺼질 것입니다. 방화벽의 구성은 별도의 문서가 필요하기 때문입니다. Windows 10에서의 설정 프로세스를 설명하겠습니다.
예비
어떤 VPN 서버를 선택하든 인터넷 액세스는 운영 체제의 통합된 수단을 통해 설정됩니다. 외부 서비스 인터페이스를 통해 인터넷 액세스를 열려면 인터페이스 간 패킷 전달을 허용하고 네트워크 주소 변환을 구성해야 합니다.
패킷 포워딩을 활성화하려면 "/etc/sysctl.conf" 파일을 열고 "net.ipv4.ip_forward" 매개변수 값을 1 로 변경하십시오.
컴퓨터를 재부팅하지 않고 변경 사항을 적용하려면 다음 명령을 실행하세요.
sudo sysctl -p /etc/sysctl.conf
네트워크 주소 변환(NAT)은 iptables를 사용하여 구성합니다 . 먼저 "ip link show" 명령을 실행하여 외부 네트워크 인터페이스의 이름을 확인하세요 . 다음 단계에서 필요합니다. 저희의 이름은 "ens3" 입니다.
모든 로컬 네트워크 노드에 대해 외부 인터페이스에서 네트워크 주소 변환을 활성화합니다.
sudo iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
서버 인터페이스의 실제 이름을 지정해야 하며, 당사와 다를 수 있습니다.
기본적으로 iptables에서 생성된 모든 규칙은 서버 재시작 후 초기화됩니다. 이를 방지하려면 "iptables-persistent" 유틸리티를 사용하십시오. 다음 패키지를 설치하세요.
sudo apt install iptables-persistent
설치 과정 중 어느 시점에서 현재 iptables 규칙을 저장할지 묻는 구성 창이 나타납니다. 규칙이 이미 정의되어 있으므로 "예"를 두 번 클릭하여 확인하십시오. 이제 서버가 재시작되면 규칙이 자동으로 적용됩니다.
PPTP 서버
서버 구성
패킷을 설치하세요:
sudo apt install pptpd
설치가 완료되면 아무 텍스트 편집기로 "/etc/pptpd.conf" 파일을 열고 다음과 같이 편집하십시오.
option /etc/ppp/pptpd-options #path to the settings file
logwtmp #client connections logging mechanism
connections 100 #number of simultaneous connections
localip 172.16.0.1 #the address that will serve as a client gateway
remoteip 172.16.0.2-200 #range of addresses
그 후, “/etc/ppp/pptpd-options” 파일을 편집하십시오 . 대부분의 매개변수는 기본값으로 설정되어 있습니다.
#name of the service for new client records
name pptpd
#restrict obsolete authentication methods
refuse-pap
refuse-chap
refuse-mschap
#allow a more secure authentication method
require-mschap-v2
#enable encryption
require-mppe-128
#specify dns servers for clients (use any available servers)
ms-dns 8.8.8.8
ms-dns 8.8.4.4
proxyarp
nodefaultroute
lock
nobsdcomp
novj
novjccomp
nologfd
다음 단계에서는 클라이언트 연결에 대한 기록을 생성해야 합니다. 예를 들어, "vpnuser" 라는 사용자와 "1" 이라는 비밀번호를 추가하고 동적 주소 지정을 허용한다고 가정해 보겠습니다. "/etc/ppp/chap-secrets" 파일을 열고 파일 끝에 사용자 매개변수를 포함한 다음 줄을 추가합니다.
vpnuser pptpd 1 *
“pptpd” 값은 “pptpd-options” 파일에 지정한 서비스 이름입니다 . “*” 대신 고정 IP 주소를 지정할 수 있습니다. 결과적으로 “chap-secrets” 파일은 다음과 같아야 합니다.
설정을 적용하려면 pptpd 서비스를 재설정하고 자동 로딩에 추가하십시오.
sudo systemctl restart pptpd
sudo systemctl enable pptpd
서버 구성이 완료되었습니다.
클라이언트 구성
"시작" - "설정" - "네트워크 및 인터넷" - "VPN"을 열고 "VPN 연결 추가"를 클릭하세요 .
열린 창에 연결 매개변수를 입력하고 "저장"을 클릭하십시오.
- VPN 제공자: “Windows(내장)”
- 연결 이름: “vpn_connect” (원하는 이름을 선택할 수 있습니다)
- 서버 이름 또는 주소: (서버의 외부 IP 주소를 지정하세요)
- VPN 유형: "자동"
- 로그인 정보 유형: “사용자 이름 및 비밀번호”
- 사용자 이름 : vpn사용자 (서버의 "chap-secrets" 파일에 지정된 이름)
- 암호: 1 (예: "chap-secrets" 파일)
매개변수를 저장하면 창에 새 VPN 연결이 표시됩니다. 해당 연결을 마우스 왼쪽 버튼으로 클릭하고 "연결"을 선택하세요 . 연결에 성공하면 "연결됨" 상태가 표시됩니다.
옵션에서 클라이언트와 서버의 내부 주소를 확인할 수 있습니다. "대상 주소" 필드에는 외부 서버 주소가 표시됩니다.
연결되면 서버의 내부 IP 주소( 저희의 경우 172.16.0.1) 가 모든 발신 패킷에 대한 기본 게이트웨이가 됩니다.
온라인 서비스를 사용하면 컴퓨터의 외부 IP 주소가 이제 VPN 서버의 IP 주소와 동일한지 확인할 수 있습니다.
OpenVPN 서버
서버 구성
추가 구성을 위해서는 루트 접근 권한이 필요하므로 현재 사용자의 권한 수준을 높여보겠습니다.
sudo -s
필요한 패키지를 모두 설치하세요. 암호화 키 관리를 위해 "Easy-RSA" 패키지가 필요합니다 .
apt install openvpn easy-rsa iptables-persistent
UDP 프로토콜을 통해 포트 1194에서 들어오는 연결을 허용하고 iptables 규칙을 적용합니다.
sudo iptables -I INPUT -p udp --dport 1194 -j ACCEPT
sudo netfilter-persistent save
"Easy-RSA" 패키지에서 복사한 파일로 디렉토리를 만들고 해당 디렉토리로 이동합니다.
make-cadir ~/openvpn
cd ~/openvpn
공개 키 인프라(PKI)를 생성합니다.
./easyrsa init-pki
인증 기관(CA) 루트 인증서를 생성합니다.
./easyrsa build-ca
생성 과정에서 비밀번호를 설정하고 기억하라는 메시지가 표시됩니다. 또한 질문에 답하고 키 소유자 정보를 입력해야 합니다. 대괄호 안에 제공된 기본값은 그대로 두어도 됩니다. "Enter" 키를 눌러 입력을 완료하세요.
개인 키와 인증서 요청을 생성하세요. 인수로 임의의 이름을 지정하세요. 이 경우에는 "vpn-server"입니다.
./easyrsa gen-req vpn-server nopass
일반 이름 값은 기본값으로 둡니다.
생성된 서버 인증서 요청에 서명합니다.
./easyrsa sign-req server vpn-server
이 단계에서는 서명을 확인하려면 "예"라고 대답한 다음 루트 인증서 생성 중에 생성된 비밀번호를 입력합니다.
Diffie-Hellman 매개변수를 생성합니다. 이 매개변수는 서버와 클라이언트 간의 안전한 키 교환에 사용됩니다.
./easyrsa gen-dh
필요한 모든 파일이 생성되었습니다. OpenVPN 작업 디렉터리에 "keys" 폴더를 만들어 키를 저장하고 생성된 파일을 여기에 복사해 보겠습니다.
mkdir /etc/openvpn/keys
sudo cp pki/ca.crt pki/issued/vpn-server.crt pki/private/vpn-server.key pki/dh.pem /etc/openvpn/keys
NAT를 사용하여 구성 iptables 규칙. 다음 이름의 파일을 만듭니다. nat 편집을 위해 열어주세요 /etc/openvpn/ 디렉토리.
#!/bin/sh
# Reset firewall settings
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# (eth0 in our case, may vary)
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# (eth0 in our case, may vary)
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
# Allow OpenVPN connections (eth0 in our case, may vary)
iptables -A INPUT -i eth0 -p udp --dport 1194 -j ACCEPT
iptables -A INPUT -i tun0 -j ACCEPT
# (eth0 in our case, may vary):
iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
# (eth0 in our case, may vary)
iptables -A FORWARD -i eth0 -o tun0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# Enable masquerading for the local network (eth0 in our case, may vary)
iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE
# Deny incoming connections from outside
iptables -A INPUT -i eth0 -j DROP
# Deny transit traffic from outside (eth0 in our case, may vary)
iptables -A FORWARD -i eth0 -o tun0 -j DROP
sudo netfilter-persistent save
파일을 저장하고 실행 가능하게 만듭니다.
sudo chmod 755 /etc/openvpn/nat
서버 구성 템플릿을 복사합니다.
cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/
"/etc/openvpn/server.conf" 파일을 편집 모드로 열고 다음 줄이 포함되어 있는지 확인한 후 필요한 경우 수정하십시오.
#Port, protocol, and interface
port 1194
proto udp
dev tun
#Path to the encryption keys
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/vpn-server.crt
key /etc/openvpn/keys/vpn-server.key
dh /etc/openvpn/keys/dh.pem
#SHA256 Hashing Algorithm
auth SHA256
#Switching off additional encryption
#tls-auth ta.key 0
#Network parameters
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /var/log/openvpn/ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
#Ping every 10 seconds to check the connection.
keepalive 10 120
#Set up AES-256 encryption for the tunnel.
cipher AES-256-GCM
#Demoting the service OpenVPN after launch
user nobody
group nogroup
#Switching on parameters saving after reboot
persist-key
persist-tun
#Set log verbosity
verb 3
#Redirecting logs
log-append /var/log/openvpn/openvpn.log
#Script the rule installation launch.
up /etc/openvpn/nat
서버에서 트래픽 전달을 활성화합니다.
sudo sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
구성을 적용하려면 OpenVPN을 시작합니다.
systemctl restart openvpn@server
서버 구성이 완료되었습니다!
클라이언트 구성
OpenVPN 공식 웹사이트( https://openvpn.net )에 접속하여 "커뮤니티" 섹션 으로 이동하세요.
아래로 스크롤하여 운영 체제 버전에 맞는 설치 프로그램을 다운로드하세요. 이 경우에는 Windows 11 ARM64입니다.
모든 매개변수를 기본값으로 두고 애플리케이션을 설치합니다.
다음 단계에서는 서버에서 다음 파일을 준비하고 클라이언트 컴퓨터로 전송해야 합니다.
- 공개 키와 개인 키
- 인증 센터 키 사본
- 설정 파일 템플릿.
서버에 연결하고 권한을 상승시키고 생성된 디렉토리로 이동합니다. "~/openvpn".
sudo -s
cd ~/openvpn
클라이언트에 대한 개인 키와 인증서 요청을 생성합니다. 인수로 임의의 이름을 지정하세요. 이 경우에는 "client1"입니다.
./easyrsa gen-req client1 nopass
루트 인증서를 생성할 때 설정한 비밀번호를 입력하고 일반 이름 값은 기본값으로 둡니다.
생성된 클라이언트 인증서 요청에 서명합니다.
./easyrsa sign-req client client1
이 단계에서는 서명을 확인하려면 "예"라고 대답한 다음 루트 인증서 생성 중에 생성된 비밀번호를 입력합니다.
편의상 홈 디렉토리에 'client1'이라는 이름의 폴더를 만들고 클라이언트 컴퓨터로 전송할 모든 파일을 여기에 복사해 보겠습니다.
mkdir ~/client1
cp pki/issued/client1.crt pki/private/client1.key pki/ca.crt ~/client1/
클라이언트 설정 파일 템플릿을 같은 디렉터리에 복사합니다. 복사할 때 파일 확장자를 “.ovpn” 으로 변경하십시오.
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client1/client.ovpn
클라이언트에게 배포할 수 있도록 "~/client1/" 디렉토리와 모든 파일의 소유자를 변경합니다 . 이 예에서는 "mihail"을 소유자로 변경해 보겠습니다.
chown -R mihail:mihail ~/client1
클라이언트 컴퓨터로 이동하여 "~/client1/" 폴더의 내용을 복사하십시오. Putty에 포함된 "PSCP" 유틸리티를 사용하면 이 작업을 수행할 수 있습니다 .
PSCP -r mihail@[IP_сервера]:/home/mihail/client1 c:\client1
"ca.crt" , "client1.crt" , "client1.key"와 같은 키 파일은 원하는 위치에 저장할 수 있습니다 . 저희의 경우, 이 파일들은 "c:\Program Files\OpenVPN\keys" 폴더에 있으며 , 설정 파일 "client.ovpn"은 "c:\Program Files\OpenVPN\config" 디렉토리 에 저장했습니다.
이제 클라이언트 설정을 진행해 보겠습니다. 텍스트 편집기로 "c:\Program Files\OpenVPN\config\client.ovpn" 파일을 열고 다음 줄을 수정하세요.
#announce that this is the client
client
#interface and protocol just like on the server
dev tun
proto udp
#IP address of the server and port
remote ip_address 1194
#saving parameters after reload
persist-key
persist-tun
#key paths
ca “c:\\Program Files\\OpenVPN\\keys\\ca.cert”
cert “c:\\Program Files\\OpenVPN\\keys\\client1.crt”
key “c:\\Program Files\\OpenVPN\\keys\\client1.key”
#enable server verification
remote-cert-tls server
#disable extra encryption
#tls-auth ta.key 1
cipher AES-256-CBC
auth-nocache
verb 3
나머지는 그대로 두세요.
파일을 저장하고 클라이언트 애플리케이션 "OpenVPN GUI" 를 실행하세요.
작업 표시줄의 앱 아이콘을 마우스 오른쪽 버튼으로 클릭하고 "연결"을 선택하세요 . 연결에 성공하면 아이콘이 녹색으로 바뀝니다.
온라인 서비스를 사용하여 공용 IP 주소가 변경되었고 이제 서버의 IP 주소와 동일한지 확인하세요.