前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Centos7.2下部署L2TP/IPsec类型的VPN环境记录

Centos7.2下部署L2TP/IPsec类型的VPN环境记录

作者头像
洗尽了浮华
发布2022-03-28 15:28:48
7.1K0
发布2022-03-28 15:28:48
举报
文章被收录于专栏:散尽浮华散尽浮华

之前在机房部署了PPTP的V**环境,后面发现有的同事使用的mac本不能连接PPTP,原因是IOS10.0系统以后就不支持PPTP的V**了,于是打算将V**更换L2TP类型的。 L2TP是一种工业标准的Internet隧道协议,功能大致和PPTP协议类似,比如同样可以对网络数据流进行加密。不过也有不同之处: 1)PPTP要求网络为IP网络,L2TP要求面向数据包的点对点连接; 2)PPTP使用单一隧道,L2TP使用多隧道; 3)L2TP提供包头压缩、隧道验证,而PPTP不支持。 4)L2TP的可应用性更为广泛,很多路由不支持PPTP穿透

废话不多说了,以下是在Centos7.2下部署L2TP环境的操作记录: 下载安装脚本https://files.cnblogs.com/files/think8848/StackScript.zip(百度云盘下载地址https://pan.baidu.com/s/1bA0FjK 提取密码:x7nn)

代码语言:javascript
复制
[root@linux-node2 ~]# wget -O StackScript.zip https://files.cnblogs.com/files/think8848/StackScript.zip
[root@linux-node2 ~]# unzip StackScript.zip
[root@linux-node2 ~]# chmod 755 StackScript
[root@linux-node2 ~]# /bin/bash -x StackScript

脚本执行中报错: ...... + sh /tmp/vpn.sh Error: Network interface 'eth0' is not available.

原因:我这里的L2TP部署机的外网网卡是em1,而不是脚本中指定的eth0,因此需要将/tmp/vpn.sh脚本文件中的eth0替换成em1 具体解决操作如下: 先查看下StackScript脚本内容

代码语言:javascript
复制
[root@linux-node2 ~]# cat StackScript
#!/bin/bash

# <UDF name="VPN_IPSEC_PSK" Label="IPsec Pre-Shared Key" />
# <UDF name="VPN_USER" Label="VPN Username" />
# <UDF name="VPN_PASSWORD" Label="VPN Password" />

if [ -f /etc/apt/sources.list ]; then
  url=vpnsetup
  apt-get -y update
  apt-get -y install wget
elif [ -f /etc/yum.conf ]; then
  url=vpnsetup-centos
  yum -y install wget
else
  echo "Your distribution is not supported by this StackScript"
  exit 1
fi

wget "https://git.io/$url" -O /tmp/vpn.sh && sh /tmp/vpn.sh && rm -f /tmp/vpn.sh

# Fix xl2tpd on CentOS 7 for Linode VMs, because kernel module
# l2tp_ppp is not available in the default Linode kernel
if grep -qs "release 7" /etc/redhat-release; then
  if [ -f /usr/lib/systemd/system/xl2tpd.service ]; then
    sed -i '/ExecStartPre/s/^/#/' /usr/lib/systemd/system/xl2tpd.service
    systemctl daemon-reload
    systemctl restart xl2tpd
  fi
fi

由于/tmp/vpn.sh脚本(可以预览下脚本里的配置内容)中定义的一些信息跟我的部署机上的信息不一致,所以需要做一些修改:eth0替换成em1;eth替换成em;192.168.42替换成192.168.1;将192.168.43替换成192.168.1;192.168.42.1替换成本机的内网ip:192.168.1.17(这里包含了防火墙规则设置)

代码语言:javascript
复制
[root@linux-node2 ~]# sed -i 's/eth0/em1/g' /tmp/vpn.sh
[root@linux-node2 ~]# sed -i 's/eth/em/g' /tmp/vpn.sh                   //将外网网卡名称有eth0改为em1,以及防火墙规则设置
[root@linux-node2 ~]# sed -i 's/192.168.42/192.168.1/g' /tmp/vpn.sh
[root@linux-node2 ~]# sed -i 's/192.168.43/192.168.1/g' /tmp/vpn.sh
[root@linux-node2 ~]# sed -i 's/192.168.42.1/192.168.1.17/g' /tmp/vpn.sh

接着将StackScript脚本中剩余的操作单独放在一个新脚本里执行:

代码语言:javascript
复制
[root@linux-node2 ~]# vim l2tp.sh
#/bin/bash
sh /tmp/vpn.sh && rm -f /tmp/vpn.sh
 
# Fix xl2tpd on CentOS 7 for Linode VMs, because kernel module
# l2tp_ppp is not available in the default Linode kernel
if grep -qs "release 7" /etc/redhat-release; then
  if [ -f /usr/lib/systemd/system/xl2tpd.service ]; then
    sed -i '/ExecStartPre/s/^/#/' /usr/lib/systemd/system/xl2tpd.service
    systemctl daemon-reload
    systemctl restart xl2tpd
  fi
fi
 
[root@linux-node2 ~]# chmod 755 l2tp.sh
[root@linux-node2 ~]# /bin/bash -x l2tp.sh
...........
...........

IPsec VPN server is now ready for use!

Connect to your new VPN with these details:

Server IP: 113.110.186.117
IPsec PSK: 4K4PJvu33hhqh6U5
Username: vpnuser
Password: 3YiPfMmLCZxfwvJV

Write these down. You'll need them to connect!

Important notes:   https://git.io/vpnnotes
Setup VPN clients: https://git.io/vpnclients

================================================

+ rm -f /tmp/vpn.sh
+ grep -qs 'release 7' /etc/redhat-release
+ '[' -f /usr/lib/systemd/system/xl2tpd.service ']'
+ sed -i '/ExecStartPre/s/^/#/' /usr/lib/systemd/system/xl2tpd.service
+ systemctl daemon-reload
+ systemctl restart xl2tpd

上面的PSK、用户名和密码都是从Linode上拔下来的,这些信息可以自己修改: a)修改PSK为huanqiuwangshibo

代码语言:javascript
复制
[root@linux-node2 ~]# vim /etc/ipsec.secrets
%any  %any  : PSK "huanqiuwangshibo"

b)修改用户名和密码为wangshibo和wangshibo@123

代码语言:javascript
复制
[root@linux-node2 ~]# vim /etc/ppp/chap-secrets
# Secrets for authentication using CHAP
# client  server  secret  IP addresses
"wangshibo" l2tpd "wangshibo@123" *

然后重启IPsec和xl2tpd服务

代码语言:javascript
复制
[root@linux-node2 ~]# systemctl restart ipsec xl2tpd

最后可以检查下ipsec状态,如下没有FAILED就说明状态正常

代码语言:javascript
复制
[root@linux-node2 ~]# ipsec verify 
Verifying installed system and configuration files

Version check and ipsec on-path                   	[OK]
Libreswan 3.19 (netkey) on 3.10.0-327.el7.x86_64
Checking for IPsec support in kernel              	[OK]
 NETKEY: Testing XFRM related proc values
         ICMP default/send_redirects              	[OK]
         ICMP default/accept_redirects            	[OK]
         XFRM larval drop                         	[OK]
Pluto ipsec.conf syntax                           	[OK]
Two or more interfaces found, checking IP forwarding	[OK]
Checking rp_filter                                	[ENABLED]
 /proc/sys/net/ipv4/conf/brqd340f735-5a/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/docker0/rp_filter        	[ENABLED]
 /proc/sys/net/ipv4/conf/em2/rp_filter            	[ENABLED]
 /proc/sys/net/ipv4/conf/em3/rp_filter            	[ENABLED]
 /proc/sys/net/ipv4/conf/em4/rp_filter            	[ENABLED]
 /proc/sys/net/ipv4/conf/tap42a276b5-a7/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/tap7a36096c-bb/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/tap8314f726-c7/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/tap8b0bfb5c-fc/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/tap9e0ad654-eb/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/tapab9a2526-d3/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/tapc6a6623c-1f/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/tapda472e40-78/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/tapdc7ebaa9-38/rp_filter 	[ENABLED]
 /proc/sys/net/ipv4/conf/tun0/rp_filter           	[ENABLED]
 /proc/sys/net/ipv4/conf/veth17da48b/rp_filter    	[ENABLED]
 /proc/sys/net/ipv4/conf/veth446262b/rp_filter    	[ENABLED]
 /proc/sys/net/ipv4/conf/virbr0/rp_filter         	[ENABLED]
 /proc/sys/net/ipv4/conf/virbr0-nic/rp_filter     	[ENABLED]
  rp_filter is not fully aware of IPsec and should be disabled
Checking that pluto is running                    	[OK]
 Pluto listening for IKE on udp 500               	[OK]
 Pluto listening for IKE/NAT-T on udp 4500        	[OK]
 Pluto ipsec.secret syntax                        	[OK]
Checking 'ip' command                             	[OK]
Checking 'iptables' command                       	[OK]
Checking 'prelink' command does not interfere with FIPS	[OK]
Checking for obsolete ipsec.conf options          	[OK]

ipsec verify: encountered 39 errors - see 'man ipsec_verify' for help

按照上面操作完成后,基本即ok了,就可以在客户端连接L2TP类型的V**了 也可以查看下/etc/ipsec.conf、/etc/ipsec.secrets、/etc/ppp/chap-secrets、/etc/xl2tpd/xl2tpd.conf这几个文件配置,确保配置信息无误。

客户端连接L2TP/IPsec的操作记录 (1)先说下windows客户机连接L2TP/IPsec的操作记录,这里温馨提示下,请按照此教程配置客户端

这里以win8/win10为例: 1)右键单击系桌面右下角的无线/网络图标。 2)选择打开网络与共享中心。 3)单击设置新的连接或网络。 4) 选择连接到工作区,然后单击 下一步。 5)单击使用我的Internet连接 (V**)。 6)在Internet地址字段中输入你的 V** 服务器 IP。 7)在目标名称 字段中输入任意内容。单击创建。 8)返回网络与共享中心。单击左侧的更改适配器设置。 9)右键单击新创建的V**连接,并选择属性。 10)单击安全 选项卡,从 V** 类型下拉菜单中选择 "使用 IPsec 的第 2 层隧道协议 (L2TP/IPSec)"。 11)单击允许使用这些协议。确保选中 "质询握手身份验证协议 (CHAP)" 复选框。 12)单击高级设置 按钮。 13)单击使用预共享密钥作身份验证并在密钥字段中输入你的 V** IPsec PSK。 14)单击确定 关闭 高级设置。 15)单击确定 保存 V** 连接的详细信息。

特别注意的是: 在首次连接之前一定要修改一次注册表(否则会报错:无法建立计算机与 V**服务器之间的网络连接,因为远程服务器未响应.....)。具体操作如下: 1)确保win10客户机的"控制面板"->"管理工具"->"组件服务"->"服务"->"IPsec Policy Agent"是正在运行的状态. 2)修改注册表。按键ctrl+r,在"运行"里输入"regedit"打开注册表 a)依次打开:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rasman\Parameters,然后在右边栏里确认有AllowL2TPWeakCrypto,并且右键AllowL2TPWeakCrypto->"修改"->"数值数据"为1(如果不存在AllowL2TPWeakCrypto,就新建它) b)依次打开:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent ,然后在右边栏里新建QWORD(64位),并命名为"AssumeUDPEncapsulationContextOnSendRule",并且修改它的"数值数据"为2 3)依次打开客户机的"C盘"->"Windows"->"System32"-"cmd.exe",右击cmd.exe,以管理员身份运行。然后在命令窗口里输入:

代码语言:javascript
复制
REG ADD HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 0x2 /f

4)最后,一定要重启客户机 5)然后再次点击新建的L2TL的V**,就能成功连接了。如下:

连接成功后能正常上网,并且查看本机外网ip已经变成L2TP服务器的外网ip了

如果客户端后续连接失败(报错:L2TP连接尝试失败,因为安全层在初始化与远程计算机协商时遇到一个处理错误) 可以重启服务端的ipsec和xl2tpd服务,然后再尝试在客户端连接 [root@linux-node2 ~]# systemctl restart ipsec xl2tpd

(2)接着说下linux客户机连接L2TP/IPsec的操作记录(这里以centos6为例)

安装基本工具

代码语言:javascript
复制
[root@dev ~]# yum install vim net-tools ftp epel-release -y

安装L2TP和IPsec客户端(其实也可以用于服务端,只不过本例中,服务器端使用的是libreswan,而客户端使用的是strongswan)

代码语言:javascript
复制
[root@dev ~]# yum install strongswan xl2tpd -y 

配置文件

代码语言:javascript
复制
[root@dev ~]# vim /etc/strongswan/ipsec.conf      //将默认配置内容情况,直接填写下面内容
config setup

conn %default
  ikelifetime=60m
  keylife=20m
  rekeymargin=3m
  keyingtries=1
  keyexchange=ikev1
  authby=secret
  ike=aes128-sha1-modp1024,3des-sha1-modp1024!
  esp=aes128-sha1-modp1024,3des-sha1-modp1024!

conn myvpn
  keyexchange=ikev1
  left=%defaultroute
  auto=add
  authby=secret
  type=transport
  leftprotoport=17/1701
  rightprotoport=17/1701
  right=113.110.186.117      //这个是L2TP服务器端的公网ip地址


[root@dev ~]# vim /etc/strongswan/ipsec.secrets      //连接L2TP的秘钥
: PSK "huanqiuwangshibo"

[root@dev ~]# vim /etc/xl2tpd/xl2tpd.conf     //将默认配置内容情况,直接填写下面内容
[lac myvpn]
lns = 113.110.186.117
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd.client
length bit = yes

[root@dev ~]# vim /etc/ppp/options.xl2tpd.client
ipcp-accept-local
ipcp-accept-remote
refuse-eap
require-chap
noccp
noauth
mtu 1280
mru 1280
noipdefault
defaultroute
usepeerdns
connect-delay 5000
name wangshibo              //连接L2TP的用户名
password wangshibo@123     //连接L2TP的密码

启动客户端

代码语言:javascript
复制
[root@dev ~]# /etc/init.d/strongswan start
[root@dev ~]# /etc/init.d/xl2tpd start

[root@dev ~]# /etc/init.d/strongswan status
[root@dev ~]# /etc/init.d/xl2tpd status

打开连接通道,successfully表示通道顺畅

代码语言:javascript
复制
[root@dev ~]# strongswan up myvpn
initiating Main Mode IKE_SA myvpn[9] to 103.10.86.17
generating ID_PROT request 0 [ SA V V V V ]
sending packet: from 192.168.9.200[500] to 103.10.86.17[500] (188 bytes)
received packet: from 103.10.86.17[500] to 192.168.9.200[500] (144 bytes)
parsed ID_PROT response 0 [ SA V V V ]
received DPD vendor ID
received FRAGMENTATION vendor ID
received NAT-T (RFC 3947) vendor ID
generating ID_PROT request 0 [ KE No NAT-D NAT-D ]
sending packet: from 192.168.9.200[500] to 103.10.86.17[500] (244 bytes)
received packet: from 103.10.86.17[500] to 192.168.9.200[500] (244 bytes)
parsed ID_PROT response 0 [ KE No NAT-D NAT-D ]
local host is behind NAT, sending keep alives
remote host is behind NAT
generating ID_PROT request 0 [ ID HASH N(INITIAL_CONTACT) ]
sending packet: from 192.168.9.200[4500] to 103.10.86.17[4500] (108 bytes)
received packet: from 103.10.86.17[4500] to 192.168.9.200[4500] (76 bytes)
parsed ID_PROT response 0 [ ID HASH V ]
received unknown vendor ID: 49:4b:45:76:32
IKE_SA myvpn[9] established between 192.168.9.200[192.168.9.200]...103.10.86.17[103.10.86.17]
scheduling reauthentication in 3387s
maximum IKE_SA lifetime 3567s
generating QUICK_MODE request 3871448243 [ HASH SA No KE ID ID NAT-OA NAT-OA ]
sending packet: from 192.168.9.200[4500] to 103.10.86.17[4500] (364 bytes)
sending retransmit 1 of request message ID 3871448243, seq 4
sending packet: from 192.168.9.200[4500] to 103.10.86.17[4500] (364 bytes)
sending retransmit 2 of request message ID 3871448243, seq 4
sending packet: from 192.168.9.200[4500] to 103.10.86.17[4500] (364 bytes)
sending retransmit 3 of request message ID 3871448243, seq 4
sending packet: from 192.168.9.200[4500] to 103.10.86.17[4500] (364 bytes)
received packet: from 103.10.86.17[4500] to 192.168.9.200[4500] (300 bytes)
parsed QUICK_MODE response 3871448243 [ HASH SA No KE ID ID ]
CHILD_SA myvpn{22} established with SPIs c4f970c1_i 69e2edb7_o and TS 192.168.9.200/32[udp/l2tp] === 103.10.86.17/32[udp/l2tp]
connection 'myvpn' established successfully

创建xl2tpd控制文件

代码语言:javascript
复制
[root@dev ~]# mkdir -p /var/run/xl2tpd
[root@dev ~]# touch /var/run/xl2tpd/l2tp-control

连接L2TP/IPsec的命令(L2TP服务端的ipsec和xl2tpd重启后,客户端的V**连接就会断开,需要重新连接)

代码语言:javascript
复制
[root@dev ~]# echo "c myvpn" > /var/run/xl2tpd/l2tp-control

稍等片刻,大概3-5秒钟就可以看到已经连上去了(ifconfig查看发现有了ppp0的ip信息,这是连接V**后分配过来的ip)

代码语言:javascript
复制
[root@dev ~]# ifconfig
eth0      Link encap:Ethernet  HWaddr 44:8A:5B:BD:43:1B  
          inet addr:192.168.9.200  Bcast:192.168.9.255  Mask:255.255.255.0
          inet6 addr: fe80::468a:5bff:febd:431b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:118805419 errors:0 dropped:0 overruns:0 frame:0
          TX packets:42102770 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:79901529647 (74.4 GiB)  TX bytes:3904418043 (3.6 GiB)

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:11097085 errors:0 dropped:0 overruns:0 frame:0
          TX packets:11097085 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:3951878331 (3.6 GiB)  TX bytes:3951878331 (3.6 GiB)

ppp0      Link encap:Point-to-Point Protocol  
          inet addr:192.168.1.190  P-t-P:192.168.1.17  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1280  Metric:1
          RX packets:4 errors:0 dropped:0 overruns:0 frame:0
          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3 
          RX bytes:64 (64.0 b)  TX bytes:82 (82.0 b)

设置路由

代码语言:javascript
复制
# route delete default
# route add 服务器端的IP gw 本机网关
# ip route add default via 192.168.1.117 dev ppp0      (192.168.1.117是服务器端的内网ip)

验证,如果顺利返回了服务器端的IP,说明已经成功了!

代码语言:javascript
复制
[root@dev ~]# wget -qO- http://ipv4.icanhazip.com; echo
113.110.186.117

[root@dev ~]# 

客户机连上V**后,ping www.baidu.com,发现夜里速度比白天慢一些,和DNS解析有关~

代码语言:javascript
复制
# vim /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4

关闭L2TP/IPsec的命令

代码语言:javascript
复制
# echo "d myvpn" > /var/run/xl2tpd/l2tp-control
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-02-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
VPN 连接
VPN 连接(VPN Connections)是一种基于网络隧道技术,实现本地数据中心与腾讯云上资源连通的传输服务,它能帮您在 Internet 上快速构建一条安全、可靠的加密通道。VPN 连接具有配置简单,云端配置实时生效、可靠性高等特点,其网关可用性达到 99.95%,保证稳定、持续的业务连接,帮您轻松实现异地容灾、混合云部署等复杂业务场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档