使用 iptables 过滤传入的 Strongswan VPN 数据包

Gor*_*tch 1 nat iptables strongswan

我在 Debian Squeeze 机器上使用 Strongswan VPN 服务器。传入的 VPN 客户端获得 192.168.99.0/24 子网的 IP。

由于我在使用非加密 WLAN 时主要使用此 VPN 进行加密,因此我正在使用 iptables 将源 NAT 连接到互联网。(我更喜欢源 NATing,因为服务器有一个静态的 ipv4 地址。)

目前我正在使用以下 iptables 命令

# used for StrongSWAN
iptables -t nat -I POSTROUTING -s 192.168.99.0/24 -o eth0 -j SNAT --to-source <public IP adress of server>
Run Code Online (Sandbox Code Playgroud)

我的问题是:当使用这个规则时,从这个 192.168.99.0/24 子网传入的每个流量现在都被接受和 NAT。我想更具体地说,只有通过此 VPN 隧道进入服务器的流量才能被此规则接受。

在具有两个网络设备的经典路由器设置中,我会检查传入设备以实现这一目标。Strongswan 中是否有等效的东西(例如虚拟网络设备)?

如何过滤掉通过隧道到达服务器的数据包,以便仅对这些数据包进行 NAT?

ecd*_*dsa 5

您应该查看 iptables 的策略模块,它根据数据包与 IPsec 策略的关系来匹配数据包(请参阅man 8 iptablesman 8 iptables-extensions了解详细信息)。

如何最好地应用该模块实际上取决于防火墙的其余部分是如何配置的以及您的确切要求是什么。例如,将INPUTFORWARD链的默认(防火墙)策略设置为DROP(通过 SSH 执行此操作时要注意,因为您可能会将您锁定在您的机器之外),然后使用 strongSwan 的默认 updown 脚本 ( leftfirewall=yes) 基本上可以完成与 IPsec 相关的所有工作隧道给你。该脚本将自动添加适当的输入和转发规则(使用策略模块)以仅允许通过 IPsec 隧道进出隧道子网的流量(实际上,对于公路战士,只允许分配的 IP,甚至不允许整个子网) .

如果您不想执行上述操作,可以手动添加一些规则。使用以下选项,您可以匹配通过任何 IPsec 连接到达的数据包(用于--dir in|out指定方向):

-m policy --dir in --pol ipsec
Run Code Online (Sandbox Code Playgroud)

因此,如果您只是想丢弃具有来自所述子网但不是通过 IPsec 到达的源 IP 的数据包,您可以添加以下规则:

iptables -A INPUT -s 192.168.99.0/24 ! -m policy --dir in --pol ipsec -j DROP 
iptables -A FORWARD -s 192.168.99.0/24 ! -m policy --dir in --pol ipsec -j DROP
Run Code Online (Sandbox Code Playgroud)