以太网:
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 配置原样。
- ServerB
eth0
保持原样。 - 服务器A的IP地址
192.168.255.254
和Bcast=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
;即/17
即netmask 255.255.128.0
是192.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