![iptables: как «переопределить» перенаправление портов?](https://rvso.com/image/1452245/iptables%3A%20%D0%BA%D0%B0%D0%BA%20%C2%AB%D0%BF%D0%B5%D1%80%D0%B5%D0%BE%D0%BF%D1%80%D0%B5%D0%B4%D0%B5%D0%BB%D0%B8%D1%82%D1%8C%C2%BB%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2%3F.png)
Моя настройка следующая:
У меня есть сервер Linux с двумя интерфейсами, eth0
и eth1
. eth1
имеет подключение к Интернету через мою обычную локальную сеть. eth0
обслуживает DHCP, а сам интерфейс имеет IP-адрес 10.0.0.1
.
Я хочу добиться следующего:
Я хочу, чтобы пакеты на порту 80, исходящие от машин, подключенных к, eth0
перенаправлялись на порт 80 на самой машине маршрутизации, а ответные пакеты, конечно, перенаправлялись обратно. Это само по себе достаточно просто, но у меня есть еще одно требование. Я хотел бы, чтобы клиенты с eth0
определенными IP-адресами могли быть освобождены от этого и чтобы пакеты порта 80 маршрутизировались так, как они обычно маршрутизируются. Как это сделать? До сих пор я сделал следующее, чтобы перенаправить все пакеты порта 80 с eth0
на локальную машину. Это работает, но я не знаю, как выполнить мое второе требование.
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1:80 -i eth0
iptables -t nat -A POSTROUTING -p tcp -d 127.0.0.1 --dport 80 -j SNAT --to-source 10.0.0.1
решение1
Вам просто нужно выйти из PREROUTING
таблицы, прежде чем она дойдет до DNAT
очереди:
iptables -t nat -I PREROUTING -p tcp -s <exempt ip> -j RETURN
Это должно вставить ( -I
) новое правило для выхода ( -j RETURN
) из таблицы маршрутизации для любого пакета с исключенного IP ( -s <exempt ip>
) в качестве первого правила, чтобы он сработал до того, как попадет в DNAT
правило.
(Возможно, вам также придется сделать что-то подобное POSTROUTING
, но я не уверен.)
Другой вариант — создать набор IP-адресов ( man ipset
) для IP-адресов, которые вы хотите исключить, а затем добавить обратное соответствие к вашим правилам DNAT
и :SNAT
ipset create exempt hash:ip
ipset add exempt <exempt ip 1>
ipset add exempt <exempt ip 2>
ipset add exempt <exempt ip 3>
iptables -t nat -A PREROUTING -p tcp --dport 80 -m set ! --match-set exempt src -j DNAT --to-destination 10.0.0.1:80 -i eth0
Это проще в управлении, поскольку вы можете легко добавлять или удалять исключенные IP-адреса из ipset, не изменяя iptables.