SSH를 통해 모든 네트워크 트래픽을 터널링하려면 어떻게해야합니까?


117

안전하지 않은 위치 (예 : 공용 Wi-Fi)에서 인터넷을 사용할 때마다 ssh -D port host트래픽을 감지 할 수 없도록 ssh 터널 ( )을 사용하고 싶습니다. 불행히도 프록시를 지정하는 방법을 제공하지 않는 많은 응용 프로그램이있는 것 같습니다 (플래시가 주요 예입니다).

내 컴퓨터의 모든 네트워크 트래픽에 터널을 사용할 수있는 방법이 있어야한다고 생각 하지만 어떻게 해야하는지 완전히 모릅니다. 도움을 주시면 감사하겠습니다.


16
물론 ssh를 통해 문자 그대로 모든 트래픽을 터널링 할 수는 없습니다. 이는 ssh 자체를 통해 터널링하는 것을 의미하기 때문에 우리는 당신이 무엇을 의미하는지 알고있었습니다. :)
CarlF

1
이것은 좋은 생각이지만 컴퓨터와 ssh 끝점 사이에서만 보호됩니다. 그 후에는 트래픽이 분명합니다 (예를 들어 SSL과 같이 달리 보호되지 않는 한). 당연히, 그것은 전선 위에있을 가능성이 훨씬 높지만 여전히 ... 제어하지 않는 전선을 실제로 신뢰할 수는 없습니다.
quack quixote

6
그러나 광역 인터넷을 사용하는 경우 수십억 개의 패킷 중 하나만으로도 안전 할 수 있습니다. 공용 Wi-Fi에 연결하면 3 개의 연결 중 하나 일 수 있으며 개인 등을 식별 할 수 있습니다.
endolith 2009

답변:


62

당신이 원하는 것을하기 위해, 나는 sshuttle을 추천 합니다 .

당신은 이것을 다음과 같이 사용합니다 :

./sshuttle -r username@sshserver 0.0.0.0/0 -vv

모든 TCP 트래픽을 자동으로 터널링합니다. --dnsDNS 트래픽도 터널링 하도록 인수를 추가 할 수 있습니다 . 원격 서버에는 Python 만 설치하면됩니다.

특정 프로그램 만 터널링하려면 프록시 체인 을 권장 합니다 .

일단 설치되면 다음과 같이 ssh socks 프록시를 시작하십시오.

ssh -fND 127.0.0.1:<local port> username@sshserver

<local port>에서 "SOCKS"프록시 청취가 시작됩니다.

그런 다음 <local port>와 동일한 포트를 가리 키도록 /etc/proxychains.conf를 편집하십시오.

마지막으로 프록시를 원하는 프로그램을 시작하십시오.

proxychains <program name>

그냥 작동해야합니다. 그러나 일부 프로그램은 프록시 체인 작업에 문제가 있습니다. 또한 Firefox에서는 about : config에서 추가 항목을 변경하여 프록시를 우회하지 않고 프록시를 통해 DNS 조회를 수행하도록해야합니다.

추가 참고 사항으로 웹 브라우저에서. 양말 프록시를 지원하는 경우 위에서 언급 한 ssh 터널을 사용하기 위해 추가 작업을 수행 할 필요가 없습니다. SOCKS 프록시 서버에 127.0.0.1을 입력하고 프록시 포트에 <local port>를 입력하십시오.

3/29/16 수정

이 게시물에 여전히 일부 의견이 게시되어 있기 때문에 업데이트 할 것이라고 생각했습니다. 프록시 체인은 여전히 ​​대부분의 Linux 저장소에 있으며 여전히 Linux에서 작동합니다. 그러나이 프로젝트는 효과적으로 중단되어 OSX에서 작동하지 않습니다. Linux 또는 OSX의 경우 여전히 유지 관리 포크로 업그레이드하는 것이 좋습니다. proxychains-ng : https://github.com/rofl0r/proxychains-ng

Linux 및 OSX에서 작업하는 것 외에도 컴파일하기 쉽고 DNS 터널링에 대한 지원이 훨씬 뛰어납니다.

또한 redsocks 인 다른 옵션을 언급해야합니다. 그것은 프록시 체인 (-ng)과 유사하게 작동하며 또한 dist 저장소에 있습니다 : https://github.com/darkk/redsocks


sshuttle을 사용하는 최신 Linux 시스템에 대한 참고 사항 : 작성시 파이프가 손상되는 커널 버그가 있습니다. 이 경우 다음을 사용하십시오.sshuttle -r root@host -x host 0/0
집합

49

man ssh정확히 이것의 예를 제공합니다. ssh 기반 VPN :

SSH-BASED VIRTUAL PRIVATE NETWORKS
     ssh contains support for Virtual Private Network (VPN) tunnelling using
     the tun(4) network pseudo-device, allowing two networks to be joined
     securely.  The sshd_config(5) configuration option PermitTunnel controls
     whether the server supports this, and at what level (layer 2 or 3 traf-
     fic).

     The following example would connect client network 10.0.50.0/24 with
     remote network 10.0.99.0/24, provided that the SSH server running on the
     gateway to the remote network, at 192.168.1.15, allows it:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.0.50.1 10.0.99.1 netmask 255.255.255.252

~~ 저격 ~~

     Since a SSH-based setup entails a fair amount of overhead, it may be more
     suited to temporary setups, such as for wireless VPNs.  More permanent
     VPNs are better provided by tools such as ipsecctl(8) and isakmpd(8).

새 인터페이스를 만든 후에는 기본 경로로 설정해야합니다. 다른 질문입니다.


1
좀 더 설명해 주시겠습니까? ifconfig 명령은 tun0이라는 새 인터페이스를 만듭니다. 또는 tun0이 ssh에 의해 생성되고 ifconfig에 의해 추가 구성됩니까? 아마도 질문과 관련된 예를 추가 하시겠습니까?
아무도

6

ssh에서 "Tunnel"옵션을 찾으십시오. 그러면 IP 주소를 할당 할 수있는 터널 장치가 생성되고 해당 터널을 사용하도록 기본 경로가 변경됩니다.



0

SSH 기반 가상 개인 네트워크 ssh에는 tun (4) 네트워크 의사 장치를 사용하여 VPN (가상 사설망) 터널링이 지원되므로 두 개의 네트워크를 안전하게 연결할 수 있습니다. sshd_config (5) 구성 옵션 PermitTunnel은 서버가이를 지원하는지 여부와 레벨 (계층 2 또는 3 트래픽)을 제어합니다.

 The following example would connect client network 10.0.50.0/24 with
 remote network 10.0.99.0/24 using a point-to-point connection from
 10.1.1.1 to 10.1.1.2, provided that the SSH server running on the gateway
 to the remote network, at 192.168.1.15, allows it.

 On the client:

       # ssh -f -w 0:1 192.168.1.15 true
       # ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252
       # route add 10.0.99.0/24 10.1.1.2

 On the server:

       # ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252
       # route add 10.0.50.0/24 10.1.1.1

 Client access may be more finely tuned via the /root/.ssh/authorized_keys
 file (see below) and the PermitRootLogin server option.  The following
 entry would permit connections on tun(4) device 1 from user “jane” and on
 tun device 2 from user “john”, if PermitRootLogin is set to
 “forced-commands-only”:

   tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... jane
   tunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john

 Since an SSH-based setup entails a fair amount of overhead, it may be
 more suited to temporary setups, such as for wireless VPNs.  More perma‐
 nent VPNs are better provided by tools such as ipsecctl(8) and
 isakmpd(8).

1
정보 출처를 추가하십시오. 참고 : 이것은 오래된 질문입니다.
Lorenzo Von Matterhorn

-2

(ssh -D 포트 호스트)는 트래픽이 스니핑되지 않도록 100 % 안전한 방법이 아니라는 것을 확인하고 싶었습니다. 세션에 암호화를 적어도 추가하기 때문에 (ssh -D -c 복어 포트 호스트)를 추가하는 것이 더 좋습니다. 추가 할 수있는 옵션이 더 있지만 터미널이나 Google에 "man ssh"를 입력하면 전체 목록을 작성하기가 쉽습니다.

내가 생각하는 옵션은 VPN (Virtual Private Network)을 설정하는 것입니다.

자신의 VPN을 설정하기 전에이 기사를 살펴보고 두 가지 ( SSH vs. VPN ) 또는 요약 된 버전 간의 차이점을 이해 하십시오. VPN 경로를 사용하기로 결정한 경우 OpenVPN , 무료 및 많은 설명서 및 지원을 권장합니다 .


6
나쁜 조언. "송어"는 SSH-1 암호입니다. 빠르고 안전하다고 생각 하지만 ( 1999 년 기준 : unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1 ) 여전히 그렇습니다 . 아마도 ssh -2 -C -D [...](SSH2를 강제 하고 압축을 사용하여) 원하는 것을 제거하십시오 -c. 내 시스템의 man sshSSH2의 암호 목록에 따르면 기본값은 aes128-cbc,3des-cbc,blowfish-cbc,[etc]입니다. 내 요점은, 요청 -c blowfish하면 SSH2보다 훨씬 안전하지 않은 SSH1로 끝날 수 있습니다.
quck quixote

2
사실, 제레미는 -D 8080만으로 연결이 안전하다는 인상을 받았습니다. 당신은 올바른 지적을하고 그래서 더 많은 옵션에 대한 매뉴얼을 언급하는 이유입니다.
ricbax

그렇지 않으면 도움이되므로 답을 바꿔야 할 수도 있습니다.
endolith 2009

이 사이트를 정기적으로 사용하지 마십시오. 설명을 주셔서 감사합니다 ... SSH가 기본적으로 안전하다는 강한 인상을 받았습니다.
Jeremy Banks

9
WTF는 기본적으로 암호화를 사용하는 SSH가 아닙니다 ??
LatinSuD

-3

다음 예를 사용하십시오.

  • 원격 호스트에서 로컬 호스트의 8888로 포트 80을 전달

    ssh -fnN -L8888 : localhost : 80 사용자 @ 서버

    이 옵션을 사용하여 원격 호스트에서만 사용할 수있는 서비스에 액세스하십시오

  • 원격 호스트의 로컬 호스트에서 8888로 포트 80 전달

    ssh -fnN -R8888 : localhost : 80 사용자 @ 서버

    이를 통해 사용자가 웹 서버 또는 기타 서비스에 액세스 할 수 있습니다.

건배! :)


좋은 의견이지만 우리가 여기서 말하는 것과 전혀 관련이 없습니다. Reverse ssh를 사용하면 SERVER가 CLIENT에게 하나의 트래픽 포트를 라우팅하도록 요청할 수 있습니다. 그런 다음 해당 트래픽을 인터넷으로 라우팅하려면 더 많은 구성이 필요합니다. 각 포트마다 SSH 터널을 설정해야합니다. 그리고 클라이언트가 아닌 서버에서 시작해야합니다. 왜해야합니까?
Beachhouse
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.