Правило ПРЕДВАРИТЕЛЬНОЙ МАРШРУТИЗАЦИИ HTTP iptable не работает

#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 будет перенаправлять соединение только с локального хоста на локальный хост.