У меня есть машина Linux в моей локальной сети, которую я использую в качестве шлюза, поэтому весь мой сетевой трафик проходит через нее (машина имеет только один сетевой интерфейс, который я использую для входящего и исходящего трафика). Мне нужно перенаправить все пакеты HTTP, поступающие через порт 7080 на порт 80. Кроме того, я хочу перенаправить ответы HTTP обратно клиенту, который отправил запрос.

Я пытался добиться этого, используя следующие правила iptables:

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7080 -j ACCEPT
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

iptables -t nat -A OUTPUT -p tcp --dport 7080 -j REDIRECT --to-ports 80
iptables -t nat -A OUTPUT -p tcp --dport 80 -j REDIRECT --to-ports 7080

Когда эти правила активны, я не получаю никаких HTTP-ответов от клиента.

Кто-нибудь имеет представление о том, что я делаю неправильно, или как я мог решить эту проблему?

3 ответа3

1

Вы применяете неправильные цепи. Полученные пакеты сначала обрабатываются PREROUTING; если они идентифицированы как идущие к "этой" машине, они передаются INPUT, в противном случае - FORWARD и POSTROUTING. Цепочка OUTPUT применяется только к пакетам, которые генерируются локально. В руководстве по iptables есть фантастическая глава .

Основываясь на примере в другом месте в Интернете, чтобы ответить на поставленный вопрос, вам, вероятно, просто нужно сделать это:

# Packets that arrive for port 7080 should be redirected to port 80
iptables -t nat -A PREROUTING -p tcp --dport 7080 -j REDIRECT --to-ports 80

# Separately, all packets that leave this machine that go to port 80
# (which will include the ones redirected above) should be masqueraded,
# i.e. use NAT:
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MSAQUERADE

Я уверен, что то, что вы хотите сделать, является более сложным, не в последнюю очередь потому, что вы на самом деле не говорите, в каком направлении вы хотите, чтобы это произошло. Если то, что вы на самом деле хотите сделать, - это просто настроить переадресацию порта так, чтобы ваш внешний IP-адрес (давайте представим, что это 251.112.112.42) выглядит как Интернет, как если бы у него был веб-сервер, работающий на его порту 7080 - но вы на самом деле обслуживаете это с внутренней машины (скажем, 192.168.42.1) на порт 80. Это также просто, просто по-другому и даже ближе к уже упомянутому примеру:

# Anything sent to your external IP:port gets redirected to the internal one:
iptables -t nat -A PREROUTING -d 251.112.112.42/32 -p tcp --dport 7080 \
    -j DNAT --to-destination 192.168.42.1:80

# Make sure those connections actually work, by rewriting everything back,
# again simply using NAT:
iptables -t nat -A POSTROUTING -d 192.168.42.1 -p tcp -dport 80 -j MASQUERADE
0

INPUT означает только пакеты, которые будут обрабатываться вашим пользовательским пространством.

Вы должны использовать не INPUT, а цепочку PREROUTING в таблице nat.

Tcpdump очень полезен для отладки того, что действительно происходит с вашими пакетами.

0

Вы должны сделать 3 изменения в пакете tcp: SourceNAT, DestinationNAT с изменением порта. Это не разрешено для одного и того же пакета. Но вы можете использовать стороннее приложение, такое как nginx, и просто перенаправить пакет этим приложением.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .