У меня есть набор правил iptable, которые выглядят так:
-A PREROUTING --jump intercept-nat
-A intercept-nat --jump DNAT -s 10.10.1.0/24 ! -d 10.10.1.1/32 -p tcp -m tcp --dport 80 --to-destination 10.10.1.1:3126 -m comment --comment "intercept-nat"
-A intercept-nat --jump DNAT -s 10.10.1.0/24 ! -d 10.10.1.1/32 -p tcp -m tcp --dport 443 --to-destination 10.10.1.1:3127 -m comment --comment "intercept-nat"
-A intercept-nat --jump DNAT -s 10.1.2.0/24 ! -d 10.10.1.1/32 -p tcp -m tcp --dport 80 --to-destination 10.10.1.1:3126 -m comment --comment "intercept-nat"
-A intercept-nat --jump DNAT -s 10.1.2.0/24 ! -d 10.10.1.1/32 -p tcp -m tcp --dport 443 --to-destination 10.10.1.1:3127 -m comment --comment "intercept-nat"
Он предназначен для отправки трафика 80 и 443 на Squid, прокси-сервер кеширования http. Я хотел бы добавить несколько строк в правила iptables, которые НЕ будут направлять трафик 443 на определенные IP-адреса на 10.10.1.1:3127 (squid)
Пример использования: у меня есть сервер веб-сокетов, к которому необходимо подключиться клиентам, находящимся за прокси, но squid не поддерживает веб-сокеты. Итак, я хочу, чтобы этот трафик обходил squid
Я бы сделал следующее:
-A PREROUTING -s 10.10.1.0/24 ! -d 10.10.1.1/32 --jump intercept-nat
-A PREROUTING -s 10.1.2.0/24 ! -d 10.10.1.1/32 --jump intercept-nat
-A intercept-nat -d target-ip -p tcp -m tcp --dport 443 -j RETURN
-A intercept-nat --jump DNAT -p tcp -m tcp --dport 80 --to-destination 10.10.1.1:3126 -m comment --comment "intercept-nat"
-A intercept-nat --jump DNAT -p tcp -m tcp --dport 443 --to-destination 10.10.1.1:3127 -m comment --comment "intercept-nat"
Каждый раз, когда адресат пакета совпадает target-ip
он пропустит остальные правила intercept-nat. Я также немного изменил ваши правила, чтобы сделать их более читаемыми и удобными для изменения ;-).
Учитывая, что вы хотите исключить преобразование определенного трафика через NAT к вашему прокси-серверу, правило для этого должно быть помещено перед другими. И я бы не стал включать его в вашу пользовательскую цепочку intercept-nat
поскольку логически эта цепочка предназначена для выполнения NAT, а не для того, чтобы этого не делать.
Просто:
iptables -t nat -A PREROUTING -d w.x.y.z -p tcp --dport 443 -j ACCEPT
где w.x.y.z - адрес сервера веб-сокета.
Кроме того, я бы изменил ваши текущие правила (хотя я предполагаю здесь некоторые вещи):
eth0
это внешняя сеть и eth1
и eth2
внутренние.DNAT
цель с помощью REDIRECT
вместо.Отказ от указания IP-адресов улучшает обслуживание, позволяет повторно использовать и упрощает работу. Все вместе будет:
-A PREROUTING -d w.x.y.z/32 -p tcp -m tcp --dport 443 -j ACCEPT
-A PREROUTING ! -i eth0 -j intercept-nat
-A intercept-nat -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3126 -m comment --comment "intercept-nat"
-A intercept-nat -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3127 -m comment --comment "intercept-nat"
Самый простой способ обойти NAT - это ПРИНЯТЬ пакет, который завершит путь в таблице (PREROUTING), а также в цепочке (intercept-nat). RETURN покинет цепочку (intercept-nat) и продолжит просмотр таблицы (PREROUTING).
iptables -t nat -A PREROUTING <some criterium> -j ACCEPT
или
iptables -t nat -A intercept-nat <some criterium> -j ACCEPT
Хотя я написал -A
, вы должны поместить эту строку перед действием NAT или вставить ее в первую позицию.