- 部分 I. Python 入门
- 第 1 章 Python 入门
- 第 2 章 Python Package Index (PyPI)
- 第 3 章 Python 模块
- 第 4 章 数据类型
- 第 5 章 数据结构
- 第 6 章 Class
- 第 7 章 Input/Output
- 第 8 章 Pipe
- 第 9 章 Library
- 9.2. 随机数
- 9.3. Python 多线程
- 9.13. syslog
- 9.5. Socket
- 9.6. subprocess
- 9.7. YAML
- 9.8. Daemon
- 9.9. python-memcached
- 9.10. Pyro - Pyro is short for PYthon Remote Objects
- 9.11. Python Imaging Library
- 9.12. getopt – Command line option parsing
- 9.14. python-subversion
- 9.15. SimpleHTTPServer
- 9.16. fuse-python.x86_64 : Python bindings for FUSE - filesystem in userspace
- 9.17. Network
- 9.18. Python-spdylay - Spdylay Python Extension Module
- 9.19. mechanize
- 9.20. Dominate
- 第 10 章 Frameworks
- 第 12 章 终端环境开发
- 部分 II. Python 数据分析
- 第 13 章 Crawler
- 第 14 章 Scrapy - Python web scraping and crawling framework
- 第 15 章 Pandas - Python Data Analysis Library
- 第 16 章 股票
- 第 17 章 数据可视化
- 部分 III. 人工智能 AI
- 第 18 章 OCR
- 第 19 章 语音处理
- 第 20 章 视频
- 第 21 章 人脸识别
- 第 22 章 自然语言处理
- 第 23 章 自动化运维
- 第 24 章 办公自动化
- 第 25 章 OpenCV
- 第 26 章 图形开发
- 第 27 章 3rdparty toolkit
- 第 29 章 实用代码
- 第 30 章 FAQ
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
23.2. Python 开发防火墙
23.2. Python 开发防火墙
23.2.1. 我为什么要开发一个防火墙软件?
起因是这样的,10年前,我们的IDC部署大量的CentOS,当时是6.x版本,后面升级到7.x版本。对于新版CentOS 大家都不太适应它携带的 firewalld 防火墙,另一个原因是IDC的服务器几乎只做 INPUT(进入)规则,极少服务器有OUTPUT(访问)和FORWARD(转发)规则。firewalld 更适合做企业防火墙,并不适合做IDC防火墙,把简单的事情复杂化了。
使用下面命令查看区域设置:
[root@localhost ~]# firewall-cmd --get-zones block dmz drop external home internal nm-shared public trusted work
当我尝试删除的时候失败,于是我便使用Python开发了一款防火墙,用来替代 firewalld。
[root@localhost ~]# for zone in $(firewall-cmd --get-zones);do firewall-cmd --delete-zone=$zone --permanent; done Error: BUILTIN_ZONE: 'block' is built-in zone Error: BUILTIN_ZONE: 'dmz' is built-in zone Error: BUILTIN_ZONE: 'drop' is built-in zone Error: BUILTIN_ZONE: 'external' is built-in zone
防火墙设计与想法
面向哪些用户:运维人员和开发人员。
运维人员:运维人员可以像使用其他软件一样使用这款防火墙软件。容易安装,容易学习,容易使用,解决运维面临的痛点。
开发人员:能通过开发包,做防火墙的二次开发。
23.2.2. 安装 Python 防火墙
准备一台 CentOS 8 (CentOS Stream),在 root 用户下运行下面命令安装
pip 安装
[root@localhost firewall]# pip3 install netkiller-firewall WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead. Collecting netkiller-firewall Using cached https://files.pythonhosted.org/packages/d2/82/f0d7cc6646447e2560702415606b9aa668b0dc7536e24944a2d0823db7ff/netkiller_firewall-0.0.1-py3-none-any.whl Installing collected packages: netkiller-firewall Successfully installed netkiller-firewall-0.0.1 [root@localhost firewall]#
源码安装
[root@localhost ~]# cd /usr/local/src/ [root@localhost ~]# dnf install -y git python38 [root@localhost ~]# git clone https://github.com/netkiller/firewall.git [root@localhost ~]# cd firewall [root@localhost ~]# bash install.sh
如何使用该防火墙
启用防火墙: systemctl enable firewall 启动防火墙: systemctl start firewall 停止防火墙: systemctl stop firewall 查看iptables规则: iptables -L
23.2.3. 切换防火墙规则
修改 /etc/sysconfig/firewall 文件设置/切换默认规则
[root@localhost ~]# vim /etc/sysconfig/firewall ############################################## LIBEXEC=/srv/firewall/libexec RULE=www ##############################################
LIBEXEC 是规则库的位置
RULE 是使用规则库 LIBEXEC 中的那个规则
23.2.4. 规则库
规则库的目录是 /srv/firewall/libexec/ 默认提供几个常用的规则:Web 服务器,邮件服务器,数据库服务器。
[root@localhost ~]# cd /srv/firewall/libexec/ [root@localhost ~]# ls db.py smtp.py www.py
默认防火墙规则 /srv/firewall/libexec/www.py
$ sudo cat /srv/firewall/libexec/www.py #!/usr/bin/env python3 # -*- coding: utf-8 -*- from firewall import * ######################################## # Web Application ######################################## www = Firewall() www.flush() www.policy(www.INPUT,www.ACCEPT) www.policy(www.OUTPUT,www.ACCEPT) www.policy(www.FORWARD,www.ACCEPT) www.input().state(('RELATED','ESTABLISHED')).accept() www.input().protocol('icmp').accept() www.input().interface('-i','lo').accept() www.input().protocol('tcp').dport('22').state('NEW').accept() www.input().protocol('tcp').dport(('443','80')).state('NEW').accept() www.output().protocol('tcp').dport(('20','21')).reject() #www.input().protocol('tcp').inbound('eth0').dport('80').recent('HTTP',2,20).drop() #www.input().protocol('tcp').inbound('eth0').dport('80').connlimit(30).drop() #www.input().protocol('tcp').inbound('eth0').dport('80').recent('HTTP').accept() # DDOS #www.input().proto('tcp').dport("80").string('XXDD0S').drop() www.input().reject('--reject-with icmp-host-prohibited') www.forward().reject('--reject-with icmp-host-prohibited') def start(): www.start() def stop(): www.stop() def restart(): www.stop() www.start() def show(): www.show() def status(): www.status() def main(): show() return( 0 ) if __name__ == '__main__': main()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论