虚拟专用网(VPN)隧道用来通过基于互联网的一条隧道,将两个不同的物理网络安全地互联起来。不同的网络是拥有全局非路由专用IP地址的专用以太网子网时,就需要隧道机制,因为这些子网无法通过基于互联网的传统路由连接到对方。比如说,常常建立VPN隧道,连接属于同一家机构的使用网络地址转换(NAT)技术的不同分支机构网络。
有时候,还可能仅仅为了安全方面的考虑而使用VPN隧道机制。服务提供商或私营公司以这样一种方式来设计其网络:关键的服务器(比如数据库、VoIP或银行业务服务器)部署在只有可信赖的人员通过VPN隧道才能访问的子网中。需要安全的VPN隧道时,IPsec常常是一个优先的选择,因为IPsec VPN隧道采用了多层安全机制来加以保护。
本教程将演示我们在Linux中使用Openswan建立站点到站点的VPN隧道有多容易。
拓扑结构
本教程将着重介绍用于建立IPsec隧道的下列拓扑结构。
安装软件包和准备VPN服务器
通常情况下,你只要管理站点A,但是根据实际需要,你有可能同时管理站点A和站点B。我们先从安装Openswan开始入手。
在基于红帽的系统上(CentOS、Fedora或RHEL):
复制
# yum install openswan lsof
1.
在基于Debian的系统上(Debian、Ubuntu或Linux Mint):
复制
# apt-get install openswan
1.
现在,我们使用下面这些命令,禁用服务器中的VPN重定向,如果有VPN重定向的话:
复制
# for vpn in /proc/sys/net/ipv4/conf/*; # do echo 0 > $vpn/accept_redirects; # echo 0 > $vpn/send_redirects; # done
1.
2.
3.
4.
下一步,我们改动内核参数,允许IP转发、永久性禁止重定向。
复制
# vim /etc/sysctl.conf net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0
1.
2.
3.
4.
重新装入/etc/sysctl.conf:
复制
# sysctl -p
1.
我们开启防火墙的必要端口。务必确保规则与现有的防火墙规则没有冲突。
复制
# iptables -A INPUT -p udp --dport 500 -j ACCEPT # iptables -A INPUT -p tcp --dport 4500 -j ACCEPT # iptables -A INPUT -p udp --dport 4500 -j ACCEPT
1.
2.
3.
最后,我们为NAT创建防火墙规则。
复制
# iptables -t nat -A POSTROUTING -s site-A-private-subnet -d site-B-private-subnet -j SNAT --to site-A-Public-IP
1.
务必确保防火墙规则具有持续性。
注意:
•你可以使用MASQUERADE来代替SNAT。按道理来说它应该可以,但在过去导致我的虚拟专用服务器(VPS)出现过问题。所以,如果我是你,就会使用SNAT。
•如果你同时在管理站点B,就在站点B服务器中创建类似的规则。
•直接路由不需要SNAT。
准备配置文件
我们将要处理的第一个配置文件是ipsec.conf。无论你配置的是哪台服务器,总是将你的站点想成“left”,将远程站点想成“right”。下列配置在站点A的VPN服务器中完成。
复制
# vim /etc/ipsec.conf ## 基本的配置参数## config setup plutodebug=all plutostderrlog=/var/log/pluto.log protostack=netkey nat_traversal=yes virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/16 ## 禁用红帽中的随机加密## oe=off ## 禁用Debian中的随机加密## ## 注意:这是一个单独的声明语句## include /etc/ipsec.d/examples/no_oe.conf ## 红帽中的连接定义## conn demo-connection-redhat authby=secret auto=start ike=3des-md5 ## 第1个阶段## keyexchange=ike ## 第2个阶段## phase2=esp phase2alg=3des-md5 compress=no pfs=yes type=tunnel left=<siteA-public-IP> leftsourceip=<siteA-public-IP> leftsubnet=<siteA-private-subnet>/netmask ## 针对直接路由## leftsubnet=<siteA-public-IP>/32 leftnexthop=%defaultroute right=<siteB-public-IP> rightsubnet=<siteB-private-subnet>/netmask ## Debian中的连接定义## conn demo-connection-debian authby=secret auto=start ## 第1个阶段 ## keyexchange=ike ## 第2个阶段 ## esp=3des-md5 pfs=yes type=tunnel left=<siteA-public-IP> leftsourceip=<siteA-public-IP> leftsubnet=<siteA-private-subnet>/netmask ## 针对直接路由## leftsubnet=<siteA-public-IP>/32 leftnexthop=%defaultroute right=<siteB-public-IP> rightsubnet=<siteB-private-subnet>/netmask
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
可以通过几种不同的方式来进行验证。本教程将探讨预共享密钥的使用,该密钥被添加到文件/etc/ipsec.secrets中。
复制
# vim /etc/ipsec.secrets siteA-public-IP siteB-public-IP: PSK "pre-shared-key" ## in case of multiple sites ## siteA-public-IP siteC-public-IP: PSK "corresponding-pre-shared-key"
1.
2.
开启服务和故障排查
服务器现在应该准备好建立站点到站点的VPN隧道了。要是你还管理站点B,务必确保已配置好了站点B服务器的必要参数。如果是基于红帽的系统,务必确保你使用chkconfig命令,将服务添加到启动项中。
复制
# /etc/init.d/ipsec restart
1.
要是两端的服务器都没有错误,现在隧道应该已建立起来。考虑到下列因素,你可以使用ping命令来测试隧道了。
1. 站点B专用子网应该无法从站点A来访问;也就是说,要是隧道未建立起来,ping应该不管用。
2. 隧道建立起来后,试着从站点A用ping连通站点B专用子网。这应该管用。
另外,通向目的地专用子网的路由应该出现在服务器的路由表中。
复制
# ip route [siteB-private-subnet] via [siteA-gateway] dev eth0 src [siteA-public-IP] default via [siteA-gateway] dev eth0
1.
2.
3.
4.
此外,我们可以使用下面这些实用命令,检查隧道的状态。
复制
# service ipsec status IPsec running - pluto pid: 20754 pluto pid 20754 1 tunnels up some eroutes exist # ipsec auto --status ## 输出被截断## 000 "demo-connection-debian": myip=<siteA- public-IP>; hisip=unset; 000 "demo-connection-debian": ike_life: 3600s; ipsec_life: 28800s; rekey_margin: 540s; rekey_fuzz: 100%; keyingtries: 0; nat_keepalive: yes 000 "demo-connection-debian": policy: PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK+lKOD+rKO D; prio: 32,28; interface: eth0; ## 输出被截断## 000 #184: "demo-connection-debian":500 STATE_QUICK_R2 (IPsec SA established); EVENT_SA_REPLACE in 1653s; newest IPSEC; eroute owner; isakmp#183; idle; import:not set ## 输出被截断## 000 #183: "demo-connection-debian":500 STATE_MAIN_I4 (ISAKMP SA established); EVENT_SA_REPLACE in 1093s; newest ISAKMP; lastdpd=- 1s(seq in:0 out:0); idle; import:not set
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
日志文件/var/log/pluto.log还应该含有验证、密钥交换方面的实用信息,以及隧道不同阶段方面的信息。要是你的隧道没有出现,还应该检查日志文件。.
如果你确信所有配置正确无误,如果你的隧道仍然没有出现,就应该检查下列方面。
1. 许多互联网服务提供商(ISP)对IPsec端口进行过滤。确保你的ISP允许UDP 500端口和TCP/UDP 4500端口。你可以通过telnet,试着从远程位置连接至你服务器的IPsec端口。
2. 确保服务器的防火墙中允许必要的端口。
3. 确保预共享密钥在两端的服务器中一模一样。
4. left和right参数在两端的服务器上都应该合理配置。
5. 如果你在NAT方面遇到了问题,试着使用SNAT,而不是MASQUERADING。
总之,本教程着重介绍了在Linux中使用Openswan建立站点到站点的IPSec VPN隧道这个过程。VPN隧道在增强安全性方面非常有用,因为它们让管理员们可以做到只通过隧道才能访问关键资源。另外,VPN隧道确保了传输中数据安全可靠,不会被人窃听或截获。
但愿本文有所帮助。欢迎交流心得。
英文原文:http://xmodulo.com/2014/08/create-site-to-site-ipsec-vpn-tunnel-openswan-linux.html