虚拟专用网(VPN)隧道用来通过基于互联网的一条隧道,将两个不同的物理网络安全地互联起来。不同的网络是拥有全局非路由专用IP地址的专用以太网子网时,就需要隧道机制,因为这些子网无法通过基于互联网的传统路由连接到对方。比如说,常常建立VPN隧道,连接属于同一家机构的使用网络地址转换(NAT)技术的不同分支机构网络。
有时候,还可能仅仅为了安全方面的考虑而使用VPN隧道机制。服务提供商或私营公司以这样一种方式来设计其网络:关键的服务器(比如数据库、VoIP或银行业务服务器)部署在只有可信赖的人员通过VPN隧道才能访问的子网中。需要安全的VPN隧道时,IPsec常常是一个优先的选择,因为IPsec VPN隧道采用了多层安全机制来加以保护。
本教程将演示我们在Linux中使用Openswan建立站点到站点的VPN隧道有多容易。
拓扑结构
本教程将着重介绍用于建立IPsec隧道的下列拓扑结构。
安装软件包和准备VPN服务器
通常情况下,你只要管理站点A,但是根据实际需要,你有可能同时管理站点A和站点B。我们先从安装Openswan开始入手。
在基于红帽的系统上(CentOS、Fedora或RHEL):
#yuminstallopenswanlsof
在基于Debian的系统上(Debian、Ubuntu或Linux Mint):
#apt-getinstallopenswan
现在,我们使用下面这些命令,禁用服务器中的VPN重定向,如果有VPN重定向的话:
#forvpnin/proc/sys/net/ipv4/conf/*; #doecho0>$vpn/accept_redirects; #echo0>$vpn/send_redirects; #done
下一步,我们改动内核参数,允许IP转发、永久性禁止重定向。
#vim/etc/sysctl.conf net.ipv4.ip_forward=1 net.ipv4.conf.all.accept_redirects=0 net.ipv4.conf.all.send_redirects=0
重新装入/etc/sysctl.conf:
#sysctl-p
我们开启防火墙的必要端口。务必确保规则与现有的防火墙规则没有冲突。
#iptables-AINPUT-pudp--dport500-jACCEPT #iptables-AINPUT-ptcp--dport4500-jACCEPT #iptables-AINPUT-pudp--dport4500-jACCEPT
最后,我们为NAT创建防火墙规则。
#iptables-tnat-APOSTROUTING-ssite-A-private-subnet-dsite-B-private-subnet-jSNAT--tosite-A-Public-IP
务必确保防火墙规则具有持续性。
注意:
•你可以使用MASQUERADE来代替SNAT。按道理来说它应该可以,但在过去导致我的虚拟专用服务器(VPS)出现过问题。所以,如果我是你,就会使用SNAT。
•如果你同时在管理站点B,就在站点B服务器中创建类似的规则。
•直接路由不需要SNAT。
准备配置文件
我们将要处理的第一个配置文件是ipsec.conf。无论你配置的是哪台服务器,总是将你的站点想成“left”,将远程站点想成“right”。下列配置在站点A的VPN服务器中完成。
#vim/etc/ipsec.conf ##基本的配置参数## configsetup 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 ##红帽中的连接定义## conndemo-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中的连接定义##conndemo-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
可以通过几种不同的方式来进行验证。本教程将探讨预共享密钥的使用,该密钥被添加到文件/etc/ipsec.secrets中。
#vim/etc/ipsec.secrets siteA-public-IPsiteB-public-IP:PSK"pre-shared-key"##incaseofmultiplesites##siteA-public-IPsiteC-public-IP:PSK"corresponding-pre-shared-key"
开启服务和故障排查
服务器现在应该准备好建立站点到站点的VPN隧道了。要是你还管理站点B,务必确保已配置好了站点B服务器的必要参数。如果是基于红帽的系统,务必确保你使用chkconfig命令,将服务添加到启动项中。
#/etc/init.d/ipsecrestart
要是两端的服务器都没有错误,现在隧道应该已建立起来。考虑到下列因素,你可以使用ping命令来测试隧道了。
1. 站点B专用子网应该无法从站点A来访问;也就是说,要是隧道未建立起来,ping应该不管用。
2. 隧道建立起来后,试着从站点A用ping连通站点B专用子网。这应该管用。
另外,通向目的地专用子网的路由应该出现在服务器的路由表中。
#iproute [siteB-private-subnet]via[siteA-gateway]dev eth0src[siteA-public-IP] defaultvia[siteA-gateway]deveth0
此外,我们可以使用下面这些实用命令,检查隧道的状态。
#serviceipsecstatus IPsecrunning-plutopid:20754 plutopid20754 1tunnelsup someeroutesexist #ipsecauto--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(IPsecSAestablished); EVENT_SA_REPLACEin1653s;newestIPSEC;eroute owner;isakmp#183;idle;import:notset ##输出被截断## 000#183:"demo-connection-debian":500 STATE_MAIN_I4(ISAKMPSAestablished); EVENT_SA_REPLACEin1093s;newestISAKMP;lastdpd=- 1s(seqin:0out:0);idle;import:notset
日志文件/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隧道确保了传输中数据安全可靠,不会被人窃听或截获。
但愿本文有所帮助。欢迎交流心得。