![Strongswan IPSEC 隧道单向阻止流量](https://linux22.com/image/748229/Strongswan%20IPSEC%20%E9%9A%A7%E9%81%93%E5%8D%95%E5%90%91%E9%98%BB%E6%AD%A2%E6%B5%81%E9%87%8F.png)
我在一台 Debian 9 机器上使用 strongswan 设置了一个可运行的站点到站点 IPSEC 隧道。但是,我对流量的工作方式有一个要求:站点 A 上的网络可以向站点 B 网络发送数据包并接收确认。站点 B 只有在连接打开时才能与站点 A 通信。基本上,站点 A 可以访问站点 B,但站点 B 不能访问站点 A。基础设施架构如下:
SITE A SITE B
NetA--------------GatewayA------Internet------GatewayB-----------------NetB
A.A.A.A/24 A.A.A.254 pub.lic.ip.A pub.lic.ip.B B.B.B.254 B.B.B.B/24
我只能访问站点 A。站点 B 在客户端。
现在我需要限制从站点 B 到站点 A 的访问。我首先在 GatewayA 上放置 iptables,基本上接受来自站点 B 的 ESTABLISHED 和 RELATED 数据包,并丢弃其他所有数据包。以下是我的 iptables:
sudo iptables -L FORWARD
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 state RELATED
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 state ESTABLISHED
DROP all -- B.B.B.B/24 A.A.A.A/24 policy match dir in pol ipsec proto esp
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 policy match dir in pol ipsec reqid 2 proto esp
ACCEPT all -- A.A.A.A/24 B.B.B.B/24 policy match dir out pol ipsec reqid 2 proto esp
sudo iptables -L INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 state RELATED
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 state ESTABLISHED
DROP all -- B.B.B.B/24 A.A.A.A/24 policy match dir in pol ipsec proto esp
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 policy match dir in pol ipsec reqid 2 proto esp
这里,每个表的前 3 条规则是手动编辑的,接下来的规则由 strongswan/ipsec 设置。在测试环境中,我可以从站点 A ping 到站点 B,但不能从站点 B ping 到站点 A,这正是我想要的。
me@gatewayA:~$ ping A.A.A.1
PING A.A.A.1 (A.A.A.1) 56(84) bytes of data.
64 bytes from A.A.A.1: icmp_seq=1 ttl=63 time=2.25 ms
64 bytes from A.A.A.1: icmp_seq=2 ttl=63 time=1.32 ms
64 bytes from A.A.A.1: icmp_seq=3 ttl=63 time=1.28 ms
64 bytes from A.A.A.1: icmp_seq=4 ttl=63 time=1.56 ms
64 bytes from A.A.A.1: icmp_seq=5 ttl=63 time=1.45 ms
me@gatewayB:~$ ping B.B.B.1
PING B.B.B.1 (B.B.B.1) 56(84) bytes of data.
现在,由于某种原因,我需要重新启动 ipsec :
sudo ipsec restart
现在我检查我的 iptables:
sudo iptables -L FORWARD
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 policy match dir in pol ipsec reqid 2 proto esp
ACCEPT all -- A.A.A.A/24 B.B.B.B/24 policy match dir out pol ipsec reqid 2 proto esp
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 state RELATED
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 state ESTABLISHED
DROP all -- B.B.B.B/24 A.A.A.A/24 policy match dir in pol ipsec proto esp
sudo iptables -L INPUT
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 policy match dir in pol ipsec reqid 2 proto esp
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 state RELATED
ACCEPT all -- B.B.B.B/24 A.A.A.A/24 state ESTABLISHED
DROP all -- B.B.B.B/24 A.A.A.A/24 policy match dir in pol ipsec proto esp
如您所见,重新启动 ipsec 改变了 iptables,现在我可以双向 ping 了。
所以我想知道是否有任何方法可以实现我想要的,即限制从站点 B 到站点 A 的访问而不影响从站点 A 到站点 B 的通信。也许有一种方法可以在 strongswan 配置中定义 iptables,或者可以更改 iptables 规则的优先级,以便它们在重新启动时保持顺序。
答案1
正如 ecdsa 所述,我只需要输入leftfirewall=no
ipsec.conf,iptables 就可以具有我想要的行为。