首页 > 系统相关 >【Linux网络】ip route 命令

【Linux网络】ip route 命令

时间:2024-03-24 10:11:24浏览次数:25  
标签:ip route 192.168 Linux 数据包 路由 路由表

1.ip route命令

1.1 ip查看已有路由

ip route list          # 列出默认路由表,和下面这句结果相同
ip route show table main

结果(以Ubuntu为例):

zx@ubuntu:~/Desktop/codes/muduo/build/release-cpp11/bin$ ifconfig 
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.133.166  netmask 255.255.255.0  broadcast 192.168.133.255
        inet6 fe80::baae:b89e:d17d:ef20  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:65:ca:56  txqueuelen 1000  (Ethernet)
        RX packets 300943  bytes 379050509 (379.0 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 51169  bytes 6183085 (6.1 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 13722  bytes 1693874 (1.6 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 13722  bytes 1693874 (1.6 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

virbr0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:a6:68:06  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
zx@ubuntu:~/Desktop/codes/muduo/build/release-cpp11/bin$ ip route list 
default via 192.168.133.2 dev ens33 proto dhcp metric 100 
169.254.0.0/16 dev ens33 scope link metric 1000 
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown 
192.168.133.0/24 dev ens33 proto kernel scope link src 192.168.133.166 metric 100

以上路由信息表的意义:

default 第一行:

"default"会在没有找到更具体的路由(数据包目的地地址与路由条目更匹配)时使用。

"via 192.168.133.2"网关的IP地址是192.168.133.2

"proto dhcp"指的是使用dhcp协议分配

第二三四行:

"proto kernel": 说明该条路由是内核在系统网络接口配置阶段添加的,而不是由管理员手动添加或由路由协议动态添加的。

"scope link" 的意思是说该路由直接连接在当前主机上,即处于同一局域网内。

"src" 是指会使用该路由条目的数据包应有的源地址,也就是意味着本机在该局域网内的 IP 地址被设置为了 192.168.122.1。

1.2 路由表记录的格式

<目的地> via <网关> dev <接口> proto <协议> src <源地址> <附加信息>

<目的地>:目的地网络或主机,可以是具体的IP地址、网络地址或default等

via <网关>:可选字段,指的是到达目的地需要使用的网关的IP地址。发往这个路由条目对应的目的地的数据包,都会把这个网关设置为下一跳,经由此发往最终目的地。

dev <接口>: 要发往本条目对应目的地时所需要使用的网络接口(设备);

proto <协议>:添加本条条目的协议。常见的值有:kernel(本条目由内核添加)、static(手动添加)、dhcp(通过DHCP添加)。

src <源地址>:在使用本条路由,向目的地发送数据包时所需采用的IP地址。

<附加信息> 代表多个可选项,常见的有:

  • scope <scope>:定义这条路由的范围。global表示有网关的单播(unicast)路由,link表示直连的单播或广播(broadcast)路由,host表示本地(local)路由。该值可能是一个整数值或者是字符串值,字符串值应该能在/etc/iproute2/rt_scopes中找到
  • metric <整数>:表示路由的优先级,数字越小优先级越高。最小值为 0 ,最大值为 65535
  • table <表名/数字>:如果一条路由不属于 main 表,则会在这里指出该路由所属的路由表

路由记录还可以有个表示路由类型的前缀,该字段能说明路由用途以及特性。类型有下面这些:

1.unicast(单播):标准类型,表示把数据发往一个有特定的目的地IP地址。通常省略不显示

2.unreadchable(不可达):目的地不可达。发往该地址的数据包会被丢弃,ICMP会返回host unreadchable,发送代码会报错EHOSTUNREADCH

3.blackhole(黑洞):目的地不可达,数据包会被无声丢弃(discarded silently),发送代码会报错EINVAL

4.prohabit(禁止):目的地不可达,数据包会被丢弃,ICMP 会返回 communication administratively prohibited。发送代码会报错 EACCES

5.local(本地):目的地时当前主机,数据包会回环发送

6.boardcast(广播):目的地是广播地址,数据包作为链路广播发送,通常是向本地网络广播;

7.nat(网络转换地址):该路由已在 2.6 内核后停止支持。这是个特殊的 NAT 路由。目的地地址是假地址(外部地址),需要在转发前转换为真实(内部)地址;

8.nycast(任播):尚未实现。目的地是本主机的 anycast 地址。和 local 只有一个区别:该地址不能被用于任何数据包的源地址;

10.multicast(多播):用于多播路由的特殊路由。不会在普通的路由表中出现。

1.3 ip route添加新路由

如何向(main)路由表、已有的路由表中添加路由,以及如何创建一个新路由表并添加指向该路由表的规则。

创建新路由需要使用ip route命令:

ip route add [type] [prefix] via [下一跳(网关)] dev [接口名] table [路由表名/ID] src [源地址]

prefix:目的地IP地址,可以是具体IP形式也可以是包含子网掩码的网络地址(192.168.1.0/24)。若prefix设置为default则代表所有地址,等效于0.0.0.0/0

在一号表中添加默认路由为192.168.1.1****:

ip route add default via 192.168.1.1 table 1

在一号表中添加一条道192.168.0.0网段的路由为192.168.1.2:

ip route add 192.168.0.0/24 via 192.168.1.2 table 1 

1.4 向指定路由表添加路由

向指定路由表custom中添加路由:

ip route add default via 192.168.1.100 dev eth1 table custom

该路由会将无法匹配到更精确路由的流量都通过 eth1 网卡发送到网关路由器 192.168.1.100。

可以用下面的命令查看添加后的结果:

ip route show table custom

注意:所有的 RPDB 规则都是在系统启动时加载进内核内存的,因此还需要 flush 缓存。这会强制内核重新加载规则和路由数据库

ip route flush cache

1.5 向默认路由表添加路由

相比custom,只需要省略table即可:

ip route add default via 192.168.1.100 dev eth1

1.6 删除路由

ip route delete <路由信息>

路由信息足够匹配到路由条目即可,最简单的方式就是把整个路由条目全都写上去,比如:

ip route delete default via 192.168.1.100 dev eth1

最后需要flush一下

ip route flush cache

1.7 路由优先级处理

系统会使用数据包的目的地地址和 ToS 值(如果有)来和每个路由条目的 prefix 进行比对,然后选择符合条件最多的一个,对比顺序为:

  1. 目的地地址和路由条目 prefix 的相符程度;
  2. 数据包和路由条目 ToS 的匹配;
  3. 选择 ToS=0 的路由

举例来说,如果数据包匹配到了多个可选路由,则按下面的顺序来选择出一个路由:

  1. 选择包含子网掩码在内的,prefix 匹配长度最长的路由;
  2. 如果有一个路由的 ToS 与数据包的 ToS 相符,则直接使用这个路由;
  3. 选择 ToS=0 的路由;
  4. 如果没有 ToS=0 的路由,返回一个错误(不可达 unreachable);
  5. 若仍有多个 ToS=0 的路由,则选择偏好值(preference value)最大的路由;
  6. 选择最新的路由

1.8 其他几种ip rule的命令示例

Linux系统的路由表序号和表名的对应关系在/etc/iproute2/rt_tables文件中。

1.通过路由表inr.ruhep路由来自源地址192.203.80/24的数据包

ip rule add from 192.203.80/24 table inr.ruhep prio 220

2.把源地址为193.233.7.83的数据报的源地址转换为192.203.80.144,并通过表1进行路由

ip rule add from 193.233.7.83 nat 192.203.80.144 table 1 prio 320

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

iptables:iptables不是真正的防火墙,可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,框架名字叫netfilter。

image

注:图中 “路由判断” 就是使用ip rule,ip route设置的规则,其中ip route配置的路由表服务于ip rule配置的规则。

以一例子来说明:公司内网要求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

参考文章:

https://zhuanlan.zhihu.com/p/673039606

https://man7.org/linux/man-pages/man8/ip-route.8.html

标签:ip,route,192.168,Linux,数据包,路由,路由表
From: https://www.cnblogs.com/Wangzx000/p/18092093

相关文章

  • Linux系统之jq工具的基本使用
    Linux系统之jq工具的基本使用一、jq工具介绍1.jq工具简介2.jq工具的特点二、jq工具的安装1.yum安装jq2.二进制安装jq三、jq命令的使用帮助1.查询jq命令帮助信息2.jq命令的选项解释四、jq命令的基本使用1.显示json文件的所有的key2.显示key对应的值3.查询json......
  • Linux环境下使用Eclipse Paho C 实现(MQTT Client)同步模式发布和订阅Message
    目录概述1同步模式和异步模式1.1同步模式1.2异步模式2下载和安装paho.mqtt.c3同步方式发布和订阅消息功能实现3.1MQTTClient参数配置3.2初始化MQTTClient3.3发布消息功能3.4订阅消息功能3.5解析订阅的信息4编译和测试4.1编译代码4.2运行5验证MQ......
  • 08-JavaScript事件监听
     <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>JS-事件-事件绑定</title></head><body><!--点击按钮,在控制台打印相关信息--><inputtype="button"......
  • `ij_javascript_spaces_within_imports = true` 这个设置表示在 JavaScript 代码的
    #http://editorconfig.orgroot=true[*]#表示所有文件适用charset=utf-8#设置文件字符集为utf-8indent_style=tab#缩进风格(tab|space)indent_size=4#缩进大小end_of_line=lf#控制换行类型(lf|cr|crlf)trim_trailing_whitespace=true#去除......
  • Linux进程查看与杀死进程
    Linux进程查看与杀死进程摘要:在Linux操作系统中,我们经常需要查看当前正在运行的进程,有时也需要结束某个不响应或占用资源过多的进程。本文将详细介绍如何在Linux中使用命令行工具查看和杀死进程。一、进程查看ps命令:ps是"processstatus"的缩写,用于显示系统中的当前进程......
  • C# 压缩文件 GZipStream
    //官方文档:https://learn.microsoft.com/zh-cn/dotnet/api/system.io.compression.gzipstream?view=net-8.0/*GZipStream介绍*此类表示gzip数据格式,该格式使用行业标准算法进行无损文件压缩和解压缩。格式包括用于检测数据损坏的循环冗余检查值。gzip数据格式使用与......
  • 工作中常用到的Linux命令
    系统,用户信息操作相关命令查看主机ip地址ifconfig获取用户信息id修改用户密码passwd查看链接用户who创建新用户账号useradd删除用户账号userdel修改用户账号的属性usermod查看系统发行版本cat/proc/version说明适用于所有版本。示例[root@vps ~]# cat /pro......
  • 一文弄懂Javascript中的深拷贝和浅拷贝
    目录一文弄懂Javascript深拷贝与浅拷贝1Javascript数据存储规则2浅拷贝3部分深拷贝3.1Object.assign3.2slice()3.3concat()3.4拓展运算符4完全深拷贝4.1_.cloneDeep()4.2结构化拷贝4.3json.stringify()4.4循环递归4.5jQuery.extend()5总结一文弄懂J......
  • 【Linux】详谈命令行参数&&环境变量
    目录一、浅谈命令行参数二、环境变量2.1环境变量的内涵以及理解2.2PATH环境变量:2.3输入程序名就能运行我们的程序2.4系统中的环境变量2.5导出环境变量 三、main函数的第三个参数3.1获得环境变量的三种方法 四、本地变量一、浅谈命令行参数        我......
  • zip()函数
    开始学python啦,第一篇章就以zip()内置函数,这个函数是看生成验证码的时候,竟然可以通过zip实现并行遍历,觉得很神奇,这个这种遍历方式,java还真没有。pythonzip是一个非常有用的内建函数,它可以实现并行遍历,也可以将两个或多个列表,转换成一个元组或者字典。具体的通过示例来看下案例......