Strongswan IPSEC 隧道单向阻止流量

Strongswan IPSEC 隧道单向阻止流量

我在一台 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=noipsec.conf,iptables 就可以具有我想要的行为。

相关内容