搭建VPN服务

背景

VPN(virtual private network)虚拟专用网络,目前主要能接触到的协议包括PPTP(点对点隧道协议)和L2TP(2层隧道协议)

  • PPTP(2层VPN) 由微软和3Com等公司组成的PPTP论坛开发的点对点隧道协议,基于PPP协议使用PAP或CHAP之类的加密算法。
  • L2TP(2层VPN) 是IETF基于L2F (Cisco的第二层转发协议)开发的PPTP的后续版本,是一种工业标准 Internet 隧道协议,其可以为跨越面向数据包的媒体发送点到点协议 (PPP) 框架提供封装。
    PPTP和L2TP都使用PPP协议对数据进行封装,然后添加附加包头用于数据在互联网络上的传输。PPTP只能在两端点间建立单一隧道。 L2TP支持在两端点间使用多隧道,用户可以针对不同的服务质量创建不同的隧道。L2TP可以提供隧道验证,而PPTP则不支持隧道验证。但是当L2TP 或PPTP与IPSEC共同使用时,可以由IPSEC提供隧道验证,不需要在第2层协议上验证隧道使用L2TP。PPTP要求互联网络为IP网络。L2TP只要求隧道媒介提供面向数据包的点对点的连接,L2TP可以在IP(使用UDP),桢中继永久虚拟电路 (PVCs),X.25虚拟电路(VCs)或ATM VCs网络上使用。

IPSec(3层VPN),隧道模式隧道是封装、路由与解封装的整个过程。隧道将原始数据包隐藏(或封装)在新的数据包内部。该新的数据包可能会有新的寻址与路由信息,从而使其能够通过网络传输。隧道与数据保密性结合使用时,在网络上窃听通讯的人将无法获取原始数据包数据(以及原始的源和目标)。封装的数据包到达目的地后,会删除封装,原始数据包头用于将数据包路由到最终目的地。

搭建环境

  • OS, raspbian jessie
  • 硬件,Raspbarry Pi 3B
  • ppp,2.4.6
  • pptpd,1.4.0
  • openswan,2.6.38
  • xl2tp,1.3.6

PPTP部署

软件安装

安装ppppptpd

1
2
sudo apt-get install ppp
sudo apt-get install pptpd

配置pptpd

在配置文件/etc/pptpd.conf中,增加如下内容:

1
2
localip 192.168.1.101       # 本地ip
remoteip 192.168.1.110-120 # 设置ip分配范围

注:ip地址不要有冲突

配置ppp

在配置文件/etc/ppp/chap-secrets中,增加用户名密码
格式: {用户名}<tab>*<tab>{密码}<tab>*

在配置文件/etc/ppp/options中,设置MTU

1
2
-mru        # 关闭MRU协商
mru 1496 # 设置MTU值为1496

ip转发配置

如果需要通过VPN访问宿主机本地网络,需要开通ip转发功能,在/etc/sysctl.conf中设置net.ipv4.ip_forward=1。并执行sudo sysctl -p使修改生效。

重启pptpd服务

sudo systemctl restart pptpd

IPsec over L2TP部署

软件安装

安装pppxl2tpdopenswan

1
2
3
sudo apt-get install ppp
sudo apt-get install xl2tpd
sudo apt-get install openswan

IPsec配置及测试

配置

/etc/ipsec.conf中,增加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
onn L2TP-PSK-NAT
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=192.168.3.100 # 本机ip
leftprotoport=17/1701
right=%any
rightprotoport=17/%any

/etc/ipsec.secrets中增加预共享密钥{本地IP}<tab>%any: PSK<tab>"{密码}"
eg: 192.168.3.100 %any: PSK "lsjflsdkfj"

关闭内核ICMP重定向

1
2
3
4
5
for abspath in /proc/sys/net/ipv4/conf/*
do
echo 0 > $abspath/accept_redirects
echo 0 > $abspath/send_redirects
done

修改/etc/sysctl.conf中的配置

1
2
3
4
5
6
7
8
9
10
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

执行sudo sysctl -p立即生效

测试

使用ipsec verify验证ipsec配置。在验证前,请先重启ipsec服务sudo systemctl restart ipsec

L2TP配置

/etc/xl2tpd/xl2tpd.conf中增加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[global]

listen-addr = 192.168.3.100
ipsec saref = yes

[lns default]
ip range = 192.168.3.120-192.168.3.123
local ip = 192.168.3.100
refuse chap = yes
refuse pap = yes
require authentication = yes
name = l2tp
ppp debug = yes

pppoptfile = /etc/ppp/options.xl2tpd

length bit = yes

PPP配置

options配置

新建xl2tpd专用options,并增加内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ipcp-accept-local
ipcp-accept-remote

#ms-dns 192.168.3.1
ms-dns 8.8.8.8
ms-dns 8.8.4.4

noccp
auth
crtscts
debug
hide-password
modem
lock
proxyarp

账户配置

可复用PPTP部署中的PPP配置的账户

重启L2TP服务

sudo systemctl restart xl2tpd

参考&鸣谢