如何将所有流量从一个接口路由到另一个接口并保持相同的端口?

如何将所有流量从一个接口路由到另一个接口并保持相同的端口?

由于我对网络总体上还很陌生,但需要实现一个特定的场景,所以我想寻求支持。提前感谢一切。

我有以下场景,我的电脑上machine A运行着一个软件,通常machine B通过以太网电缆连接到。我现在想做的是通过machine B中间路由器/设备从远程连接到machine A,我们称这个新设备为machine C。我相信我需要使用 IP 路由iptables

注意:机器A与机器B不在同一子网

因此场景将会是这样的:

  192.168.20.X machine A 10.8.0.55  <--tap0--> 10.8.0.50 machine C 192.168.27.1 <--eth0--> 192.168.27.100 machine B

我认为 iptables 可以完成这个工作:

因此例如当machine A想要连接到时machine B,它必须使用 连接到其tap0接口10.8.0.50:12345Machine C将更改来自的 IP 数据包(通过 iptables)tap0eth0使用相同端口将其发送到其连接192.X.X:12345Machine B将回复machine C,然后将其发送回machine A

我的一些问题是:

  1. 如果机器 C 不知道机器 B 的 IP 地址,但我知道它与 eth0 接口相连,在机器 A 发送发往机器 B 的数据包的情况下,我是否仍可以将流量路由到其 eth0 IP 地址?例如使用网关 tap0?
  2. 如果机器 A 和 C 不知道机器 B 的 IP 地址,是否可以将流量路由到 B 的 eth0 IP 地址?或者该数据包是否会被丢弃,因为它不包含目标 IP 地址?
  3. 我可以将机器 C 中的数据包转发到不同的接口并保持相同的端口吗?

我关注指南中没有实施防火墙规则,但我无法正确连接,因为它使用的是我想避免的硬编码 IP 地址,我想将流量从 tap0 转发到机器 C 中的 eth0,并且在最好的情况下不需要知道机器 B 的 IP 地址。

我试图在机器 C 中使用这些规则,但说实话,我对它们理解不太好。

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -A FORWARD -i eth0 -o tap0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i tap0 -o eth0 -j ACCEPT

如果您能给我推荐一些容易理解的资源,我也会去看看。谢谢。

还签出了:

这个问题 这个问题


编辑: 我添加了场景的简化布局。我发现我可能需要使用 NAT。

从机器 AI 尝试使用ping 10.8.0.50 机器 B 的 IP 地址将数据包发送到机器 C:。192.168.27.106当我从机器 A 向 CI 发送数据包时,希望它更改数据包的源地址和目标地址,因此我应用了:

sudo iptables -t nat -A PREROUTING -i tap0 -j DNAT --to 192.168.27.100
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 10.8.0.55

在机器 BI 上使用时sudo tcpdump -i eth0,获得了正确的 ICMP 请求。但是,回显没有返回到机器 A。自然而然地,我认为我需要将 iptables 规则再次应用到机器 A。因此,我应用了:

sudo iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 10.8.0.55
sudo iptables -t nat -A POSTROUTING -o tap0 -j SNAT --to 192.168.27.100

我能够将数据包发送到机器 B,但没有收到机器 A 的回复。我觉得缺少了一些东西。有什么想法吗?

在此处输入图片描述

答案1

Machine C has only one address and can not be changed.- 但在您的图片上,它在 A 和 B 子网中都有 2 个地址以及 2 个网络接口 tap0 和 eth0。

此外,您的图片和 IP 的文字不同。实际上是什么192.168.27.106?eth0 上的机器 B IP?但您的图片显示它是192.168.27.100。您正在对进行 SNAT 10.8.0.55,但根据您的图片,那是机器 A IP。这样,机器 C 将根据其路由表向该 IP 发送 ICMP 回复。您需要在 eth0 端对机器 B IP 进行 SNAT,即192.168.27.1如果您的图片标注了正确的 IP。即像这样:

sudo iptables -t nat -A PREROUTING -i tap0 -j DNAT --to 192.168.27.100
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.27.1

您通常不需要“反向” NAT 规则,因为连接跟踪应该在记住的数据包上再次解析它。

答案2

鉴于图中的拓扑,您可以仅通过路由和数据包转发将机器 A 与机器 B 连接起来。

在机器 A 上添加一条通过机器 C 到机器 B 的路由,如下所示:

ip route add 192.168.27.100/32 via 10.8.0.50

在机器 B 上添加一条通过机器 C 到 A 的路由,如下所示

ip route add 10.8.0.55/32 via 192.168.27.1

在机器 C 上,使用以下命令激活 IP 转发

/sbin/sysctl -w net.ipv4.ip_forward=1

通常不需要 iptables,您可以通过各自的地址访问机器 A 和 B。


如果无法在机器A和机器B上添加路由条目,那么就必须使用机器C作为连接另一端的代理,并在机器C上配置NAT。

NAT 具有破坏性,可能会以意想不到的方式造成破坏。因此,我建议使 NAT 规则尽可能具体,并记录 NAT 的必要性。

您可以使用 NStorm 在另一个答案中提供的 NAT 规则使其变得“通用”:

sudo iptables -t nat -A PREROUTING -i tap0 -j DNAT --to 192.168.27.100
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.27.1

但请记住,有了这些规则,您就无法再从任何通过接口进入的网络访问机器 C tap0。因此,我建议将 NAT 限制为仅必要的端口、协议和源地址。

相关内容