后浪笔记一零二四

https://github.com/iproute2/iproute2

net-tools通过procfs(/proc)和ioctl系统调用来访问和改变内核网络配置,而iproute2则通过netlink套接字与内核通讯。

mac中安装iproute2(并不包含ss命令,所以在mac中需要使用lsof): brew install iproute2mac

net-tools: ifconfig, route, arp, ipmaddr, iptunnel, netstat

iproute2: ip, ss

tc命令

ss命令

IP命令

  1. ip link 网络设备配置命令,如可以启用/禁用某个网络设备,改变mtu及mac地址等

ip -s link ls eth0 : 显示接口统计 ip link show : 显示mac地址 ip link show eth0 : 显示某个特定的网络设备的mac地址 ip link set eth0 up : 设置网卡状态为开 ip link set eth0 down : 设置网卡状态为关 ip link add veth0 type veth peer name veth1 : 创建一对veth: veth0, veth1 ip link set veth0 netns ns1; ip link set veth1 netns ns2 : 分别将两个Veth(veth0, veth1)移到两个Namespace(ns1, ns2)中

  1. ip addr 用于管理某个网络设备与协议(IP或IPv6)有关的地址。与ip link类似,不过增加了协议有关的管理(其实就是增加了对IP地址的管理)

ip a : 显示ip地址 ip addr show dev eth0 : 显示某个特定的网络设备 ip addr add 10.0.2.44/24 dev eth0 : 添加ip地址 ip addr del 10.0.2.44/24 dev eth0 : 删除ip地址

  1. ip addrlabel IPv6的地址标签,主要用于RFC3484中描述的IPv6地址的选择。RFC3484主要介绍了两个算法,用于IPv6地址(源地址和目标地址)的选择策略

  2. ip route 管理路由。如添加,删除等

ip route show : 显示路由表 ip route show dev eth0 : 显示某个网卡的路由表 ip route add 10.0.2.45/24 dev eth0 : 给某个网卡添加新路由 ip route add default via 10.0.2.1 : 新增默认路由 ip route chg default via 10.0.2.1 : 修改默认路由 ip route del default : 删除默认路由 ip route add default via 172.31.0.2 dev veth0 : route add -net 0.0.0.0/0 gw 172.31.0.1 dev veth0

  1. ip rule 管理路由策略数据库。在这里有一个算法,用来控制路由的选择策略

  2. ip neigh (ARP和FDB的区别) 用于neighbor/ARP表的管理,如显示、插入、删除等

ip neigh show : 显示arp表 ip neighbor add 10.0.2.30 dev eth0 : 新增arp项 ip neighbor del 10.0.2.30 dev eth0 : 删除arp项

arp: address resolve protocol: 从ip地址中解析链路层地址

  1. ip tunnel 隧道配置。隧道的作用是将数据(可以是不同协议)封装成IP包然后在互联网上将包发出

ip tunnel add gre01 mode gre local 10.0.2.1 remote 192.168.0.1 ttl 255 : 增加和删除GRE隧道 ip tunnel del gre01 : 删除GRE隧道 ip tunnel add ipip01 mode ipip local 10.0.2.1 remote 192.168.0.1 ttl 255 : 添加IPIP隧道 ip tunnel del ipip01 : 删除IPIP隧道 ip tunnel show : 显示隧道 ip -s tunnel ls gre01 : 显示隧道统计

  1. ip tuntap 创建tun/tap设备 ip tuntap add dev tap1 mod tap user root # 给root用户添加tap ip tuntap add dev tun1 mod tap user root # 给root用户添加tun 删除tun/tap设备 ip tuntap del dev tap1 mod tap # 给root用户添加tap ip tuntap del dev tun1 mod tap # 给root用户添加tun

  2. ip maddr 多播地址管理

  3. ip mroute 多播路由管理

  4. ip monitor 状态监控。如可以持续监控IP地址和路由的状态

  5. ip xfrm 设置xfrm。xfrm是一个IP框架,可以转换数据报的格式,如用某个算法对数据报进行加密

  6. ip netns 创建Network Namespace

ip netns add ns1 : 创建Network Namespace, ns1 ip netns exec ns1 ip link : 到ns1的namespace中,查看网络设备

  1. 网桥(网桥是没有MAC地址的,只有端口和CAM表)(其中CAM表用于维护端口和MAC地址的关系) ip link add cni0 type bridge : 创建名为cni0的网桥,等价于brctl addbr br0 ip link set eth0 master br0 : 将eth0网卡挂载到br0网桥上。注意,一旦将网卡"插"到网桥上,它就会变成该网桥的"从设备" “从设备"会被"剥夺"调用网络协议栈处理数据包的资源,从而"降级"为网桥上的一个端口。 等价于:brctl addif br0 eth0 ip link set cni0 up : 创建完网桥后需要启动网桥 ip link show type bridge : 查询所有的网桥,等价于brctl show

tap/tun的原理

  1. tap(二层)/tun(三层)是什么? tap/tun是Linux内核2.4.x版本之后实现的虚拟网络设备,不同于物理网卡靠硬件网路板卡,tap/tun虚拟网卡 完全由软件来实现,功能和硬件实现完全没有差别,它们都属于网络设备,都可以配置IP,都归linux网路设备管理模块统一管理。

作为网络设备,tap/tun也需要配套相应的驱动程序才能工作。tap/tun驱动程序包括两个部分,一个是字符设备驱动, 一个是网卡驱动。这两部分驱动程序分工不太一样,字符驱动负责数据包在内核空间和用户空间的传送,网卡驱动 负责数据包在TCP/IP网络协议栈上的传输和处理。

  1. 用户空间与内核空间的数据传输 在linux中,用户空间和内核空间的数据传输有多种方式,字符设备就是其中的一种。tap/tun通过驱动程序和一个与之关联 的字符设备,来实现用户空间和内核空间的通信接口。

在linux内核2.6.x之后的版本中,tap/tun对应的字符设备文件分别为:

  • tap: /dev/tap0
  • tun: /dev/net/tun

设备文件即充当了用户空间和内核空间通信的接口。当应用程序打开设备文件时,驱动程序就会创建并注册相应的虚拟 设备接口,一般以tunX或tapX命名。当应用程序关闭文件时,驱动也会自动删除tunX和tapX设备,还会删除已经建立起来的路由等信息。

tap/tun 设备文件就像一个管道,一端连接着用户空间,一端连接着内核空间。当用户程序向文件 /dev/net/tun 或 /dev/tap0 写数据时, 内核就可以从对应的 tunX 或 tapX 接口读到数据,反之,内核可以通过相反的方式向用户程序发送数据。

tap/tun 和网络协议栈的数据传输
           APP                           APP
            ^                             |
            | read                        | write
            |                             V
-------/dev/net/tun-----------------/dev/net/tun-----------
            ^                             |
            | send                        | recv    NetworkStack(TCP/IP)
            |                             V            ^
          tunX                          tunX ----------|

tap/tun 通过实现相应的网卡驱动程序来和网络协议栈通信。一般的流程和物理网卡和协议栈的交互流程是一样的, 不同的是物理网卡一端是连接物理网络,而 tap/tun 虚拟网卡一般连接到用户空间。

如下图的示意图,我们有两个应用程序 A、B,物理网卡 eth0 和虚拟网卡 tun0 分别配置 IP:10.1.1.11 和 192.168.1.11, 程序 A 希望构造数据包发往 192.168.1.0/24 网段的主机 192.168.1.1。

+----------------------------------------------------------------------+
|     +-----------+                             +-----------+          |
|     | 应用程序A |                  192.168.1.1| 应用程序B |<----|    |
|     +-----------+                             +-----------+     ^    |
|           |                                          |          |    |
|User       |socketA                                  4| socketB  |    |
|-----------|------------------------------------------|----------|----|
|Kernel     |1                                         |          |    |
|           V                                          V          |    |
|     +-----------------------------------------------------+     ^3   |
|     |             NetworkProtocolStack(TCP/IP)            |     |    |
|     +-----------------------------------------------------+     |    |
|           |5                                         |2         |    |
|           V                                          V          |    |
|          eth0(10.1.1.11)             (192.168.1.11)tun0------>--|    |
+-----------|6---------------------------------------------------------+
            V
        Physical Network(网关地址:10.1.1.1)

基于上图,我们看看数据包的流程:

  1. 应用程序 A 构造数据包,目的 IP 是 192.168.1.1,通过 socket A 将这个数据包发给协议栈。
  2. 协议栈根据数据包的目的 IP 地址,匹配路由规则,发现要从 tun0 出去。
  3. tun0 发现自己的另一端被应用程序 B 打开了,于是将数据发给程序 B.
  4. 程序 B 收到数据后,做一些跟业务相关的操作,然后构造一个新的数据包,源IP是eth0的IP,目的IP是10.1.1.1/24,封装原来的数据的数据包,重新发给协议栈。
  5. 协议栈再根据本地路由,将这个数据包发给eth0。

在这个流程中,应用程序B的作用其实是利用tun0对数据包做了一层隧道封装。其实 tun 设备的最大用途就是用于隧道通信的。

  1. tap/tun 的区别 tap 是一个二层设备(或者以太网设备),只能处理二层的以太网帧; tun 是一个点对点的三层设备(或网络层设备),只能处理三层的 IP 数据包。

本文发表于 0001-01-01,最后修改于 0001-01-01。

本站永久域名「 jiavvc.top 」,也可搜索「 后浪笔记一零二四 」找到我。


上一篇 « 下一篇 »

赞赏支持

请我吃鸡腿 =^_^=

i ysf

云闪付

i wechat

微信

推荐阅读

Big Image