--- 编辑:2019/03/23 ---

--- 编辑:2019/03/23 ---

我无法在如下图所示的网络中找到解决方案。

  • 我需要能够从 LAN1 中的 PC 打开 LAN2 上路由器 2 的管理页面,无需通过互联网进行路由。
  • 我有一台带有 2 个 NIC 和 Linux(Debian)的“桥接”PC,我可以在其上做所有事情。

我希望任何连接到 LAN 1 的 PC 都可以访问 LAN 2 路由器的端口 80。

     Internet 1                         Internet 2
        !                                   !
+---------------------+             +---------------------+
| Router 1            |             | Router 2            |
| LAN 192.168.55.1/24 |             | LAN 192.168.2.1/24  |
|                     |             |                     |
+---------------------+             +---------------------+
        |                                   |
        |                                   |
        |       +-----------------------+   |
        |       |                       |   |
        |       |         BRIDGE        |   |
        |-------|eth0                   |   |
        |       |192.168.55.2       eth1|---|
        |       |            192.168.2.2|   |
        |       +-----------------------+   |
        |                                   |
        |                                   |
    Other clients                       other clients
     LAN 1                                  LAN 2

这个想法是在(PC)“网桥”的 eth0 上设置一个端口(例如 8080),并在 LAN 2 上的 eth1 上退出到路由器的 IP 192.168.2.1:80

来自 192.168.2.1 的答案不会通过网关,而是会返回到 eth1。经过处理后,IP 数据包从 eth0 出来。“网桥”应该替换源地址,就好像它来自 192.168.55.2 一样。

我已经做了很多测试,但是我找不到通过各种 iptables 设置测试的解决方案。

显然,我启用了 ip_forward = 1 并且我这样设置了 iptables。

iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport 8080 -j ACCEPT
iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 8080 -j DNAT --to 192.168.2.1:80

并转发:

sysctl -a | grep "\.forwarding" | grep ipv4
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.wlan0.stable_secret"
net.ipv4.conf.all.forwarding = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.eth0.forwarding = 1
net.ipv4.conf.lo.forwarding = 1
net.ipv4.conf.wlan0.forwarding = 1

有没有人遇到过类似的问题?你能给我提示一下吗?

提前致谢!

答案1

你正在朝着正确的方向前进,但你只走了一半……真的 :-)。问题在于答案——回到原点。

@Router 1
default => "internet GW"
192.168.55.0/24 => LAN
  # 192.168.55.2 is ok
  # 192.168.2.0/24 is unknown - "matched" by default route
@Router 2
default => "internet GW"
192.168.2.0/24 => LAN
  # 192.168.2.2 is ok
  # 192.168.55.0/24 is unknown - "matched" by default route
iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 8080 -j DNAT --to 192.168.2.1:80

此规则只会更改目标,而不会更改源。让我们考虑源 IP 192.168.55.55:(SRC) 192.168.55.55:<port> => 192.168.55.2:8080 (DST)此规则将其更改为(SRC) 192.168.55.55:<port> => 192.168.2.1:80 (DST)并正确路由。这部分可以正常工作。一旦 Router2 尝试响应,问题就开始了。根据路由表,地址 192.168.55.55 与“默认”匹配并路由到互联网。

选项 1 - 在“桥梁”上实现变更

要使其正常工作,您还需要在“桥接”上“触摸”源 IP,这样 Router2 就会将通信发送到 192.168.2.2,这样就可以将其 NAT 回来。您可以通过添加以下规则来实现它:

iptables -A POSTROUTING -t nat -s 192.168.55.0/24 -o eth1 -d 192.168.2.0/24 -j MASQUERADE

选项 2 - 在“Router2”上实现更改

添加路由后,192.168.55.0/24 => 192.168.2.2它也会开始工作。Router2 上的路由表将是

@Router 2
default => "internet GW"
192.168.2.0/24 => LAN
192.168.55.0/24 => 192.168.2.2
  # 192.168.2.2 is ok
  # 192.168.55.0/24 is routed via 192.168.2.2

--- 编辑:2019/03/23 ---

  • 在与 POSTROUTING 相关的“提供”规则中删除-i eth0(感谢反馈 - 我的错,确定 POSTROUTING 无法与源接口一起运行,因为路由过程已完成并且源接口不可用/相关信息)

旁边是答案最有可能的类似情况,因为它没有通过 NAT 回到 192.168.55.2:8080 ;-)。我现在是午夜,所以可能会发生一些逻辑错误(因为“原始”选项 2 对您有用):-D。将这些编辑的内容作为头脑风暴以供将来研究...

我看到两种选择。

选项1

为反向连接设置相同的规则,因此所有时间(两个方向)在子网上都将可见,作为与网关的通信...端口 8080 将可用于通信的初始化,但以下通信将不会使用它...

iptables -A POSTROUTING -t nat -d 192.168.55.0/24 -o eth0 -s 192.168.2.0/24 -j MASQUERADE

选项 2

您可以直接“NAT 回”到端口 8080,这样即使以下通信也可以正常工作。由于我们使用 --sport,因此我们必须指定协议 (-p),如果我们只使用 IP(如上一个选项中所示),则不需要指定协议 ;-)。

iptables -A POSTROUTING -t nat -p tcp -d 192.168.55.0/24 -o eth0 -s 192.168.2.1 --sport 80 -j SNAT --to-source 192.168.55.2:8080

希望这能帮助您使其完全按照您设想的那样工作 ;-)。祝您好运!

相关内容