github编辑

IPsec VPN

Internet Protocol Security (IPsec) 是一组协议,位于互联网协议(IP)层之上。它通过对每个通信会话的 IP 包进行认证和加密,使两个或多个主机能够以安全的方式进行通信。FreeBSD 的 IPsec 网络栈基于 http://www.kame.net/arrow-up-right 实现,支持 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)arrow-up-right

本文演示了如何在家庭网络和公司网络之间设置 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/24

1. 在 FreeBSD 上配置 VPN

首先,必须从 Ports Collection 安装 security/ipsec-toolsarrow-up-right。该软件提供了多个支持配置的应用程序。

接下来的要求是创建两个 gif(4)arrow-up-right 虚拟设备,用于隧道数据包并允许两个网络正确通信。作为 root 用户,在每个网关上运行以下命令:

使用 ifconfig gif0 验证每个网关上的设置。以下是家庭网关的输出:

以下是公司网关的输出:

完成后,使用 ping(8)arrow-up-right 检查两个内部 IP 地址是否可以互通:

正如预期的那样,双方能够从私有配置的地址发送和接收 ICMP 包。接下来,必须告诉两个网关如何路由数据包,以便正确地从每个网关后面的网络发送流量。以下命令将实现此目标:

内部机器应该能够从每个网关以及网关后的机器上访问。同样,使用 ping(8)arrow-up-right 来确认:

此时,流量已经在通过 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)arrow-up-right 查看网络流量,使用以下命令。根据需要将 em0 替换为网络接口卡:

控制台应显示类似以下的数据。如果没有,说明存在问题,需要调试返回的数据。

此时,两个网络应该都可用,并且看起来像是同一个网络。很可能这两个网络都受防火墙保护。为了允许流量在它们之间流动,需要在防火墙中添加规则以通过数据包。对于 ipfw(8)arrow-up-right 防火墙,可以在防火墙配置文件中添加以下行:

注意

规则号可能需要根据当前主机配置进行修改。

对于 pf(4)arrow-up-rightipf(8)arrow-up-right 的用户,以下规则应该可以实现:

最后,为了在系统初始化期间启用 VPN 支持,可以将以下行添加到 /etc/rc.conf

最后更新于