Docker快速验证保存iptables的转发策略

Docker快速验证保存iptables的转发策略

[TOC]

故事和事故

这里的故事都是来源于事故。当然处理好了是传说中的故事,处理不好就是惨痛的事故。

前言

接上回(Docker快速验证tomcat单机多实例方案),解决非root账号不能绑定80端口,采用的是iptables转发的解决办法.这只能是个临时方案:

root@SuSE11:/etc/sysconfig$ iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8081

这个方法有以下局限:

  1. 重启服务器失效;
  2. 重启防火墙失效: [root@tomcat7conf]# rcSuEfirewall2 restart
  3. 每次都的申请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端口。

将草稿整理,并做了适当清洗后,作为笔记,分享出来。欢迎斧正!

转载于:https://my.oschina.net/hexie/blog/1591848

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值