netfilter/iptables
(简称 iptables
)组成 Linux 平台下的包过滤防火墙网络
iptables
组件是一种工具,也称为用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易ssh
netfilter
组件也称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集tcp
安装 iptables
工具
yum -y install iptables iptables-services
重启:systemctl restart iptables
保存:service iptables save
rest
iptables + -t 表名 + 规则/链管理参数 + 匹配参数 + 动做类型参数日志
# 选择表 -t # 对指定表进行操做(必须是 raw、nat、filter、mangle 中的一个。如没有指定则默认为 filter表) # 规则管理 -A # 在指定规则链的末尾加入新规则 -I # 在指定规则链的头部加入新规则(默认在第一行添加) -D # 删除指定链中的一条规则(可按规则序号和内容删除) -R # 修改、替换指定链中的某一条规则(可按照规则序号和内容替换) # 链管理 -P # 设置指定链默认策略 -N # 新建一条用户本身定义的规则链 -X # 删除指定表中用户自定义的规则链 -E # 重命名用户定义的链(不改变链自己) -Z # 将全部表的全部链的字节和数据包计数器清零 # 规则链 INPUT # 处理入站的数据包 OUTPUT # 处理出站的数据包 FORWARD # 处理转发的数据包 PREROUTING # 处理入站的路由规则 POSTROUTING # 处理出站的路由规则 # 匹配(加感叹号 “!“表示这个目标除外(加感叹号后需加空格后在加匹配项)) -s # 匹配来源地址 IP/MASK -d # 匹配目标地址 -i # 网卡名称(匹配从这块网卡流入的数据) -o # 网卡名称(匹配从这块网卡流出的数据) -m # 使用扩展模块 -p # 匹配协议(如:tcp、udp、icmp) tcp # 扩展选项:--source-port (扩展选项可用 iptables -p tcp -h 查看) udp # 扩展选项:--source-port (扩展选项可用 iptables -p icmp -h 查看) icmp # 可用扩展: --icmp-type (可用扩展可用 iptables -p icmp -h 查看) --dport 80 # 匹配目标端口 80 --sport 81 # 匹配来源端口 81 # 指定动做类型 -j # 指定动做类型 动做类型: ACCEPT # 容许数据包经过 REJECT # 拒绝数据包经过(必要时会发送响应信息) DROP # 直接丢弃(不给出任何回应) QUEUE # 中断过滤程序,将封包放入队列,交由其它程序处理 RETURN # 中止当前链中的后续规则,并返回到调用链(the calling chain)中 REDIRECT # 在本机上作端口映射 DNAT # 改变数据包的目的地址 SNAT # 改变数据包的源地址 MASQUERADE # SNAT 的一种特殊形式,适用于动态、临时会变的 IP 上(只能用户 nat 表的 POSTROUTING 链) LOG # 在 /var/log/messages 文件中记录日志信息,而后在将数据包传递给下一条规则 # 查看/清空 规则 -L # 列出指定链中全部的规则 -n # IP地址和端口会一数字的形式打印 -v # 详细输出 -F # 清空规则链
使用方法:iptables + -m + 扩展模块名
可用扩展选项可用:iptables + -m + 扩展名 + -h
查看code
# 每分钟容许经过 5 个 icmp 包(默认为 3/小时,秒:/sec 分钟:/minute 小时:/hour 天:/day) iptables -A INPUT -p icmp -m limit --limit 5/minute -j ACCEPT # 每分钟容许经过 5 个 icmp 包,最多不超过 10 个 iptables -A INPUT -p icmp -m limit --limit 5/minute --limit-burst 10 -j ACCEPT
# 匹配 22,端口(最多可指定15个端口) iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
# 匹配指定范围内的地址 iptables -A INPUT -p tcp -m iprange --src-range 192.168.1.0-192.168.1.111 --dport 22 -j ACCEPT
# 当服务端返回数据报文检查到有关键字 “test" 时,则丢弃该报文(可以检测到报文应用层中的字符串 注:该条规则需添加到 OUTPUT 链) iptables -A OUTPUT -p tcp --dport 80 -m string --algo kmp --string "test" -j DROP
# 限制同一 IP 最多同时 10 个 http 链接 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT # 限制每组 C 类 IP 最多同时 10 个 http 链接 iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP # 限制指定网段的 IP 最多同时 10 个 http 链接 iptables -A INPUT -s 192.168.1.0/24 -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
--name # 设置列表名称 --resource # 源地址 --redest # 目的地址 --seconds # 指定时间内(单位:秒) --hitcount # 匹配次数 --set # 将地址添加进列表,并更新信息(包含地址加入的时间戳) --rcheck # 匹配列表中的源地址(以第一个匹配计算时间) --update # 相似 rcheck(以最后一个匹配计算时间) --remove # 在列表里删除相应地址(后面接列表名称及地址) # 将访问的主机记录到 test 列表,并放行 iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --set -j ACCEPT # 如访问的主机在 test 列表有记录则限制 80 端口 60 秒 内每一个 IP 只能发起 20 个新的链接,超过则记录日志(日志前缀为 DDOS:) iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --rcheck --seconds 60 --hitcount 20 -j LOG --log-prefix 'DDOS:' --log-ip-options # 如访问的主机在 test 列表有记录则限制 80 端口 60 秒 内每一个 IP 只能发起 20 个新的链接,超过则丢包 iptables -A INPUT -p tcp --dport 80 --syn -m recent --name test --rcheck --seconds 60 --hitcount 20 -j DROP
NEW:新创建一个会话 ESTABLISHED:已创建的链接 RELATED:有关联关系的链接 INVALID:没法识别的链接 # 放行 ssh 的首次链接状态 iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT # 放行有关联的链接跟已创建的链接 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
规则表提供特定的功能(内置了4个表),相似用户组,每一个组都有不一样的功能,而且都有对应的用户(规则链)blog
filter # 负责过滤功能(内核模块:iptables_filter) nat # 负责网络地址转换功能(内核模块:iptable_nat) mangle # 拆解、修改、封装报文(内核模块;iptable_mangle) raw # 决定数据包是否被状态跟踪机制处理内核(内核模块:iptable_raw)
规则表优先顺序(从左往右):raw <--- mangle <--- nat <--- filter
队列
规则表对应的规则链:ip
raw 表:PREOUTING、OUTPUT mangle 表:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING nat 表:PREROUTING、INPUT、OUTPUT、POSTROUTING filter 表:INTPUT、FORWARD、OUTPUT
规则链是规则的集合。对特定的数据包设置相应的规则(读取规则链时是按照从上往下的顺序)
INPUT # 处理入站的数据包 OUTPUT # 处理出站的数据包 FORWARD # 处理转发的数据包 PREROUTING # 数据包进入路由表前 POSTROUTING # 数据包进入路由表后
入站顺序(从左往右):PREROUTING <--- INPUT
出站顺序(从左往右):OUTPUT <--- POSTROUTING
转发顺序(从左往右):PREROUTING <--- FORWARD <--- POSTROUTING
iptables -L # 列出全部规则 iptables -L -nv # 查看详细信息(IP 跟 端口会以数字形式显示) iptables -t nat -L # 列出 nat 表中的全部规则 iptables -t nat -L -nv # 查看详细信息(IP 跟 端口会以数字形式显示) iptables -F # 清除全部规则(如不指定表,则默认表为 filter) iptables -t nat -D INPUT 1 # 删除 nat 表 INPUT 链下的第一条规则
# 在 nat 表中开放 80 端口 iptables -t nat -A INPUT -p tcp --dport 80 -j ACCEPT
# 容许 192.168.1.0/24 网段的主机访问 iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 容许 192.168.2.0/24 网段的主机访问本机的 80 端口 iptables -A INPUT -p all -s 192.168.2.0/24 --dport 80 -j ACCEPT
# 指定 IP 范围 iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE # 指定端口范围 iptables -t nat -A INPUT -p tcp --dport 90:100 -j ACCEPT
# 当别的主机访问本地 80 端口时会被重定向到 8080 端口 iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# 禁 Ping iptables -A INPUT -p icmp -j DROP # 禁 Ping iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP # 禁止 MAC 地址为 00:11:22:33:44:55 的主机访问 iptables -A INPUT -m mac --mac-source 00:11:22:33:44:55 -j DROP # 禁止转发 MAC 地址为 00:11:22:33:44:55 的主机的数据 iptables -A FORWARD -m mac --mac-source 00:11:22:33:44:55 -j DROP