Nie można dotrzeć do wewnętrznego adresu IP ze świata zewnętrznego, używając iptables NAT

1

Mam 2 maszyny wirtualne, jedna działa jako router i serwer Ubuntu i jest połączona z hostem przez połączenie zmostkowane, a druga jest maszyną Kali, która jest połączona z maszyną wirtualną serwera za pośrednictwem połączenia tylko z hostem.

Maszyna Kali ma adres IP 192.168.0.40, a serwer ma adres IP 172.16.23.100.

Reguły iptables, które ustawiłem, są następujące:

Chain PREROUTING (policy ACCEPT 114 packets, 20912 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       all  --  ens33  *       0.0.0.0/0            172.16.23.101        to:192.168.0.40

Chain INPUT (policy ACCEPT 60 packets, 8700 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 6 packets, 422 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 6 packets, 422 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   168 MASQUERADE  all  --  *      ens33   192.168.0.0/24       0.0.0.0/0           
    0     0 SNAT       all  --  *      ens33   192.168.0.40         0.0.0.0/0            to:172.16.23.101

przejście z komputera Kali na zewnątrz do hosta działa dobrze, ale kiedy próbuję przejść z hosta do komputera Kali albo przez zwykły ping, albo przez ssh, nie przechodzi.

Czy muszę ustawić DNAT, aby działał tylko z określonym portem?

Plik wygenerowany przez iptables-save zgodnie z żądaniem @grawity

# Generated by iptables-save v1.6.0 on Thu Jul 27 06:58:13 2017
*filter
:INPUT ACCEPT [686:75420]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [485:45172]
-A FORWARD -i ens33 -o ens38 -j ACCEPT
-A FORWARD -i ens38 -o ens33 -j ACCEPT
COMMIT
# Completed on Thu Jul 27 06:58:13 2017
# Generated by iptables-save v1.6.0 on Thu Jul 27 06:58:13 2017
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [4:240]
:POSTROUTING ACCEPT [4:240]
-A PREROUTING -d 172.16.23.101/32 -i ens33 -j DNAT --to-destination 192.168.0.40
-A POSTROUTING -s 192.168.0.0/24 -o ens33 -j MASQUERADE
-A POSTROUTING -s 192.168.0.40/32 -o ens33 -j SNAT --to-source 172.16.23.101
COMMIT
# Completed on Thu Jul 27 06:58:13 2017

Gdy uruchamiam tcpdump na routerze / serwerze, pokazuje mi, że wysyła żądania arp na adres 172.16.23.101, ale nic nie jest wysyłane, nie rozumiem, dlaczego nie jest łapany w regule NAT, jeśli jest w łańcuch PREROUTING

Muffinator
źródło
Czy możesz pokazać prawdziwe zasady, jak w iptables-save?
grawity
@grawity dodał go do głównego posta
Muffinator
Normalnie miałbym regułę w łańcuchu wejściowym, umożliwiającą dostęp do określonego portu ...
djsmiley2k
1
Czy fizyczny interfejs sieciowy hosta odbiera pakiety wysłane do 172.16.23.101? Prawdopodobnie problem nie jest po stronie iptable, ale po stronie interfejsu, który nie wie, że musi odbierać te pakiety. To, co mówisz o braku odpowiedzi ARP, wydaje się to potwierdzać.
Nathan.Eilisha Shiraini
1
Może to pomóc: askubuntu.com/a/547300/600828 - Jakiekolwiek rozwiązanie wybierzesz, z pewnością przetestujesz je najpierw! Nie mam nic do przetestowania w tej chwili, a manipulowanie interfejsami może być nieco niebezpieczne (szczególnie, jeśli nie masz lokalnego dostępu do serwera).
Nathan.Eilisha Shiraini

Odpowiedzi:

2

Problemem nie były zasady iptables, wszystko było w porządku. ale próbując dostać się do 172.16.23.101, wysłał żądania arp, aby zobaczyć, kto ma ten adres, a który nie.

więc dodałem interfejs podrzędny do ens33 i podałem mu ten adres

Dodałem do pliku „/ etc / network / interfaces” te wiersze

auto ens33:1
iface ens33:1 inet static
    address 172.16.23.101
    netmask 255.255.0.0

wtedy, jeśli pinguję 172.16.23.101 z tcpdump działającym na serwerze, widzę, że ttl wynosi 63, co oznacza, że ​​przeszedł przez jeden sprzęt warstwy 3, ponieważ domyślne ttl dla linux to 64

Muffinator
źródło