У меня есть набор правил 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 - это ПРИНЯТЬ пакет, который завершит путь в таблице (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, или вставьте его в первую позицию.
Учитывая, что вы хотите исключить преобразование определенного трафика через NAT к вашему прокси-серверу, правило для этого должно быть помещено перед другими. И я бы не стал включать его в вашу определяемую пользователем цепочку intercept-nat
, поскольку эта цепочка логически предназначена для выполнения NAT, а не для того, чтобы не делать этого.
Просто:
iptables -t nat -A PREROUTING -d w.x.y.z -p tcp --dport 443 -j ACCEPT
где wxyz - это адрес сервера websocket.
Кроме того, я бы изменил ваши текущие правила (хотя я предполагаю некоторые вещи здесь):
eth0
- это внешний LAN, а 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"