有些网站/服务我只能从我的服务器所在的子网访问(想想典型的 Intranet 场景)。有没有办法透明地路由通过 SSH 隧道到达这些地址的流量?
考虑以下设置:
我的笔记本电脑已连接到家庭网络。它无法直接访问 ips X 和 Y 上的服务。我有一个通往服务器的 SSH 隧道,该服务器位于可以实际访问这些服务的子网上。
我能否以某种方式自动将所有流量封装到 X 和 Y 的子网以通过此隧道,而无需运行通过服务器发送所有流量的整个 VPN 解决方案?换句话说:前往任何其他子网的所有流量仍应直接从笔记本电脑发出,而不通过服务器(使用隧道)。
答案1
您可以指定在路由表中路由流量的接口:
sudo route add <host.com> -interface <ppp0>
其中,host.com 是您要通过接口访问的主机名或 IP,ppp0 是命令中显示的 VPN 的链接标识符ifconfig
。
答案2
最新版本的 OpenSSH 支持 tun/tap 网络设备以实现真正的 VPN 支持。看https://help.ubuntu.com/community/SSH_VPN一些基本文档(显然是针对 Ubuntu 的,但基本原理也适用于其他地方。)
答案3
免责声明:我还没有真正测试过我要描述的内容,实际上它可能是完全错误的,但你的问题是如此有趣,我无法抗拒起草答案的诱惑。 :-) 另外,此处的设置取决于某些iptables
可能仅存在于 Linux 上的功能。
假设您想要从笔记本电脑连接到服务器 X1 上的特定端口 P1、服务器 X2 上的端口 P2 等 - 我将描述如何通过 SSH 隧道将 TCP 流量路由到这些特定服务器+端口对。 笔记:IP 地址 X1、X2 等是从网关主机(您通过 SSH 连接到的主机)看到的服务器的 IP 地址。
选择一些未使用的本地端口L1(例如10000),L2(例如10001)等。端口L1,L2,...必须全部不同,并且它们的数量应等于不同的(Xn,Pn)服务器+的数量端口对。
用于
iptables
将定向到 Xn:Pn 的数据包重定向到 localhost:Lniptables -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
现在通过 SSH 连接到网关,使用
-L
将流量从 localhost:Ln 隧道传输到 (Xn, Pn) 的选项:ssh gateway.server -L 本地主机:L1:X1:P1 -L 本地主机: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 代理并通过该代理传输所有流量可能仍然更容易。
答案4
我能否以某种方式自动将所有流量封装到 X 和 Y 的子网以通过此隧道,而无需运行通过服务器发送所有流量的整个 VPN 解决方案?
乍一看这有点奇怪,因为这就是 VPN 将为您做的事情。 SSH 往往是点对点的事情,其想法是将本地计算机上的一个端口连接到其他地方的远程计算机的端口;它确实不是为您想象的流量类型而设计的。
换句话说:前往任何其他子网的所有流量仍应直接从笔记本电脑发出,而不通过服务器(使用隧道)。
同样,VPN 可以解决这个问题。
如果您担心获得安全 VPN 流量的“重量级”解决方案(即您不想使用它,因为它太复杂),您真的应该看看开放VPN,这将完全按照您所描述的进行。它不仅会封装所有流量,而且可以通过只有发往这些子网的流量才会通过 VPN 管道进行传输的方式来完成。我会警告您,您仍然需要在本地和远程计算机上编辑文本文件,但运行起来相当容易。
出于您的目的,由于您不希望中间方(服务器)看到您的流量,因此您可以将 VPN 设置为直接从您的计算机连接到远程计算机。所有路由数据包在离开您的笔记本电脑之前都会被加密,因此您将获得 100% 的端到端覆盖。