在 Linux 系统中,实现不同网段(子网)之间的互访,核心在于路由配置,当两台主机不在同一个二层网络(即不在同一个子网)时,数据包必须通过网关(Gateway)或路由器进行转发。
以下是实现 Linux 网段互访的完整指南,涵盖场景、配置方法和常见问题排查。
核心原理
- 同网段互访:通过 ARP 协议解析 MAC 地址,直接二层通信。
- 跨网段互访:
- 源主机检查目标 IP 是否在同一网段。
- 如果不在,源主机会将数据包发送给默认网关或特定路由表中的下一跳。
- 网关/路由器根据路由表将数据包转发到目标网段。
常见场景与配置方法
场景 1:临时测试(使用 ip route 命令)
适用于临时添加路由,重启后失效。
假设:
- 本机 IP:
168.1.10/24 - 目标网段:
0.0.0/24 - 网关 IP:
168.1.1
添加路由:
# 语法:ip route add <目标网段> via <网关IP> dev <网卡名> sudo ip route add 10.0.0.0/24 via 192.168.1.1 dev eth0
删除路由:
sudo ip route del 10.0.0.0/24
查看路由表:
ip route show # 或 route -n
场景 2:永久配置(推荐)
永久配置需根据 Linux 发行版选择不同方法。
✅ 方法 A:使用 Netplan(Ubuntu 18.04+ / Debian 11+)
- 编辑 Netplan 配置文件(通常在
/etc/netplan/目录下,如01-netcfg.yaml或50-cloud-init.yaml):
network:
version: 2
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.1.10/24
routes:
- to: 10.0.0.0/24
via: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 114.114.114.114
- 应用配置:
sudo netplan apply
✅ 方法 B:使用 NetworkManager(CentOS/RHEL 8+ / Fedora / Ubuntu 桌面版)
使用 nmcli 工具:
# 添加静态路由到指定连接(假设连接名为 eth0) sudo nmcli connection modify eth0 +ipv4.routes "10.0.0.0/24 192.168.1.1" sudo nmcli connection up eth0
✅ 方法 C:使用 /etc/network/interfaces(Debian/Ubuntu 传统方式)
编辑 /etc/network/interfaces:
auto eth0
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
# 添加静态路由
up route add -net 10.0.0.0 netmask 255.255.0.0 gw 192.168.1.1
down route del -net 10.0.0.0 netmask 255.255.0.0 gw 192.168.1.1
重启网络服务:
sudo systemctl restart networking
✅ 方法 D:使用 systemd-networkd(Arch Linux / 部分服务器)
编辑 /etc/systemd/network/10-eth0.network:
[Network] Address=192.168.1.10/24 Gateway=192.168.1.1 [Route] Destination=10.0.0.0/24 Gateway=192.168.1.1
重启服务:
sudo systemctl restart systemd-networkd
场景 3:多网卡/复杂路由(策略路由)
Linux 主机有多个网卡,且需要基于源 IP 或目标 IP 选择不同的网关,需使用 策略路由。
从 eth1 发出的流量走网关 168.2.1,从 eth0 发出的流量走网关 168.1.1。
-
创建自定义路由表(如
table10):echo "10 custom_table" | sudo tee -a /etc/iproute2/rt_tables
-
添加规则:
# 从 eth1 发出的流量使用 table10 sudo ip rule add from 192.168.2.0/24 table 10 # 在 table10 中添加默认网关 sudo ip route add default via 192.168.2.1 dev eth1 table 10
防火墙与安全组检查
即使路由正确,防火墙也可能阻止跨网段通信。
检查 iptables/nftables
# 查看当前规则 sudo iptables -L -n -v # 临时允许所有流量(仅用于测试) sudo iptables -P INPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -P OUTPUT ACCEPT
检查 firewalld(CentOS/RHEL)
sudo firewall-cmd --list-all # 临时关闭测试 sudo systemctl stop firewalld
检查 ufw(Ubuntu)
sudo ufw status # 临时关闭测试 sudo ufw disable
云环境安全组
- 如果是云服务器(AWS、简米云、酷番云等),还需检查安全组或网络 ACL 是否允许相应端口和 IP 段访问。
常见问题排查步骤
-
Ping 测试
ping <目标IP>
ping不通,但arp -a能看到网关 MAC,说明路由问题。arp -a看不到网关,说明二层不通或网关未响应 ARP。
-
追踪路由
traceroute <目标IP> # 或 mtr <目标IP>
查看数据包在哪一跳丢失。
-
检查路由表
ip route show
确保目标网段有对应的路由条目。
-
检查网关是否可达
ping <网关IP>
-
检查目标主机防火墙
确保目标主机允许来自源网段的 ICMP 或特定端口访问。
| 步骤 | 操作 |
|---|---|
| 1 | 确认本机 IP 和子网掩码 |
| 2 | 确认目标网段和网关 IP |
| 3 | 添加静态路由(ip route add 或配置文件) |
| 4 | 检查本机防火墙(iptables/firewalld/ufw) |
| 5 | 检查目标主机防火墙和安全组 |
| 6 | 使用 ping 和 traceroute 验证 |
⚠️ 注意:在生产环境中,建议使用永久配置文件(如 Netplan、NetworkManager)来管理路由,避免重启后失效,务必确保防火墙规则允许跨网段通信。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/476288.html



