追梦人博客Dream.ren

追梦人 Dream.ren

DNS服务器iptables防火墙简单配置


本文以Pure DNS主节点的iptables防火墙配置为例,简单介绍iptables的使用方法。怎么说呢,防治DDOS攻击是个世界性难题,不可能靠一个iptables就解决的,只能说能在一定程度上能缓解一下,给攻击者增加些门槛,并留下些日志文件方便日后针对性地防治。iptables是许多linux发行版自带的防火墙应用,安装就不再介绍了,本文主要介绍其简单的使用方法。
iptables默认表有INPUT、OUTPUT、FORWARD三个规则链,顾名思义,INPUT是用来控制流入到服务器里面的流量,主要就是依靠配置INPUT链来进行DDOS、CC防御,OUTPUT就是控制服务器向外发送数据的,FORWARD嘛,我也不懂是干嘛的,此外还有一个NAT规则表,可以用来配置端口映射、端口转发之类的操作。
先介绍下几个经常用到的命令吧。(Tips:双击命令可快速选中)

netstat -tunlp#查看当前服务器打开了哪些端口
iptables -nL --line-number#查看防火墙设置
iptables -D INPUT n#删除查询到的INPUT链中序号为n的规则
iptables -t nat -nL --line-number#查看NAT规则
iptables -t nat -D PREROUTING 1#删除查询结果中序号为1的PREROUTING链规则
iptables -F#清空防火墙配置
#保存配置(添加修改iptables规则后仅仅是临时生效,长期有效需保存当前配置)
service iptables save
#或者
iptables-save > /etc/sysconfig/iptables
chkconfig iptables on/off#设置iptables开机自启/不自启
service iptables restart#重启iptables

常用命令暂时就这些吧,接下来就是编写iptables的规则了。

注意:
1、无论如何请始终保证ssh端口可用,不然的话登录不了服务器后果可能很严重;
2、iptables是按顺序依次匹配的,只会执行第一次匹配到的非log操作,后面的是不会执行的,因此一定要注意规则的顺序。


iptables -I OUTPUT -j ACCEPT

功能:允许服务器本机对外访问。
解释:还用解释吗?就像防狼喷雾是用来防狼的而不是用来喷自己的一样~


iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

功能:允许本机对本机的访问。
解释:和上面一样,来不及解释了!


开启DNS服务端口

#对dns查询进行限速
#对udp查询限速
iptables -A INPUT -p udp --dport 53 -m recent --name dnspool --rcheck --seconds 4 --hitcount 20 -j LOG --log-prefix 'DNS-DDOS:' --log-ip-options
iptables -A INPUT -p udp --dport 53 -m recent --name dnspool --rcheck --seconds 4 --hitcount 20 -j DROP
iptables -A INPUT -p udp --dport 53 -m recent --name dnspool --set -j ACCEPT
#tcp查询同理
iptables -A INPUT -p tcp --dport 53 -m recent --name dnspool --rcheck --seconds 4 --hitcount 20 -j LOG --log-prefix 'DNS-DDOS:' --log-ip-options
iptables -A INPUT -p tcp --dport 53 -m recent --name dnspool --rcheck --seconds 4 --hitcount 20 -j DROP
iptables -A INPUT -p tcp --dport 53 -m recent --name dnspool --set -j ACCEPT
#NAT转发配置,将443、5353端口的请求转发到53端口
#echo "1" > /proc/sys/net/ipv4/ip_forward #若端口转发不工作,试试这句。
iptables -t nat -A PREROUTING -p udp -m multiport --dports 443,5353 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -p tcp --dport 5353 -j REDIRECT --to-ports 53

功能:对53端口进行限速,超速的包直接丢弃处理
解释:带LOG那一条是用来记录日志的,带DROP的那一条丢弃超速的数据包,成功坚持到ACCEPT规则的就放行并添加到name记录中;由于tcp的443端口被web服务占用,因此,NAT转发中去掉对443端口的tcp转发。


iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

功能:放行已建立连接的相关数据。
解释:比如临时打开22端口后登录ssh终端,再用防火墙关闭22端口的访问,ssh还是连接着的。只要不是新建立的连接都会被这条规则放行的。


开启WEB服务端口

#记录并拒绝在20秒内新建立tcp连接数超过12个的ip
iptables -A INPUT -p tcp -m recent --name webpool --rcheck --seconds 20 --hitcount 12 -j LOG --log-prefix 'DDOS:' --log-ip-options
iptables -A INPUT -p tcp -m recent --name webpool --rcheck --seconds 20 --hitcount 12 -j DROP
#开放80、443tcp端口
iptables -A INPUT -p tcp --dport 80 -m recent --name webpool --set -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m recent --name webpool --set -j ACCEPT

功能:和开启DNS端口那段类似。
解释:由于上面已经放行了非新建的连接,所以此处仅仅对新建连接有效;目前几乎所有浏览器对同一域名发起的最大并发连接数都不超过10,http2模式下仅仅为1。经测试,一般用户20秒内不会新建立12个连接,就像你现在正常地浏览到了这篇博文一样。


动态开启ssh端口

iptables -A INPUT -p icmp --icmp-type 8 -m length --length 1052 -j LOG --log-prefix "SSHOPEN: "
iptables -A INPUT -p icmp --icmp-type 8 -m length --length 1052 -m recent --set --name sshopen --rsource -j ACCEPT
iptables -A INPUT -p tcp --dport 22 --syn -m recent --rcheck --seconds 3600 --name sshopen --rsource -j ACCEPT

功能:ping方式动态开启ssh端口,ping为icmp协议,假设数据长度(长度当秘钥)1024字节,IP报文头部为20字节,ICMP头部8字节,1024+28=1052即为上面1052的由来,1052请修改为自己需要的其他数值并牢记。
解释:第二行表示接受长度为1052的ping报文,并记录ip到sshopen中,第三行表示,对sshopen中的ip开放22端口,并在3600秒内有效。
食用姿势:

ping -s 1024 host #Linux下解锁22端口,host为服务器ip或域名
ping -l 1024 host #Windows下解锁22端口,host为服务器ip或域名

当你确认上面规则无误后,再执行下面这句,将INPUT链缺省值修改为DROP,即除了iptables允许的访问,其他的入网流量统统丢弃处理。

iptables -P INPUT DROP

如果你执行这句后ssh突然断开,或者ping完主机后没法连接到ssh终端,那么恭喜你,去服务器控制台使用网页版命令行工具service iptables stop或者重启机器吧。
一切无误后记得保存下规则,方法在上面,这就是Pure DNS当前的iptables规则,iptables需针对性配置,上述规则仅供参考。
整个过程至此结束~

评论回复

  1. 回复 Woshiluo

    新加的代码格式很厉害的样子,不过对于没有主机的我看懂了这篇文章也没啥用 :mrgreen:

  2. 回复 姜辰

    你这玩意好复杂啊

  3. 回复 匿名

    请问您网站主页上的多首背景音乐是怎么实现添加的呢?谢谢

1 + 8 =

回到顶部