DNAT от localhost (127.0.0.1)
Я хотел бы настроить TCP DNAT с 127.0.0.1, порт 4242 до 11.22.33.44, порт 5353 в Linux 3.x (в настоящее время 3.2.52, но я могу обновить при необходимости).
Похоже, установка простого правила DNAT не работает, telnet 127.0.0.1 4242
висит на минуту в Trying 127.0.0.1...
, а затем время ожидания. Может быть, это потому, что ядро отбрасывает возвращаемые пакеты (например, SYN+ACK), потому что считает их марсианскими. Мне не нужно объяснение, почему простое решение не работает, мне нужно решение, даже если оно сложное (например, оно предполагает создание правил май).
Я мог бы установить обычный DNAT с другого локального IP-адреса, вне 127.0.0.0/8
сеть, но теперь мне нужно 127.0.0.1 в качестве адреса назначения. Я знаю, что могу настроить процесс переадресации портов на уровне пользователя, но теперь мне нужно решение, которое можно настроить с помощью iptables
и не нуждается во вспомогательных процессах.
Я гуглил это в течение часа. Об этом спрашивали несколько раз, но я не мог найти никаких рабочих решений.
Также есть много вопросов о DNAT до 127.0.0.1, но мне это не нужно, мне нужно наоборот.
Обратите внимание, что один iptables -j REDIRECT
правило не будет работать, потому что мне нужно изменить IP-адрес исходящего пакета с 127.0.0.1 на 11.22.33.44, и -j REDIRECT
не могу изменить IP-адрес.
3 ответа
Это работает для меня, маршрутизация трафика от localhost:8081
в 172.17.0.1:80
, где 172.17.0.1
это ветка за интерфейсом моста с именем docker0
,
sysctl -w net.ipv4.conf.docker0.route_localnet=1
iptables -t nat -A OUTPUT -o lo -p tcp -m tcp --dport 8081 -j DNAT --to-destination 172.17.0.1:80
iptables -t nat -A POSTROUTING -o docker0 -m addrtype --src-type LOCAL --dst-type UNICAST -j MASQUERADE
Ключевой частью головоломки является MASQUERADE
править.
Дальнейшее вдохновение:
Вам нужно будет выполнить следующие три команды, чтобы заставить его работать:
iptables -t nat -A OUTPUT -p tcp -d 127.0.0.1 --dport 4242 -j DNAT --to 11.22.33.44:5353
sysctl -w net.ipv4.conf.eth0.route_localnet=1
iptables -t nat -A POSTROUTING -p tcp -s 127.0.0.1 -d 11.22.33.44 --dport 5353 -j SNAT --to $your-eth0-ip
Вот подробное объяснение.
Первая команда выполнит DNAT, как и ожидалось. Однако, если вы попытаетесь захватить пакет только с этим набором правил, вы обнаружите, что ничего не получите:
tcpdump -i any -n port 5353
Это связано с тем, что ядро Linux по умолчанию отбрасывает этот тип пакета, если пакет имеет 127.0.0.0/8
как один конец, и внешний IP-адрес как другой конец.
Вторая команда изменяет параметр ядра, чтобы пропустить этот тип пакета (конечно, вы должны изменить eth0
соответственно). После этого, когда вы перехватываете пакет на eth0, вы увидите отправленные пакеты, но с адресом источника 127.0.0.1
и адрес назначения 11.22.33.44
, Независимо от того, может ли этот пакет достигнуть целевого сервера или нет (промежуточные маршрутизаторы отбросят этот пакет), этот пакет не может быть возвращен. Так что вы должны добавить SNAT
Правило, чтобы изменить адрес источника на ваши eth0. И теперь это должно работать.
Вам нужно что-то подобное? Перенаправление порта iptables не работает для localhost
iptables -t nat -I OUTPUT -p tcp -d 127.0.0.1 --dport 443 -j REDIRECT --to-ports 8080
Adrien