我在 Debian Squeeze 机器上使用 Strongswan VPN 服务器。传入的 VPN 客户端获得 192.168.99.0/24 子网的 IP。
由于我使用此 VPN 主要是为了在使用非加密 WLAN 时进行加密,因此我使用 iptables 将源 NAT 连接到互联网。(我更喜欢源 NAT,因为服务器具有静态 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>
我的问题是:使用此规则时,现在所有来自此 192.168.99.0/24 子网的流量都会被接受并进行 NAT。我想更具体地说,只有通过此 VPN 隧道进入服务器的流量才会被此规则接受。
在具有两个网络设备的经典路由器设置中,我会检查传入设备以实现此目的。Strongswan 中是否有类似的东西(例如虚拟网络设备)?
我如何过滤通过隧道到达服务器的数据包以便只有这些数据包被进行 NAT?
答案1
您应该查看 iptables 的策略模块,它根据数据包与 IPsec 策略的关系来匹配数据包(有关详细信息,请参阅man 8 iptables
或man 8 iptables-extensions
)。
如何最好地应用模块实际上取决于防火墙的其余部分是如何配置的以及您的确切要求。例如,将默认(防火墙)策略设置为INPUT
和FORWARD
链DROP
(通过 SSH 执行此操作时请注意,因为您可能会锁定您的计算机),然后使用 strongSwan 的默认 updown 脚本(leftfirewall=yes
)基本上会为您完成与 IPsec 隧道相关的所有操作。该脚本将自动添加适当的输入和转发规则(使用策略模块),以仅允许通过 IPsec 隧道从/到隧道子网的流量(实际上,对于经常出差的人来说,只允许分配的 IP,甚至不允许整个子网)。
如果您不想执行上述操作,您可以手动添加一些规则。使用以下选项,您可以匹配通过任何 IPsec 连接到达的数据包(用于--dir in|out
指定方向):
-m policy --dir in --pol ipsec
因此,如果您只是想丢弃来自所述子网的源 IP 且不是通过 IPsec 到达的数据包,您可以添加以下规则:
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