关于这个模块,我开始有以下几个问题:

1.研究过他的人一定会对里面的chain的命名方式感到奇怪,为什么会有unwrapped_chain与wrapped_chain同时存在呢,这个按照他注释里面写的意思

# Add a neutron-filter-top chain. It's intended to be shared
# among the various neutron components. It sits at the very top
# of FORWARD and OUTPUT.

这个链可以在neutron模块之间进行共享使用。当然这个链也可以被删除

2.在IptablesTable.remove_chain方法里面,为什么对于wrapped_chain与unwrapped_chain的删除要分别以不同的方式进行?

该方法代码如下:

    def remove_chain(self, name, wrap=True):"""Remove named chain.This removal "cascades". All rule in the chain are removed, as areall rules in other chains that jump to it.If the chain is not found, this is merely logged."""name = get_chain_name(name, wrap)chain_set = self._select_chain_set(wrap)if name not in chain_set:LOG.debug('Attempted to remove chain %s which does not exist',name)returnchain_set.remove(name)if not wrap:# non-wrapped chains and rules need to be dealt with specially,# so we keep a list of them to be iterated over in apply()self.remove_chains.add(name)# Add rules to remove that have a matching chain name or# a matching jump chainjump_snippet = '-j %s' % nameself.remove_rules += [str(r) for r in self.rulesif r.chain == name or jump_snippet in r.rule]else:jump_snippet = '-j %s-%s' % (self.wrap_name, name)# Remove rules from list that have a matching chain name or# a matching jump chainself.rules = [r for r in self.rulesif r.chain != name and jump_snippet not in r.rule]

总结来说,删除一个链的时候,先在自己内部的chains与rules数据结构中删除对应的链与规则。对于unwrapped_chain,则需要记录进remove_chains与remove_rules,这个我开始非常不理解,直到我读到刷新防火墙规则的代码:

    def _modify_rules(self, current_lines, table, table_name):unwrapped_chains = sorted(table.unwrapped_chains)chains = sorted(table.chains)rules = set(map(str, table.rules))new_filter = [line.strip() for line in current_linesif self.wrap_name not in line andline.strip() not in rules]our_chains = [':%s-%s' % (self.wrap_name, name) for name in chains]our_chains += [':%s' % name for name in unwrapped_chainsif not any(':%s' % name in s for s in new_filter)]our_top_rules = []our_bottom_rules = []for rule in table.rules:rule_str = str(rule)if rule.top:our_top_rules += [rule_str]else:our_bottom_rules += [rule_str]our_chains_and_rules = our_chains + our_top_rules + our_bottom_rulesrules_index = self._find_rules_index(new_filter)new_filter[rules_index:rules_index] = our_chains_and_rulesdef _weed_out_removes(line):if line.startswith(':'):chain = line[1:]if chain in table.remove_chains:table.remove_chains.remove(chain)return Falseelse:if line in table.remove_rules:table.remove_rules.remove(line)return False# Leave it alonereturn Trueseen_lines = set()def _weed_out_duplicates(line):if line in seen_lines:thing = 'chain' if line.startswith(':') else 'rule'LOG.warning("Duplicate iptables %(thing)s detected. This ""may indicate a bug in the iptables ""%(thing)s generation code. Line: %(line)s",{'thing': thing, 'line': line})return Falseseen_lines.add(line)return Truenew_filter.reverse()new_filter = [line for line in new_filterif _weed_out_duplicates(line) and_weed_out_removes(line)]new_filter.reverse()# flush lists, just in case a rule or chain marked for removal# was already gone. (chains is a set, rules is a list)table.remove_chains.clear()table.remove_rules = []return new_filter

最难以理解的一句话就是

        new_filter = [line.strip() for line in current_linesif self.wrap_name not in line andline.strip() not in rules]

这行代码是将原本就未标记的链以及原本就不属于自己的规则提取出来作为新规则的基本部分,后续新的防火墙规则是在这部分上进行扩展的。如果不记录那些未标记的链,那么删除的时候是不知道哪些未标记的链与对应的规则需要删除。

openstack代码解读之 neutron.agent.linux.iptables_manager模块相关推荐

  1. [连载型] Neutron 系列 (15): OpenStack 是如何实现 Neutron 网络 和 Nova虚机 防火墙的...

    问题导读: 1.Nova安全组是什么? 2.Nova的是如何配置的? 3.FWaas是什么? 1. Nova 安全组 1.1 配置 节点 配置文件 配置项 说明 controller /etc/nov ...

  2. Neutron VxLAN + Linux Bridge 环境中的网络 MTU

    1. 基础知识 1.1 MTU 一个网络接口的 MTU 是它一次所能传输的最大数据块的大小.任何超过MTU的数据块都会在传输前分成小的传输单元.MTU 有两个测量层次:网络层和链路层.比如,网络层上标 ...

  3. 编译原理语义分析代码_Pix2Pix原理分析与代码解读

    原理分析: 图像.视觉中很多问题都涉及到将一副图像转换为另一幅图像(Image-to-Image Translation Problem),这些问题通常都使用特定的方法来解决,不存在一个通用的方法.但 ...

  4. OpenStack(五)——Neutron组件

    OpenStack(五)--Neutron组件 一.OpenStack网络 1.Linux网络虚拟化 2.Linux虚拟网桥 3.虚拟局域网 4.开放虚拟交换机(OVS) 二.OpenStack网络基 ...

  5. 200行代码解读TDEngine背后的定时器

    作者 | beyondma来源 | CSDN博客 导读:最近几周,本文作者几篇有关陶建辉老师最新的创业项目-TdEngine代码解读文章出人意料地引起了巨大的反响,原以为C语言已经是昨日黄花,不过从读 ...

  6. 【强化学习】《Easy RL》- Q-learning - CliffWalking(悬崖行走)代码解读

    目录 0. 前言 1. 超参数 2. 训练 2.1 初始化环境和智能体 2.2 智能体选择动作 2.3 环境接收动作并反馈下一个状态和奖励 2.4 智能体进行策略更新(学习) 3. 结果处理 3.1 ...

  7. MAML-RL Pytorch 代码解读 (6) -- maml_rl/envs/bandit.py

    MAML-RL Pytorch 代码解读 (6) – maml_rl/envs/bandit.py 文章目录 MAML-RL Pytorch 代码解读 (6) -- maml_rl/envs/band ...

  8. DAMO-YOLO全流程代码解读

    一.数据集相关代码解读 创建dataloader(damo/dataset/build.py) 在damo/apis/detector_trainer.py的158行,及174-203行中,DAMO- ...

  9. 视觉学习笔记3——复现GSDT,且代码解读

    文章目录 一.GSDT是什么? 二.搭建GSDT 1.硬件 2.读入数据 3.搭建GSDT环境 三.报错解决: 错误一: 错误二: 四.复现: 代码解读: if __name__ == '__main ...

最新文章

  1. 代理 设置wsl_第一次使用WSL我做了什么
  2. Python+Matplotlib制作动画
  3. neo4j导入两个文件_Neo4j:找到两个纬度/经度之间的中点
  4. TVM:使用 Auto-scheduling 来优化算子
  5. ModuleNotFoundError: No module named ‘_bz2‘(Python3.7安装某些包报错)
  6. javascript arguments对象研究--针对jquery源码研究再研究
  7. SQLServer扩展存储过程
  8. HTML-DOM零碎
  9. 音频HiFi的二三事
  10. 20200308模拟赛
  11. 【转下载】黑莓7290中文说明书
  12. C语言训练-1522-对称矩阵的判定
  13. BoredApeYachtClub 无聊猿-NFT 源码解析第一节
  14. NiFi 常用处理器(Processor)介绍
  15. 汤森路透 Thomson Reuters --使用多模型数据库ArangoDB 打造快速安全的简单视图分析...
  16. 高阶数据结构 —— 红黑树(较平衡搜索树)
  17. 51单片机学习日记 | LCD1602黑块和闪烁问题的处理
  18. NX/UG二次开发—QT—基于QT平台的UG二次开发
  19. USB 3.x之所以有“超速”的表现,完全得益于技术的改进。
  20. ubuntu snort-mysql_Ubuntu 16.04 搭建Snort

热门文章

  1. 在交换机上,广播帧是如何发送的,
  2. 2018-2019-1 20165226 《信息安全系统设计基础》第8周学习总结
  3. 解决xcode升级插件失效
  4. 软件工程综合实践阶段小结(2)
  5. MVC分页控件之二,为IQueryable定义一个扩展方法,直接反回PagedListT结果集
  6. WinAPI: GetTickCount - 获取系统已启动的时间
  7. golang defer 关闭文件 报错file may have nil or other unexpected value as its corresponding error
  8. linux shell date 日期格式转换
  9. linux 定时任务 crontab 报错 service command not found 解决方法
  10. linux内核arch目录,各个处理器的介绍