由于我对网络总体上还很陌生,但需要实现一个特定的场景,所以我想寻求支持。提前感谢一切。
我有以下场景,我的电脑上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:12345
。Machine C
将更改来自的 IP 数据包(通过 iptables)tap0
并eth0
使用相同端口将其发送到其连接192.X.X:12345
。Machine B
将回复machine C
,然后将其发送回machine A
。
我的一些问题是:
- 如果机器 C 不知道机器 B 的 IP 地址,但我知道它与 eth0 接口相连,在机器 A 发送发往机器 B 的数据包的情况下,我是否仍可以将流量路由到其 eth0 IP 地址?例如使用网关 tap0?
- 如果机器 A 和 C 不知道机器 B 的 IP 地址,是否可以将流量路由到 B 的 eth0 IP 地址?或者该数据包是否会被丢弃,因为它不包含目标 IP 地址?
- 我可以将机器 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 限制为仅必要的端口、协议和源地址。