ip rule,ip route,iptables 三者之间的关系

文章讲述了如何在公司内网环境中,通过设置默认路由、创建特定路由表、定义iprule规则和使用iptables标记数据包,实现192.168.0.100以内IP地址通过10.0.0.1网关(电信)上网,而其他IP地址则通过20.0.0.1(网通)网关上网。这个过程利用了Linux的网络路由和过滤规则,确保数据包通过正确的出口。

以一例子来说明:公司内网要求192.168.0.100 以内的使用 10.0.0.1 网关上网 (电信),其他IP使用 20.0.0.1 (网通)上网。

  1. 首先要在网关服务器上添加一个默认路由,当然这个指向是绝大多数的IP的出口网关:ip route add default gw 20.0.0.1
  2. 之后通过 ip route 添加一个路由表:ip route add table 3 via 10.0.0.1 dev ethX (ethx 是 10.0.0.1 所在的网卡, 3 是路由表的编号)
  3. 之后添加 ip rule 规则:ip rule add fwmark 3 table 3 (fwmark 3 是标记,table 3 是路由表3 上边。 意思就是凡事标记了 3 的数据使用 table3 路由表)
  4. 之后使用 iptables 给相应的数据打上标记:iptables -A PREROUTING -t mangle -i eth0 -s 192.168.0.1 - 192.168.0.100 -j MARK --set-mark 3

因为 mangle 的处理是优先于 nat 和 fiter 表的,所以在数据包到达之后先打上标记,之后再通过 ip rule 规则,对应的数据包使用相应的路由表进行路由,最后读取路由表信息,将数据包送出网关。

原文链接:新浪博客

Linux 网络配置中,`ip rule` 和 `ip route` 是两个非常重要的命令,它们分别用于管理 **路由策略规则(Routing Policy Rules)** 和 **路由表(Routing Table)**。它们共同决定了一个数据包如何被路由。 --- ## 一、ip route:路由表管理 `ip route` 命令用于操作内核的 **路由表(Routing Table)**,它决定了数据包从本机出发后,应该通过哪个网关、哪个网络接口发送出去。 ### 常用命令示例: ```bash # 查看主路由表 ip route show table main # 添加默认路由(通过网关 192.168.1.1 发送所有流量) ip route add default via 192.168.1.1 dev eth0 # 添加特定网络的路由(访问 192.168.2.0/24 通过 eth1 接口) ip route add 192.168.2.0/24 via 192.168.1.2 dev eth0 # 删除路由 ip route del default via 192.168.1.1 ``` ### 路由表的组成: - **目的网络地址(Destination)** - **下一跳地址(Gateway)** - **输出接口(Device)** - **路由类型(unicast、blackhole、unreachable 等)** --- ## 二、ip rule:路由策略规则 `ip rule` 命令用于管理 **路由策略规则数据库(Routing Policy Database, RPDB)**。它决定了数据包在路由时,应该查找哪张路由表。 Linux 支持多张路由表,每张表可以有不同的路由规则。`ip rule` 就是用来决定“在什么条件下使用哪张路由表”。 ### 查看规则: ```bash ip rule show ``` ### 默认规则示例: ``` 0: from all lookup local 32766: from all lookup main 32767: from all lookup default ``` - `local` 表:用于本地地址、广播地址等。 - `main` 表:主路由表,对应 `ip route show` 显示的内容。 - `default` 表:默认路由表,通常为空。 ### 添加自定义规则: ```bash # 添加一条规则:来自 192.168.1.100 的流量查找表 100 ip rule add from 192.168.1.100 table 100 # 添加规则:匹配某个 mark 的流量使用特定路由表 ip rule add fwmark 0x1 table 200 ``` ### 自定义路由表: 你需要先定义自定义路由表,通常在 `/etc/iproute2/rt_tables` 中添加: ```bash echo "100 mytable" >> /etc/iproute2/rt_tables ``` 然后可以为这张表添加路由: ```bash ip route add default via 192.168.2.1 dev eth1 table mytable ``` --- ## 三、ip ruleip route 的协作流程 当一个数据包需要路由时,流程如下: 1. 根据数据包的属性(源地址、fwmark、目标地址等)匹配 `ip rule` 中的规则。 2. 找到匹配的规则后,查找对应的路由表(如 main、local、mytable)。 3. 在路由表中查找匹配的路由条目(如默认路由或特定网络路由)。 4. 最终决定数据包的下一跳和出接口。 --- ## 四、典型应用场景 ### 1. 多出口网络(策略路由) ```bash # 定义两张表 echo "100 isp1" >> /etc/iproute2/rt_tables echo "200 isp2" >> /etc/iproute2/rt_tables # 为每张表添加默认路由 ip route add default via 192.168.1.1 dev eth0 table isp1 ip route add default via 192.168.2.1 dev eth1 table isp2 # 添加规则:根据源地址选择路由表 ip rule add from 192.168.1.100 table isp1 ip rule add from 192.168.2.100 table isp2 ``` ### 2. 基于 fwmark 的策略路由(常用于透明代理) ```bash # 给特定流量打上 mark(例如通过 iptablesiptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1 # 添加规则:匹配 mark 1 的流量使用路由表 100 ip rule add fwmark 1 table 100 # 为路由表添加路由 ip route add default via 192.168.1.254 dev eth0 table 100 ``` --- ## 五、总结对比 | 特性 | `ip route` | `ip rule` | |------------------|-------------------------------------|--------------------------------------------| | 功能 | 定义路由表 | 定义路由策略(决定使用哪张路由表) | | 示例命令 | `ip route add default via 192.168.1.1` | `ip rule add from 192.168.1.100 table 100` | | 默认表 | main, local, default | 0(local)、32766(main)、32767(default)| | 应用场景 | 默认路由、静态路由 | 多出口、策略路由、透明代理、QoS 等 | --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值