如何通过SSH隧道传输所有网络流量?


117

每当我从不安全的位置(例如公共wifi)使用互联网时,我都喜欢使用ssh隧道(ssh -D port host)来确保流量不会被监听。不幸的是,似乎有许多应用程序没有提供指定代理的方法(Flash是一个主要示例)。

感觉应该有某种方法可以对我的计算机中的所有网络流量使用隧道,但是我完全不知道该怎么做。任何帮助将不胜感激。


16
当然,您实际上无法通过ssh隧道传输所有流量,因为那将意味着通过ssh本身隧道传输,但是我们知道您的意思。:)
CarlF

1
这是一个好主意,但是只在计算机和ssh端点之间保护您。在那之后,您的流量是明确的(除非受到其他保护,例如SSL)。当然,它更有可能通过电线,但是仍然……您不能真正信任不受控制的电线。
2009年

6
但是,当您使用广泛的Internet时,只有数十亿个数据包中的一个就可以保证安全,对吗?当您连接到公共Wi-Fi时,您可能是3个连接之一,您可以个人识别,等等
。– endolith

Answers:


62

要执行您想要的操作,我建议使用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以指向与<本地端口>相同的端口。

最后,启动要代理的程序,如下所示:

proxychains <program name>

它应该工作。但是,一些程序在使用代理链时会遇到麻烦。还请记住,使用Firefox,您必须在about:config下更改其他项,以强制它通过代理进行DNS查找,而不是绕过它。

作为附加说明,在Web浏览器上。如果它们支持袜子代理,则无需执行任何其他操作即可使它们使用上述的ssh隧道,只需为SOCKS代理服务器输入127.0.0.1,为代理端口输入<local port>。

编辑3/29/16

由于该帖子仍然有一些赞誉,我想我将对其进行更新。Proxychains仍然存在于大多数Linux仓库中,并且仍然可以在Linux上使用。但是,该项目实际上已被放弃,无法在OSX上运行。对于Linux或OSX,我强烈建议升级到仍维护的fork:proxychains-ng:https : //github.com/rofl0r/proxychains-ng

除了可以在Linux和OSX上运行之外,它还易于编译,并且对DNS隧道具有更好的支持。

我还应该提到另一种选择,即红袜子。它的工作原理类似于proxychains(-ng),也可能在您的dist回购中:https : //github.com/darkk/redsocks


请注意使用shuttle的较新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中寻找“隧道”选项。这将创建一个隧道设备,您可以为其分配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
请添加信息来源。注意:这是一个老问题。
罗伦佐·冯·马特宏峰

-2

只是想清除一下(ssh -D端口主机),这不是一种不监听流量的100%安全方式。添加(ssh -D -c blowfish端口主机)将是一个更好的选择,因为您至少要在会话中添加加密。您可以添加更多选项,但只需在终端机或Google中输入“ man ssh”即可获得完整列表,这很容易。

我认为您正在寻找的选项是设置VPN(虚拟专用网络)

在着手设置自己的VPN之前,请查看本文,以了解两者之间的区别(SSH与VPN)或一个很好的摘要版本。如果您决定使用VPN路由,建议您使用OpenVPN,它是免费的,并提供大量文档和支持。


6
不好的建议。“ 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。
2009年

2
没错,但是杰里米给人的印象是,仅使用-D 8080,连接是安全的,我只是说它比他使用的要好。您的观点是正确的,这就是为什么我在手册中提到更多选项的原因。
ricbax

也许您应该更改答案,否则会有所帮助。
endlith

忘记了我问的这个问题,不要经常使用此网站。感谢您的澄清...我给人的强烈印象是SSH默认是安全的。
杰里米·班克斯

9
WTF默认不使用加密SSH ??
LatinSuD 2011年

-3

使用以下示例:

  • 将端口80从远程主机转发到本地主机上的8888

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

    使用它来访问仅在远程主机上可用的服务

  • 将端口80从您的本地主机转发到远程主机上的8888

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

    使用它可以使其他用户访问您的服务:Web服务器或其他。

干杯! :)


很好的评论,但与我们在这里所说的根本无关。反向ssh允许SERVER请求CLIENT将流量的一个端口路由到它。然后需要更多配置才能将该流量路由到Internet。您还必须为每个端口设置SSH隧道。并且必须从服务器而不是客户端启动它-为什么除非您必须这样做,否则为什么要这样做?
海滨别墅
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.