iptables 是一个配置 Linux 内核 防火墙 的命令行工具,是 netfilter 项目的一部分。术语 iptables 也经常代指该内核级防火墙。iptables 可以直接配置,也可以通过许多 前端 和 图形界面 配置。iptables 用于 ipv4,ip6tables 用于 ipv6。
iptables 可以检测、修改、转发、重定向和丢弃 IPv4 数据包。过滤 IPv4 数据包的代码已经内置于内核中,并且按照不同的目的被组织成 表 的集合。表 由一组预先定义的 链 组成,链 包含遍历顺序规则。每一条规则包含一个谓词的潜在匹配和相应的动作(称为 目标),如果谓词为真,该动作会被执行。也就是说条件匹配。iptables 是用户工具,允许用户使用 链 和 规则。
下图简要描述了网络数据包通过 iptables 的过程:
下载 iptables 并启用
iptables 是主要的 Linux 防火墙工具,但也有例外,例如在 CentOS 7.x 默认的防火墙是 firewalld
如何给 CentOS 7.x 上 iptables?教程实例如下:
首先要关闭 firewalld
systemctl stop firewalld.service
systemctl mask firewalld
systemctl disable firewalld.service
下载 iptables 并启用
yum -y install iptables-services
systemctl restart iptables.service
systemctl enable iptables.service
清除已有 iptables 规则
iptables -F
iptables -X
iptables -Z
重置规则
使用这些命令刷新和重置 iptables 到默认状态:
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X
iptables -t security -F
iptables -t security -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
开放指定的端口
- 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
屏蔽 IP
如果只是想屏蔽 IP 的话,会在“开放指定的端口”可以直接跳过
# 屏蔽单个 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
添加 IP 至白名单
# 将 IP 为 8.8.8.8 对本机所有端口的所有方式的连接添加进白名单
iptables -A INPUT -s 8.8.8.8 -j ACCEPT
#将 IP 为 45.123.45.123 对本机 80 端口的 TCP 方式的连接添加进白名单
iptables -A INPUT -s 45.123.45.123 -p tcp --dport 80 -j ACCEPT
防御各类攻击
# 防御 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
查看已添加的 iptables 规则
iptables -L -n
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M)
n:只显示 IP 地址和端口号,不将 ip 解析为域名
删除已添加的 iptables 规则
将所有 iptables 以序号标记显示,执行:
iptables -L -n
--line-numbers
比如要删除 INPUT 里序号为 7 的规则,执行:
iptables -D INPUT 7
iptables 的开机启动及规则保存
CentOS 上可能会存在安装好 iptables 后,iptables 并不开机自启动,可以执行一下:
chkconfig iptables on
将其加入开机启动。
CentOS 6.x 上可以执行:
service iptables save
CentOS 7.x 上可以执行:
service iptables save