在 Linux 上,具有不同网络掩码和广播的两个网络之间进行路由?

在 Linux 上,具有不同网络掩码和广播的两个网络之间进行路由?

以太网:

ServerA; IP=192.168.255.254; Mask=255.255.0.0; Bcast=192.168.255.255
   |
   |
  eth1 IP=192.168.1.254; Mask=255.255.0.0; Bcast=192.168.255.255
ServerB DHCP: 192.168.1.1 - 192.168.1.252
  eth0 IP=192.168.1.253; Mask 255.255.255.0; Bcast=192.168.1.255
   |
   |
Client1..252 IP over DHCP (192.168.1.1 - 192.168.1.252)

我如何连接/路由以在 ClientX 和 ServerA 之间进行通信?

_

ClientX 和 ServerB 之间的 Ping 操作正常。

ServerA 和 ServerB 之间的 Ping 可以正常工作。

_

我试过Linux 上两个网络之间的路由?在 eth0 和 eth1 之间路由但没有工作。

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.1.253
    netmask 255.255.255.0
    broadcast 192.168.1.255

auto eth1
iface eth1 inet static
    address 192.168.1.254
    netmask 255.255.0.0
    broadcast 192.168.255.255

/etc/网络/接口

interface=eth0
no-dhcp-interface=eth1
dhcp-range=interface:eth0,192.168.1.1,192.168.1.252,1

/etc/dnsmasq.conf

----------------------------------更新 1------------------------------------

ServerA; IP=192.168.255.254; Mask=255.255.255.0; Bcast=192.168.255.255
   |
   |
  eth1 IP=192.168.255.1; Mask=255.255.255.0; Bcast=192.168.255.255
ServerB DHCP: 192.168.1.1 - 192.168.1.253
  eth0 IP=192.168.1.254; Mask 255.255.255.0; Bcast=192.168.1.255
   |
   |
Client1..253 IP over DHCP (192.168.1.1 - 192.168.1.253)

路由:

 sysctl -w net.ipv4.ip_forward=1
 iptables -A INPUT -i lo -j ACCEPT       # Always accept loopback traffic
 iptables -A INPUT -i eth0 -j ACCEPT     # We allow traffic from the LAN side
 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT        # Allow established connections
 iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE    # Masquerade
 iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT      # fowarding
 iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT   # Allow outgoing connections from the LAN side.

结果:

从 ClientX 到 ServerA 的 ping 操作成功,但不是从 ServerA 到 ClientX:

 $ ping 192.168.1.119
 PING 192.168.1.119 (192.168.1.119) 56(84) bytes of data.
 From 192.168.255.254 icmp_seq=1 Destination Host Unreachable
 From 192.168.255.254 icmp_seq=2 Destination Host Unreachable

----------------------------------没有 iptables 的更新 2 (解决方案)------------------------------------

根据更新 1 的网络:

                     ServerA
                        |
     |------------------|------------------|-------------…
   eth1               eth1                eth1
 ServerB             ServerC            ServerD
   eth0               eth0               eth0
     |                  |                  |
     |                  |                  …
  ClientX network     ClientY network

服务器A上的路由:

 route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.255.1
 route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.255.2
 route add -net 192.168.N.0 netmask 255.255.255.0 gw 192.168.255.N

在ServerB上转发:

 sysctl -w net.ipv4.ip_forward=1

所有网络参与者之间的 Ping 操作均可以在没有 iptables 的情况下进行。

答案1

您的192.168.0.0/16( 192.168.0.0 - 255.255) 包含192.168.1.0/24( 192.168.1.0-255)。因此,您无法从 ServerA 经由 ServerB 路由到 ClientX。

我们保留尽可能多的变量并仅修改必要的变量:

保持:

  • ClientX 配置原样。
  • ServerBeth0保持原样。
  • 服务器A的IP地址192.168.255.254Bcast=192.168.255.255

改变:

  • ServerA 网络掩码为255.255.255.0
  • 服务器B eth1

    auto eth1
    iface eth1 inet static
    address 192.168.255.253
    netmask 255.255.255.0
    broadcast 192.168.255.255
    

当然,您可以在 ServerA 和 ServerB 之间使用更宽的网络掩码,只要它不与 重叠即可192.168.1.0/24;即/17netmask 255.255.128.0192.168.128.0 - 192.168.255.255可能的最宽范围。

这只是针对确切问题的一个快速解决方案,请自我介绍一下跨域路由


现在,基于评论。假设您有许多服务器,并且希望将每个服务器用作从其自己的子网到的路由器192.168.255.0/24,ServerA 为192.168.255.254。您可以在配置中使用一个简单的模式,其中192.168.255.254/24作为服务器之间的网络,另一个是客户端-服务器网络。

           eth0            eth1
ServerB    192.168.1.253   192.168.255.1
ServerC    192.168.2.253   192.168.255.2
ServerD    192.168.3.253   192.168.255.3
...
Server<N>  192.168.N.253   192.168.255.N

假设eth0作为该特定服务器后面的客户端的默认网关,则每个客户端都能够通过中间服务器连接到 ServerA。但是,ServerA 通过0.0.0.0其自己的默认网关(我们不知道)具有默认路由。这包括除其自己的子网之外的所有内容。您需要为每个子网添加一条路由,即

route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.255.1
route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.255.2
route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.255.3
...
route add -net 192.168.N.0 netmask 255.255.255.0 gw 192.168.255.N

您可以通过 ServerA 使其持久化/etc/network/interfaces,例如

auto eth0
iface eth0 inet static
    address 192.168.255.254
    netmask 255.255.255.0
    broadcast 192.168.255.255
    up route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.255.1
    up route add -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.255.2
    up route add -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.255.3
    down route del -net 192.168.1.0 netmask 255.255.255.0 gw 192.168.255.1
    down route del -net 192.168.2.0 netmask 255.255.255.0 gw 192.168.255.2
    down route del -net 192.168.3.0 netmask 255.255.255.0 gw 192.168.255.3

答案2

我无法评论 Linux 设置(我对 Linux 一无所知)但如果我是你,我会看看你使用的 IP 寻址方案。

ServerA 位于 192.168.0.0/16 网络上,它正尝试访问另一个子网上的客户端 1,其 IP 地址为 192.168.1.252/24。

问题是,ServerA 在确定 Client1 是否与其位于同一子网时将使用其子网掩码。如果它认为 Client1 位于同一子网,则 ServerA 将尝试直接与 CLient1 通信,而不是将流量发送到路由器。

使用问题中的 IP 寻址方案。ServerA 将视其网络为 192.168.0.0/16,而使用其自己的子网掩码将认为 Client1 也在 192.168.0.0/16 网络上。

在 Linux 中完成所有需要做的事情来启用路由,然后尝试将客户端的网络 ID 更改为不同的网络地址:

172.16.0.0/16 或 10.0.0.0/8

或者任何以 192.168 开头的

或者,你可以将服务器 A 所在网络的网络 ID 更改为 192.168.0.0/24,这样也可以,

答案3

默认情况下,路由未激活。要在 Linux 上激活路由,您必须添加此行:net.ipv4.ip_forward = 1

在此文件中:/etc/sysctl.conf

如果您想测试,可以使用以下命令激活路由:sysctl -w net.ipv4.ip_forward=1

答案4

您无法从服务器 ping 到客户端,因为您仅允许以这种方式建立 RELATED 和 ESTABLISHED 连接。

iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT

当你以另一种方式 ping 时,它会起作用,因为你对此有不同的规则:

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

相关内容