故事和事故
这里的故事都是来源于事故。当然处理好了是传说中的故事,处理不好就是惨痛的事故。
前言
接上回(Docker快速验证tomcat单机多实例方案),解决非root账号不能绑定80端口,采用的是iptables转发的解决办法.这只能是个临时方案:
root@SuSE11:/etc/sysconfig$ iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
这个方法有以下局限:
- 重启服务器失效;
- 重启防火墙失效: [root@tomcat7conf]# rcSuEfirewall2 restart
- 每次都的申请root权限手工执行转发命令
背后的故事
当时投产时间紧任务重,直接就投了。终于在第三次投产前,生产迁移扩容,重启后,趴了。因为部署在异地,电话支持后异地没了下文。晚一点儿客户直接电话过来,要求彻底解决。
后来才知道这个命令失效了(为什么失效这里有故事,当然对运维来说就是事故:推测异地也是发现了这个结果,没辙了就给本地客户反馈,压力就到项目组来了)。
第二天,客户建议在开发环境验证:先把防火墙关了看看行不行得通。虽然知道关了也不可能突然80就能被非 root 用户绑定了,但是还是安排工程师做了。一验证,出事了。防火墙关了之后,再也起不起来了(重启后,转发命令失效了)。咦~,有好戏了。
反复查证之后,推测是客户运营部门在这个时间段内,出于某种考虑,逐个排查,“彻底”关闭了所有服务器的防火墙:因为是规定。我们开发环境一直没重启,所以,转发规则一直生效。现在被循循善诱主动关闭防火墙验证时,新的策略生效,防火墙趴了,转发命令当仁不让失效了。
查证和推测过程以及解决方案如下,请各位参考。为什么推测,因为有些事情拿不到台面上,知道就好了,不必好为人师。尤其面对客户语焉不详时,给出解决方案就是了。大家心知肚明:乙方么,就是解决问题的。不管这个问题源头在哪儿,反正你的项目你碰上了,自己解决就是。
理论指导实践
SuSE 11 Linux 中,使用 /etc/sysconfig/SuSEfirewall2 脚本来“简化” iptables 策略的构建。系统启动时,通过加载此脚本,来生成 iptables 策略。
还原和推测现场
工程师的验证
大致也就这几个命令,最终结果就是,关闭了,验证80端口仍旧不能访问。再启动,运行了 iptables 转发命令,居然失效了。
# 关闭防火墙
root@SuSE11:/etc/sysconfig$ rcSuSEfirewall2 stop
# 启动防火墙
root@SuSE11:/etc/sysconfig$ rcSuEfirewall2 start
# 重启防火墙
root@SuSE11:/etc/sysconfig$ rcSuSEfirewall2 restart
“彻底”关闭防火墙
推测是这么“彻底”关闭的。后来经过后续验证,证明推测是正确的。
root@SuSE11:/etc/sysconfig$ chkconfig SuSEfirewall2_init off
root@SuSE11:/etc/sysconfig$ chkconfig SuSEfirewall2_setup off
被彻底关闭后,防火墙状态如下
root@SuSE11:/etc/sysconfig$ chkconfig --list | grep firewall
SuSEfirewall2_init 0:off 1:off 2:off 3:off 4:off 5:off 6:off
SuSEfirewall2_setup 0:off 1:off 2:off 3:off 4:off 5:off 6:off
在这种情况下,传统办法重启前置防火墙是无效的,自然 iptables 的转发命令运行了也是无效的,感兴趣的童鞋,自行尝试。
root@SuSE11:/etc/sysconfig$ rcSuSEfirewall2 restart
root@SuSE11:/etc/sysconfig$ iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
查看“前置”防火墙状态
╮(╯_╰)╭,貌似没啥用,仅记录下。
root@SuSE11:/etc/sysconfig$ cd /etc/sysconfig
root@SuSE11:/etc/sysconfig$ SuSEfirewall2 status | grep 80
查看“底层”防火墙状态
正常状态如下,
root@SuSE11:/etc/sysconfig$ chkconfig --list | grep firewall
SuSEfirewall2_init 0:off 1:off 2:off 3:on 4:off 5:on 6:off
SuSEfirewall2_setup 0:off 1:off 2:off 3:on 4:off 5:on 6:off
启动防火墙
如果防火墙被关闭,或者状态异常,使用如下命令启动
root@SuSE11:/etc/sysconfig$ chkconfig SuSEfirewall2_init on
root@SuSE11:/etc/sysconfig$ chkconfig SuSEfirewall2_setup on
验证和准备
检查 firewall 的状态
正常状态如下,
root@SuSE11:/etc/sysconfig$ chkconfig --list | grep firewall
SuSEfirewall2_init 0:off 1:off 2:off 3:on 4:off 5:on 6:off
SuSEfirewall2_setup 0:off 1:off 2:off 3:on 4:off 5:on 6:off
如果不正常,则:
启动防火墙
root@SuSE11:/etc/sysconfig$ chkconfig SuSEfirewall2_init on
root@SuSE11:/etc/sysconfig$ chkconfig SuSEfirewall2_setup on
验证 iptables 的转发
root@SuSE11:/etc/sysconfig$ iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
查看 iptables 的转发是否生效
iptables-save 这个命令也好用的很,用于检查已有策略(无论是临时的还是永久的)
当有如下结果
root@SuSE11:/etc/sysconfig$ iptables-save -t nat | grep 80
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
重启防火墙
iptables 应失效
root@SuSE11:/etc/sysconfig$ rcSuSEfirewall2 restart
root@SuSE11:/etc/sysconfig$ iptables-save -t nat | grep 80
保存 iptables 策略
有多种办法,其中之一就是:用户添加自定义规则。还有一种办法就是导出iptables里的策略到一个文件,系统启动时,加载这个策略(见参考链接)。此处使用的是前者。
修订自定义函数
root@SuSE11:/etc/sysconfig$ cd /etc/sysconfig/scripts/
root@SuSE11:/etc/sysconfig$ cp SuSEfirewall2-custom SuSEfirewall2-custom20171111bak
root@SuSE11:/etc/sysconfig$ vi SuSEfirewall2-custom
# 找到fw_custom_after_antispoofing函数,在函数内“true”上面一行加入
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
# 保存,退出
root@SuSE11:/etc/sysconfig$ more SuSEfirewall2-custom | grep 8081
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
加载自定义函数
root@SuSE11:/etc/sysconfig$ cd /etc/sysconfig
root@SuSE11:/etc/sysconfig$ vi SuSEfirewall2
# 找到FW_CUSTOMRULES="",修订为
FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom"
# 保存,退出
# 验证防火墙脚本是否加载自定义函数
root@SuSE11:/etc/sysconfig$ more SuSEfirewall2 | grep FW_CUS
FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom"
验证
root@SuSE11:/etc/sysconfig$ rcSuSEfirewall2 restart
root@SuSE11:/etc/sysconfig$ iptables-save -t nat | grep 80
-A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081
root@SuSE11:/etc/sysconfig$ crul localhost:8081
感谢和参考
感谢以下网友的分享:SuSE的网上资料能用的不多,像这样的认真的笔记已经不多了。
参考
- SuSE IPTABLES 用法
- iptables 的备份、恢复及防火墙脚本的基本使用
- 在 suse 上折腾 iptables
后续
2017.12.18 Update:
这个方案也是个过渡方案:甚至都没能投产。
因为客户这边的奇怪规定,一律要彻底关闭防火墙。
具体见下一篇笔记:不通过转发让tomcat绑定80端口。
docker + k8s
此课程为网络直播课程,一共 10 个课时,每周上一个全天,历时两个多月。附加:录播视频+笔记+除课堂外的答疑时间(7次+)2019-1-13 开课,原价 5800 ,现在周年活动 100 定金抵 800
课程主讲师:GY 老师
10 年一线软件开发经验,先后经历了传统安全公司,以及多家互联网公司;在安全开发方面,曾开发过 Linux 防火墙、web 应用防火墙、Linux 安全内核加固,基于大流量的 Web 安全威胁分析等项目;在互联网公司工作时,曾基于 DPDK 高性能网络开发框架开发过基于全流量的网络流量分析平台和基于 Sflow 网络流量分析平台,基于Golang 开发SmartDNS 等;开发语言也是从C -> python -> golang 的转变过程?现从事基于 K8S 和 Docker在私有云平台建设方面的研发工作;具备丰富的Linux系统开发经验、网络开发经验以及项目管理经验;目前开发工作90+% 都在用 Golang,Golang 是一门简洁、高效、强大且灵活的编程语言。
关于课程的具体内容想要了解的, 添加加小助手WeChat:17812796384 咨询了解
本文由作者:蛮大人 授权发布
链接:https://opsdev.fun/2017/12/19/O1-8-06-Docker%E5%BF%AB%E9%80%9F%E9%AA%8C%E8%AF%81%E4%BF%9D%E5%AD%98iptables%E7%9A%84%E8%BD%AC%E5%8F%91%E7%AD%96%E7%95%A5/
著作权归作者所有。
转载请联系作者获得授权。