Перенаправлять только определенные запросы хостов, оставляя значение по умолчанию для других

227
Phate

У меня есть машина с открытым портом 80, уже включен http-сервер. Я хочу перехватить любой входящий трафик через порт 80 и:

  • если происходит перенаправление с ip1, ip2, ip3 на другое приложение, прослушивающее другой порт
  • Остальное зайти на веб-сервер

Возможно ли это? В настоящее время я использую socat, но, даже с reuseaddr, я по-прежнему получаю сообщение об ошибке при запуске веб-сервера из-за порта уже используется ...

0
Что вы имеете в виду "только с открытым портом 80"? Не заблокированы ли другие порты каким-либо внешним брандмауэром (например, маршрутизатор с NAT, перенаправлен только порт 80)? или внутренним программным брандмауэром (правила `iptables`)? Kamil Maciorowski 5 лет назад 0
К сожалению, блок находится за пределами моей машины, поэтому я ничего не могу с этим поделать ... Phate 5 лет назад 0

1 ответ на вопрос

1
Kamil Maciorowski

Вы сказали «только с открытым портом 80». Если другие порты заблокированы каким-либо внешним брандмауэром (например, маршрутизатор с NAT, вам перенаправлен только порт 80), то основное правило может быть таким:

iptables -t nat -A PREROUTING -p TCP --dport 80 -s 192.168.1.7 -j REDIRECT --to-port 1234 

Принимая каждый трафик, поступающий в порт 80, он перенаправляет все, что из 192.168.1.7порта 1234, оставляя нетронутыми остальные.

Примечание iptablesработает на основе первого совпадения, поэтому вы можете захотеть сделать

iptables -t nat -I PREROUTING … 

вместо.

Различные способы указания нескольких возможных адресов источника см. В ответах на этот вопрос: iptablesнесколько IP-адресов источника .

Но если «с открытым только 80-м портом» означает, что у вас есть iptables -A INPUT …правила, которые разрешают только 80-й порт, я ожидаю, что вышеупомянутое не сработает. Это потому, что nat/PREROUTINGработает в первую очередь. В этом случае вы также должны разблокировать другой порт.

Итак, если я правильно понял, он перенаправляет только трафик с 192.168.1.7 на порт 1234, а остальное - на 80? Phate 5 лет назад 0
@ Фейт Да. Мой ответ теперь расширен. Kamil Maciorowski 5 лет назад 0
Кажется, что это работает, но происходит нечто странное: если я делаю iptables -L для перечисления своих правил, я не вижу введенное правило ... но оно работает наверняка, поэтому оно должно быть там! Мне это нужно для того, чтобы на случай потом удалить Phate 5 лет назад 0
@Phate Я считаю, что `iptables -L` эквивалентно` iptables -t filter -L`. Вам нужен `iptables -t nat -L`. Kamil Maciorowski 5 лет назад 0

Похожие вопросы