題 如何通過SSH隧道傳輸所有網絡流量?


每當我從不安全的位置使用互聯網(例如公共wifi)時,我喜歡使用ssh隧道(ssh -D port host)以確保我的交通不會被嗅到。不幸的是,似乎有許多應用程序沒有提供指定代理的方法(Flash是一個主要的例子)。

感覺應該有一些方法來使用隧道 所有 來自我電腦的網絡流量,但我完全不知道如何做到這一點。任何幫助將不勝感激。


108
2017-10-29 00:51


起源


當然,你無法通過ssh隧道傳輸所有流量,因為這意味著隧道傳輸ssh,但我們知道你的意思。 :) - CarlF
這是一個好主意,但您只能在您的計算機和ssh端點之間受到保護。之後,您的流量是明確的(除非另有保護,例如SSL)。被授予,它更可能是通過電線,但仍然......你不能真正信任你無法控制的電線。 - quack quixote
但是,當你在廣闊的互聯網上出行時,你只能成為數十億個數據包中的一個,這對嗎?當您連接到公共Wi-Fi時,您可能是3個連接之一,您可以親自識別,等等。 - endolith


答案:


為了做你想做的事,我建議 sshuttle

你這樣使用它:

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

它會自動為您提供所有TCP流量的隧道。你可以添加 --dns 讓它隧道你的DNS流量的論點。遠程服務器只需要安裝Python。

如果你只想隧道特定的程序,我會建議 proxychains

安裝完成後,啟動你的ssh socks代理,如下所示:

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

這將啟動一個“SOCKS”代理偵聽<本地端口>。

然後編輯/etc/proxychains.conf以指向與<local port>相同的端口。

最後啟動你想要代理的程序,如下所示:

proxychains <program name>

它應該工作。但是,一些程序在使用代理鏈時會遇到問題。還要記住,使用Firefox,您必須更改about:config下的其他項目,以強制它通過代理進行DNS查找,而不是繞過它。

另外需要注意的是,在Web瀏覽器上。如果它們支持socks代理,你不需要做任何額外的事情來讓他們使用上面提到的ssh隧道,只需為SOCKS代理服務器輸入127.0.0.1,為代理端口輸入<local port>。

編輯3/29/16

由於這篇文章仍然看到一些贊成,我以為我會更新它。 Proxychains仍然在大多數Linux repos中,仍可在Linux上運行。但是,該項目實際上已被放棄,並且不適用於OSX。對於Linux或OSX,我強烈建議升級到仍然維護的fork:proxychains-ng: https://github.com/rofl0r/proxychains-ng

除了在Linux和OSX中工作外,它易於編譯,並且對DNS隧道提供了更好的支持。

我還應該提一下另一種選擇,即redsocks。它與proxychains(-ng)的工作方式類似,也可能在你的dist repo中: https://github.com/darkk/redsocks


54
2018-05-23 16:08





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

~~ SNIP ~~

     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).

一旦你有了新的界面,你只需要將它作為默認路線,這是一個不同的問題。


44
2017-07-18 10:24



你能解釋一下嗎? ifconfig命令創建一個名為tun0的新接口,對嗎?或者是由ssh創建的tun0,還是由ifconfig進一步配置?也許添加一個與問題相關的例子? - Nobody


在ssh中查找“Tunnel”選項。這將創建一個可以為其分配IP地址的隧道設備,然後更改默認路由以使用該隧道。


7
2017-11-01 17:40





我開發了一種軟件,允許您通過系統範圍內的SOCKS5代理轉發所有TCP和UDP。

http://code.google.com/p/badvpn/wiki/tun2socks

它甚至可以安裝在路由器上,以轉發LAN上計算機的所有連接。


4
2017-07-18 08:55





只是想清除(ssh -D端口主機)不是一種100%安全的方式來防止流量被嗅探。添加(ssh -D -c blowfish端口主機)將是一個更好的選擇,因為您至少在會話中添加加密。您可以添加更多選項,但只需在您的終端或Google中鍵入“man ssh”即可獲得完整列表。

我認為您正在尋找的選項是建立VPN(虛擬專用網絡)

看看這篇文章,了解兩者之間的差異(SSH與VPN)或好的 總結版本,在你解決建立自己的VPN之前。如果您決定採用我推薦的VPN路線 OpenVPN的,它免費和大量的文檔和支持。


-1
2017-10-29 01:43



不好的建議。 “blowfish”是一種SSH-1密碼;這是快速的,安全的(截至1999年: unixhelp.ed.ac.uk/CGI/man-cgi?ssh+1 ),但仍然。你可能想要的 ssh -2 -C -D [...] (強制SSH2,使用壓縮)並刪除 -c。根據我的系統 man ssh SSH2中的密碼列表默認為 aes128-cbc,3des-cbc,blowfish-cbc,[etc]。我的觀點是,如果你要求 -c blowfish 你最終可能會使用SSH1,這比SSH2安全得多。 - quack quixote
沒錯,但Jeremy的印像是連接只有-8080這個安全,我只是說它比他用的更好。你提出了一個有效的觀點,這就是我提到手冊以獲得更多選擇的原因。 - ricbax
也許你應該改變你的答案,否則它會有所幫助。 - endolith
忘了我問了這個,不要經常使用這個網站。謝謝你的澄清......我有一種強烈的印象,默認情況下SSH是安全的。 - Shareware
WTF默認情況下不使用SSH加密? - LatinSuD


基於SSH的虛擬私有網絡      ssh包含對使用的虛擬專用網絡(VPN)隧道的支持      tun(4)網絡偽設備,允許連接兩個網絡      牢固。 sshd_config(5)配置選項PermitTunnel控件      服務器是否支持此功能,以及在何種級別(第2層或第3層)      FIC)。

 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
2018-03-12 22:57



請添加您的信息來源。注意:這是一個老問題。 - Lorenzo Von Matterhorn


使用這些示例:

  • 將端口80從遠程主機轉發到本地主機上的8888

    ssh -fnN -L8888:localhost:80 user @ server

    使用此選項可訪問僅在此處可用的遠程主機上的服務

  • 將端口80從本地主機轉發到遠程主機上的8888

    ssh -fnN -R8888:localhost:80 user @ server

    使用它來允許用戶訪問您的服務:webserver或其他。

乾杯! :)


-3
2017-11-01 17:47



好的評論,但與我們在這裡談論的內容完全沒有關係。反向ssh允許SERVER請求CLIENT將一個流量端口路由到它。然後需要更多配置來將該流量路由到互聯網。您還必須為每個端口設置SSH隧道。它必須從服務器而不是客戶端啟動 - 除非你必須這樣做,為什麼你會這樣做呢? - Beachhouse