在VPS上部署VPN有一段時間了,但用SSH較多,偶爾用手機連連VPN。最近用的時候遇到一些小問題:“斷開VPN連接後再次連接的時候就連不上了”, 重啟IPsec後才能恢復。當時安裝的時候圖省心,直接用的一鍵腳本,雖然過程中也遇到些小問題,但後來都谷歌解決了,之後也沒有記錄安裝過程。今天連帶解決這個問題轉發一帖就當複習了。
考慮到很多網絡環境的不確定已經一些移動通信網絡對pptp的不支持,早晚要用得上L2tp,所以這次就順便搭一下。
第二層隧道協議L2TP(Layer 2 Tunneling Protocol)是一種工業標準的Internet隧道協議,它使用UDP的1701端口進行通信。L2TP本身並沒有任何加密,但是我們可以使用IPSec對L2TP包進行加密。
僅搭建L2tp即可實現大部分功能,但一般情況下L2tp都與IPSec配合使用,MacOS與iOS的設備貌似對L2tp的支持都必須使用IPSec,所以有必要部署IPSec。
部署IPSec
首先安裝必備依賴包
yum install make gcc gmp-devel bison flex lsof
其次安裝Openswan
wget http://www.openswan.org/download/openswan-2.6.38.tar.gztar -zxvf openswan-2.6.38.tar.gz
cd openswan-2.6.38make programs install
編輯配置文件/etc/ipsec.conf:
vim /etc/ipsec.conf
查找protostack=auto,修改為:
protostack=netkey
在最後加入:
conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT
conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=YOUR.SERVER.IP.ADDRESS
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
“YOUR.SERVER.IP.ADDRESS”為外網IP,下同。 設置共享密鑰PSK 編輯配置文件/etc/ipsec.secrets:
vim /etc/ipsec.secrets
輸入:
YOUR.SERVER.IP.ADDRESS %any: PSK "YourSharedSecret"
修改包轉發設置
for each in /proc/sys/net/ipv4/conf/* do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done
echo 1 >/proc/sys/net/core/xfrm_larval_drop
修改內核設置,使其支持轉發,編輯/etc/sysctl.conf文件:
vim /etc/sysctl.conf
將“net.ipv4.ip_forward”的值改為1。
使修改生效:
sysctl -p
重啟IPSec:
service ipsec restart
查看系統IPSec安裝和啟動的正確性:
ipsec verify
一般情況下沒有報[FAILED]就可以了。但是如果轉發已經確認配置了,但仍檢測checking IP Forwarding 失敗,可以先忽略此項錯誤,雖然我此項FAIL,但不影響使用,根據郵件列表的內容來看很可能是一個未解決的判斷BUG, 查看日誌中出現 IPSec connection established此類字樣基本沒有問題。
部署L2TP(使用xl2tpd和rp-l2tp)
xl2tpd是由Xelerance Corporation維護的l2tpd應用。但是xl2tpd沒有l2tp-control,需要從rp-l2tp這個裡面提取。所以要裝這兩個軟件包。
雖然根據編譯結果來看,目前最新版的xl2tpd已經含有l2tp-control了,但加上rp-l2tp也沒什麼問題。因為默認情況下可能會少創建一個目錄導致啟動不成功。
首先安裝依賴軟件:
yum install libpcap-devel ppp policycoreutils
安裝xl2tpd和rp-l2tp:
wget http://sourceforge.net/projects/rp-l2tp/files/rp-l2tp/0.4/rp-l2tp-0.4.tar.gztar -zxvf rp-l2tp-0.4.tar.gz
cd rp-l2tp-0.4./configure
make
cp handlers/l2tp-control /usr/local/sbin/mkdir /var/run/xl2tpd/ln -s /usr/local/sbin/l2tp-control /var/run/xl2tpd/l2tp-control
xl2tpd用的是目前最新的xl2tpd-1.3.0(更新得不是很快)
wget http://www.xelerance.com/wp-content/uploads/software/xl2tpd/xl2tpd-1.3.0.tar.gztar -zxvf xl2tpd-1.3.0.tar.gz
cd xl2tpd-1.3.0make
make install
建立xl2tpd配置文件:
mkdir /etc/xl2tpd
vim /etc/xl2tpd/xl2tpd.conf
加入:
[global]ipsec saref = yes[lns default]ip range = 10.82.88.2-10.82.88.254local ip = 10.82.88.1refuse chap = yes
refuse pap = yesrequire authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
配置ppp 建立options.xl2tpd文件:
vim /etc/ppp/options.xl2tpd
加入:
#require-mschap-v2 #此處不是必須,在非MS環境下ms-dns 8.8.8.8ms-dns 8.8.4.4asyncmap 0auth
crtsctslockhide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30lcp-echo-failure 4
設置撥號用戶名和密碼:
vim /etc/ppp/chap-secrets
此處注意的是第二列的 l2tpd 為上面配置的name,如果有改動也要修改此處。
# Secrets for authentication using CHAP# client server secret IP addressesmyusername l2tpd mypassword *
最後添加iptables轉發規則並保存重啟
iptables --table nat --append POSTROUTING --jump MASQUERADE/etc/init.d/iptables save/etc/init.d/iptables restart
以debug方式啟動l2tp,查看有無錯誤:
xl2tpd -D
後繼問題解決
部署成功後,可以使用並連接,但每天的連接並不穩定,經常需要重啟IPSec。檢查日誌發現大量類似結果:
Maximum retries exceeded for tunnel 50347. Closing.
經過這幾天試驗,終於解決,在/etc/ipsec.conf中的 conn L2TP-PSK-noNAT節 加入如下內容解決:
dpddelay=40dpdtimeout=130dpdaction=clear
leftnexthop=%defaultroute
rightnexthop=%defaultroute
至此實現了備選方案的部署
閱讀更多 心若琉璃萬般自在 的文章