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: редагування схеми адрес.


Нам потрібно певне уточнення. Звідки береться трафік? Куди спочатку йде трафік? Куди повинен рухатися трафік? Коли я читаю, ви хочете, щоб трафік з 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/…
slm

Так. Як я розумію, мені потрібно додати правило masq? Звичайно, переадресація IP вже включена.
SimWhite

Чому б не запустити його на "справжньому" IP-адресі та не відфільтрувати трафік, що надходить із небажаних джерел? Саме для цього потрібні брандмауери ...
vonbrand

Відповіді:


60

Правило iptables, яке ви використовуєте, буде працювати, але вам потрібно внести одну додаткову зміну:

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

(заміни eth0на nic 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 пн. 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, але не на циклічне повернення (127.0.0.0/8). Петля - це лазівка. Вам доведеться перенаправити один з реальних інтерфейсів. Спробуйте використовувати REDIRECT.

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


Це, мабуть, найкраща відповідь без sysctl voodo ...
Лестер Чеун

Все ще не допомагає, якщо порт 222 прослуховується лише в localhost (правило не змінить адресу призначення)
sanmai

У такому випадку використовуйте-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)
# 

І справді, зв’язки проходять через!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.