본문으로 바로가기

리눅스 서버에서 l2tp방식으로 VPN서버를 구축할 것이다.

pptp방식으로는 이전에 이미 글을 올렸지만 pptp 방식은 구글 클라우드(GCP) 에서는 쓸 수가 없다. 

또한 보안적으로도 l2tp가 pptp 보다는 이점이 있다고 한다.

 

ㅁ 이 글은 Google Cloud Platform 에서 Cent OS 7을 기준으로 작성되었습니다.

 

GCP CentOS 7에서 VPN 서버 구축하기

GCP 세팅

 

먼저 GCP에서 Cent OS로 인스턴스를 만들어 줍니다. 무료로 사용할 수 있는 미국리전의 f1-micro로도 저에게는 쓰기가 불편함 없는 속도가 나왔습니다. (프리미엄 네트워크 기준)

 

프리미엄은 아래 외부 IP로 들어가서

해당 인스턴스의 IP 유형을 고정으로 바꾸면 자동으로 프리미엄이 적용됩니다. 아마 고정 IP는 1개인가 까지 무료일 겁니다.

 

 

 

그 다음은 VPN 트래픽을 허용하기 위해 방화벽 포트를 열어줘야합니다.

 

다음과 같이 UDP 프로토콜의 500, 4500 번 포트를 열어줍니다.

 

xl2tpd + IPSec 설치

이제 ssh를 통해 CentOS에 접속해줍니다. (바로 사용하시고 싶으시면 건너뛰고 밑으로 내려서 스크립트를 받아 실행해주세요)

 

sudo su

명령어를 통해서 root로 진행합니다.

 

yum install epel-release -y
yum install xl2tpd libreswan -y

명령어를 입력해서 xl2tpd를 설치합니다. 

 

그 다음에는 

 

vim /etc/sysctl.conf

 

로 파일을 열어서

vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.all.arp_announce=2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.ip_forward = 1
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_source_route = 0

를 붙여 넣어줍니다.

sysctl -p

로 적용합니다.

 

다음은

vim /etc/ipsec.d/l2tp_psk.conf
conn L2TP-PSK-NAT
     rightsubnet=vhost:%priv
     also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
     authby=secret
     pfs=no
     auto=add
     keyingtries=3
     dpddelay=30
     dpdtimeout=120
     dpdaction=clear
     rekey=no
     ikelifetime=8h
     keylife=1h
     type=transport
     left=IP주소
     leftprotoport=17/1701
     right=%any
     rightprotoport=17/%any

left= 뒤에는 자신의 ip주소로 변경하여 해당 파일에 써줍니다. ip주소는 내부 ip 주소를 말하며, ifconfig로 확인할 수 있습니다.

 

vim /etc/ipsec.secrets
IP주소 %any: PSK "비밀번호"

다음은 공용 비밀번호를 설정해야 합니다. 

IP주소를 한 번 더 입력해야 하고, 비밀번호를 입력해야 합니다. 비밀번호 양 옆 "는 꼭 입력해줘야 합니다.

 

 

이제 ipsec을 켭니다.

ipsec setup start
ipsec verify
systemctl enable ipsec

출력되는 결과가 OK와 ENABLED만 있다면 문제가 없는 겁니다.

 

 

mv /etc/xl2tpd/xl2tpd.conf /etc/xl2tpd/xl2tpd.conf.old
mv /etc/ppp/options.xl2tpd /etc/ppp/options.xl2tpd.old

기존 파일을 사용하지 않기에 옮겨둡니다.

vim /etc/xl2tpd/xl2tpd.conf
[global]
listen-addr = ip주소
ipsec saref = yes
[lns default]
ip range = 192.168.100.128-192.168.100.254
local ip = 192.168.100.99
require chap = yes
refuse pap = yes
require authentication = yes
name = LinuxVPNserver
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

다음과 같이 적어줍니다. listen-addr에는 ip주소를 적습니다.

 

vim /etc/ppp/options.xl2tpd
ipcp-accept-local
ipcp-accept-remote
ms-dns  8.8.8.8
ms-dns  4.2.2.4
noccp
noauth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000

다음과 같이 적어줍니다.

 

이제 vpn 계정을 설정해야 합니다.

vim /etc/ppp/chap-secrets
USERNAME * PASSWORD *

USERNAME과 PASSWORD 를 각각 채워주시면 됩니다.

 

systemctl start xl2tpd
systemctl enable xl2tpd
systemctl status xl2tpd

l2tp를 켜줍니다.

 

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p gre -j ACCEPT
firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --permanent --add-rich-rule='rule protocol value="esp" accept'
firewall-cmd --permanent --add-rich-rule='rule protocol value="ah" accept'
firewall-cmd --permanent --add-port=1701/udp
firewall-cmd --permanent --add-port=500/udp 
firewall-cmd --permanent --add-port=4500/udp 
firewall-cmd --permanent --add-service="ipsec"
firewall-cmd --reload

리눅스 방화벽을 설정합니다.

 

iptables -A INPUT -p gre -j ACCEPT
iptables -A OUTPUT -p gre -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 192.168.100.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o 네트워크인터페이스 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables

iptable을 설정합니다.

네트워크인터페이스는 ifconfig 명령어를 통해 확인할 수 있습니다. (여기서는 eth0)

 

iptables-restore  < /etc/sysconfig/iptables

iptables는 껐다켜면 설정이 사라져서 재부팅 할 때마다 위 명령어를 통해 다시 설정해줘야 합니다.

 

만약 귀찮다면 /etc/rc.d/rc.local 파일에 등록해서 자동으로 실행하도록 할 수 있습니다.

echo -e "iptables-restore  < /etc/sysconfig/iptables\n" >> /etc/rc.d/rc.local
# rc.local 파일에 실행권한 부여
chmod +x /etc/rc.d/rc.local

 

setsebool -P daemons_use_tty 1

 

마지막으로 SElinux를 설정합니다.

 

그러면 이제 VPN 서버 세팅이 끝났으며 클라이언트로 연결해서 사용할 수 있습니다.

vpn_l2tp.sh
0.00MB

만약 전체 과정이 귀찮으시다면 위 파일을 다운 받고

sudo bash vpn_l2tp.sh

로 실행한 뒤에 shared key, username, password만 입력하면 바로 구축할 수 있습니다. 

 

 

참고 문서: https://www.tuxtips.net/how-to-install-l2tp-vpn-server-on-centos-7-linux/

 

Windows에서 연결하기

Mac이나 안드로이드에서는 서버 주소, username, password, shared key 만 입력하면 쉽게 설정할 수 있습니다.

하지만 윈도우에서는 조금 설정이 필요합니다.

 

우선 위와 같이 서버 주소와 Pre-shared key, User name, password로 설정을 해줍니다. 그런데 아마 이대로 Connect를 해보면 연결이 안될 겁니다.

 

어댑터 설정에 들어갑니다.

 

이렇게 나올텐데

 

이렇게 바꿔줍니다.

 

그 다음은 관리자 권한으로 powershell을 켭니다.

REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f

를 입력해줍니다.

 

 

이제 재부팅을 한 뒤에 다시 연결을 해보면 정상적으로 동작할 겁니다. 참고로 여러 개의 VPN을 설정한다면 아까 어댑터 옵션은 매번 변경해줘야 하지만 위의 레지스트리 설정은 한 번만 하면 여러 VPN을 써도 적용이 됩니다.

 

 

참고 문서: https://superuser.com/questions/1298513/l2tp-ipsec-vpn-fails-to-connect-on-windows-10-works-fine-on-ios