Linux中如何使用Openswan建立站点到站点的IPsec VPN隧道?

译文
运维 系统运维
虚拟专用网(VPN)隧道用来通过基于互联网的一条隧道,将两个不同的物理网络安全地互联起来。不同的网络是拥有全局非路由专用IP地址的专用以太网子网时,就需要隧道机制,因为这些子网无法通过基于互联网的传统路由连接到对方

虚拟专用网(VPN)隧道用来通过基于互联网的一条隧道,将两个不同的物理网络安全地互联起来。不同的网络是拥有全局非路由专用IP地址的专用以太网子网时,就需要隧道机制,因为这些子网无法通过基于互联网的传统路由连接到对方。比如说,常常建立VPN隧道,连接属于同一家机构的使用网络地址转换(NAT)技术的不同分支机构网络。

有时候,还可能仅仅为了安全方面的考虑而使用VPN隧道机制。服务提供商或私营公司以这样一种方式来设计其网络:关键的服务器(比如数据库、VoIP或银行业务服务器)部署在只有可信赖的人员通过VPN隧道才能访问的子网中。需要安全的VPN隧道时,IPsec常常是一个优先的选择,因为IPsec VPN隧道采用了多层安全机制来加以保护。

本教程将演示我们在Linux中使用Openswan建立站点到站点的VPN隧道有多容易。

拓扑结构

本教程将着重介绍用于建立IPsec隧道的下列拓扑结构。

 

 

安装软件包和准备VPN服务器

通常情况下,你只要管理站点A,但是根据实际需要,你有可能同时管理站点A和站点B。我们先从安装Openswan开始入手。

在基于红帽的系统上(CentOS、Fedora或RHEL):

  1. # yum install openswan lsof 

在基于Debian的系统上(Debian、Ubuntu或Linux Mint):

  1. # apt-get install openswan 

现在,我们使用下面这些命令,禁用服务器中的VPN重定向,如果有VPN重定向的话:

  1. # for vpn in /proc/sys/net/ipv4/conf/*;  
  2. # do echo 0 > $vpn/accept_redirects;  
  3. # echo 0 > $vpn/send_redirects;  
  4. # done 

下一步,我们改动内核参数,允许IP转发、永久性禁止重定向。

  1. # vim /etc/sysctl.conf  
  2. net.ipv4.ip_forward = 1 
  3. net.ipv4.conf.all.accept_redirects = 0 
  4. net.ipv4.conf.all.send_redirects = 0 

重新装入/etc/sysctl.conf:

  1. # sysctl -p 

我们开启防火墙的必要端口。务必确保规则与现有的防火墙规则没有冲突。

  1. # iptables -A INPUT -p udp --dport 500 -j ACCEPT  
  2. # iptables -A INPUT -p tcp --dport 4500 -j ACCEPT  
  3. # iptables -A INPUT -p udp --dport 4500 -j ACCEPT 

最后,我们为NAT创建防火墙规则。

  1. # iptables -t nat -A POSTROUTING -s site-A-private-subnet -d site-B-private-subnet -j SNAT --to site-A-Public-IP 

务必确保防火墙规则具有持续性。

注意:

•你可以使用MASQUERADE来代替SNAT。按道理来说它应该可以,但在过去导致我的虚拟专用服务器(VPS)出现过问题。所以,如果我是你,就会使用SNAT。

•如果你同时在管理站点B,就在站点B服务器中创建类似的规则。

•直接路由不需要SNAT。

准备配置文件

我们将要处理的第一个配置文件是ipsec.conf。无论你配置的是哪台服务器,总是将你的站点想成“left”,将远程站点想成“right”。下列配置在站点A的VPN服务器中完成。

  1. # vim /etc/ipsec.conf  
  2. ## 基本的配置参数##  
  3. config setup  
  4. plutodebug=all 
  5. plutostderrlog=/var/log/pluto.log  
  6. protostack=netkey 
  7. nat_traversal=yes 
  8. virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/16  
  9. ## 禁用红帽中的随机加密##  oe=off 
  10. ## 禁用Debian中的随机加密##  
  11. ## 注意:这是一个单独的声明语句##  include /etc/ipsec.d/examples/no_oe.conf  
  12. ## 红帽中的连接定义##  conn demo-connection-redhat  
  13. authby=secret 
  14. auto=start 
  15. ike=3des-md5  
  16. ## 第1个阶段## keyexchange=ike 
  17. ## 第2个阶段## phase2=esp 
  18. phase2alg=3des-md5  
  19. compress=no 
  20. pfs=yes 
  21. type=tunnel 
  22. left=<siteA-public-IP> 
  23. leftsourceip=<siteA-public-IP> 
  24. leftsubnet=<siteA-private-subnet>/netmask  
  25. ## 针对直接路由## leftsubnet=<siteA-public-IP>/32  
  26. leftnexthop=%defaultroute  
  27. right=<siteB-public-IP> 
  28. rightsubnet=<siteB-private-subnet>/netmask  
  29. ## Debian中的连接定义## conn demo-connection-debian  
  30. authby=secret 
  31. auto=start 
  32. ## 第1个阶段 ## keyexchange=ike 
  33. ## 第2个阶段 ## esp=3des-md5  
  34. pfs=yes 
  35. type=tunnel 
  36. left=<siteA-public-IP> 
  37. leftsourceip=<siteA-public-IP> 
  38. leftsubnet=<siteA-private-subnet>/netmask  
  39. ## 针对直接路由## leftsubnet=<siteA-public-IP>/32  
  40. leftnexthop=%defaultroute  
  41. right=<siteB-public-IP> 
  42. rightsubnet=<siteB-private-subnet>/netmask 

可以通过几种不同的方式来进行验证。本教程将探讨预共享密钥的使用,该密钥被添加到文件/etc/ipsec.secrets中。

  1. # vim /etc/ipsec.secrets  
  2. 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" 

开启服务和故障排查

服务器现在应该准备好建立站点到站点的VPN隧道了。要是你还管理站点B,务必确保已配置好了站点B服务器的必要参数。如果是基于红帽的系统,务必确保你使用chkconfig命令,将服务添加到启动项中。

  1. # /etc/init.d/ipsec restart 

要是两端的服务器都没有错误,现在隧道应该已建立起来。考虑到下列因素,你可以使用ping命令来测试隧道了。

1. 站点B专用子网应该无法从站点A来访问;也就是说,要是隧道未建立起来,ping应该不管用。

2. 隧道建立起来后,试着从站点A用ping连通站点B专用子网。这应该管用。

另外,通向目的地专用子网的路由应该出现在服务器的路由表中。

  1. # ip route  
  2. [siteB-private-subnet] via [siteA-gateway] dev  
  3. eth0 src [siteA-public-IP]  
  4. default via [siteA-gateway] dev eth0 

此外,我们可以使用下面这些实用命令,检查隧道的状态。

  1. # service ipsec status  
  2. IPsec running - pluto pid: 20754  
  3. pluto pid 20754  
  4. 1 tunnels up  
  5. some eroutes exist  
  6. # ipsec auto --status  
  7. ## 输出被截断##  
  8. 000 "demo-connection-debian": myip=<siteA- 
  9. public-IP>hisip=unset;  
  10. 000 "demo-connection-debian": ike_life: 3600s;  
  11. ipsec_life: 28800s; rekey_margin: 540s;  
  12. rekey_fuzz: 100%; keyingtries: 0; nat_keepalive:  
  13. yes  
  14. 000 "demo-connection-debian": policy:  
  15. PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK+lKOD+rKO  
  16. D; prio: 32,28; interface: eth0;  
  17. ## 输出被截断##  
  18. 000 #184: "demo-connection-debian":500  
  19. STATE_QUICK_R2 (IPsec SA established);  
  20. EVENT_SA_REPLACE in 1653s; newest IPSEC; eroute  
  21. owner; isakmp#183; idle; import:not set  
  22. ## 输出被截断##  
  23. 000 #183: "demo-connection-debian":500  
  24. STATE_MAIN_I4 (ISAKMP SA established);  
  25. EVENT_SA_REPLACE in 1093s; newest ISAKMP; lastdpd=-  
  26. 1s(seq in:0 out:0); idle; import:not set 

日志文件/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

责任编辑:牛小雨 来源: 51CTO
相关推荐

2011-07-18 10:40:39

2011-10-31 10:57:44

VPNIpsec VPN

2009-02-27 11:03:00

VPN配置远程接入

2014-06-05 14:01:39

微软Windows AzuVPN

2009-10-14 09:52:16

2009-12-31 10:28:16

VPN配置实例

2011-11-25 13:49:17

2009-12-28 16:55:25

2011-11-25 13:24:56

2010-07-27 09:44:16

HTML 5

2011-11-25 13:34:56

IPsec VPNIPsec VPN协议

2011-11-29 16:08:30

IPsec VPN

2023-08-30 00:08:22

灾难恢复备份

2011-11-25 13:14:16

2010-05-18 18:38:06

IIS服务器

2011-11-29 12:13:21

VPN

2010-05-18 18:36:22

IIS服务器

2012-09-26 09:49:44

2010-12-15 11:24:35

2012-09-28 09:44:32

点赞
收藏

51CTO技术栈公众号