上次發了服務器上公網的文章,當時L2TP撥號用的是網絡上的解決方案,也就是現成的腳本,一跑就OK了。像這樣:
輸入幾個關鍵信息,腳本就自動執行完成了。我看了一下,腳本一共810行,功能很強大,系統方面支持centos 6+、Debian 7+、Ubuntu 12+。
但實際上有個隱藏的問題。上次部署用的是CentOS 7的系統,一切正常,重新部署之后騰訊云的CentOS僅支持8.3的鏡像,安裝頻繁報錯。
查看腳本內容發現,此腳本僅支持CentOS的6和7兩個版本,在8上,因為軟件名稱和操作命令變更,無法正常安裝。
既然這樣,那就只能拆解代碼,自己安裝了。
首先找到腳本中需要的軟件,或者找到執行腳本時不能正常使用的命令,用yum provides來查找命令,最后整理一下,需要安裝以下軟件:
yum install -y make gcc gmp-devel xmlto bison flex libpcap lsof vim man xl2tpd libreswan
修改ipsec配置文件
vim /etc/ipsec.conf
在config setup中添加以下命令,允許穿透nat建立l2tp連接。
nat_traversal=yes
上圖中最后一行可以看到include /etc/ipsec.d/*.conf這行代碼,所以需要在/etc/ipsec.d/目錄下創建IPsec與L2TP服務關聯的配置文件。
vim /etc/ipsec.d/l2tp_psk.conf
文件復制以下內容,僅需修改left參數為公網網卡的IP地址。
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=10.0.8.12
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
在/etc/ipsec.d/目錄下創建保存預共享密鑰的文件,名字可自定義,擴展名為.secrets。
vim /etc/ipsec.d/ipsec.secrets
預共享密鑰參照如下格式填寫,其中,IP地址為網卡的IP地址,雙引號中為預共享密鑰,請自行設置。(注意字段之間用空格或者tab隔開,否則檢查會報錯)
10.0.8.12 %any: PSK "test123"
修改sysctl的內核支持文件。
vim /etc/sysctl.conf
可以直接用下面的內容替換掉原來的文件。
vm.swAppiness = 0
net.ipv4.ip_forward = 1
net.ipv4.conf.all.arp_announce=2
net.ipv4.conf.all.promote_secondaries = 1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.default.promote_secondaries = 1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.arp_announce=2
net.ipv4.neigh.default.gc_thresh3 = 4096
net.ipv6.neigh.default.gc_thresh3 = 4096
net.ipv4.neigh.default.gc_stale_time=120
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syncookies = 1
net.ipv6.conf.all.disable_ipv6=0
net.ipv6.conf.default.disable_ipv6=0
net.ipv6.conf.lo.disable_ipv6=0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.printk = 5
kernel.shmmax = 68719476736
kernel.softlockup_panic = 1
kernel.sysrq = 1
修改完保存退出,執行以下命令重新加載配置文件使配置生效。
sysctl -p
重啟IPsec服務,并檢驗ipsec服務配置。
systemctl restart ipsec
ipsec verify
就是圖里面
/proc/sys/net/ipv4/conf/eth0/rp_filter這個文件很奇怪,使用vim無法編輯,修改權限也不行,但是可以用echo。那就用echo命令把里面的1換成0吧。
echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
修改L2TP配置文件,設置監聽網卡地址和LNS的IP地址及分配的地址段。
vim /etc/xl2tpd/xl2tpd.conf
主要修改4個地方配置:
1、[global]模塊中,取消listen-addr注釋,并修改IP地址為網卡地址(10.0.8.12);
2、[global]模塊中,取消ipsec saref = yes的注釋;
3、[lns default]模塊中,在ip_range后設置客戶端連接服務器后LNS分配給客戶端的ip地址范圍;
4、[lns default]模塊中,將local ip設置為LNS的網關IP地址。
如下圖:
修改xl2tpd配置文件中的安全配置。
vim /etc/ppp/options.xl2tpd
文本中增加驗證字段的算法要求,DNS視具體情況進行調整。
require-mschap-v2
將L2TP服務器的賬戶與密碼寫入/etc/ppp/chap-secrets文件。
vim /etc/ppp/chap-secrets
依次寫用戶名、服務名、密碼、IP地址,實際上服務名與IP地址都寫成星號即可,主要設置用戶名與密碼,以空格或tab隔開。填寫服務名用于多服務場景,填寫IP地址用于指定該用戶登錄后獲取的IP地址為某個固定地址。
然后就是防火墻的規則調整了,首先停止firewalld服務并禁用。
systemctl stop firewalld
systemctl mask firewalld
安裝iptables服務。
yum install -y iptables iptables-services
清空iptables規則。
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -Z
執行命令進行規則配置,其中轉發相關的地址段請設置與L2TP地址段一致。
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -I FORWARD -s 172.16.113.0/24 -j ACCEPT
iptables -I FORWARD -d 172.16.113.0/24 -j ACCEPT
iptables -A INPUT -p udp -m policy --dir in --pol ipsec -m udp --dport 1701 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 1701 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 4500 -j ACCEPT
iptables -A INPUT -p esp -j ACCEPT
iptables -A INPUT -m policy --dir in --pol ipsec -j ACCEPT
iptables -A FORWARD -i ppp+ -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
上述命令執行完后,保存iptables規則并重啟服務。
service iptables save
systemctl restart iptables
走完上面的流程,現在就需要檢查iptables、ipsec、xl2tpd三個服務是否是正常運行了。
systemctl status iptables
systemctl status ipsec
systemctl status xl2tpd
這個地方出了兩次錯誤,第一次啟動失敗是內核重新掛載l2tp_ppp失敗,需要修改
/usr/lib/systemd/system/xl2tpd.service配置文件,注釋掉相關配置。
ExecStartPre=/sbin/modprobe -q l2tp_ppp
然后執行以下命令重啟服務。
systenctl daemon-reload
systemctl restart xl2tpd
第二個報錯就相對簡單,但是不好找,我把LNS的本地地址配錯了,一直提示地址綁定失敗。所以操作的時候還是要細心。
最后再看一下連接成功的頁面。
得益于高鏈路質量,延遲只有5ms左右。
今天,你學廢了嗎?