한 시스템에서 다른 시스템으로 포트를 전달하는 방법은 무엇입니까?


19

다음 상황을 고려하십시오.

집에는 라우터 (인터넷에 연결되어 있음), 서버 (S) 및 내 기본 컴퓨터 (M)가 있습니다. S는 인터넷에서 연결할 수 있으며 (정적 IP가 있음) 24/7이며 M은 그렇지 않습니다.

때로는 외부 인터넷에서 액세스 할 수있는 일부 응용 프로그램 (예 : 8888과 같은 M의 일부 포트에서 수신 대기)을 만들고 싶습니다.

이를 위해 S (2222)에 일부 포트를 설정하여 M의 포트 8888로 전달하여 S : 2222에 액세스하는 모든 사람이 M : 8888에 액세스하는 것처럼 느낄 수 있도록했습니다.

ssh 포트 전달을 사용하려고 시도했지만 최선의 시도는 다음과 같습니다.

ssh -L 2222:M:8888 -N M

그러나 다른 컴퓨터가 아닌 서버 자체에서 2222 포트에만 액세스 할 수 있습니다.

제대로 할 수있는 방법이 있습니까? 바람직하게는 더 이상 전달이 필요하지 않을 때 ^ C로 시작하고 종료 할 수있는 간단한 명령 이길 원합니다.


당신이에서 얻을 수있는 웹 사이트 인 localhost.run 시도 localhost.run가 나는 거기에서 .. 당신의 제품을 얻을 수있는 방법이 있다고 생각
Angelena Neilsomt

답변:


16

예, 이것은 GatewayPortsSSH에서 호출 됩니다. 발췌 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”.

SSH를 사용하는 것과 동일한 컴퓨터로 전달할 때 전달 localhost대신에 사용할 수 있습니다 M. 질문을 올바르게 이해하면.

따라서 명령은 다음과 같습니다.

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

그리고 다음과 같이 보일 것입니다 netstat -nltp:

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

이제 포트 2222 TCP에서이 시스템에 액세스하는 사람은 실제로 시스템 M에서 볼 수 있듯이 localhost : 8888과 통신합니다. 이는 M의 포트 8888 로의 일반 전달과 동일하지 않습니다.


1
감사! 작동합니다! 그러나 이상한 점이 있습니다. 어떤 이유로 출력에는 "바인드 : 주소가 이미 사용 중"이라는 줄이 포함됩니다. 무슨 뜻일까요?
Rogach

1
해당 포트에서 일부 프로세스가 이미 실행 중입니다. 동일한 netstat명령을 사용하여 정확히 무엇을 찾으십시오. 아마도 다른 비슷한 SSH가 여전히 백그라운드에서 실행 중이며 PID netstat를 사용하여 죽일 수 있습니다.
gertvdijk

재미있는 점은 S와 M 모두에서 해당 포트에 대한 프로세스가 없다는 것입니다. 일부가 있다면 전체 구성이 작동하지 않았을 것입니다.
Rogach

10

다른 방법이 있습니다. iptables를 사용하여 S : 2222에서 W : 8888로 포트 전달을 설정할 수 있습니다. 단일 명령 :

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

여기서 1.2.3.4는 M의 IP 주소입니다. 이를 NAT (Network Address Translation)라고합니다.


1
여기서 소스 NAT와 달리 대상 NAT 만 수행하므로 특정 상황에서만 안정적으로 작동하며 라우팅 테이블을 수정해야 할 수도 있습니다. 그러나 호스트 (S)에서 실행되는 가상 머신 (M)으로 전달하는 경우에는 잘 작동 할 수 있습니다.
gertvdijk

이 명령은 게이트웨이에서 발행해야합니다. S와 M이 같은 LAN에 있다고 가정합니다. 소스 NAT는 최신 Linux 커널에서 연결 추적기에 의해 자동으로 수행됩니다. 내 사무실 네트워크에 이러한 구성이 있으며 완벽하게 작동합니다. 그러나 명령을보다 구체적으로 만들 수 있습니다 (예 : eth0이 외부 인터페이스 인 iptables -i eth0에게 알려주기).
Gevial

S와 M이 동일한 LAN에 있으면 포트를 전달할 필요가 없습니다. 게이트웨이간에 트래픽이 없기 때문입니다.
gertvdijk

1
그러나 M : 8888에 연결하는 것은 인터넷에서 이루어집니다. 누군가가 인터넷을 형성 함-> S :
2222-

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.