iptables переадресація порту не працює для localhost


54

Я хочу перенаправити весь трафік з порту 443 на внутрішній порт 8080. Я використовую цю конфігурацію для iptables:

iptables -t nat -I PREROUTING --source 0/0 --destination 0/0 -p tcp \
         --dport 443 -j REDIRECT --to-ports 8080

Це працює для всіх зовнішніх клієнтів. Але якщо я намагаюся отримати доступ до порту 443 з тієї ж машини, я отримаю помилку підключення.

wget https://localhost

Як я можу розширити правило iptables для перенаправлення локального трафіку?


Ця тема дає більш загальну відповідь: serverfault.com/questions/380447/iptables-preroute-localhost
Jeroen

1
Чи може хтось із реп додати зворотну косу рису до команди перед розривом рядка?
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Відповіді:


68

PREROUTING не використовується інтерфейсом зворотного зв'язку, вам також потрібно додати правило OUTPUT:

iptables -t nat -I PREROUTING -p tcp --dport 443 -j REDIRECT --to-ports 8080
iptables -t nat -I OUTPUT -p tcp -o lo --dport 443 -j REDIRECT --to-ports 8080

3
Не потрібно першого правила. Локально генеровані пакети не проходять через ланцюг ПЕРЕДАЧА.
Халед

9
Я додав початкове правило заради змагань, оскільки він хоче, щоб і зовнішній трафік переспрямовувався. Правило не потребує джерела / місця призначення, якщо вони скажуть лише прийняти всі IP-адреси
Енді,

о, вибачте, я не побачив вашої відповіді, коли я відповів.
Енді

Привіт Енді, я все ще отримую Підключення до server.com | <ip> |: 443 ... не вдалося: з’єднання відмовлено.
Кріс

Привіт Кріс, це підключення до localhost | 127.0.0.1 | 443 чи це домен? Якщо останній ви працюєте з сервером, у вас може виникнути внутрішня проблема з маршрутизацією. Ви можете двічі перевірити, спробувавши wget server.com:8080 (хоча я припускаю, що причина переадресації порту полягає в тому, що його заблоковано зовні?). У моєї власної VPC є така проблема, проте ви, можливо, можете вирішити проблему, визначивши домен як 127.0.0.1 у вашому / etc / hosts файлі.
Енді

10

Для перенаправлення пакетів з localhost на іншу машину діє правило:

 iptables -t nat -A OUTPUT -o lo -d 127.0.0.1 -p tcp --dport 443 -j DNAT  --to-destination 10.x.y.z:port

буде працювати, Але вам також потрібно включити цю опцію в ядрі:

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

Без цього налаштування ядра воно не буде працювати.


Це теж би спрацювало. Я думаю, що робити все це в iptables - чистіше.
чотиримісний

Власне, параметр ядра є вкладеним, якщо пункт призначення знаходиться на іншій машині, лінійці VM або віддаленій машині.

це не так, якщо у вас є два правила, як запропонував Енді вище.
чотиримісний

Вибачте, я говорив про випадок переадресації на іншу машину, де DNAT не працює. Я дивився на цю відповідь, щоб вирішити проблему, коли я намагався переслати щось, що думало, що воно підключається до localhost до контейнера на тій же машині. наприклад, запуск сервера імен у контейнері для локальних запитів.

Насправді це, мабуть, залежить від версії ядра> = 3.6.
чотиримісний

3

Як щодо цього?

iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 443 -j ПОВЕРХНЕНО - до порту 8080


2

Ви сказали, що ви отримуєте помилку відмови в з’єднанні . Це означає, що на порту, до якого ви намагаєтеся підключитися, немає локального прослуховування процесу! Для перевірки процесів прослуховування використовуйте команду:

$ sudo netstat -lnp | grep 8080

Після застосування правила вам слід прослухати процес на порту 8080 для підключення.

Здається, натомість у вас повинно бути таке правило:

$ iptables -t nat -I OUTPUT --source 0/0 --destination 0/0 -p tcp
                                       --dport 443 -j REDIRECT --to-ports 8080

Пам'ятайте, що ви надсилаєте з localhost. Отже, вам потрібно перенаправити вихідний пакет.


1
Дякую за вашу відповідь. Процес прослуховування на порту 8080. Для цього я хочу перенаправити весь трафік на цей порт.
Кріс

Ви впевнені, що процес прослуховується і в інтерфейсі циклу? Це може бути лише прослуховування у вашому фізичному інтерфейсі. Зазвичай ваш веб-сервер повинен буде слухати 0,0.0.0, а не, скажімо, 192.168.10.0
MrMajestyk
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.