#iptables #nat
#iptables #nat
Вопрос:
Я пытаюсь понять iptables и, похоже, вообще не могу перенаправить трафик. Цель состоит в том, чтобы перенаправить трафик с порта 4567 на 8443 и заставить (локальную) программу прослушивать последний.
Я написал короткий скрипт, чтобы убедиться, что я очищаю и перезапускаю iptables при каждом изменении правила:
#!/bin/bash
iptables -t nat -F
iptables -t nat -A PREROUTING -p tcp --dport 4567 -j REDIRECT --to-ports 8443
sudo /sbin/iptables-save
Я также настроил ip_forwarding (хотя я не совсем уверен, нужно ли мне это):
sudo echo "1" > /proc/sys/net/ipv4/ip_forward
Я запускаю этот простой скрипт на python для проверки маршрутизации. Сайт создан так, чтобы разрешать http-запросы на любой порт.
import requests
r = requests.get("http://portquiz.net:4567")
print(r.status_code)
А также проверка того, проходят ли какие-либо пакеты / байты через предварительную маршрутизацию, просматривая выходные данные iptables -t nat --list -v
Chain PREROUTING (policy ACCEPT 4 packets, 560 bytes)
pkts bytes target prot opt in out source destination
0 0 REDIRECT tcp -- any any anywhere anywhere tcp dpt:4567 redir ports 8443
Оба iptables и скрипт python находятся на одном компьютере (мой ноутбук).
Запрос python, похоже, проходит без проблем и, похоже, не перехватывается политикой предварительной маршрутизации.
Я работаю на последней версии ubuntu 20.02
Это вывод iptables-save
, на случай, если он полезен:
# Generated by iptables-save v1.8.4 on Tue Nov 10 13:20:02 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 4567 -j REDIRECT --to-ports 8443
COMMIT
# Completed on Tue Nov 10 13:20:02 2020
# Generated by iptables-save v1.8.4 on Tue Nov 10 13:20:02 2020
*filter
:INPUT ACCEPT [16727:8538288]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [16979:3211690]
COMMIT
# Completed on Tue Nov 10 13:20:02 2020
Ответ №1:
При использовании iptables необходимо уделять пристальное внимание между локальными пакетами и сетевыми пакетами. Локальные пакеты — это пакеты, созданные на локальном компьютере, тогда как сетевые пакеты — это полученные пакеты. PREROUTING
работает с сетевыми пакетами, например, с тем, что вы получили бы на устройстве маршрутизатора. Поскольку в этом случае все это локально, тогда нужно использовать OUTPUT
вместо PREROUTING
перенаправления пакетов. Поэтому необходимое правило.
iptables -t nat -A OUTPUT -p tcp --dport 4567 -j REDIRECT --to 8443
Я нашел эту картинку очень полезной:
Которое взято из этой статьи: https://danielmiessler.com/study/iptables /
Комментарии:
1. Я думаю, что отсутствует важная деталь :
-o lo
:iptables -t nat -A OUTPUT -p tcp -o lo --dport 4567 -j REDIRECT --to 8443
Потому что в противном случае все исходящие соединения, нацеленные на порт «4567», будут перенаправлены на порт «8443». Использование вывода вместе с-o lo
будет перенаправлять соединение только с локального хоста на локальный хост.