IPsec VPN
Internet Protocol Security (IPsec) 是一组协议,位于互联网协议(IP)层之上。它通过对每个通信会话的 IP 包进行认证和加密,使两个或多个主机能够以安全的方式进行通信。FreeBSD 的 IPsec 网络栈基于 http://www.kame.net/ 实现,支持 IPv4 和 IPv6 会话。
IPsec 包含以下子协议:
Encapsulated Security Payload (ESP):该协议通过使用对称加密算法(如 Blowfish 和 3DES)加密内容,保护 IP 包数据不受第三方干扰。
Authentication Header (AH):该协议通过计算加密校验和并使用安全哈希函数对 IP 包头字段进行哈希,保护 IP 包头免受第三方干扰和伪造。接着,附加一个包含哈希值的头部,允许对包中的信息进行认证。
IP Payload Compression Protocol (IPComp):该协议通过压缩 IP 负载以减少传输的数据量,尝试提高通信性能。
这些协议可以一起使用,也可以单独使用,具体取决于环境。
IPsec 支持两种操作模式。第一种模式是 Transport Mode,保护两个主机之间的通信。第二种模式是 Tunnel Mode,用于建立虚拟隧道,通常称为虚拟专用网络(VPN)。有关 FreeBSD 中 IPsec 子系统的详细信息,请参考 ipsec(4)。
本文演示了如何在家庭网络和公司网络之间设置 IPsecVPN。
在示例场景中:
两个站点都通过运行 FreeBSD 的网关连接到互联网。
每个网络的网关至少有一个外部 IP 地址。在此示例中,公司 LAN 的外部 IP 地址是
172.16.5.4,家庭 LAN 的外部 IP 地址是192.168.1.12。两个网络的内部地址可以是公共或私有 IP 地址。然而,地址空间不得重叠。在此示例中,公司 LAN 的内部 IP 地址是
10.246.38.1,家庭 LAN 的内部 IP 地址是10.0.0.5。
公司 家
10.246.38.1/24 -- 172.16.5.4 <--> 192.168.1.12 -- 10.0.0.5/241. 在 FreeBSD 上配置 VPN
首先,必须从 Ports Collection 安装 security/ipsec-tools。该软件提供了多个支持配置的应用程序。
接下来的要求是创建两个 gif(4) 虚拟设备,用于隧道数据包并允许两个网络正确通信。作为 root 用户,在每个网关上运行以下命令:
使用 ifconfig gif0 验证每个网关上的设置。以下是家庭网关的输出:
以下是公司网关的输出:
完成后,使用 ping(8) 检查两个内部 IP 地址是否可以互通:
正如预期的那样,双方能够从私有配置的地址发送和接收 ICMP 包。接下来,必须告诉两个网关如何路由数据包,以便正确地从每个网关后面的网络发送流量。以下命令将实现此目标:
内部机器应该能够从每个网关以及网关后的机器上访问。同样,使用 ping(8) 来确认:
此时,流量已经在通过 gif 隧道封装的两个网络之间流动,但没有任何加密。接下来,使用 IPSec 通过预共享密钥(PSK)加密流量。除了 IP 地址之外,/usr/local/etc/racoon/racoon.conf 在两个网关上将是相同的,并且内容类似于:
有关每个可用选项的描述,请参考 racoon.conf 的手册页。
需要配置安全策略数据库(SPD),以便 FreeBSD 和 racoon 能够加密和解密主机之间的网络流量。
可以通过类似以下的 shell 脚本在公司网关上实现这一点。该文件将在系统初始化期间使用,并应保存为 /usr/local/etc/racoon/setkey.conf。
文件配置好后,可以通过以下命令在两个网关上启动 racoon:
输出应类似于以下内容:
为了确保隧道正常工作,请切换到另一个控制台并使用 tcpdump(1) 查看网络流量,使用以下命令。根据需要将 em0 替换为网络接口卡:
控制台应显示类似以下的数据。如果没有,说明存在问题,需要调试返回的数据。
此时,两个网络应该都可用,并且看起来像是同一个网络。很可能这两个网络都受防火墙保护。为了允许流量在它们之间流动,需要在防火墙中添加规则以通过数据包。对于 ipfw(8) 防火墙,可以在防火墙配置文件中添加以下行:
注意
规则号可能需要根据当前主机配置进行修改。
对于 pf(4) 或 ipf(8) 的用户,以下规则应该可以实现:
最后,为了在系统初始化期间启用 VPN 支持,可以将以下行添加到 /etc/rc.conf:
最后更新于