Использование iptables для изменения порта назначения

Можно ли изменить порт назначения UDP-пакета с помощью iptables?

Я пытаюсь заставить агент SNMP отправлять ловушки на 1620 вместо 162. К сожалению, пока мне удалось изменить только порт источника:

iptables -t nat -A ПОСТРОУТИРОВАНИЕ -p udp --dport 162 -j SNAT --to: 1620


person Kristof Provost    schedule 28.10.2008    source источник


Ответы (6)


Очевидно, такое использование не поддерживается. Взято из http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO.txt:

6.3.7. Изменение места назначения для локально созданных подключений

Код NAT позволяет вставлять правила DNAT в цепочку OUTPUT, но
это не полностью поддерживается в 2.4 (это может быть, но для этого требуется новый параметр конфигурации
, некоторое тестирование и немного кода. , так что, если кто-то не закажет Расти написать его, я бы не ожидал этого в ближайшее время).

Текущее ограничение состоит в том, что вы можете изменить место назначения только на локальную машину (например, `j DNAT --to 127.0.0.1 '), но не на любую другую машину, иначе ответы не будут переведены правильно.

person Adam Liss    schedule 31.10.2008
comment
Разве это не перенаправляет на порт 1620 на локальном компьютере? Похоже, это та же рекомендация, что и аскотоки. - person Kristof Provost; 31.10.2008
comment
Вы правы ... Я покопался немного глубже и нашел вышеупомянутую информацию. - person Adam Liss; 31.10.2008

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

iptables -t nat -A OUTPUT -p udp --dport 162 -j DNAT --to-destination <dest-ip>:1620
person PiedPiper    schedule 28.10.2008
comment
Это заставляет мои iptables жаловаться: iptables: недопустимый аргумент - person Kristof Provost; 28.10.2008
comment
Меня устраивает. Вы заменяете ‹dest-ip› на настоящий IP-адрес? - person PiedPiper; 28.10.2008
comment
Эта команда отлично сработала для меня. Ядро 2.6 и iptables 1.2.11+ - person borodimer; 28.10.2008
comment
У меня ядро ​​2.6.10 и iptables v1.3.3 - person Kristof Provost; 29.10.2008
comment
У меня ядро ​​2.6.26 и iptables 1.4.1, но оно должно работать со старыми версиями. - person PiedPiper; 29.10.2008

вы можете перенаправить 162 на 1620

iptables -t nat -A PREROUTING -p UDP --dport 162 -j REDIRECT --to-port 1620
person Community    schedule 13.11.2008

@PiedPiper был прав. С DNAT вы должны указать IP-адрес, но мы хотим только перенаправить порт, поэтому -j REDIRECT может работать в этом случае.

См. http://www.netfilter.org/documentation/HOWTO//NAT-HOWTO-6.html#ss6.2

person azkotoki    schedule 28.10.2008
comment
Если я прочитал, что правильное перенаправление отправит пакет на порт 1620 на локальном компьютере. Я хочу, чтобы он перешел в пункт назначения, указанный в пакете, но на порт 1620 вместо 162. - person Kristof Provost; 28.10.2008

Вместо того, чтобы делать SNAT, попробуйте DNAT. Исходный порт изменяется, потому что SNAT означает SourceNAT, поэтому DNAT подойдет вам.

person azkotoki    schedule 28.10.2008
comment
чтобы заставить DNAT работать, вам нужно указать IP-адрес как --to-destination - person PiedPiper; 28.10.2008
comment
В этом случае это не будет большой проблемой, но правило DNAT, похоже, тоже не работает. Правило не выполняется, и отправляемые пакеты не изменяются. - person Kristof Provost; 28.10.2008
comment
Вы не можете использовать DNAT в цепочке POSTROUTING. iptables-tutorial.frozentux.net/ - person borodimer; 28.10.2008
comment
Спасибо за совет @borodimer. Правило должно быть помещено в PREROUTING, если пакеты приходят извне, и в OUTPUT, если они генерируются локально. - person azkotoki; 29.10.2008

Вы можете настроить правило переадресации, а затем повторно ввести пакет с измененным портом.

Я делал это некоторое время назад в Mac OS X, но тот же принцип в Linux: http://blog.dv8.ro/2006/08/using-divert-sockets-on-mac-os-x.html

По сути, вам нужно создать очень простой прозрачный прокси.

person diciu    schedule 28.10.2008
comment
Ссылка мертвая. - person CLSheppard; 12.09.2018