在 CentOS 架設 L2TP/IPsec VPN
發表於 : 2017-08-31 14:31:15
https://atifans.net/articles/setup-l2tp ... on-centos/
之前嘗試過PPTP和OpenVPN,但PPTP太弱,而OpenVPN太依賴第三方軟體,因此想說來試試看L2TP/IPsec
架設的軟體使用epel上的strongSwan和xl2tpd,不用openSwan是因OSX在連線的時候會遇到伺服器端錯誤,據說是openSwan本身的問題
安裝前先把必要套件補完
1
yum install strongswan xl2tpd
strongSwan裝完之後可以在/etc/strongswan設定,裏頭的strongswan.conf沒特別設定不需要去動,預設是所有plugin都載入
在這之前,記得先調整kernel和iptables
1
2
3
4
5
6
7
8
9
sed -i 's/net\.ipv4\.ip_forward[ ]*=[ ]*0/net\.ipv4\.ip_forward = 1/g' /etc/sysctl.conf && sysctl -p # 啟動ip_forward
# 防火牆規則僅供參考
iptables -A INPUT -p esp -j ACCEPT # ESP
iptables -A INPUT -p ah -j ACCEPT # AH
iptables -A INPUT -p udp --dport 500 -j ACCEPT # IKE
iptables -A INPUT -p udp --dport 4500 -j ACCEPT # NAT-T
iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT # 強制l2tp透過ipsec存取
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE # 轉送VPN流量
/etc/init.d/iptables save
接著開始設定IPsec連線部分,我這邊使用PSK,其他驗證方法可以上官網文件查
/etc/strongswan/ipsec.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
config setup
conn %default
ikelifetime=60m
keylife=20m
rekeymargin=3m
keyingtries=1
conn l2tp
keyexchange=ikev1 # IKE版本
left=>>>>{對外IP}<<<<<<
leftsubnet=0.0.0.0/0
leftprotoport=17/1701 # l2tp udp流量
authby=secret # PSK驗證
leftfirewall=no # 不要讓strongswan更改防火牆
right=%any # 任意IP
rightprotoport=17/%any # 任意port udp流量
type=transport # ipsec transport mode
auto=add
/etc/strongswan/ipsec.secrets
1
2
# ipsec.secrets - strongSwan IPsec secrets file
: PSK "A long preshared key for ipsec"
IPsec這邊設定和網路上的不一樣是因為新的strongswan使用charon來處理IKEv1,而不是以往的pluto
而且有時候設定太多反而會有一些奇怪的錯誤,於是就留預設值
如此一來IPsec的部分就完成了,再來是L2TP
/etc/xl2tpd/xl2tpd.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
[global]
listen-addr = >>>>{對外IP}<<<<
[lns default]
ip range = 172.16.1.100-172.16.1.200; VPN使用者配發的IP段
local ip = 172.16.1.1; VPN Server本身的聯絡IP
assign ip = yes
;refuse chap = yes
;refuse pap = yes <<<我個人覺得有ipsec使用pap沒關係,而且某些情況下(例如pam),必須使用
require authentication = yes
unix authentication = yes; 使用pam驗證,用密碼檔記得刪掉這行
name = NyanVPNServer; 這個名字等一下會用到,可以任意取名
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
如果上面的xl2tpd.conf使用了pam驗證,要修改下面這個
/etc/pam.d/ppp
1
2
3
4
5
#%PAM-1.0
auth required pam_nologin.so
auth required pam_unix.so
account required pam_unix.so
session required pam_unix.so
PPP的部分
/etc/ppp/options.xl2tpd
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8 # 推送的DNS資訊
ms-dns 8.8.4.4
# ms-dns 192.168.1.1
# ms-dns 192.168.1.3
# ms-wins 192.168.1.2
# ms-wins 192.168.1.4
noccp
auth
crtscts
idle 1800
#mtu 1410
#mru 1410
mtu 1200 # 我也不知道mtu/mru怎麼設,不過這個會動
mru 1200
nodefaultroute
debug
lock
proxyarp
connect-delay 5000
login # 透過PAP使用系統密碼驗證,這也是為什麼前面不能拒絕PAP的原因
#require-mschap-v2 強迫使用MS-CHAP-V2
最後是連線密碼,CHAP和PAP的密碼檔是分開的,依照前面設定的內容和使用者的選擇而定
/etc/ppp/*-secrets
1
2
3
4
5
# Secrets for authentication using PAP
# client(帳號) server(前面提到的name) secret(密碼) IP addresses(配發的IP)
alice NyanVPNServer "AliceIsCute" *
# 下面這個是PAM的用法
* NyanVPNServer "" *
設定就到這邊為止,接著就可以啟動VPN了
1
2
service strongswan start
service xl2tpd start
成功連上VPN之後,如果無法連外,檢查看看iptables的FORWARD chain是不是有阻擋連線的行為
之前嘗試過PPTP和OpenVPN,但PPTP太弱,而OpenVPN太依賴第三方軟體,因此想說來試試看L2TP/IPsec
架設的軟體使用epel上的strongSwan和xl2tpd,不用openSwan是因OSX在連線的時候會遇到伺服器端錯誤,據說是openSwan本身的問題
安裝前先把必要套件補完
1
yum install strongswan xl2tpd
strongSwan裝完之後可以在/etc/strongswan設定,裏頭的strongswan.conf沒特別設定不需要去動,預設是所有plugin都載入
在這之前,記得先調整kernel和iptables
1
2
3
4
5
6
7
8
9
sed -i 's/net\.ipv4\.ip_forward[ ]*=[ ]*0/net\.ipv4\.ip_forward = 1/g' /etc/sysctl.conf && sysctl -p # 啟動ip_forward
# 防火牆規則僅供參考
iptables -A INPUT -p esp -j ACCEPT # ESP
iptables -A INPUT -p ah -j ACCEPT # AH
iptables -A INPUT -p udp --dport 500 -j ACCEPT # IKE
iptables -A INPUT -p udp --dport 4500 -j ACCEPT # NAT-T
iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT # 強制l2tp透過ipsec存取
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE # 轉送VPN流量
/etc/init.d/iptables save
接著開始設定IPsec連線部分,我這邊使用PSK,其他驗證方法可以上官網文件查
/etc/strongswan/ipsec.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
config setup
conn %default
ikelifetime=60m
keylife=20m
rekeymargin=3m
keyingtries=1
conn l2tp
keyexchange=ikev1 # IKE版本
left=>>>>{對外IP}<<<<<<
leftsubnet=0.0.0.0/0
leftprotoport=17/1701 # l2tp udp流量
authby=secret # PSK驗證
leftfirewall=no # 不要讓strongswan更改防火牆
right=%any # 任意IP
rightprotoport=17/%any # 任意port udp流量
type=transport # ipsec transport mode
auto=add
/etc/strongswan/ipsec.secrets
1
2
# ipsec.secrets - strongSwan IPsec secrets file
: PSK "A long preshared key for ipsec"
IPsec這邊設定和網路上的不一樣是因為新的strongswan使用charon來處理IKEv1,而不是以往的pluto
而且有時候設定太多反而會有一些奇怪的錯誤,於是就留預設值
如此一來IPsec的部分就完成了,再來是L2TP
/etc/xl2tpd/xl2tpd.conf
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
[global]
listen-addr = >>>>{對外IP}<<<<
[lns default]
ip range = 172.16.1.100-172.16.1.200; VPN使用者配發的IP段
local ip = 172.16.1.1; VPN Server本身的聯絡IP
assign ip = yes
;refuse chap = yes
;refuse pap = yes <<<我個人覺得有ipsec使用pap沒關係,而且某些情況下(例如pam),必須使用
require authentication = yes
unix authentication = yes; 使用pam驗證,用密碼檔記得刪掉這行
name = NyanVPNServer; 這個名字等一下會用到,可以任意取名
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
如果上面的xl2tpd.conf使用了pam驗證,要修改下面這個
/etc/pam.d/ppp
1
2
3
4
5
#%PAM-1.0
auth required pam_nologin.so
auth required pam_unix.so
account required pam_unix.so
session required pam_unix.so
PPP的部分
/etc/ppp/options.xl2tpd
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8 # 推送的DNS資訊
ms-dns 8.8.4.4
# ms-dns 192.168.1.1
# ms-dns 192.168.1.3
# ms-wins 192.168.1.2
# ms-wins 192.168.1.4
noccp
auth
crtscts
idle 1800
#mtu 1410
#mru 1410
mtu 1200 # 我也不知道mtu/mru怎麼設,不過這個會動
mru 1200
nodefaultroute
debug
lock
proxyarp
connect-delay 5000
login # 透過PAP使用系統密碼驗證,這也是為什麼前面不能拒絕PAP的原因
#require-mschap-v2 強迫使用MS-CHAP-V2
最後是連線密碼,CHAP和PAP的密碼檔是分開的,依照前面設定的內容和使用者的選擇而定
/etc/ppp/*-secrets
1
2
3
4
5
# Secrets for authentication using PAP
# client(帳號) server(前面提到的name) secret(密碼) IP addresses(配發的IP)
alice NyanVPNServer "AliceIsCute" *
# 下面這個是PAM的用法
* NyanVPNServer "" *
設定就到這邊為止,接著就可以啟動VPN了
1
2
service strongswan start
service xl2tpd start
成功連上VPN之後,如果無法連外,檢查看看iptables的FORWARD chain是不是有阻擋連線的行為