У меня есть служба, работающая на 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: изменить адресную схему.
iptables
port-forwarding
network-interface
SimWhite
источник
источник
2222
переносить через интерфейс обратной связи из подсети192.168.1.0/24
? Это не просто тип правил установки. Смотрите здесь: debuntu.org/...Ответы:
Правило iptables, которое вы используете, будет работать, но нужно внести еще одно изменение:
(замена
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
(или любой другой ваш ник).источник
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 Тегroute_localnet
более позднего (7 июня 2012 года), чем мое ядро (2.6.30-std-def-alt15 # 1 SMP Mon Dec 14 08:45:48 UTC 2009). Хорошо, я просто добьюсь желаемой переадресации порта (снаружи внутрь) с помощью процесса пересылки вродеnetcat
(nc
)xinetd
или опций переадресации портаssh
(последняя, конечно, неэффективна и глупа, но я упоминаю об этом, потому что, ну, такая возможность есть).sysctl -w net.ipv4.conf.all.route_localnet=1
Вы можете перенаправить на localhost, но не на loopback (127.0.0.0/8). Петля - это лазейка. Вы должны перенаправить на один из ваших реальных интерфейсов. Попробуйте использовать REDIRECT.
iptables -t nat -A PREROUTING ..... -j REDIRECT --to-port 222
источник
-j DNAT --to-destination w.x.y.z:222
Что, если правильный ответ с
route_localnet
не работает? ..Если ваше ядро не содержит патч для
route_localnet
, то ... обновите ядро!Или есть другие способы перенаправить трафик, поступающий на один интерфейс, на другой порт на другом интерфейсе (в частности, на localhost), запустив процесс, который будет прослушивать внешний интерфейс и пересылать трафик.
netcat
(nc
),xinetd
иssh
(и, возможно, больше) являются примерами программ, способных сделать это (хотя выборssh
будет странным и неэффективным).Я написал конфигурацию
xinetd
для этого. Теперь этот сервис автоматически активируется:(
vaio.ob
имя этого хоста во внешнем сетевом интерфейсе.)После
service xinetd reload
, давайте проверим, что он слушает:И действительно, связи проходят!
источник