Почему это правило iptables, которое не работает переадресация портов?

3691
videoguy

У меня есть сервер, связанный с localhost:7060. Он использует сокет ipv6 вместо ipv4. Внизу есть netstat outout.

# netstat -an Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 10.200.32.98:1720 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:4122 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:4123 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:4123 127.0.0.1:43051 ESTABLISHED tcp 0 0 10.200.32.98:5555 10.200.32.44:53162 ESTABLISHED tcp6 0 0 :::5060 :::* LISTEN tcp6 0 0 ::ffff:127.0.0.1:7060 :::* LISTEN tcp6 0 0 :::23 :::* LISTEN tcp6 0 0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.142:43505 ESTABLISHED tcp6 0 0 ::ffff:127.0.0.1:43051 ::ffff:127.0.0.1:4123 ESTABLISHED tcp6 0 0 ::ffff:10.200.32.98:23 ::ffff:10.200.32.44:53195 ESTABLISHED udp6 0 0 :::5060 :::* CLOSE #  

Я хочу установить правило переадресации портов, которое принимает соединения через порт 24 (на всех интерфейсах loopback, а также eth0) и пересылать данные в localhost:7060.

Вот как я настраиваю правило iptables:

iptables -t nat -A ПРЕДОТВРАЩЕНИЕ -p tcp --dport 24 -j DNAT --to 127.0.0.1:7060**

Это не работает. Когда я телнет из другой коробки, я вижу следующее

$ telnet 10.200.32.98 24
Попытка 10.200.32.98 ...

Если я изменю сервер для привязки к нему *:7060и установлю следующее правило, похоже, он будет работать нормально.

iptables -t nat -A ПРЕДУПРЕЖДЕНИЕ -p tcp --dport 24 -j НАПРАВЛЕНО --to-port 7060

Но это сделает мой сервер доступным через интерфейс WAN, который мне не нравится.

Я чувствую, что это как-то связано с сокетом ipv6 (строка tcp6 в выводе netstat). Все это делается на устройстве Android с помощью специально созданного образа платформы Android.

Как мне заставить это работать?

5
Если ваш сокет IPv6, вам нужно выполнить фильтрацию IPv6. Кроме того, я понимаю, что `ip6tables` еще не поддерживает NAT для таких вещей, как маскировка или переадресация портов (ваш случай). Попробуйте вместо этого сделать сокет IPv4 и посмотрите, работает ли ваше правило. Garrett 12 лет назад 1

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

0
Frio

Когда ответные пакеты возвращаются из порта 7060 и отправляются в маршрутизатор, эти пакеты также нуждаются в операции маскирования отправителя, чтобы маскировать адрес источника этих пакетов в адрес маршрутизатора (127.0.0.1) и порт как 24. Так что вам нужно добавьте правило SNAP iptables, чтобы оно заработало.

iptables -t nat -A POSTROUTING -p tcp --sport 7060 -j MASQUERADE --to-ports 24 

Несмотря на то, что пакеты генерируются локальным хостом, они также попадают в цепочку POSTROUTER. Операция REDIRECT автоматически делает эти две вещи за вас, но если ваша служба находится на другом сервере в вашей локальной сети, вы должны использовать SNAT и DNAT.

-1
xOneca

Я думаю, что вы должны использовать --sport 24вместо --dport 24, потому что де трафик входящий, а не исходящий. Хотя, как сказал Гаррет, вероятно, вы должны использовать ip6tables...

неправильно, входящее соединение имеет порт назначения 24, поэтому следует использовать --dport. Обычно порт источника (от подключающегося клиента) назначается случайным образом для каждого. hultqvist 11 лет назад 1

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