路由表是存储在网络设备(包括计算机)中的一张表,用于决定数据包如何转发。路由表包含以下关键信息:
route [选项] [命令] [参数]
| 选项/命令 | 说明 |
|---|---|
| -n | 以数字形式显示地址(不进行DNS解析) |
| -v | 详细模式,显示更多信息 |
| -e | 以netstat格式显示路由表 |
| -C | 显示路由缓存 |
| -F | 显示内核FIB路由表(转发信息库) |
| add | 添加路由条目 |
| del | 删除路由条目 |
| show | 显示路由表(默认) |
| flush | 清除所有路由表 |
| -h | 显示帮助信息 |
| -V | 显示版本信息 |
| 标志 | 含义 | 说明 |
|---|---|---|
| U (Up) | 路由可用 | 该路由条目是活动的 |
| G (Gateway) | 网关路由 | 需要经过网关转发 |
| H (Host) | 主机路由 | 目标是一个主机而不是网络 |
| R (Reinstate) | 恢复路由 | 动态路由恢复的标志 |
| D (Dynamic) | 动态路由 | 通过路由守护进程动态学习 |
| M (Modified) | 修改路由 | 由路由守护进程或ICMP重定向修改 |
| A (Installed by addrconf) | 地址配置 | 由IPv6地址配置安装 |
| C (Cache entry) | 缓存条目 | 路由缓存条目 |
| ! (Reject route) | 拒绝路由 | 丢弃匹配的数据包 |
# 显示完整的路由表
route
# 以数字形式显示(不解析主机名)
route -n
# 以netstat格式显示
route -e
# 显示详细路由信息
route -v
# route -n 输出示例:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
# 添加默认网关(需要root权限)
sudo route add default gw 192.168.1.1
# 指定网关和网络接口
sudo route add default gw 192.168.1.1 eth0
# 添加网络路由
sudo route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.1
# 添加主机路由(到特定主机的路由)
sudo route add -host 203.0.113.5 gw 192.168.1.1
# 添加网络路由并指定度量值(优先级)
sudo route add -net 172.16.0.0/16 gw 192.168.1.1 metric 100
# 删除默认网关
sudo route del default
# 删除特定网络路由
sudo route del -net 10.0.0.0 netmask 255.0.0.0
# 删除主机路由
sudo route del -host 203.0.113.5
# 删除指定网关的路由
sudo route del default gw 192.168.1.1
# 清除所有路由表(危险!)
sudo route flush
route flush会删除所有路由,可能导致网络连接中断!仅在了解后果的情况下使用。
# 添加拒绝路由(丢弃到特定网络的数据包)
sudo route add -net 192.168.2.0 netmask 255.255.255.0 reject
# 添加黑洞路由(静默丢弃数据包)
sudo route add -net 192.168.3.0 netmask 255.255.255.0 blackhole
# 添加本地网络路由
sudo route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0
# 添加多路径路由
sudo route add default scope global nexthop via 192.168.1.1 dev eth0 weight 1 \
nexthop via 192.168.2.1 dev eth1 weight 2
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 eth0
| 字段 | 说明 | 示例 |
|---|---|---|
| Destination | 目标网络或主机 | 0.0.0.0(默认路由) |
| Gateway | 网关地址(0.0.0.0表示直连) | 192.168.1.1 |
| Genmask | 网络掩码 | 255.255.255.0 |
| Flags | 路由标志(U=可用,G=网关等) | UG(可用网关路由) |
| Metric | 路由度量值(越小优先级越高) | 100 |
| Ref | 路由引用计数 | 0 |
| Use | 路由查找次数 | 0 |
| Iface | 网络接口 | eth0 |
#!/bin/bash
# multi_nic_routing.sh
# eth0: 192.168.1.100/24,用于管理流量
# eth1: 10.0.0.100/24,用于业务流量
# 添加默认网关(管理网络)
sudo route add default gw 192.168.1.1 eth0
# 添加特定业务网络路由
sudo route add -net 10.0.0.0 netmask 255.255.255.0 dev eth1
# 添加数据中心路由(通过业务网络)
sudo route add -net 172.16.0.0/12 gw 10.0.0.1 eth1
# 查看路由表
echo "=== 当前路由表 ==="
route -n
# 测试路由策略
echo ""
echo "=== 路由策略测试 ==="
echo "到互联网的流量走 eth0 (192.168.1.1)"
echo "到数据中心的流量走 eth1 (10.0.0.1)"
#!/bin/bash
# vpn_routing.sh
VPN_GATEWAY="10.8.0.1"
VPN_INTERFACE="tun0"
LOCAL_GATEWAY="192.168.1.1"
echo "配置VPN路由..."
# 添加默认路由到VPN(将所有流量通过VPN)
# sudo route add default gw $VPN_GATEWAY $VPN_INTERFACE
# 更常见的:只将特定流量通过VPN(分流路由)
# 保留本地网络的直接路由
sudo route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0
# 添加公司内网路由通过VPN
sudo route add -net 10.0.0.0 netmask 255.255.0.0 gw $VPN_GATEWAY $VPN_INTERFACE
sudo route add -net 172.16.0.0 netmask 255.240.0.0 gw $VPN_GATEWAY $VPN_INTERFACE
# 其他所有流量走本地网关
sudo route add default gw $LOCAL_GATEWAY eth0
echo "路由配置完成:"
echo "- 本地网络 (192.168.1.0/24): 直连"
echo "- 公司内网 (10.0.0.0/16, 172.16.0.0/12): 通过VPN"
echo "- 其他流量: 通过本地网关"
#!/bin/bash
# security_routing.sh
echo "配置安全路由策略..."
# 1. 阻止到恶意IP的访问
sudo route add -host 203.0.113.100 reject
sudo route add -net 192.0.2.0 netmask 255.255.255.0 blackhole
# 2. 限制特定网络只能通过指定网关
sudo route add -net 10.10.0.0 netmask 255.255.0.0 gw 192.168.1.254 eth0
# 3. 配置多路径路由(负载均衡和冗余)
# sudo ip route add default scope global \
# nexthop via 192.168.1.1 dev eth0 weight 1 \
# nexthop via 192.168.2.1 dev eth1 weight 1
# 4. 添加监控路由
echo "添加路由监控..."
while true; do
# 检查默认路由是否存在
if ! route -n | grep -q "^0\.0\.0\.0"; then
echo "警告:默认路由丢失!尝试恢复..."
sudo route add default gw 192.168.1.1 eth0
fi
sleep 60
done
-n选项避免DNS解析延迟ip route取代# 在 /etc/sysconfig/network-scripts/route-eth0 中添加:
# 格式1:网络/掩码 via 网关
192.168.2.0/24 via 192.168.1.254
10.0.0.0/8 via 192.168.1.254
# 格式2:网络/掩码 dev 接口
172.16.0.0/16 dev eth1
# 重启网络服务
sudo systemctl restart network
# 编辑 /etc/netplan/01-netcfg.yaml
network:
version: 2
ethernets:
eth0:
addresses: [192.168.1.100/24]
routes:
- to: 10.0.0.0/8
via: 192.168.1.254
- to: 172.16.0.0/12
via: 192.168.1.254
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
# 应用配置
sudo netplan apply
# 创建 /etc/systemd/network/10-static-route.network
[Match]
Name=eth0
[Route]
Gateway=192.168.1.254
Destination=10.0.0.0/8
[Route]
Gateway=192.168.1.254
Destination=172.16.0.0/12
# 重启服务
sudo systemctl restart systemd-networkd
A: 主要区别:
| 特性 | route命令 | ip route命令 |
|---|---|---|
| 出现时间 | 传统工具,来自net-tools | 现代工具,来自iproute2 |
| 功能范围 | 基本路由管理 | 完整路由功能,包括策略路由 |
| 输出格式 | 固定格式,可读性好 | 更灵活,信息更详细 |
| IPv6支持 | 有限 | 完全支持 |
| 推荐程度 | 逐步淘汰 | 现代Linux系统推荐 |
A: 根据发行版选择合适的方法:
# Debian/Ubuntu (旧版) - /etc/network/interfaces
up route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254
# 通用方法 - /etc/rc.local
route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254
# 使用cron定时任务(@reboot)
@reboot root /sbin/route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.1.254
A: 度量值决定路由的优先级,当有多条路由到达同一目标时:
# 添加低优先级路由(高度量值)
sudo route add -net 10.0.0.0/8 gw 192.168.1.254 metric 200
# 添加高优先级路由(低度量值)
sudo route add -net 172.16.0.0/12 gw 192.168.1.254 metric 50
A: 这个错误通常表示网关不可达,解决方法:
ping 网关IP测试连通性现代Linux推荐使用ip route命令代替route命令:
# 查看路由表
ip route show
# 添加默认网关
sudo ip route add default via 192.168.1.1 dev eth0
# 添加网络路由
sudo ip route add 10.0.0.0/8 via 192.168.1.254 dev eth0
# 添加主机路由
sudo ip route add 203.0.113.5/32 via 192.168.1.254 dev eth0
# 删除路由
sudo ip route del 10.0.0.0/8
# 添加多路径路由
sudo ip route add default \
nexthop via 192.168.1.1 weight 1 \
nexthop via 192.168.2.1 weight 1
# 清空路由表
sudo ip route flush all
ip route命令功能更强大,支持更多高级功能如策略路由、多路径路由、路由表管理等。