Jak przekierować zakres portów na hoście Linux do wirtualnej maszyny wirtualnej?

1

Próbuję przekierować pewien zakres portów na hoście Linux do jednej z maszyn wirtualnych gości. Chciałbym, aby to przekierowanie dotyczyło wszystkich interfejsów hosta, w tym localhost. Byłem w stanie zrobić:

iptables -I FORWARD -m state -d 192.168.122.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -I PREROUTING -p tcp --dport 8000:8500 -j DNAT --to 192.168.122.158

Gdzie 8000: 8500 to zakres, który jestem zainteresowany przekazywaniem, a 192.168.122.158 to adres IP gościa. Działa to tak długo, jak próbuję połączyć się z innego komputera, tj. Hosta VM. Chciałbym również móc przekazywać ruch pochodzący z hosta VM.

Mam nadzieję, że to jasne, przepraszam, jeśli zmieniłem terminologię.

samwise
źródło

Odpowiedzi:

1

Najwyraźniej wykonywanie DNAT dla ruchu w pętli zwrotnej nie jest możliwe - np. Zobacz to pytanie lub dyskusję z użytkownikiem debian-użytkownik . Korzystanie REDIRECTdziała, ponieważ ruch pozostaje na interfejsie sprzężenia zwrotnego, ale przekazywanie ruchu na inną maszynę nie działa.

Możesz użyć programu przestrzeni użytkownika do przekazywania połączeń TCP - np. Xinetd z następującą konfiguracją przekieruje port 8000 na maszynę wirtualną:

service forward_8000
{
        type                    = UNLISTED
        port                    = 8000
        socket_type             = stream
        wait                    = no
        user                    = root
        redirect                = 192.168.122.158 8000
}

Nie można jednak przekierować zakresu portów w ten sposób - każdy port wymaga osobnej definicji usługi.

Siergiej Własow
źródło
Dziękuję Ci. Znalazłem rinetd, który jest nieco łatwiejszy do skonfigurowania niż xinetd dla tej ilości portów. Przyznam ci nagrodę, ponieważ dostarczyłeś tak wiarygodną odpowiedź, jak to możliwe. dbać.
samwise
0

Pakiety lokalne nie wejdą do PREROUTINGłańcucha. Wierzę, że będziesz musiał użyć OUTPUTłańcucha w tabeli NAT, aby to zrobić:

iptables -t nat -I OUTPUT -p tcp --dport 8000:8500 -j DNAT --to 192.168.122.158

Być może będziesz musiał także dodać regułę do łańcucha filtrów, która zezwala na te wychodzące i powiązane z nimi pakiety:

iptables -I OUTPUT -m state -d 192.168.122.158 --state NEW,RELATED,ESTABLISHED -j ACCEPT
Janos Pasztor
źródło
To nie wydaje się działać. Otrzymuję ten sam wynik, tzn. Telnet localhost 8000 nie może się połączyć (mam coś uruchomionego na maszynie wirtualnej na porcie 8000)
Konieczne może być również dodanie reguły, aby przepuścić pakiety. (Odpowiednik reguły FORWARD.) Zalecam sprawdzenie pakietów za pomocą tcpdump, aby zobaczyć, co się właściwie dzieje.