Debian

Strongswan IPSEC 隧道以一種方式阻止流量

  • February 7, 2020

我已經在 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 的訪問。我首先將 iptables 放在 GatewayA 上,以便基本上接受來自站點 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 到站點 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 規則的優先級,以便它們在重新啟動時保持順序。

正如 ecdsa 所指出的,我只需要leftfirewall=no輸入 ipsec.conf 以便 iptables 可以具有我想要的行為。

引用自:https://serverfault.com/questions/1002024