公司原来的服务器是pptp+freeaduis。后来由于苹果更新系统IOS无法接入PPTP模式服务器,所以研究了这个L2TP/IPSEC的V×N

L2TP是一种工业标准的Internet隧道协议,功能大致和PPTP协议类似,比如同样可以对网络数据流进行加密。不过也有不同之处,比如PPTP要求网络为IP网络,L2TP要求面向数据包的点对点连接;PPTP使用单一隧道,L2TP使用多隧道;L2TP提供包头压缩、隧道验证,而PPTP不支持。

基本信息
中文名称 L2TP 英文原义 Layer 2 Tunneling Protocol
中文释义 第二层隧道协议 L2TP命令头 12 16 32 bit

连接中要设置L2TP连接,方法同PPTP设置,同样是在连接属性窗口的"网络"选项卡中,将类型设置为"L2TP IPSec **"即可。

第二层隧道协议(L2TP)是用来整合多协议拨号服务至现有的因特网服务提供商点。PPP 定义了多协议跨越第二层点对点链接的一个封装机制。特别地,用户通过使用众多技术之一(如:拨号 POTS、ISDN、ADSL 等)获得第二层连接到网络访问服务器(NAS),然后在此连接上运行 PPP。在这样的配置中,第二层终端点和 PPP 会话终点处于相同的物理设备中(如:NAS)。

L2TP 扩展了 PPP 模型,允许第二层和 PPP 终点处于不同的由包交换网络相互连接的设备来。通过 L2TP,用户在第二层连接到一个访问集中器(如:调制解调器池、ADSL DSLAM 等),然后这个集中器将单独得的 PPP 帧隧道到 NAS。这样,可以把 PPP 包的实际处理过程与 L2 连接的终点分离开来。

对于这样的分离,其明显的一个好处是,L2 连接可以在一个(本地)电路集中器上终止,然后通过共享网络如帧中继电路或英特网扩展逻辑 PPP 会话,而不用在 NAS 上终止。从用户角度看,直接在 NAS 上终止 L2 连接与使用 L2TP 没有什么功能上的区别。L2TP 协议也用来解决"多连接联选组分离"问题。多链接 PPP,一般用来集中 ISDN B 通道,需要构成多链接捆绑的所有通道在一个单网络访问服务器(NAS)上组合。因为 L2TP 使得 PPP 会话可以出现在接收会话的物理点之外的位置,它用来使所有的通道出现在单个的 NAS 上,并允许多链接操作,即使是在物理呼叫分散在不同物理位置的 NAS 上的情况下。

LNS表示L2TP网络服务器(L2TP Network Server),是PPP端系统上用于处理L2TP协议服务器端部分的设备。它作为L2TP隧道的另一侧端点,是LAC的对端设备,是被LAC进行隧道传输的PPP会话的逻辑终止端点。

与PPTP不同:

PPTP和L2TP都使用PPP协议对数据进行封装,然后添加附加包头用于数据在互联网络上的传输。尽 管两个协议非常相似,但是仍存在以下几方面的不同:

1.PPTP要求互联网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接。L2TP可以在IP(使用UDP),帧中继永久虚拟电路(PVCs),X.25虚拟电路(VCs)或ATM VCs网络上使用。

2.PPTP只能在两端点间建立单一隧道。L2TP支持在两端点间使用多隧道。使用L2TP,用户可以针对不同的服务质量创建不同的隧道。

3.L2TP可以提供包头压缩。当压缩包头时,系统开销(overhead)占用4个字节,而PPTP协议下要占用6个字节。

4.L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP或PPTP与IPSEC共同使用时,可以由IPSEC提供隧道验证,不需要在第2层协议上验证隧道

5.L2TP访问集中器(L2TP Access Concentrator,LAC)是一种附属在网络上的具有PPP端系统和L2Tpv2协议处理能力的设备,它一般就是一个网络接入服务器软件,在远程客户端完成网络接入服务的功能。

6.L2TP网络服务器(L2TP Network Server,LNS)是用于处理L2TP协议服务器端的软件。

L2TP支持的协议

IP协议、IPX协议和NetBEUI协议

1、安装EPEL源(CentOS7官方源中已经去掉了xl2tpd,或者官网手动下载)

在centos7 版本后, 提供ipsec 服务包由libreswan替代了openswan

yum install -y make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced man
yum install xl2tpd 
yum install libreswan

2、修改ipsec的配置文件

[root@localhost ~]# vim /etc/ipsec.conf(只添加一行nat_traversal=yes即可)
# NAT-TRAVERSAL support
# exclude networks used on server side by adding %v4:!a.b.c.0/24
# It seems that T-Mobile in the US and Rogers/Fido in Canada are
# using 25/8 as "private" address space on their wireless networks.
# This range has never been announced via BGP (at least up to 2015)
nat_traversal=yes     ###在配置文件里加入这一行,充许传透nat建立l2tp连接      
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v4:100.64.0.0/10,%v6:fd00::/8,%v6:fe80::/10

3、建立ipsec 与 l2tp 服务关联的配置文件 

#因为这个文件没有所以需要手动创建
[root@localhost ~]# 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=192.168.4.197   ###192.168.4.197 是自己的网卡Ip地址
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any

4、当建立l2tp连接时,需要输入预共享密匙,以下为预共享密匙的配置文件。

#如果这个文件也没有也需要手动创建,访问的IP地址和密码

[root@localhost ~]# vim /etc/ipsec.d/ipsec.secrets

#include /etc/ipsec.d/*.secrets
192.168.4.197 %any: PSK "123456789"
#120.86.124.5 是外网网卡地址,PSK是预存共享密匙

5、修改内核支持,可以对照以下配置修改,修改完后运行sysctl -p 使配置生效

[root@localhost ~]# cat /etc/sysctl.conf 

vm.swappiness = 0
net.ipv4.ip_forward = 1
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.conf.default.accept_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.default.accept_source_route = 0

[root@localhost ~]# sysctl -p

6、检验ipsec服务配置

#重启ipsec
systemctl restart ipsec
#检验ipsec服务配置 
ipsec verify

***-2.png
//报错处理,当出现以上几个[ENABLED]错误提示时 ,不用在意,可以继续。当然全部OK更好。

7、启动服务

#启动ipsec 
systemctl start ipsec
#设置为开机自启 
systemctl enable ipsec

8、修改L2tp的配置文件

[root@localhost ~]# vim /etc/xl2tpd/xl2tpd.conf 
[global]
 listen-addr = 192.168.4.197    ###本机外网网卡IP
 ipsec saref = yes      ###取消注释
[lns default]
ip range = 192.168.1.128-192.168.1.254
local ip = 192.168.1.99
require chap = yes
refuse pap = yes
require authentication = yes
name = Linux×××server
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

9、修改xl2tpd属性配置文件 

[root@localhost ~]# vim /etc/ppp/options.xl2tpd

require-mschap-v2   ###添加此行
ipcp-accept-local
ipcp-accept-remote
#dns 写自己的网卡DNS ,写成8.8.8.8也行
ms-dns 192.168.0.2 
#ms-dns  8.8.8.8
noccp
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000

10、添加用户名和密码(**登录的用户名和密码)

建立xl2tpd连接的用户,建立l2tp连接需要输入的用户名和密码就在该文件里配置:

vim /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
test      *  123 *

11、iptables安装配置

CentOS7默认的防火墙不是iptables,而是firewalle.

1)安装iptable iptable-service

yum install -y iptables
yum install iptables-services

2)禁用/停止自带的firewalld服务

#停止firewalld服务

systemctl stop firewalld

#冻结firewalld服务

systemctl mask firewalld

3)设置现有规则

#查看iptables现有规则

iptables -L -n

#先允许所有,不然有可能会杯具

iptables -P INPUT ACCEPT

#清空所有默认规则

iptables -F

#清空所有自定义规则

iptables -X

#所有计数器归0

iptables -Z

4)开启地址转换(eth0为外网网卡,根据实际情况替换。)

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -I FORWARD -s 192.168.1.0/24 -j ACCEPT
iptables -I FORWARD -d 192.168.1.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

service iptables save
/bin/systemctl restart iptables.service

12、完成服务配置

#启动xl2tp服务 
systemctl start xl2tpd

#设置开机自启 
systemctl enable xl2tpd

#查看状态 
systemctl status xl2tpd

如果启动失败,报错如下:

Job for xl2tpd.service failed because the control process exited with error code. See "systemctl status xl2tpd.service" and "journalctl -xe" for details.
# systemctl status xl2tpd.service
 xl2tpd.service - Level 2 Tunnel Protocol Daemon (L2TP)
   Loaded: loaded (/usr/lib/systemd/system/xl2tpd.service; disabled; vendor preset: disabled)
   Active: failed (Result: start-limit) since Sat 2018-07-07 07:11:31 UTC; 12s ago
  Process: 3985 ExecStartPre=/sbin/modprobe -q l2tp_ppp (code=exited, status=1/FAILURE)
Jul 07 07:11:31 ip-192-168-4-197.ap-northeast-1.compute.internal systemd[1]: xl2tpd.service: control process exited, code=exited status=1
Jul 07 07:11:31 ip-192-168-4-197.ap-northeast-1.compute.internal systemd[1]: Failed to start Level 2 Tunnel Protocol Daemon (L2TP).
Jul 07 07:11:31 ip-192-168-4-197.ap-northeast-1.compute.internal systemd[1]: Unit xl2tpd.service entered failed state.
Jul 07 07:11:31 ip-192-168-4-197.ap-northeast-1.compute.internal systemd[1]: xl2tpd.service failed.
Jul 07 07:11:31 ip-192-168-4-197.ap-northeast-1.compute.internal systemd[1]: xl2tpd.service holdoff time over, scheduling restart.
Jul 07 07:11:31 ip-192-168-4-197.ap-northeast-1.compute.internal systemd[1]: start request repeated too quickly for xl2tpd.service
Jul 07 07:11:31 ip-192-168-4-197.ap-northeast-1.compute.internal systemd[1]: Failed to start Level 2 Tunnel Protocol Daemon (L2TP).
Jul 07 07:11:31 ip-192-168-4-197.ap-northeast-1.compute.internal systemd[1]: Unit xl2tpd.service entered failed state.
Jul 07 07:11:31 ip-192-168-4-197.ap-northeast-1.compute.internal systemd[1]: xl2tpd.service failed.

解决方法:

centos7 ,查看资料之后发现是内核重新挂载l2tp_ppp,在xl2tpd.service中删除掉“ExecStartPre=/sbin/modprobe -q l2tp_ppp”就可以,另外注意Restart项

systemctl daemon-reload
systemctl start xl2tpd

如果Mac L2TP ×××无法连接:

解决方法:

需要在MAC中配置一个options文件在\etc\ppp目录下:

1.点击此处,在弹出框中输入:\etc\ppp,进入ppp文件夹,发现里面是空的

tmp1.png
2.添加一个文件options,注意不要用记事本创建,创建出来之后类型是不一样的。
要用命令行创建。

在options文件中输入:
plugin L2TP.ppp

l2tpnoipsec