Мне нужно изменить номер исходящего порта для всех пакетов UDP, исходящих от локального процесса. Например:
local machine
udp dest:192.168.10.1/255.255.255.0 port 2222
должен стать (перед тем, как покинуть локальную машину):
udp dest:192.168.10.1/255.255.255.0 port 3333
Я пробовал это правило iptables:
iptables -t nat -A OUTPUT -d 192.168.10.1/255.255.255.0 -p udp --dport 2222 -j DNAT --to-destination :3333
Однако он также изменяет IP-адрес назначения. Из другого вопроса в serverfault я увидел, что согласно документации netfilter ( http://www.netfilter.org/documentation/HOWTO/NAT-HOWTO.txt, раздел 6.3.7) iptables не может этого сделать.
У меня вопрос: как мне выполнить эту задачу в Linux? Может быть, есть другой инструмент, который сделает эту работу?
Вы могли бы сделать это с помощью Отводные розетки, хотя я никогда не использовал его для этой конкретной цели и не пробовал на современном ядре.
Вот страница проекта для порта linux. По сути, это добавляет задание в iptables, которое позволяет перенаправлять пакеты в пользовательское пространство и изменять их перед отправкой обратно по сети (или полностью отбрасывать их).
Я не могу придумать какой-либо инструмент, который бы делал это из коробки. Это довольно редкий сценарий, поскольку вы не можете создать правильное двустороннее сопоставление NAT, если только измените порт. Вам действительно нужно только одностороннее движение?
Однако вы всегда можете написать свой собственный модуль netfilter (это не так уж сложно) и изменить заголовки пакетов так, как захотите.