Linux不同网段网络通信

问题

有两台机子,各自设置了静态 IP:

  • A 机:ifconfig eth0 192.168.32.10 netmask 255.255.254.0
  • B 机:ifconfig eth0 192.168.1.15 netmask 255.255.254.0

A 机 Ping B 机时,显示异常:

1
2
3
[root@test]# ping 192.168.1.15
PING 192.168.1.15 (192.168.1.15): 56 data bytes
ping: sendto: Network is unreachable

需要在不改变 AB 机 IP 的情况下,让网络互通。

说明

子网掩码是一个32位的2进制数,常见格式为255.255.255.255(即FF.FF.FF.FF)。子网掩码由1和0组成,且1和0分别连续。 其对应网络地址的所有位都置为1,对应于主机地址的所有位置都为0。用于告知路由器,地址的哪一部分是网络地址,哪一部分是主机地址,使路由器正确判断任意IP地址是否是本网段)的,从而正确地进行路由。

注意:只有网络标识相同的两台主机在无路由的情况下才能相互通信。

通过子网掩码判断两台设备是否属于同一网段的方法是,将IP地址和子网掩码转换为二进制,然后进行二进制“与”计算,如果得出的结果是相同的,那么这两台计算机就属于同一网段。

比如:

1
2
3
4
5
6
#子网掩码:255.255.254.0
#设备1地址:192.168.0.55
#设备2地址:192.168.1.45

可知:
设备1网段192.168.0,设备2网段192.168.0

使用子网掩码划分子网后,子网内可以通信,跨子网不能通信,子网间通信应该使用路由器,并正确配置静态路由信息。

解决方法

  1. 设置掩码为255.255.192.0,从而在二层打通 192.168.0.0 - 192.168.63.255 ,两个设备间可以走二层直接交付

    1
    2
    3
    4
    # A机
    ifconfig eth0 192.168.32.10 netmask 255.255.192.0
    # B机
    ifconfig eth0 192.168.1.15 netmask 255.255.192.0
  2. 设置静态路由:

    由于掩码是 23 位,A 机所在局域网 IP 地址范围是 192.168.32.1 ~ 192.168.33.254 (0 和 255 一般不分配给主机),B 机所在局域网 IP 地址范围是 192.168.0.1 ~ 192.168.1.254。所以不是同一个 network ,网络不可达,无法 ping 通,只能在 A 机上添加一条到 B 机 network 的静态路由,并且在 B 机器上添加 A 机器的 static route

    1
    2
    3
    4
    # A机
    ip route add 192.168.0.0/23 dev eth0
    # B机
    ip route add 192.168.32.0/23 dev eth0

参考:请教大佬一个关于网络的问题 - V2EX