前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >开通防火墙的简单改进 (r6笔记第88天)

开通防火墙的简单改进 (r6笔记第88天)

作者头像
jeanron100
发布2018-03-16 16:31:06
7070
发布2018-03-16 16:31:06
举报

今天有个需求是开通防火墙,听起来任务难度不大吧,如果按照客户端和端口来细分,匹配下来需要开通的有近400多台。 所以任务艰巨,关键是提供的列表中含有多个环境的负责人,没有按照环境属主来分,所以如果从列表中一一查找,开通权限,那就得折腾一整天,眼睛熬得通红,而且还没啥技术含量。 而且还有个坑,因为列表中时不时会出来几个unix环境,开通的方式方法又不同,而且之前听说配置有误还导致服务器重启,所以对于unix开通防火墙都是规规矩矩,不敢越雷池一步。

这个时候如果放到批量脚本里,也还是不合适的,因为会有很多的隐患和不明确的地方。

所以拿到列表我没有马上开始忙活开通防火墙的事情,而是先梳理了一下环境。 列表是类似下面的这种格式 第一栏是db的ip 第二栏是需要开通的端口,第三栏是客户端的ip 10.12.5.111 1521 10.27.142.68 10.12.5.111 1528 10.27.142.68 10.12.5.112 1528 10.27.142.68 10.12.5.19 1523 10.12.142.16 10.12.5.23 1523 10.12.142.16 10.16.8.105 1521 10.27.142.68

所以根据提供的3个参数,需要连接到db服务器,然后查看是否有防火墙的配置,如果没有,就需要开通,开通完之后保存防火墙列表。

在细化之前,先看看环境 首先根据关键字solaris得到了相关的Unix列表,假设all.lst里面存放的都是所有服务器的明细信息 sh all.lst|grep -i solari|grep -v \#|awk '{print $1}'|sort|uniq 假设当前得到的列表为aa.lst,用下面的命令就可以发现其实涉及的服务器有大概40多台。 # cat aa.lst|awk '{print $1}'|sort|uniq|wc -l 43 然后用下面的方式得到了相关的服务器列表,类似下面的形式 cat aa.lst|awk '{print $1}'|sort|uniq|sed '/^$/d' 10.12.5.111 10.12.5.112 10.12.5.19 10.12.5.23 10.16.8.105 。。。 使用下面的两个命令得到了两个文件,后面需要进一步处理。 sh all.lst|grep -i solari|grep -v \#|awk '{print $1}'|sort|uniq|awk '{print "ssh "$1}'> test/sun_ip.lst cat aa.lst|awk '{print $1}'|sort|uniq|sed '/^$/d'|awk '{print "ssh "$1}' > test/all_ip.lst 这两个文件的意义就在于下面的形式,可以看到没有<,|的列都是存在重复的列,即服务器列表中的unix服务器,这些是需要排除在列表之外,手工开防火墙的。 # sdiff all* sun* ssh 10.1.14.18 < ssh 10.2.19.83 < ssh 10.2.13.11 < ssh 10.2.13.118 ssh 10.2.13.118 ssh 10.2.13.122 < ssh 10.2.13.128 ssh 10.2.13.128 ssh 10.2.13.13 | ssh 10.2.13.138 ssh 10.2.13.132 < ssh 10.2.13.14 < ssh 10.2.13.141 ssh 10.2.13.141 ssh 10.2.13.157 | ssh 10.2.13.144 ssh 10.2.133.16 | ssh 10.2.13.148 使用下面的方法来过滤得到纯linux的环境。 sdiff all* sun*|grep '<\||' ssh 10.1.14.18 < ssh 10.2.19.83 < ssh 10.2.13.11 < ssh 10.2.13.122 < ssh 10.2.13.13 | ssh 10.2.13.138 ssh 10.2.13.132 < ssh 10.2.13.14 < ssh 10.2.13.157 | ssh 10.2.13.144 ssh 10.2.133.16 | ssh 10.2.13.148 光得到列表还不行,得看看网卡的情况,还有能不能ping通,因为有些服务器可能在其它的网段,需要代理服务器跳转。 sdiff all* sun*|grep '<\||'|awk '{print $1" "$2" \"ifconfig |head -1\""}' ssh 10.1.14.18 "ifconfig |head -1" ssh 10.2.19.83 "ifconfig |head -1" ssh 10.2.13.11 "ifconfig |head -1" ssh 10.2.13.122 "ifconfig |head -1" ssh 10.2.13.13 "ifconfig |head -1" ssh 10.2.13.132 "ifconfig |head -1" ssh 10.2.13.14 "ifconfig |head -1" 或者设置超时限制也可以,不过我测试发现差别不大。 sdiff all* sun*|grep '<\||'|awk '{print $1" -o ServerAliveInterval=3 "$2" \"ifconfig |head -1\""}' 可以看到有些服务器确实不通,这些需要手工跳转到别的代理服务器去手工完成。 ssh: connect to host 10.2.13.122 port 22: Connection timed out ssh: connect to host 10.2.13.162 port 22: Connection timed out eth0 Link encap:Ethernet HWaddr 00:26:B9:2C:34:13 eth0 Link encap:Ethernet HWaddr 78:2B:CB:0D:DE:1E eth0 Link encap:Ethernet HWaddr 00:1D:09:1A:88:BD eth0 Link encap:Ethernet HWaddr 78:2B:CB:24:98:77 em1 Link encap:Ethernet HWaddr E0:DB:55:22:0E:90 eth0 Link encap:Ethernet HWaddr 78:2B:CB:24:82:C1 em1 Link encap:Ethernet HWaddr 78:2B:CB:3E:87:B7 eth0 Link encap:Ethernet HWaddr D4:AE:52:7A:84:D9 eth0 Link encap:Ethernet HWaddr 78:2B:CB:0D:1C:35 所以针对这个问题,我的思路就是写一个在db服务端可运行的脚本,然后在服务端运行,完成后退出。 服务端需要运行的脚本内容如下: ip_exists_flag=`iptables -nvL|grep -w $1|wc -l` echo $ip_exists_flag "ip address is founded from firewall list" if [ ${ip_exists_flag} -eq 0 ];then echo "iptables -I INPUT -s $1 -p tcp -m multiport --dports $2 -i `ifconfig |head -1|awk '{print $1}'` -j ACCEPT "; iptables -I INPUT -s $1 -p tcp -m multiport --dports $2 -i `ifconfig |head -1|awk '{print $1}'` -j ACCEPT echo "iptables -nvL|grep -w $1 "; iptables -nvL|grep -w $1 echo "service iptables save"; service iptables save else echo "nothing to do"; fi 而要在服务端运行,得把脚本传过去,可以用下面的脚本。 #!/usr/bin/expect set dbip_addr [lindex $argv 0] set dbip_port [lindex $argv 1] set ip_addr [lindex $argv 2] set timeout 5 spawn scp -r open_firewall_dep.sh $dbip_addr:/home send "exit \r" expect eof spawn ssh $dbip_addr send "sh /home/open_firewall_dep.sh $ip_addr $dbip_port \r" expect eof 所以两个脚本各司其职, 在服务端运行的结果如下,如果配置存在,直接退出 # sh /home/open_firewall_dep.sh 10.2.10.18 1521 1 ip address is founded from firewall list nothing to do 如果没有配置防火墙,就需要配置一下 # sh /home/open_firewall_dep.sh 10.2.12.165 1528 0 ip address is founded from firewall list iptables -I INPUT -s 10.2.12.165 -p tcp -m multiport --dports 1528 -i eth0 -j ACCEPT iptables -nvL|grep -w 10.2.12.165 0 0 ACCEPT tcp -- eth0 * 10.2.12.165 0.0.0.0/0 multiport dports 1528 service iptables save Saving firewall rules to /etc/sysconfig/iptables: [ OK ] 然后大概花了十多分钟的时间,整个过程就完成了,剩下的几个手工配置相对来说就轻松很多,不会有混乱的感觉了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2015-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档