巨大黑人极品videos精品你的位置:最近2019中文字幕在线高清 > 巨大黑人极品videos精品 > 天天讲路由,那 Linux 路由到底咋兑现的!?
天天讲路由,那 Linux 路由到底咋兑现的!?

发布日期:2022-06-18 17:01    点击次数:51

  

天天讲路由,那 Linux 路由到底咋兑现的!?

 

本文转载自微信公众号「征战内功修齐」,作家张彦飞allen。转载本文请连络征战内功修齐公众号。

全球好,我是飞哥。

容器是一种新的捏造化技巧,每一个容器都是一个逻辑上独处的汇聚环境。Linux 上提供了软件捏造出来的二层交换机 Bridge 不错惩处合并个宿主机上多个容器之间互连的问题,但这是不够的。二层交换无法惩处容器和宿主机外部汇聚的互通。

容器笃定是需要和宿主机之外的外部汇聚互通才具备实用价值的。比如在 Kubernets 中,就条目通盘的 pod 之间都不错互通。颠倒于在原先物理机所构成的汇聚之上,要再建一个互通的捏造汇聚出来。这等于 Overlay 汇聚的主张,用一个通俗的示例图暗示如下。

追念在传统物理物理汇聚会,不同子网之间的做事器是何如互联起来的呢,没错,等于在三层使命的路由器,也叫网关。路由器使得数据包不错从一个子网中传输到另一个子网中,进而兑现更大范畴的汇聚互通。如下图所示,一台路由器将 192.168.0.x 和 192.168.1.x 两个子网链接了起来。

在容器捏造化汇聚会,当然也需要这样一个脚色,将容器和宿主机之外的汇聚链接起来。其实 Linux 天生就具备路由的功能,仅仅在云原生时间,它的路由功能再一次找到了用武之地。在容器和外部汇聚通讯的进程中,Linux 就又承担起路由器的脚色,兑现容器数据包的正确转发和送达。

在多样基于容器的云原生技巧盛行的今天,再次回头深入调处路由使命旨趣显得相等有必要,并且也相等的有价值。今天,咱们就再来强化一下 Linux 上的路由常识!

一、什么期间需要路由

先来聊聊 Linux 在什么情况下需要路由进程。其着实发送数据时和袭取数据时都会波及到路由汲取,为什么?咱们挨个来看。

1.1 发送数据时选路

Linux 之是以在发送数据包的期间需要进行路由汲取,这是因为做事器上是可能会有多张网卡建造存在的。数据包在发送的期间,一齐通过用户态、TCP 层到了 IP 层的期间,就要进行路由汲取,以决定使用哪张网卡建造把数据包送出去。扫视进程参见25 张图,一万字,拆解 Linux 汇聚包发送进程

来简短过一下路由连络源码源码。汇聚层发送的进口函数是 ip_queue_xmit。

//file: net/ipv4/ip_output.c int ip_queue_xmit(struct sk_buff *skb, struct flowi *fl) {  // 路由汲取进程  // 汲取完跋文录路由信息到 skb 上  rt = (struct rtable *)__sk_dst_check(sk, 0);  if (rt == NULL) {   // 莫得缓存则查找路由项   rt = ip_route_output_ports(...);   sk_setup_caps(sk, &rt->dst);  }  skb_dst_set_noref(skb, &rt->dst);  ...  //发送  ip_local_out(skb); } 

在 ip_queue_xmit 里咱们开头就看到了路由项查找, ip_route_output_ports 这个函数中完成路由汲取。路由汲取等于到路由表中进行匹配,然后决定使用哪个网卡发送出去。

Linux 中最多不错有 255 张路由表,其中默许情况下有 local 和 main 两张。使用 ip 大叫不错稽查路由表的具体建树。拿 local 路由表来例如。

#ip route list table local local 10.143.x.y dev eth0 proto kernel scope host src 10.143.x.y local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 
1.2 袭取数据时选路

没错,袭取数据包的期间也需要进行路由汲取。这是因为 Linux 可能会像路由器相通使命,将收到的数据包通过合适的网卡将其转发出去。

Linux 在 IP 层的袭取进口 ip_rcv 引申后调用到 ip_rcv_finish。在这里张开路由汲取。淌若发现如实等于本建造的汇聚包,那么就通过 ip_local_deliver 送到更表层的 TCP 层进行处理。

淌若路由后发现非本建造的汇聚包,那就投入到 ip_forward 进行转发,终末通过 ip_output 发送出去。

具体的代码如下。

//file: net/ipv4/ip_input.c static int ip_rcv_finish(struct sk_buff *skb){     ...     if (!skb_dst(skb)) {         int err = ip_route_input_noref(skb, iph->daddr, iph->saddr,                            iph->tos,
中文字幕人妻丝袜乱一区三区 skb->dev);         ...     }     ...     return dst_input(skb); } 

其中 ip_route_input_noref 等于在进行路由查找。

//file: net/ipv4/route.c int ip_route_input_noref(struct sk_buff *skb, __be32 daddr, __be32 saddr,     u8 tos, struct net_device *dev) {  ...  res = ip_route_input_slow(skb, daddr, saddr, tos, dev);  return res; } 

这里记住 ip_route_input_slow 就行了,后头咱们再看。

1.3 linux 路由小结

路由在内核公约栈中的位置不错用如下一张图来暗示。

汇聚包在发送的期间,需要从本机的多个网卡建造中汲取一个合适的发送出去。汇聚包在袭取的期间,也需要进行路由汲取,淌若是属于本建造的包就往表层送到汇聚层、传输层直到 socket 的袭取缓存区中。淌若不是本建造上的包,就汲取合适的建造将其转发出去。

二、Linux 的路由兑现 2.1 路由表

路由表(routing table)在内核源码中的另外一个叫法是转发信息库(Forwarding Information Base,FIB)。是以你在源码中看到的 fib 开头的界说基本上等于和路由表连络的功能。

其中路由表自己是用 struct fib_table 来暗示的。

struct fib_table {  struct hlist_node tb_hlist;  u32   tb_id;  int   tb_default;  int   tb_num_default;  unsigned long  tb_data[0]; }; 

通盘的路由表都通过一个 hash - fib_table_hash 来组织和治理。它是放在汇聚定名空间 net 下的。这也就讲解每个定名空间都有我方独处的路由表。

//file:include/net/net_namespace.h struct net {  struct netns_ipv4 ipv4;  ... }  //file: include/net/netns/ipv4.h struct netns_ipv4 {  // 通盘路由表   struct hlist_head *fib_table_hash;   // netfilter  ... } 

在默许情况下,Linux 只须 local 和 main 两个路由表。淌若内核编译时援手计策路由,那么治理员最多不错建树 255 个独处的路由表。

淌若你的做事器上创建了多个汇聚定名空间的话,那么就会存在多套路由表。以除了默许定名汇聚空间外,又创明晰一个新汇聚定名空间的情况为例,路由表在通盘这个词内核数据结构中的关联关连回顾如下图所示。

2.2 路由查找

在上头的末节中咱们看到,发送进程调用 ip_route_output_ports 来查找路由,袭取进程调用 ip_route_input_slow 来查找。但其实这两个函数都又最终会调用到 fib_lookup 这个中枢函数,源码如下。

//file: net/ipv4/route.c struct rtable *__ip_route_output_key(struct net *net,巨大黑人极品videos精品 struct flowi4 *fl4) {  ...  // 投入 fib_lookup  if (fib_lookup(net, fl4, &res)) {  } }  //file: net/ipv4/route.c static int ip_route_input_slow(struct sk_buff *skb, __be32 daddr, __be32 saddr,           u8 tos, struct net_device *dev) {  ...  // 投入 fib_lookup  err = fib_lookup(net, &fl4, &res); } 

咱们来看下 fib_loopup 都干了啥。为了容易调处,咱们只看一下不援手多路由表版块的 fib_lookup。

//file: include/net/ip_fib.h static inline int fib_lookup(struct net *net, const struct flowi4 *flp,         struct fib_result *res) {  struct fib_table *table;   table = fib_get_table(net, RT_TABLE_LOCAL);  if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF))   return 0;   table = fib_get_table(net, RT_TABLE_MAIN);  if (!fib_table_lookup(table, flp, res, FIB_LOOKUP_NOREF))   return 0;  return -ENETUNREACH; } 

这个函数等于纪律到 local 和 main 表中进行匹配,匹配到后就复返,不会不绝往下匹配。从上头不错看到 local 表的优先级要高于 main 表,淌若 local 表中找到了端正,则路由进程就限度了。

这也等于好多同学说为什么 ping 本机的期间在 eth0 上抓不到包的压根原因。通盘射中 local 表的包都会被送往 loopback 缔造,不会过 eth0。

三、路由的使用尺度 3.1 开启转发路由

在默许情况下,Linux 上的转发功能是关闭的,这期间 Linux 发现收到的汇聚包不属于我方就会将其丢弃。

但在某些场景下,例如关于容器汇聚来说,Linux 需要转发本机上其它汇聚定名空间中过来的数据包,需要手工开启转发。如下这两种尺度都不错。

# sysctl -w net.ipv4.ip_forward=1 # sysctl net.ipv4.conf.all.forwarding=1 

开启后,Linux 就能像路由器相通对不属于本机(严格地说是本汇聚定名空间)的 IP 数据包进行路由转发了。

3.2 稽查路由表

在默许情况下,Linux 只须 local 和 main 两个路由表。淌若内核编译时援手计策路由,那么治理员最多不错建树 255 个独处的路由表。在 centos 上不错通过以下容貌稽查是否开启了 CONFIG_IP_MULTIPLE_TABLES 多路由表援手。

# cat /boot/config-3.10.0-693.el7.x86_64  CONFIG_IP_MULTIPLE_TABLES=y ... 

通盘的路由表按照从 0 - 255 进行编号,每个编号都有一个一名。编号和一名的对应关连在 /etc/iproute2/rt_tables 这个文献里不错查到。

# cat /etc/iproute2/rt_tables 255     local 254     main 253     default 0       unspec 200     eth0_table 

稽查某个路由表的建树,通过使用 ip route list table {表名} 来稽查。

#ip route list table local local 10.143.x.y dev eth0 proto kernel scope host src 10.143.x.y local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1 

淌若是稽查 main 路由表,也不错凯旋使用 route 大叫

# route -n Kernel IP routing table Destination     Gateway         Genmask         Flags Metric Ref    Use Iface 10.0.0.0        10.*.*.254      255.0.0.0       UG    0      0        0 eth0 10.*.*.0        0.0.0.0         255.255.248.0   U     0      0        0 eth0 

上头字段中的含义如下

Destination:想法地址,不错是一个具体的 IP,也不错是一个网段,和 Genmask 一齐暗示。 Gateway:网关地址,淌若是 0.0.0.0 暗示不需要经过网关。 Flags: U 暗示灵验,G 暗示链接路由,H 这条文定是主机路由,而不是汇聚路由。 Iface:网卡建造,使用哪个网卡将包送往时。

上述着力中输出的第一条路由端正暗示这台机器下,真确地说这个汇聚环境下,通盘狡计为 10.0.0.0/8(Genmask 255.0.0.0 暗示前 8 位为子网掩码) 网段的汇聚包都要通过 eth0 建造送到 10...254 这个网关,由它再匡助转发。

第二条路由端正暗示,淌若想法地址是 10...0/21(Genmask 255.255.248.0 暗示前 21 位为子网掩码)则凯旋通过 eth0 发出即可,不需要经过网关就可通讯。

3.3 修改路由表

默许的 local 路由表是内核笔据面前机器的网卡建造建树自动生成的,不需要手工鬈曲。关于main 的路由表建树咱们一般只需要使用 route add 大叫就不错了,删除使用 route del。

修改主机路由

# route add -host 192.168.0.100 dev eth0 //直连无用网关 # route add -host 192.168.1.100 dev eth0 gw 192.168.0.254 //下一跳网关 

修改汇聚路由

# route add -net 192.168.1.0/24 dev eth0 //直连无用网关 # route add -net 192.168.1.0/24 dev eth0 gw 10.162.132.110 //下一跳网关 

也不错指定一条默许端正,不射中其它端正的期间会引申到这条。

# route add default gw 192.168.0.1 eth0 

关于其它编号的路由表想要修改的话,就需要使用 ip route 大叫了。这里不外多张开,只用 main 表举一个例子,有更多使用需求的同学请自行搜索。

# ip route add 192.168.5.0/24 via 10.*.*.110 dev eth0 table main 
3.4 路由端正测试

在建树了一系列路由端正后,为了快速校验是否相宜预期,不错通过 ip route get 大叫来阐述。

# ip route get 192.168.2.25 192.168.2.25 via 10.*.*.110 dev eth0 src 10.*.*.161     cache 
本文回顾

在现如今多样汇聚捏造化技巧里,到处都能看着对路由功能的天真垄断。是以咱们今天有益深入策动了一下 Linux 路由使命旨趣。

在 Linux 内核中,关于发送进程和袭取进程都会波及路由汲取,其中袭取进程的路由汲取是为了判断是该土产货袭取依然将它转发出去。

 

默许有 local 和 main 两个路由表,不外淌若安设的 linux 开启了 CONFIG_IP_MULTIPLE_TABLES 选项的话,最多能援手 255 张路由表。

路由汲取进程其实不复杂,等于笔据各个路由表的建树找到合适的网卡建造,以及下一跳的地址,然后把包转发出去就算是完事。

通过合适地建树路由端正,容器中的汇聚环境和外部的通讯不再是难事。通过多数地遏制路由端正就不错兑现捏造汇聚互通。

 

好了,今天的共享就到这里了,期待你的点赞、再看和转发~~

 



Powered by 最近2019中文字幕在线高清 @2013-2022 RSS地图 HTML地图