IPTables - Port do innego adresu IP i portu (od wewnątrz)

10

Obecnie mam urządzenie NAS działające pod portem 80. Aby uzyskać dostęp do NAS z zewnątrz, zamapowałem port 8080 na port 80 na serwerze NAS w następujący sposób:

iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.32.25.2:80

To działa jak urok. Działa to jednak tylko wtedy, gdy uzyskuję dostęp do strony internetowej z zewnątrz sieci (w pracy, w innym domu itp.). Więc kiedy piszę mywebsite.com:8080, IPTables wykonują zadanie poprawnie i wszystko działa dobrze.

Problem polega na tym, jak mogę przekierować ten port z wnętrza sieci? Moja nazwa domeny mywebsite.comwskazuje na mój router (mój serwer linux) od wewnątrz (10.32.25.1), ale chcę przekierować port 8080 do portu 80 na 10.32.25.2 od wewnątrz.

Jakieś wskazówki?

Edytuj nr 1

Próbując pomóc w rozwiązaniu tego problemu, zestawiłem ten schemat. Zaktualizuj, jeśli jest to niepoprawne lub wprowadzające w błąd to, czego szukasz.

                                 iptables
                                     |                   .---------------.
    .-,(  ),-.                       v               port 80             |
 .-(          )-.        port 8080________               |               |
(    internet    )------------>[_...__...°]------------->|      NAS      |
 '-(          ).-'     10.32.25.2    ^   10.32.25.1      |               |
     '-.( ).-'                       |                   |               |
                                     |                   '---------------'
                                     |
                                     |
                                   __  _ 
                                  [__]|=|
                                  /::/|_|
David Bélanger
źródło
@slm Dokładnie. Nic się nie dzieje 10.32.25.2:8080, ponieważ serwer znajduje się na porcie 80. Z zewnątrz NAT przekierowuje z portu 8080 na port 80 pod określonym adresem IP (10.32.25.2). NET -> NAT: 8080 -> 10.32.25.2:80. Potrzebuję reguły od środka i nie wiem, co tam umieścić.
David Bélanger
@slm Tak. Nie wiem, jak mogę osiągnąć coś takiego. Chcę powiedzieć 10.32.25.1:8080przekierowanie do 10.32.25.2:80. Moja powyższa reguła działa z zewnątrz, ale nie z wnętrza mojej sieci. Więc jeśli jestem w biurze, mogę uzyskać dostęp do mojego serwera NAS ze strony internetowej.com:8080 i jest on całkowicie przejrzysty. Z mojego domu website.com:8080 wskazuje na 10.32.25.1, ponieważ jest to mój router aka serwer Linux. Chcę przekierować port 8080 do NAS również na porcie 80, ale znowu w przejrzysty sposób.
David Bélanger
@slm Tak, wszystko jest w porządku i działa. Chcę tylko przekierować port 10.32.25.1:8080 na 10.32.25.2:80 z sieci wewnętrznej.
David Bélanger
wspomnijmy również o interfejsie typu „ eth0 10.32.25.2tak”, abyśmy mogli napisać użycie iptables na podstawie interfejsu przychodzącego
Rahul Patil
Niestety, właśnie widziałem ... już rozwiązałeś problem ...
Rahul Patil

Odpowiedzi:

13

W końcu znalazłem instrukcje. Najpierw musiałem dodać -i eth1do mojej reguły „na zewnątrz” (eth1 to moje połączenie WAN). Musiałem także dodać dwie inne reguły. Tutaj w końcu to, co przyszedłem:

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 10.32.25.2:80
iptables -t nat -A POSTROUTING -p tcp -d 10.32.25.2 --dport 80 -j MASQUERADE
David Bélanger
źródło
2
Druga reguła nie jest konieczna, ponieważ pierwsza reguła zawiera już ...
machineaddict
1
Pierwsza reguła ogranicza trasę wstępną tylko wtedy, gdy dotrze ona do interfejsu eth1. Druga reguła jest bardziej ogólna, ponieważ dotyczy wszystkich interfejsów. Uważaj na pętle!
Tu-Reinstate Monica-dor duh
4

Zapomniałeś również wspomnieć, że przekazywanie pakietów powinno być włączone, aby móc wykonywać docelowy NAT. Domyślnie jest zwykle wyłączony, więc reguły iptables nie będą działać. Można to włączyć, wydając:

echo 1 > /proc/sys/net/ipv4/ip_forward
Dmitriusan
źródło
Dziękuję bardzo za to, że godzinami wyciągałbym włosy!
ColinM,
3

Najpierw zezwól na przekazywanie za pomocą

echo 1 > /proc/sys/net/ipv4/ip_forward

Następnie ustaw reguły iptable za pomocą

IF=eth1
PORT_FROM=8080
PORT_TO=80
DEST=10.32.25.2
iptables -t nat -A PREROUTING -i $IF -p tcp --dport $PORT_FROM -j DNAT --to $DEST:$PORT_TO
iptables -t nat -A POSTROUTING -p tcp -d $DEST --dport $PORT_TO -j MASQUERADE

Możesz /etc/rc.localna przykład wstawić te linie . Uwaga: ponieważ Debian jessie sprawia, że ​​jest wykonywalny i włącza usługę rc.local poprzez

systemctl enable rc-local.service
rubo77
źródło
0

Najpierw musisz sprawdzić, czy masz włączone przekazywanie:

cat /proc/sys/net/ipv4/ip_forward

Jeśli nie 1, uruchom echo 1 > /proc/sys/net/ipv4/ip_forward.

Jeśli chcesz, aby ruch uderzający w 10.32.25.1 na porcie 80 i 443 był przekierowywany do portu 80.32.25.2, powinieneś użyć poniższej reguły:

iptables -t nat -A PREROUTING -d 10.32.25.1 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.32.25.2:80
balon
źródło