我有以下设置 LAN 设置(所有机器都运行 Slackware 14.2):
INTERNET
|
| 192.168.10.1
+----------+
|ISP ROUTER|
+----------+
| |
+----+ +-----+
192.168.10.10 | (eth0) | 192.168.10.20 (eth0)
+--------+ +--------+
| HOST A | | HOST B |
+--------+ +--------+
| 192.168.50.50 (eth1)
|
| 192.168.50.100 (eth0)
+--------+
| HOST C |
+--------+
HOST A
和HOST B
通过我的 ISP 路由器连接,并可以互相连接。HOST C
仅连接到HOST B
并能够与 通信HOST B
。但是,我希望能够HOST C
从连接到HOST A
。我无法配置我的 ISP 路由器。HOST A
并且HOST B
必须能够连接到 Internet,因此将默认网关更改为除我的 ISP 路由器之外的其他任何网关都是不可能的。 不允许HOST C
与 Internet 建立任何连接。
我认为至少HOST B
我必须应用这些iptables
规则:
iptables -A FORWARD -s 192.168.50.100 -d 192.168.10.0/24 -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.50.100 -s 192.168.10.0/24 -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.50.100 -d 192.168.10.0/24 -o eth0 -j MASQUERADE
但是,我不确定这些规则是否足够,HOST B
而且我不知道如何配置HOST A
。有什么想法吗?
答案1
经过进一步的研究,我找到了解决方案。首先,HOST B
必须配置为转发来自和到的数据包HOST C
:
iptables -A FORWARD -s 192.168.50.100 -d 192.168.10.0/24 -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.50.100 -s 192.168.10.0/24 -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.50.100 -d 192.168.10.0/24 -o eth0 -j MASQUERADE
然后HOST A
和 HOST C
需要通过 添加额外的路线HOST B
,以便他们能够互相找到对方。
以 root 身份处理HOST A
问题:
route add -host 192.168.50.100 gw 192.168.10.20
以 root 身份处理HOST C
问题:
route add -host 192.168.10.10 gw 192.168.50.50
就是这样。当然,任何相关主机上的潜在防火墙都必须进行相应配置以允许流量通过。
答案2
你被骗了。没有能力配置主机A或者ISP 路由器,你不能这样做。
如果/当您可以配置主机 A 时,您可以为其提供更具体的(即非默认)192.168.50.0/24 路由,并将其指向主机 B 作为下一跳,然后使用主机 B 上的 iptables 转发到(和从)主机 C。这是稍微干净的方法,因为您可以完全绕过 ISP 路由器。
如果/当你可以配置 ISP 路由器时,你可以告诉它网络 192.168.50.0/24 存在(它现在还不知道这一点),并且要到达那里,它需要通过主机 B 发送流量。(另外:在这种情况下,ISP 路由器应该发送ICMP 重定向当主机 A 收到发往 C 的流量时,返回到主机 A。)
总而言之,你有一个无法解决的问题两者都不主机 A 和 ISP 路由器都不知道这个其他子网。除非你以某种方式打破这种僵局,否则你很倒霉。
此外,您的 iptables 语句暗示您严格尝试仅为主机 C 转发数据包 - 如果您计划在该子网上放置更多设备,您可能需要考虑为整个 /24 子网而不是仅仅那一个主机构建转发规则。