一.问题情况
由于习惯使用iptables防火墙,但是又由于iptables对动态域名解析支持不好,只有在iptables的规则reload的时候可以把域名解析的IP存入规则,如果后续域名解析IP变更了.iptables不能动态的获得域名的解析.
二.解决办法
centos7默认是firewalled防火墙,先关闭firewalled防火墙.
1 2 3 |
systemctl stop firewalld systemctl disable firewalld systemctl mask firewalld |
安装ipset和iptables
1 2 3 4 5 6 7 |
yum install iptables-services yum install ipset ipset-service #开启ipset自动保存 vim /etc/sysconfig/ipset-config IPSET_SAVE_ON_STOP="no" 改 IPSET_SAVE_ON_STOP="yes" |
创建ipset的ip列表合集
1 2 3 4 5 6 7 8 9 10 |
ipset create whitelist hash:net hashsize 4096 maxelem 1000000 iptables规则添加: -A INPUT -m set --match-set whitelist src -j ACCEPT ipset create blacklist hash:net hashsize 4096 maxelem 1000000 iptables规则添加: -A INPUT -m set --match-set blacklist src -j DROP #ipset列表创建完最好执行一次保存命令,防止重启后找不到ipset列表合集造成iptables启动失败 ipset save |
开启iptables和ipset的服务并设置开机启动
1 2 3 4 5 |
systemctl start iptables.service systemctl enable iptables.service #ipset服务如果不设置开机启动,也会造成iptables启动失败 systemctl start ipset systemctl enable ipset |
以下脚本为使用域名解析添加IP白名单的脚本(黑名单同理请自行修改)
1 2 |
touch /root/ipset-whitelist.txt vim /root/ipset-whitelist.sh |
ipset-whitelist.sh内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#!/bin/sh #读取旧IP oldip=$(cat /root/ipset-whitelist.txt) #获取新IP(修改域名www.1987619.com为所需域名) newip=$(ping www.1987619.com -c 1 | sed '1{s/[^(]*(//;s/).*//;q}') if [ "${newip}" = "" ]; then #如果获取新IP为空,直接退出 exit; else if [ "${oldip}" = "${newip}" ]; then #旧新IP一致退出 exit; else #记录新IP echo ${newip} > /root/ipset-whitelist.txt #添加ipset新白名单 /usr/sbin/ipset add whitelist ${newip} #删除ipset旧白名单 /usr/sbin/ipset del whitelist ${oldip} fi fi |
第一次执行由于没有旧IP会提示ipset删除失败忽略即可.后面就可以定时执行了.比如5分钟执行一次
1 2 3 |
crontab -e */5 * * * * sh /root/ipset-whitelist.sh |
这样iptables防火墙就可以动态的根据域名解析IP来进行ipset规则的判断了.