[unix] 터널을 통해 특정 주소를 라우팅하는 방법은 무엇입니까?

서버가있는 서브넷에서만 액세스 할 수있는 특정 웹 사이트 / 서비스가 있습니다 (일반 인트라넷 시나리오를 고려하십시오). SSH 터널을 통해 이러한 주소로 이동하는 트래픽을 투명하게 라우팅하는 방법이 있습니까?

다음 설정을 고려하십시오.

노트북이 홈 네트워크에 연결되어 있습니다. ips X 및 Y의 서비스에 직접 액세스 할 수 없습니다. 실제로 이러한 서비스에 액세스 할 수있는 서브넷에있는 서버에 대한 SSH 터널이 있습니다.

서버를 통해 모든 트래픽을 전송하는 전체 VPN 솔루션을 실행하지 않고도이 터널을 통과하기 위해 X 및 Y의 서브넷에 대한 모든 트래픽을 자동으로 캡슐화 할 수 있습니까? 즉, 다른 서브넷으로 이동하는 모든 트래픽은 서버를 통과하지 않고 (터널을 사용하여) 랩톱에서 직접 이동해야합니다.



답변

라우팅 테이블에서 트래픽을 라우팅 할 인터페이스를 지정할 수 있습니다.

sudo route add <host.com> -interface <ppp0>

여기서 host.com은 인터페이스를 통해 액세스하려는 호스트 이름 또는 ip이고 ppp0은 ifconfig명령에 표시된 vpn의 링크 식별자입니다 .


답변

최신 버전의 OpenSSH는 진정한 VPN 지원을 위해 tun / tap 네트워크 장치를 지원합니다. 일부 기본 설명서 (분명히 우분투를위한 것이지만 기본 원칙은 다른 곳에 적용됨)는 https://help.ubuntu.com/community/SSH_VPN 을 참조 하십시오 .


답변

면책 조항 : 실제로 설명 할 내용을 테스트하지 않았으며 실제로 완전히 잘못 될 수는 있지만 귀하의 질문은 너무 흥미로워 서 답변을 작성하려는 유혹에 저항 할 수 없습니다. 🙂 또한 여기서 설정 iptables은 Linux에만 존재할 수있는 일부 기능에 따라 다릅니다 .

랩톱에서 서버 X1의 특정 포트 P1, 서버 X2의 포트 P2 등에 연결한다고 가정합니다.-SSH 터널을 통해 TCP 트래픽을 이러한 특정 서버 + 포트 쌍으로 라우팅하는 방법을 설명하려고합니다. 참고 : IP 주소 X1, X2 등은 게이트웨이 호스트 (SSH 호스트)에서 볼 때 서버의 IP 주소입니다.

  1. 사용하지 않는 로컬 포트 ​​L1 (예 : 10000), L2 (예 : 10001) 등을 선택하십시오. 포트 L1, L2, …는 모두 고유해야하며 해당 수는 고유 (Xn, Pn) 서버 수와 ​​동일해야합니다. 포트 쌍.

  2. iptablesXn : Pn으로 향하는 패킷을 localhost : Ln으로 리디렉션하는 데 사용

    iptables -t nat -A 출력 -p tcp -d X1 –dport P1 -j DNAT-대상 로컬 호스트 : L1 iptables -t nat -A 출력 -p tcp -d X2 –dport P2 -j DNAT- 대상 로컬 호스트 : L2

  3. 이제 -Llocalhost : Ln에서 (Xn, Pn)으로 트래픽을 터널링 하는 옵션을 사용하여 게이트웨이에 대한 SSH :

    ssh gateway.server -L localhost : L1 : X1 : P1 -L localhost : L2 : X2 : P2 …

예:

# access webserver.intranet (port 80) through localhost:10080
iptables -t nat -A OUTPUT -p tcp -d webserver.intranet --dport 80 -j DNAT --to-destination localhost:10080
ssh gateway.server -L locahost:10080:webserver.intranet:80

주의 사항 :

  • 그것은 전혀 작동하지 않으면 TCP에서만 작동합니다 …

  • 둘 이상의 서버에 액세스하려면 VPN을 설정하는 것이 덜 효과적입니다.

  • SSH -D옵션을 사용하여 SOCKS 프록시를 시뮬레이션하고이를 통해 모든 트래픽을 터널링하는 것이 여전히 더 쉬울 수 있습니다 .


답변

서버를 통해 모든 트래픽을 보내는 전체 VPN 솔루션을 실행할 필요없이 X와 Y의 서브넷이이 터널을 통과합니까?

원하는 것은 VPN의 정의입니다.

VPN은

서버를 통해 모든 [귀하의] 트래픽을 보내시겠습니까?

설정되어 있으면 제대로 설정되지 않은 것입니다.

정의에 따라 인터넷을 통해 액세스 할 수없는 터널이나 VPN을 통해 액세스하려는 모든 컴퓨터는 가정합니다. 따라서 인터넷으로 라우팅 할 수없는 필요한 주소 만 VPN을 통해 라우팅해야합니다.

머신 X와 Y 만 있고 다른 것은 없습니다. IT 담당자가이를 서브넷에 배치 할 수 있습니다. 그런 다음 클라이언트 컴퓨터에서 해당 서브넷 만 VPN으로 라우팅하십시오.


답변

서버를 통해 모든 트래픽을 전송하는 전체 VPN 솔루션을 실행하지 않고도이 터널을 통과하기 위해 X 및 Y의 서브넷에 대한 모든 트래픽을 자동으로 캡슐화 할 수 있습니까?

VPN이 당신을 위해 할 일이기 때문에 언뜻보기에는 조금 이상합니다. SSH는 지점 간 업무 인 경향이 있습니다. 즉, 로컬 컴퓨터의 한 포트를 다른 곳의 원격 컴퓨터 포트에 연결한다는 생각입니다. 실제로 트래픽 유형에 맞게 설계되지 않았습니다.

즉, 다른 서브넷으로 이동하는 모든 트래픽은 서버를 통과하지 않고 (터널을 사용하여) 랩톱에서 직접 이동해야합니다.

다시 한 번 VPN이이를 처리합니다.

안전한 VPN 트래픽을 얻는 “무거운”솔루션에 대해 우려하는 경우 (즉, 너무 복잡하기 때문에 원숭이와 함께 사용하지 않으려는 경우) OpenVPN을 살펴보십시오 . 모든 트래픽을 캡슐화 할뿐만 아니라 해당 서브넷으로 향하는 트래픽 만 VPN 파이프를 통과하는 방식으로 수행 할 수 있습니다. 로컬 및 원격 컴퓨터에서 여전히 텍스트 파일을 편집해야한다고 경고하지만 실행하기는 매우 쉽습니다.

중간에있는 서버 (서버)가 트래픽을 보지 못하도록하기 위해 VPN을 설정하여 시스템에서 원격 시스템으로 직접 연결합니다. 라우팅 된 패킷은 랩톱을 떠나기 전에 암호화되므로 100 % 엔드 투 엔드 적용 범위를 갖습니다.


답변

다른 사람들이 말했듯이 “모든 트래픽을 서브넷으로 캡슐화”해야한다면 VPN을 사용하고 싶을 것입니다.

그러나 일부 서비스에만 액세스하려면 SSH의 로컬 포트 ​​전달 기능을 사용하는 것이 좋습니다. 이는 매우 간단합니다. 예를 들어 (노트북에서) 입력하는 경우 :

ssh -N -L 3333:localhost:2222 jump_box

localhost:2222연결하면 localhost:2222에서 연결하는 것과 같습니다 jump_box. 여러 개의 -L 옵션을 한 번에 jump_box사용할 수 있으며 ssd_config on이 허용하는 경우 다른 호스트의 서비스에 연결할 수 있습니다.

autosshwith 등 을 사용 systemd하여 터널을 계속 작동시킬 수 있습니다.


답변