iptables перенаправляет внешние запросы на 127.0.0.1

41

У меня есть служба, работающая на 127.0.0.1 с портом 2222. Мне нужно перенаправить все запросы на 192.168.2.2:2222 (вне IP) только из подсети 192.168.1.0/24 на 127.0.0.1:2222.

Я пытаюсь использовать это, но это не работает.

$ iptables -t nat -I PREROUTING -p tcp -d 192.168.1.0/24 --dport 2222 -j DNAT --to-destination 127.0.0.1:2222

Как я могу заставить это работать?

UPD: изменить адресную схему.

SimWhite
источник
Нам нужны некоторые разъяснения. Откуда идет трафик? Куда изначально идет трафик? Куда должен идти трафик? Насколько я понимаю, вы хотите, чтобы трафик с 192.168.1.0/24 до 127.0.0.1:2222 был перенаправлен на 12.23.34.45:2222. Но ответ Уоррена предполагает, что вы хотите, чтобы трафик с 192.168.1.0/24 до 12.23.34.45:2222 был перенаправлен на 127.0.0.1:222
Патрик
1
Трафик поступает из подсети 192.168.1.0/24 в 192.168.2.2:2222 и должен быть переведен в службу 127.0.0.1:2222. Я исправил адресную схему.
SimWhite
1
Вы хотите правило, которое позволяет трафику 2222переносить через интерфейс обратной связи из подсети 192.168.1.0/24? Это не просто тип правил установки. Смотрите здесь: debuntu.org/...
ОДС
Да. Как я понимаю, мне нужно добавить правило Masq? Переадресация IP уже включена, конечно.
SimWhite
Почему бы не запустить его на «реальном» IP и не отфильтровать трафик, поступающий из нежелательных источников? Для этого, по сути, и
нужны

Ответы:

60

Правило iptables, которое вы используете, будет работать, но нужно внести еще одно изменение:

sysctl -w net.ipv4.conf.eth0.route_localnet=1

(замена eth0на никель 192.168.2.2находится на)

По умолчанию это значение 0, которое указывает ядру не маршрутизировать внешний трафик, предназначенный 127.0.0.0/8. Это просто для безопасности, так как такой трафик не является нормальным.


Дополнительное примечание: ваше текущее правило iptables слишком широкое. Ваше правило задается -d 192.168.1.0/24 --dport 2222как совпадение назначения, что означает, что если ваша машина попытается связаться с другим хостом через порт 2222 (т.е. исходящий трафик), она также будет перенаправлена. Вам нужно либо изменить -dсоответствие -d 192.168.2.2, либо добавить -i eth0(или любой другой ваш ник).

Патрик
источник
8
Эту информацию удивительно сложно найти.
Рен Т.
Да, очень ценная труднодоступная информация! Спасибо! Но у меня нет route_localnet. Были ли другие имена для этого? (в Linux 2.6.30) ls /proc/sys/net/ipv4/conf/lan/: accept_redirects arp_accept arp_filter arp_notify disable_policy force_igmp_version log_martians medium_id proxy_arp secure_redirects shared_media accept_source_route arp_announce arp_ignore bootp_relay disable_xfrm пересылка mc_forwarding promote_secondaries rp_filter send_redirects Тег
IMZ - Иван Zakharyaschev
Я вижу, патч дляroute_localnet более позднего (7 июня 2012 года), чем мое ядро ​​(2.6.30-std-def-alt15 # 1 SMP Mon Dec 14 08:45:48 UTC 2009). Хорошо, я просто добьюсь желаемой переадресации порта (снаружи внутрь) с помощью процесса пересылки вроде netcat( nc) xinetdили опций переадресации порта ssh(последняя, ​​конечно, неэффективна и глупа, но я упоминаю об этом, потому что, ну, такая возможность есть).
imz - Иван Захарящев
2
Мои 2 цента: вы можете включить этот параметр для всех интерфейсов сsysctl -w net.ipv4.conf.all.route_localnet=1
Dmitriusan
Как и другие, эту информацию было трудно найти. Спасибо, если бы я нашел это раньше, сэкономил бы мне массу усилий.
Стивен Симпсон
3

Вы можете перенаправить на localhost, но не на loopback (127.0.0.0/8). Петля - это лазейка. Вы должны перенаправить на один из ваших реальных интерфейсов. Попробуйте использовать REDIRECT.

iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222

dresende
источник
Это, вероятно, лучший ответ без sysctl вудо ...
Лестер Чунг
По-прежнему не помогает, если порт 222 прослушивается только на локальном
хосте
В этом случае используйте-j DNAT --to-destination w.x.y.z:222
dresende
2

Что, если правильный ответ с route_localnetне работает? ..

Если ваше ядро ​​не содержит патч дляroute_localnet , то ... обновите ядро!

Или есть другие способы перенаправить трафик, поступающий на один интерфейс, на другой порт на другом интерфейсе (в частности, на localhost), запустив процесс, который будет прослушивать внешний интерфейс и пересылать трафик.

netcat( nc), xinetdи ssh(и, возможно, больше) являются примерами программ, способных сделать это (хотя выбор sshбудет странным и неэффективным).

Я написал конфигурацию xinetdдля этого. Теперь этот сервис автоматически активируется:

# cat /etc/xinetd.d/z-from-outside 
# default: off
# description: Forward connections to the z port.
service z-from-outside
{
    disable         = no
    socket_type     = stream
    type        = UNLISTED
    wait            = no
    user            = nobody
    bind        = vaio.ob
    port        = 7070
    redirect    = localhost 7070
}
# 

( vaio.obимя этого хоста во внешнем сетевом интерфейсе.)

После service xinetd reload, давайте проверим, что он слушает:

# lsof -i -P | fgrep 7070
xinetd    556      root    6u  IPv4 1797906      0t0  TCP vaio.ob:7070 (LISTEN)
sshd    27438 tun_zzoom    4u  IPv4 1059100      0t0  TCP localhost.localdomain:7070 (LISTEN)
# 

И действительно, связи проходят!

imz - Иван Захарящев
источник