Skip to content

天楚锐齿

人工智能 云计算 大数据 物联网 IT 通信 嵌入式

天楚锐齿

  • 下载
  • 物联网
  • 云计算
  • 大数据
  • 人工智能
  • Linux&Android
  • 网络
  • 通信
  • 嵌入式
  • 杂七杂八

Linux策略路由及iptables mangle、ip rule、ip route关系及一种Network is unreachable错误

2020-02-11
iptables、ip rule、ip route关系,一个包到达网络协议层,首先会被iptables的managle表打上标记(当然也可以不打),然后给ip rule匹配,找到对应的路由表,最后根据ip route table的路由表找到对应出口接口。
如果ip rule规则不对,则很可能出现ping网关(这种情况下ping同子网,跟路由没关系)的时候直接报错:
# ping 192.168.1.1
connect: Network is unreachable
而指定接口再ping 的时候就能通:
# ping -I wlan0 192.168.1.1
PING 10.193.20.64 (10.193.20.64) from 10.193.20.83 eth5: 56(84) bytes of data.
64 bytes from 10.193.20.64: icmp_seq=1 ttl=64 time=0.345 ms
64 bytes from 10.193.20.64: icmp_seq=2 ttl=64 time=0.354 ms

看看iptable内容(iptables各过滤表的优先级为managle -> nat -> filter):

使用Netfilter的managle机制针对特定的数据包设置MARK值(长度为32bit),下面例子将HTTP(端口80)数据包的MARK值设置为1,SMTP及POP3数据包(端口25和110)的MARK值设置为2,其余数据包则设置MARK值为3。
iptables -t mangle -A FORWARD -i eth3 -p tcp –dport 80 -j MARK –set-mark 1
iptables -t mangle -A FORWARD -i eth3 -p tcp –dport 25 -j MARK –set-mark 2
iptables -t mangle -A FORWARD -i eth3 -p tcp –dport 110 -j MARK –set-mark 2
iptables -t mangle -A FORWARD -i eth3 -j MARK –set-mark 3
下面的表是个实际中的表,上面的配置没有体现。
# iptables -t mangle –list
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
PREROUTING_direct  all  —  anywhere             anywhere
PREROUTING_ZONES_SOURCE  all  —  anywhere             anywhere
PREROUTING_ZONES  all  —  anywhere             anywhere
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
INPUT_direct  all  —  anywhere             anywhere
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
FORWARD_direct  all  —  anywhere             anywhere
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
OUTPUT_direct  all  —  anywhere             anywhere
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
POSTROUTING_direct  all  —  anywhere             anywhere
Chain FORWARD_direct (1 references)
target     prot opt source               destination
Chain INPUT_direct (1 references)
target     prot opt source               destination
Chain OUTPUT_direct (1 references)
target     prot opt source               destination
Chain POSTROUTING_direct (1 references)
target     prot opt source               destination
Chain PREROUTING_ZONES (1 references)
target     prot opt source               destination
PRE_public  all  —  anywhere             anywhere            [goto]
Chain PREROUTING_ZONES_SOURCE (1 references)
target     prot opt source               destination
Chain PREROUTING_direct (1 references)
target     prot opt source               destination
Chain PRE_public (1 references)
target     prot opt source               destination
PRE_public_log  all  —  anywhere             anywhere
PRE_public_deny  all  —  anywhere             anywhere
PRE_public_allow  all  —  anywhere             anywhere
Chain PRE_public_allow (1 references)
target     prot opt source               destination
MARK       tcp  —  anywhere             anywhere             tcp dpt:biimenu MARK set 0x64   打标记为0x64
MARK       tcp  —  anywhere             anywhere             tcp dpt:http MARK set 0x65          打标记为0x65
Chain PRE_public_deny (1 references)
target     prot opt source               destination
Chain PRE_public_log (1 references)
target     prot opt source               destination
# iptables -t filter –list
略

再看ip route内容:

Linux 最多可以支持 255 张路由表,在默认情况下,系统有三个路由表,这三个路由表的功能如下:
local路由表(id为255):路由表local包含本机路由及广播信息。例如,在本机上执行ssh 127.0.0.1时,就会参考这份路由表的内容,在正常情况下,只要配置好网卡的网络设置,就会自动生成local路由表的内容,我们应该也不必修改其内容。
main路由表(id为254):使用传统命令route -n所看到的路由表就是main的内容。Linux系统在默认情况下使用这份路由表的内容来传输数据包,因此,其内容极为重要,在正常情况下,只要配置好网卡的网络设置,就会自动生成main路由表的内容。
default路由表(id为253):最后是default路由表,这个路由表在默认情况下内容为空;除非有特别的要求,否则保持其内容为空即可。
另外有个id为 0 的unspec表保留无作用。
如果有需要,则可以自行再添加其他路由表。
# cat /etc/iproute2/rt_tables
255     local
254     main
253     default
0       unspec
#
# ip route show table main
192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.150
#
# ip route show table default
#
# ip route show table local
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 192.168.1.0 dev wlan0 proto kernel scope link src 192.168.1.150
local 192.168.1.150 dev wlan0 proto kernel scope host src 192.168.1.150
broadcast 192.168.1.255 dev wlan0 proto kernel scope link src 192.168.1.150
#
# ip route show table wlan0
default via 192.168.1.1 dev wlan0 proto static
192.168.1.0/24 dev wlan0 proto static scope link

再看ip rule内容(前面数字为优先级,值越小的越优先匹配):

# ip rule list
0:      from all lookup local            这个表示是优先匹配local路由表,对应ip route show table local的local路由表。
10000:  from all fwmark 0xc0000/0xd0000 lookup legacy_system     这里表示iptables的mark标记为0xc0000(0xd0000为掩码,进来的包先和xd0000做AND与计算,结果为0xc0000的包)的查找legacy_system路由表。
10500:  from all iif lo oif wlan0 uidrange 0-0 lookup wlan0  这里表示从lo环回接口输入、从wlan0接口输出、uid为0(即系统用户)的包查找wlan0路由表。
13000:  from all fwmark 0x10063/0x1ffff iif lo lookup local_network
13000:  from all fwmark 0x10065/0x1ffff iif lo lookup wlan0
14000:  from all iif lo oif wlan0 lookup wlan0
15000:  from all fwmark 0x0/0x10000 lookup legacy_system
16000:  from all fwmark 0x0/0x10000 lookup legacy_network
17000:  from all fwmark 0x0/0x10000 lookup local_network
19000:  from all fwmark 0x65/0x1ffff iif lo lookup wlan0 这里表示iptables的mark标记为0x65(0x1ffff为掩码,进来的包先和0x1ffff做AND与计算,结果为0x65的包)、输入接口为lo环回地址的包查找wlan0路由表,对应上面的ip route show table wlan0的wlan0路由表。
22000:  from all fwmark 0x0/0xffff iif lo lookup wlan0    这里表示iptables的mark标记为0x0(0xffff为掩码,进来的包先和0xffff做AND与计算,结果为0x0的包)、输入接口为lo环回地址的包查找wlan0路由表,对应上面的ip route show table wlan0的wlan0路由表。
32000:  from all unreachable
上面这个ip rule list里面没有default和main是不对的,一般都会有的。
每行各部分的解释(具体查看ip rule命令help):
    xx: 第一列数字是优先级,小的数字优先级高
    中间部分内容:如 from all, 这是规则。
    fwmark 0x10064: 其中0x64(十进制为100)就是该网络的netid
    lookup [xxx] : 表示搜索xxx路由表,1-252之间的数字或名称
整行的意思就是,如果一个数据包符合规则(源地址、目的地址、协议、端口、数据包大小、内容等),则使用指定路由表。
比如要添加几条:
# ip rule add from all lookup main prio 23000
# ip rule add from all lookup default prio 32000

CentOS 7.x下让ip route路由和ip rule永久生效,重启不丢失:

假定要给eth1(假定接口地址为 192.168.100.140)增加rule和路由表:
# vi /etc/iproute2/rt_tables
255     local
254     main
253     default
0       unspec
128     mynet
# vi /etc/sysconfig/network-scripts/rule-eth1
from 192.168.100.0/24 lookup mynet
from 192.168.101.0/24 lookup mynet    假定192.168.101.0/24这个网段的包也走路由表mynet,则需要加这一条。
# vi /etc/sysconfig/network-scripts/route-eth1
192.168.100.0/24 dev eth1 table mynet              这个相当于是scope link类型的路由,和接口地址在同一网段。
default via 192.168.100.1 dev eth1 table mynet
8,023次阅读

Post navigation

前一篇:

Android9源码输出linux内核pr_debug调试信息

后一篇:

android9下增加对eth0以太网IP地址的配置(以及如何修改并编译SDK)

1条评论

  1. linux爱好者说道:
    2023-05-23 12:07

    10500: from all iif lo oif wlan0 uidrange 0-0 lookup wlan0 这里表示从lo环回接口输入、从wlan0接口输出、uid为0(即系统用户)的包查找wlan0路由表
    从lo环回接口输入、从wlan0接口输出,这一块我不太明白,答主可以详细讲一下这个吗?

    登录以回复

回复 linux爱好者 取消回复

要发表评论,您必须先登录。

个人介绍

需要么,有事情这里找联系方式:关于天楚锐齿

=== 美女同欣赏,好酒共品尝 ===

微信扫描二维码赞赏该文章:

扫描二维码分享该文章:

分类

  • Linux&Android (81)
  • Uncategorized (1)
  • 下载 (28)
  • 云计算 (38)
  • 人工智能 (9)
  • 大数据 (35)
  • 嵌入式 (34)
  • 杂七杂八 (35)
  • 物联网 (65)
  • 网络 (25)
  • 通信 (22)

归档

近期文章

  • 飞书机器人发送卡片interactive消息
  • Springboot JPA实现对数据库表统一的增删改查
  • WEB的内容安全策略CSP(Content-Security-Policy)
  • CSS利用@media和viewport实现响应式布局自动适配手机电脑等
  • VUE前端增加国际化支持

近期评论

  • linux爱好者 发表在《Linux策略路由及iptables mangle、ip rule、ip route关系及一种Network is unreachable错误》
  • maxshu 发表在《使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序》
  • Ambition 发表在《使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序》
  • Ambition 发表在《使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序》
  • maxshu 发表在《Android9下用ethernet 的Tether模式来做路由器功能》

阅读量

  • 使用Android的HIDL+AIDL方式编写从HAL层到APP层的程序 - 23,636次阅读
  • 卸载深信服Ingress、SecurityDesktop客户端 - 18,320次阅读
  • 车机技术之车规级Linux-Automotive Grade Linux(AGL) - 10,435次阅读
  • linux下的unbound DNS服务器设置详解 - 9,141次阅读
  • 在Android9下用ndk编译vSomeIP和CommonAPI以及使用例子 - 9,014次阅读
  • linux的tee命令导致ssh客户端下的shell卡住不动 - 8,518次阅读
  • 车机技术之360°全景影像(环视)系统 - 8,027次阅读
  • Linux策略路由及iptables mangle、ip rule、ip route关系及一种Network is unreachable错误 - 8,023次阅读
  • 车机技术之Android Automotive - 7,887次阅读
  • Windows下安装QEMU并在qemu上安装ubuntu和debian - 7,761次阅读

其他操作

  • 注册
  • 登录
  • 条目 feed
  • 评论 feed
  • WordPress.org

联系方式

地址
深圳市科技园

时间
周一至周五:  9:00~12:00,14:00~18:00
周六和周日:10:00~12:00

标签

android AT命令 CAN centos docker Hadoop hdfs ip java kickstart linux mapreduce mini6410 modem nova OAuth openstack os python socket ssh uboot 内核 协议 安装 嵌入式 性能 报表 授权 操作系统 数据 数据库 月报 模型 汽车 深信服 源代码 统计 编译 脚本 虚拟机 调制解调器 车机 金融 鉴权
© 2025 天楚锐齿