简介
L2TP是一种工业标准的Internet隧道协议,功能大致和PPTP协议类似,比如同样可以对网络数据流进行加密。不过也有不同之处,比如PPTP要求网络为IP网络,L2TP要求面向数据包的点对点连接;PPTP使用单一隧道,L2TP使用多隧道;L2TP提供包头压缩、隧道验证,而PPTP不支持。以上是来源于百度百科的专业术语解释,当然看不懂也正常,看懂了说明你厉害,用人类看的懂的语言翻译一下就是一种加密的传输协议,我们常常说翻墙出去上Facebook、YouTu这些其实就是连接了vpn,而vpn的传输协议其中就包括L2TP,常见的还有pptp。
协议结构
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的区别
- PPTP要求互联网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接。L2TP可以在IP(使用UDP),帧中继永久虚拟电路(PVCs),X.25虚拟电路(VCs)或ATM VCs网络上使用。
- PPTP只能在两端点间建立单一隧道。L2TP支持在两端点间使用多隧道。使用L2TP,用户可以针对不同的服务质量创建不同的隧道。
- L2TP可以提供包头压缩。当压缩包头时,系统开销(overhead)占用4个字节,而PPTP协议下要占用6个字节。
- L2TP自身不提供隧道验证,从L2TP的包头可以看出。隧道认证是由PPP(pap或chap)协议提供!而PPTP则支持隧道验证,PPTP自身就是PPP的扩展!但是当L2TP或PPTP与IPsec共同使用时,可以由IPsec提供隧道验证,不需要在第2层协议上验证隧道.
- L2TP访问集中器(L2TP Access Concentrator,LAC)是一种附属在网络上的具有PPP端系统和L2Tpv2协议处理能力的设备,它一般就是一个网络接入服务器软件,在远程客户端完成网络接入服务的功能。
- L2TP网络服务器(L2TP Network Server,LNS)是用于处理L2TP协议服务器端的软件。
实践尝试
部署有两种方法:一种是一键脚本安装搭建,另一种则是手动DIY安装,前者比较适用于经典网络的服务器,没有区分内外网IP地址,做起来比较简单,而后者相对比较复杂,比较适合中高级玩家打的副本;
安装前的检查
执行命令:cat /dev/net/tun
执行命令:
cat /dev/ppp
方法一:脚本安装
cd /root
#CentOS、Fedora或Redhat系统时执行
wget http://lamp.teddysun.com/files/l2tp.sh
#Ubuntu系统时执行此命令
wget http://lamp.teddysun.com/files/l2tp_ubuntu.sh
#为脚本添加执行权限
chmod +x *.sh
#CentOS、Fedora或Redhat系统时执行
./l2tp.sh
#Ubuntu系统时执行此命令
./l2tp_ubuntu.sh
等待出现一下提示信息:
[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
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
验证结果
手机和电脑上都是可以连接的,但是电脑连接的时候弹出报错,下面是解决思路,可供参考
1、检查IPsec服务时候开启;
2、Win+R调出运行输入regedit回车,打开注册表单击以下注册表子项,HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters
,新建AllowL2TPWeakCrypto
的Dword
值1
;
错误 809:无法建立计算机与 VPN 服务器之间的网络连接,因为远程服务器未响应。这可能是因为未将计算机与远程服务器之间的某种网络设备(如防火墙、NAT、路由器等)配置为允许 VPN 连接。请与管理员或服务提供商联系以确定哪种设备可能产生此问题。
要解决此错误,在首次连接之前需要修改一次注册表,以解决 VPN 服务器 和/或 客户端与 NAT (比如家用路由器)的兼容问题。请下载并导入下面的 .reg 文件,或者打开 提升权限命令提示符 并运行以下命令。完成后必须重启计算机。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent]
"AssumeUDPEncapsulationContextOnSendRule"=dword:00000002
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters]
"ProhibitIpSec"=dword:00000000
最后总结
我们简单总结一下,我们这篇教程里面用到的软件有:
openswan(ipsec):提供一个密钥
ppp:提供用户名和密码
xl2tpd:提供L2TP服务
sysctl:提供服务器内部转发
iptables:提供请求从服务器内部转向外部,外部响应转向服务器内部
在动手的过程中有什么问题也可以在下方留言