Jak przekierować port z jednej maszyny na drugą?


19

Rozważ następującą sytuację:

W moim domu mam router (podłączony do Internetu), serwer (S) i moją główną maszynę (M). S jest osiągalny z Internetu (ma statyczny adres IP) i jest dostępny 24/7, podczas gdy M nie.

Czasami chcę udostępnić aplikację (która nasłuchuje na porcie M, na przykład 8888) z zewnętrznego Internetu.

W tym celu chciałem skonfigurować port na S (2222), aby przekazywał do portu M 8888, aby każdy, kto ma dostęp do S: 2222, miałby wrażenie, jakby miał dostęp do M: 8888.

Próbowałem użyć przekierowania portów ssh, moja najlepsza próba była następująca:

ssh -L 2222:M:8888 -N M

Ale to pozwala mi tylko uzyskać dostęp do portu 2222 z samego serwera, a nie z innych maszyn.

Czy jest jakiś sposób, aby zrobić to poprawnie? Wolałbym, aby było to proste polecenie, które mógłbym uruchamiać i zamykać za pomocą ^ C, gdy nie potrzebuję już tego przekazywania.


Wypróbuj localhost.run, która jest witryną, którą możesz
odwiedzić

Odpowiedzi:


16

Tak, nazywa się to GatewayPortsw SSH. Fragment ssh_config(5):

GatewayPorts
        Specifies whether remote hosts are allowed to connect to local
        forwarded ports.  By default, ssh(1) binds local port forwardings
        to the loopback address.  This prevents other remote hosts from
        connecting to forwarded ports.  GatewayPorts can be used to spec‐
        ify that ssh should bind local port forwardings to the wildcard
        address, thus allowing remote hosts to connect to forwarded
        ports.  The argument must be “yes” or “no”.  The default is “no”.

I możesz użyć localhostzamiast Mw przesyłaniu dalej, ponieważ przekierowujesz na tę samą maszynę, na której korzystasz z SSH - jeśli dobrze rozumiem twoje pytanie.

Tak więc polecenie stanie się następujące:

ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M

i będzie wyglądać tak w netstat -nltp:

tcp        0      0    0.0.0.0:2222   0.0.0.0:*  LISTEN  5113/ssh

Teraz każdy, kto uzyskuje dostęp do tego komputera przez port 2222 TCP, faktycznie będzie rozmawiał z hostem lokalnym: 8888, jak widać na komputerze M. Zauważ, że to nie jest to samo, co zwykłe przekazywanie do portu 8888 w M.


1
Dzięki! To działa! Ale jest pewna dziwność - z jakiegoś powodu dane wyjściowe zawierają wiersz „bind: Adres już używany”. Co to może znaczyć?
Rogach,

1
Na tym porcie już działa proces. Użyj tego samego netstatpolecenia, aby dowiedzieć się, co dokładnie. Prawdopodobnie kolejny podobny SSH wciąż działa w tle i zabija go za pomocą komendy PID netstat.
gertvdijk

Zabawne jest to, że już to zrobiłem - żadnych procesów na tych portach, zarówno na S, jak i M. Gdyby takie były, cała konstrukcja prawdopodobnie by nie zadziałała.
Rogach,

10

Jest inny sposób. Możesz skonfigurować przekierowanie portów od S: 2222 do W: 8888 za pomocą iptables. Jedno polecenie:

iptables -t nat -A PREROUTING -p tcp --dport 2222 \
         -j DNAT --to-destination 1.2.3.4:8888

gdzie 1.2.3.4 to adres IP M. Nazywa się to NAT (Network Address Translation).


1
Ponieważ robisz tutaj tylko docelowy NAT (w przeciwieństwie do źródłowego NAT), będzie to działało niezawodnie tylko w określonych sytuacjach i może wymagać modyfikacji tabel routingu. Może to jednak działać dobrze w przypadku przekazywania do maszyn wirtualnych (M) działających na hoście (S).
gertvdijk

To polecenie powinno zostać wydane na bramie. Zakładam, że S i M są w tej samej sieci LAN. Źródłowy NAT byłby wykonywany automatycznie przez moduł śledzący połączenia w nowoczesnych jądrach Linuksa. Mam taką konfigurację w sieci biurowej i działa idealnie. Można jednak sprecyzować komendę (na przykład mówiąc iptables -i eth0, gdzie eth0 jest interfejsem zewnętrznym).
Gevial,

Jeśli S i M są w tej samej sieci LAN, nie trzeba przekierowywać portów, ponieważ żaden ruch między nimi nie przechodzi przez bramę.
gertvdijk

1
Tak, ale łączenie się z M: 8888 odbywa się z Internetu, zakładam. Ktoś z Internetu -> S: 2222 -> M i S router LAN z iptables -> M: 8888
Gevial

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.