如何在 Linux 中使用 Openswan 创建站点到站点 IPsec VPN 隧道
虚拟专用网络 (VPN) 隧道用于通过 Internet 上的隧道安全地互连两个物理上独立的网络。当单独的网络是具有全局不可路由的私有 IP 地址的私有 LAN 子网时,需要使用隧道,这些子网无法通过 Internet 上的传统路由相互访问。例如,通常部署 VPN 隧道来连接属于同一机构的不同 NAT 分支机构网络。
有时,VPN 隧道也可能仅用于其安全优势。服务提供商或私营公司可能会以这样的方式设计其网络:将重要服务器(例如数据库、VoIP、银行服务器)放置在仅可由受信任人员通过 VPN 隧道访问的子网中。当需要安全的 VPN 隧道时,IPsec 通常是首选,因为 IPsec VPN 隧道具有多层安全性。
本教程将展示如何在 Linux 中使用 Openswan 轻松创建站点到站点 VPN 隧道。
测试拓扑
本教程将重点介绍用于创建 IPsec 隧道的以下拓扑。



安装软件包并准备 VPN 服务器
通常,您将仅管理 site-A
,但根据要求,您可以同时管理 site-A
和 site-B
。我们通过安装 Openswan 开始该过程。
在基于 Red Hat 的系统(CentOS、Fedora 或 RHEL)上:
# yum install openswan lsof
在基于 Debian 的系统(Debian、Ubuntu 或 Linux Mint)上:
# apt-get install openswan
现在,我们使用以下命令在服务器中禁用 VPN 重定向(如果有):
# for vpn in /proc/sys/net/ipv4/conf/*;
# do echo 0 > $vpn/accept_redirects;
# echo 0 > $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 -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
最后,我们为 NAT 创建防火墙规则。
# 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
。如果您也在管理
site-B
,请在site-B
服务器中创建类似的规则。直接路由不需要
SNAT
。
准备配置文件
我们将使用的第一个配置文件是ipsec.conf
。无论您配置哪个服务器,始终将您的站点视为左,将远程站点视为右。以下配置是在 siteA
的 VPN 服务器中完成的。
# vim /etc/ipsec.conf
## general configuration parameters ##
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/12
## disable opportunistic encryption in Red Hat ##
oe=off
## disable opportunistic encryption in Debian ##
## Note: this is a separate declaration statement ##
include /etc/ipsec.d/examples/no_oe.conf
## connection definition in Red Hat ##
conn demo-connection-redhat
authby=secret
auto=start
ike=3des-md5
## phase 1 ##
keyexchange=ike
## phase 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
## for direct routing ##
leftsubnet=<siteA-public-IP>/32
leftnexthop=%defaultroute
right=<siteB-public-IP>
rightsubnet=<siteB-private-subnet>/netmask
## connection definition in Debian ##
conn demo-connection-debian
authby=secret
auto=start
## phase 1 ##
keyexchange=ike
## phase 2 ##
esp=3des-md5
pfs=yes
type=tunnel
left=<siteA-public-IP>
leftsourceip=<siteA-public-IP>
leftsubnet=<siteA-private-subnet>/netmask
## for direct routing ##
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-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 隧道。如果您也管理 site-B
,请确保您已使用必要的参数配置 site-B
的服务器。对于基于 Red Hat 的系统,请确保使用 chkconfig 命令将服务添加到启动中。
# /etc/init.d/ipsec restart
如果两端服务器都没有错误,则隧道现在应该已启动。考虑到以下因素,您可以使用 ping
命令测试隧道。
site-B
的私有子网不应从site-A
访问。也就是说,如果隧道未启动,ping
应该不起作用。隧道建立后,尝试从
site-A
ping
到site-B
的私有子网。这应该有效。
此外,到目标私有子网的路由应出现在服务器的路由表中。
# ip route
[site-B's private-subnet] via [siteA-gateway] dev eth0 src [siteA-public-IP]
default via [site-A's gateway] dev eth0
此外,我们可以使用以下有用的命令检查隧道的状态。
# service ipsec status
IPsec running - pluto pid: 20754
pluto pid 20754
1 tunnels up
some eroutes exist
# ipsec auto --status
## output truncated ##
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+rKOD; prio: 32,28; interface: eth0;
## output truncated ##
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
## output truncated ##
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
日志文件 /var/log/pluto.log
还应包含有关身份验证、密钥交换和隧道不同阶段信息的有用信息。如果您的隧道没有出现,您也可以检查那里。
如果您确定所有配置均正确,但隧道仍未启动,则应检查以下事项。
许多 ISP 都会过滤 IPsec 端口。确保您的 ISP 允许
UDP/500
、TCP/UDP/4500
端口。您可以尝试通过telnet
从远程位置连接到服务器 IPsec 端口。确保服务器的防火墙允许必要的端口。
确保两个终端服务器中的预共享密钥相同。
左右参数应在两端服务器上正确配置。
如果您遇到 NAT 问题,请尝试使用
SNAT
而不是MASQUERADING
。
总而言之,本教程重点介绍使用 Openswan 在 Linux 中创建站点到站点 IPSec VPN 隧道的过程。 VPN 隧道对于增强安全性非常有用,因为它们允许管理员仅通过隧道提供关键资源。 VPN 隧道还确保传输中的数据不被窃听或拦截。
希望这可以帮助。让我知道你的想法。