網站首頁 編程語言 正文
添加如下的路由策略:
# ip rule add from 10.0.1.3 oif ens33 lookup 10
#
# ip rule
0: from all lookup local
32760: from 10.0.1.3 lookup 10
32766: from all lookup main
32767: from all lookup default
在策略路由表10中,添加默認網關192.168.0.40。查看可見出接口為ens33。
# ip route add default via 192.168.0.40 table 10
#
#
# ip route show table 10
default via 192.168.0.40 dev ens33
如下刪除接口ens33接口上的IP地址,路由規則還在,但是路由表10中的ens33相關表項已經被清除,導致策略路由失效。
# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.4 netmask 255.255.255.0 broadcast 192.168.0.255
#
# ip addr del 192.168.0.4/24 dev ens33
#
# ip rule
0: from all lookup local
32760: from 10.0.1.3 lookup 10
32766: from all lookup main
32767: from all lookup default
#
# ip route show table 10
#
或者將出接口ens33設置為down狀態,也將清除路由表10中的路由表項。這導致在接口UP/DOWN,或者修改接口地址時,要重新下發策略路由表中的表項。
# ip link set ens33 down
路由項刪除
如下在地址刪除處理中,向inetaddr_chain鏈發送NETDEV_DOWN消息。
static void __inet_del_ifa(struct in_device *in_dev,
struct in_ifaddr __rcu **ifap,
int destroy, struct nlmsghdr *nlh, u32 portid)
{
rtmsg_ifa(RTM_DELADDR, ifa1, nlh, portid);
blocking_notifier_call_chain(&inetaddr_chain, NETDEV_DOWN, ifa1);
路由子系統在inetaddr_chain上注冊了處理函數fib_inetaddr_event,由函數fib_del_ifaddr處理IP地址刪除事件。如果此接口上沒有IP地址,由函數fib_disable_ip處理。
static int fib_inetaddr_event(struct notifier_block *this, unsigned long event, void *ptr)
{
struct in_ifaddr *ifa = (struct in_ifaddr *)ptr;
switch (event) {
case NETDEV_DOWN:
fib_del_ifaddr(ifa, NULL);
atomic_inc(&net->ipv4.dev_addr_genid);
if (!ifa->ifa_dev->ifa_list) {
/* Last address was deleted from this interface.
* Disable IP.
*/
fib_disable_ip(dev, event, true);
}
如下fib_disable_ip函數,處理路由表項及緩存的刪除。
static void fib_disable_ip(struct net_device *dev, unsigned long event,
bool force)
{
if (fib_sync_down_dev(dev, event, force))
fib_flush(dev_net(dev));
else
rt_cache_flush(dev_net(dev));
arp_ifdown(dev);
遍歷接口設備相關聯的路由表項,將下一跳設置為RTNH_F_DEAD。
int fib_sync_down_dev(struct net_device *dev, unsigned long event, bool force)
{
int scope = RT_SCOPE_NOWHERE;
unsigned int hash = fib_devindex_hashfn(dev->ifindex);
struct hlist_head *head = &fib_info_devhash[hash];
hlist_for_each_entry(nh, head, nh_hash) {
struct fib_info *fi = nh->nh_parent;
if (nh->fib_nh_dev != dev || fi == prev_fi)
continue;
change_nexthops(fi) {
if (nexthop_nh->fib_nh_flags & RTNH_F_DEAD)
dead++;
else if (nexthop_nh->fib_nh_dev == dev &&
nexthop_nh->fib_nh_scope != scope) {
switch (event) {
case NETDEV_DOWN:
case NETDEV_UNREGISTER:
nexthop_nh->fib_nh_flags |= RTNH_F_DEAD;
最后,fib_flush遍歷命名空間中所有的路由表,已經每個表中的路由項,刪除設置了RTNH_F_DEAD標志的表項。
void fib_flush(struct net *net)
{
for (h = 0; h < FIB_TABLE_HASHSZ; h++) {
struct hlist_head *head = &net->ipv4.fib_table_hash[h];
struct hlist_node *tmp;
struct fib_table *tb;
hlist_for_each_entry_safe(tb, tmp, head, tb_hlist)
flushed += fib_table_flush(net, tb, false);
}
if (flushed)
rt_cache_flush(net);
內核版本 5.10
原文鏈接:https://blog.csdn.net/sinat_20184565/article/details/126325194
- 上一篇:LCP創建bond接口
- 下一篇:VPP靜態映射實現DNAT
相關推薦
- 2022-06-09 使用Ajax實現進度條的繪制_AJAX相關
- 2022-07-30 Hadoop中hdfs與yarn命令大全
- 2022-01-17 自動化實戰之Cypress(一):環境搭建
- 2022-11-12 C++?哈希表的基本用法及說明_C 語言
- 2023-05-22 NumPy迭代數組的實現_python
- 2022-08-08 pandas?給dataframe添加列名的兩種方法_python
- 2022-10-20 Android?Flutter實現自定義下拉刷新組件_Android
- 2022-04-08 WPF引用MVVM框架與使用方法_基礎應用
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支