如何通过隧道路由特定地址?


14

我只能从服务器所在的子网访问某些网站/服务(请考虑典型的Intranet方案)。有没有一种方法可以透明地路由通过SSH隧道到达这些地址的流量?

请考虑以下设置:

我的笔记本电脑已连接到家庭网络。它不能直接在IP X和Y上访问服务。我有一个到服务器的SSH隧道,该服务器位于可以实际访问这些服务的子网上。

我能以某种方式自动封装到X和Y子网的所有流量以通过此隧道,而不必运行将通过服务器发送所有流量的整个VPN解决方案吗?换句话说:所有流向任何其他子网的流量仍应直接从便携式计算机进行,而无需通过服务器(使用隧道)。

Answers:


6

您可以在路由表中指定用于路由流量的接口:

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

其中host.com是要通过接口访问的主机名或IP,而ppp0是ifconfig命令显示的vpn的链接标识符。


2
注意:至少在ubuntu -interface上不是这样的选择,route因此上述建议会出现用法错误。另外,这将如何导致OP要求通过ssh隧道进行路由?
arielf


1

免责声明:我实际上没有测试过我要描述的内容,的确可能是完全错误的,但是您的问题是如此有趣,以至于我无法抗拒草拟答案的诱惑。:-)另外,此处的设置取决于某些iptables功能,这些功能可能仅在Linux上存在。

假设您要从便携式计算机连接到服务器X1上的特定端口P1,再连接到服务器X2上的端口P2,等等。-我将描述如何通过SSH隧道将TCP流量路由到这些特定的服务器+端口对。 注意: IP地址X1,X2等是从网关主机(您通过SSH登录到的主机)看到的服务器的IP地址。

  1. 选择一些未使用的本地端口L1(例如10000),L2(例如10001)等。端口L1,L2,...必须全部不同,并且它们的数量应等于不同的(Xn,Pn)服务器的数量+端口对。

  2. 使用iptables重定向引导到XN包:光合速率到本地主机:LN

    iptables -t nat -A OUTPUT -p tcp -d X1 -dport P1 -j DNAT -to-destination localhost:L1 iptables -t nat -A OUTPUT -p tcp -d X2 -dport P2 -j DNAT-到目标localhost:L2

  3. 现在,使用-L选项将SSH的流量从localhost:Ln隧道传输到(Xn,Pn),通过SSH到网关:

    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代理并通过该隧道传输所有流量可能会更容易。


它实际上有效!(遗憾的是,这不适合我的具体情况,我想路由源自虚拟机而非本地主机的流量。)
pvgoran

1

X和Y的两个子网可以通过此隧道,而不必运行将通过服务器发送我的所有流量的整个VPN解决方案?

您想要的是VPN的定义。

VPN不应该

通过服务器发送所有[您的]流量?

如果是,则未正确设置。

根据定义,假定您试图通过隧道或VPN访问的任何计算机都无法通过Internet访问。因此,仅需要的非Internet可路由地址应沿VPN路由。

如果您遇到的情况更复杂,则仅喜欢X和Y机,别无其他。您的IT员工可以将它们放在您的子网中。然后在您的客户端计算机上,仅将该子网沿VPN路由。


0

我能以某种方式自动封装到X和Y子网的所有流量以通过此隧道,而不必运行将通过服务器发送所有流量的整个VPN解决方案吗?

乍一看这有点奇怪,因为这就是VPN将为您做的。SSH往往是点对点的事情,其想法是将本地计算机上的一个端口连接到其他地方的远程计算机的端口。它确实不是针对您设想的流量类型而设计的。

换句话说:所有流向任何其他子网的流量仍应直接从便携式计算机进行,而无需通过服务器(使用隧道)。

同样,VPN会解决这个问题。

如果您担心获得安全VPN流量的“重量级”解决方案(即,您不想因为它太复杂而烦恼),则应该真正看一下OpenVPN,它将完全按照您的描述进行操作。它不仅可以封装所有流量,而且可以通过以下方式完成:只有发往这些子网的流量才能通过VPN管道进行传输。我会警告您,您仍然需要在本地和远程计算机上编辑文本文件,但是运行起来相当容易。

就您的目的而言,由于您不希望中间的一方(服务器)看到您的流量,因此可以将VPN设置为直接从您的计算机连接到远程计算机。任何路由发送的数据包在离开笔记本电脑之前都会被加密,因此您将拥有100%的端到端覆盖率。


0

正如其他人所说,如果您必须“封装到子网的所有流量”,那么您可能要使用VPN。

但是,要访问一些服务,您可能想要使用SSH的本地端口转发功能,这非常简单。例如,如果您输入(从笔记本电脑输入):

ssh -N -L 3333:localhost:2222 jump_box

然后连接到localhost:2222,就像localhost:2222从连接jump_box。您可以一次使用多个-L选项,并且如果ssd_config jump_box允许,则可以连接到其他主机上的服务。

你可以用autosshsystemd等来保持隧道正常运行。

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.