Я установил рабочий туннель IPSEC между сайтами с strongswan на машине debian 9. Однако у меня есть требование о том, как должен работать трафик: сеть на сайте 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, чтобы в основном принимать пакеты ESTABLISHED и RELATED с сайта B и отбрасывать все остальное. Вот мои 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
Здесь три первых правила для каждой таблицы редактируются вручную, а следующие устанавливаются strongswan / ipsec. В тестовой среде я могу пинговать с сайта A на сайт 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
Теперь я проверяю my 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, и теперь я могу пинговать обоими способами.
Мне было интересно, есть ли какой-нибудь способ достичь того, чего я хочу, а именно ограничить доступ с сайта B к сайту A, не влияя на обмен данными, идущими от сайта A к сайту B. Возможно, есть способ определить iptables в конфигурации strongswan или, возможно, изменить приоритет правил iptables, чтобы они сохраняли свой порядок при перезагрузке.
Как отмечает ecdsa, мне просто нужно было поместить leftfirewall = no
в ipsec. conf, чтобы iptables могли вести себя так, как я хотел.