Назад | Перейти на главную страницу

IP-таблицы перехватывают исключение

У меня есть набор правил 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 - адрес сервера веб-сокета.

Кроме того, я бы изменил ваши текущие правила (хотя я предполагаю здесь некоторые вещи):

  • Я думаю, вам не нужно указывать исходные IP-адреса в разделе сопоставления, поскольку вы, вероятно, просто хотите перенаправить весь трафик из своей внутренней сети (-ов). Я предполагаю eth0 это внешняя сеть и eth1 и eth2 внутренние.
  • Вероятно, вам также не нужно указывать IP-адрес назначения, что позволяет сэкономить время процессора. Я предполагаю, что веб-трафик не направляется на прокси-сервер, если на нем не запущен веб-сервер.
  • Если прокси-сервер работает на том же компьютере, что и брандмауэр, вы также можете не указывать IP-адрес назначения для использования в 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 или вставить ее в первую позицию.