WenRou's Blog
Linux上iptables防火墙的实例教程
2016-1-19 温柔哥


1、安装iptables防火墙

如果没有安装iptables需要先安装,CentOS执行:


yum install iptables 


Debian/Ubuntu执行:


apt-get install iptables 


2、清除已有iptables规则


iptables -F
iptables -X
iptables -Z


3、开放指定的端口

-A和-I参数分别为添加到规则末尾和规则最前面。


#允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -i lo -j ACCEPT

# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT

# 允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#允许访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

#允许FTP服务的21和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行

#允许ping
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

#禁止其他未允许的规则访问
iptables -A INPUT -j REJECT #(注意:如果22端口未加入允许规则,SSH链接会直接断开。)
iptables -A FORWARD -j REJECT


4、屏蔽IP

如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。


#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP

#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP

#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP

#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP


5、添加IP至白名单


#将IP为8.8.8.8对本机所有端口的所有方式的连接添加进白名单
iptables -A INPUT -s 8.8.8.8 -j ACCEPT

#将IP为43.241.50.200对本机80端口的TCP方式的连接添加进白名单
iptables -A INPUT -s 43.241.50.200 -p tcp --dport 80 -j ACCEPT


6、防御各类攻击


#防御SYN轻量级攻击
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT

#防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

#用Iptables抵御DDOS (参数与上相同)
iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

#通过另一种想法防御syn,ddos攻击
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

#防御CC
#控制单个IP的最大并发连接数
#允许单个IP的最大连接数为 30
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT
#默认iptables模块不包含connlimit,需要自己单独编译加载

#控制单个IP在一定的时间(比如60秒)内允许新建立的连接数
#单个IP在60秒内只允许最多新建30个连接
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT


巧用Recent模块加固Linux安全

(1)通过recent模块可以防止穷举猜测Linux主机用户口令,通常可以通过iptables限制只允许某些网段和主机连接Linux机器的22/TCP端口,如果管理员IP地址经常变化,此时iptables就很难适用这样的环境了。通过使用recent模块,使用下面这两条规则即可解决问题


#iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --name SSH --rsource -j DROP
#iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name SSH --rsource -j ACCEPT


应用该规则后,如果某IP地址在一分钟之内对Linux主机22/TCP端口新发起的连接超过4次,之后的新发起的连接将被丢弃。



(2)通过recent模块可以防止端口扫。


#iptables -A INPUT -m recent --update --seconds 60 --hitcount 20 --name PORTSCAN --rsource -j DROP
#iptables -A INPUT -m recent --set --name PORTSCAN --rsource -j DROP


应用该规则后,如果某个IP地址对非Linux主机允许的端口发起连接,并且一分钟内超过20次,则系统将中断该主机与本机的连接。



7、查看已添加的iptables规则


 #iptables -L -n 


v:显示详细信息,包括每条规则的匹配包数量和匹配字节数

x:在 v 的基础上,禁止自动单位换算(K、M)

n:只显示IP地址和端口号,不将ip解析为域名



8、删除已添加的iptables规则



将所有iptables以序号标记显示,执行:


 #iptables -L -n --line-numbers 


比如要删除INPUT里序号为8的规则,执行:


#iptables -D INPUT 8 


9、iptables的开机启动及规则保存

CentOS上可能会存在安装好iptables后,iptables并不开机自启动,可以执行一下:


 #chkconfig iptables on 


将其加入开机启动。



CentOS上可以执行:


 #service iptables save 


保存规则。



另外更需要注意的是Debian/Ubuntu上iptables是不会保存规则的。

需要按如下步骤进行,让网卡关闭是保存iptables规则,启动时加载iptables规则:

创建/etc/network/if-post-down.d/iptables 文件,添加如下内容:


#!/bin/bash 


iptables-save > /etc/iptables.rules

执行:chmod +x /etc/network/if-post-down.d/iptables 添加执行权限。

创建/etc/network/if-pre-up.d/iptables 文件,添加如下内容:


#!/bin/bash
iptables-restore < /etc/iptables.rules


执行:chmod +x /etc/network/if-pre-up.d/iptables 添加执行权限。



关于更多的iptables的使用方法可以执行:iptables --help或网上搜索一下iptables参数的说明。

发表评论:
昵称

邮件地址 (选填)

个人主页 (选填)

内容