简介

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

    以上是来源于百度百科的专业术语解释,当然看不懂也正常,看懂了说明你厉害,用人类看的懂的语言翻译一下就是一种加密的传输协议,我们常常说×××出去上Facebook、YouTu这些其实就是连接了***,而***的传输协议其中就包括L2TP,常见的还有pptp。

eac4b74543a982267c345a9b8282b9014b90eb91.jpg


  协议结构

4d086e061d950a7b1add72cd0ad162d9f3d3c9ca.jpg

L2TP 命令头 :12 16 32 bit

T L X X S X O P X X X X VER Length

Tunnel ID Session ID

Ns (opt) Nr (opt)

Offset Size (opt) Offset Pad (opt)

T ― T 位表示信息类型。若是数据信息,该值为0;若是控制信息,该值为1。

L ― 当设置该字段时,说明 Length 字段存在,表示接收数据包的总长。对于控制信息,必须设置该值。

X ― X 位为将来扩张预留使用。在导出信息中所有预留位被设置为0,导入信息中该值忽略。

S ― 如果设置 S 位,那么 Nr 字段和 Ns 字段都存在。对于控制信息,S 位必须设置。

O ― 当设置该字段时,表示在有效负载信息中存在 Offset Size 字段。对于控制信息,该字段值设为0。

P - 如果 Priority (P)位值为1,表示该数据信息在其本地排队和传输中将会得到优先处理。

Ver ― Ver 位的值总为002。它表示一个版本1 L2TP 信息。

Length ― 信息总长,包括头、信息类型 AVP 以及另外的与特定控制信息类型相关的 AVPs。

Tunnel ID ― 识别控制信息应用的 Tunnel。如果对等结构还没有接收到分配的 Tunnel ID,那么 Tunnel ID 必须设置为0。一旦接收到分配的 Tunnel ID,所有更远的数据包必须和 Tunnel ID 一起被发送。

Call ID ― 识别控制信息应用的 Tunnel 中的用户会话。如果控制信息在 Tunnel 中不应用单用户会话(例如,一个 Stop-Control-Connection-Notification 信息),Call ID 必须设置为0。

Nr ― 期望在下一个控制信息中接收到的序列号。

Ns ― 数据或控制信息的序列号。

Offset Size & Pad ― 该字段规定通过 L2F 协议头的字节数,协议头是有效负载数据起始位置。Offset Padding 中的实际数据并没有定义。如果 Offset 字段当前存在,那么 L2TP 头 Offset Padding 的最后八位字节后结束。


  与PPTP的区别

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自身不提供隧道验证,从L2TP的包头可以看出。隧道认证是由PPP(pap或chap)协议提供!而PPTP则支持隧道验证,PPTP自身就是PPP的扩展!但是当L2TP或PPTP与IPsec共同使用时,可以由IPsec提供隧道验证,不需要在第2层协议上验证隧道.

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

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


  实践尝试

部署有两种方法:一种是一键脚本安装搭建,另一种则是手动DIY安装,前者比较适用于经典网络的服务器,没有区分内外网IP地址,做起来比较简单,而后者相对比较复杂,比较适合中高级玩家打的副本;


安装前的检查

执行命令:cat /dev/net/tun

#检测是否支持TUN模块,如果返回信息为:cat: /dev/net/tun: File descriptor in bad state 说明正常


执行命令:cat /dev/ppp

#检测是否支持ppp模块,如果返回信息为:cat: /dev/ppp: No such device or address 说明正常



方法一:脚本安装

cd /root
wget http://lamp.teddysun.com/files/l2tp.sh    #CentOS、Fedora或Redhat系统时执行
wget http://lamp.teddysun.com/files/l2tp_ubuntu.sh    #Ubuntu系统时执行此命令
chmod +x *.sh
./l2tp.sh    #CentOS、Fedora或Redhat系统时执行
./l2tp_ubuntu.sh    #Ubuntu系统时执行此命令

等待出现
[Please input IP-Range:]设置网段,一般回车即可
[Please input PSK:]设置你预共享密钥。

执行后,一直等待成功,会显示相关配置信息。

生成的密码是随机的,需要修改的话,执行  

vim /etc/ppp/chap-secrets



方法二:手动安装

首先,我们需要先准备准备

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


然后我们一步一步的来配置

(1) 配置编辑/etc/ipsec.conf文件

vim /etc/ipsec.conf


config setup
    protostack=netkey
    nhelpers=0
    uniqueids=no
    interfaces=%defaultroute
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!${iprange}.0/24
    dumpdir=/var/run/pluto/

conn l2tp-psk
    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=%defaultroute
    leftid=47.52.18.101    #这里将IP地址修改为服务器的外网地址
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any
    dpddelay=40
    dpdtimeout=130
    dpdaction=clear
    sha2-truncbug=yes

include /etc/ipsec.d/*.conf

(2) 配置编辑/etc/ipsec.secrets文件

vim /etc/ipsec.secrets


include /etc/ipsec.d/*.secrets
%any %any : PSK "123456"      #"123456"这里设置的是设置共享秘钥


(3) 修改/etc/sysctl.conf,并使其生效


vim /etc/sysctl.conf


vm.swappiness = 0
net.ipv4.neigh.default.gc_stale_time=120

# see details in https://help.aliyun.com/knowledge_detail/39428.html
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.default.log_martians = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_announce=2

# see details in https://help.aliyun.com/knowledge_detail/41334.html
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_tw_reuse = 0
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
kernel.sysrq = 1

sysctl -p    #生效上面的修改使用如下命令


(4) 验证ipsec运行状态

ipsec restart
ipsec verify

如果出现如下内容,说明已经成功:


  1. Checking your system to see if IPsec got installed and started correctly:
    Version check and ipsec on-path                                 [OK]
    Linux Openswan U2.6.32/K2.6.32-431.20.3.0.1.el6.centos.plus.x86_64 (netkey)
    Checking for IPsec support in kernel                            [OK]
    SAref kernel support                                           [N/A]
    NETKEY:  Testing for disabled ICMP send_redirects              [OK]
    NETKEY detected, testing for disabled ICMP accept_redirects     [OK]
    Checking that pluto is running                                  [OK]
    Pluto listening for IKE on udp 500                             [OK]
    Pluto listening for NAT-T on udp 4500                          [OK]
    Checking for 'ip' command                                       [OK]
    Checking /bin/sh is not /bin/dash                               [OK]
    Checking for 'iptables' command                                 [OK]
    Opportunistic Encryption Support                                [DISABLED


(5) 配置编辑/etc/xl2tpd/xl2tpd.conf文件

vim /etc/xl2tpd/xl2tpd.conf


[global]
port = 1701

[lns default]
ip range = 10.10.20.1-10.10.20.5    #这里设置IP地址分配的地址段
local ip = 10.10.20.254    #设置网关地址
require chap = yes
refuse pap = yes
require authentication = yes
name = l2tpd
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes


(6) 配置用户名,密码:编辑 /etc/ppp/chap-secrets

vim /etc/ppp/chap-secrets


# Secrets for authentication using CHAP
# client    server  secret      IP addresses
 Kemin     l2tpd   Kemin       10.10.20.1
 
# 用户名     连接协议    密码    指定IP地址


(7) 重启xl2tp

service xl2tpd restart


(8) 添加自启动

chkconfig xl2tpd on
chkconfig iptables on
chkconfig ipsec on


(9) 防火墙配置转发规则

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# 允许已建立的或相关连的通行
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 允许本地回环接口
-A INPUT -i lo -j ACCEPT

# 允许指定主机使用ssh协议
-A INPUT -m tcp -p tcp --dport 22 -j ACCEPT

# 允许外网访问l2tp协议的端口
-A INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.10.20.0/24  -j ACCEPT

# 拒绝其他未允许的规则访问
-A INPUT -j DROP
-A FORWARD -j REJECT
COMMIT

*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]

#允许分配的地址段从内网网卡转发
-A POSTROUTING -s 10.10.20.0/24 -j SNAT --to-source 172.31.243.141
COMMIT


OK,到这里为止,基本的服务已经配置好了,接下来连接试试


  验证结果

手机和电脑上都是可以连接的,但是电脑连接的时候弹出报错,下面是解决思路,可供参考

1、检查IPsec服务时候开启;

2、Win+R调出运行输入regedit回车,打开注册表单击以下注册表子项,HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters,新建AllowL2TPWeakCrypto的Dword值1;


  最后总结

我们简单总结一下,我们这篇教程里面用到的软件有:

openswan(ipsec) : 提供一个密钥
ppp :提供用户名和密码
xl2tpd : 提供L2TP服务
sysctl : 提供服务器内部转发
iptables : 提供请求从服务器内部转向外部,外部响应转向服务器内部

感觉对你有用的话点个赞或收藏支持支持呗,如果在动手的过程中有什么问题也可以在下方留言,我会第一时间为你解答的哟~