iptables 防火墙规则详解

1,148 阅读4分钟

防火墙类型

  • 包过滤防火墙:包过滤是 IP 层实现,包过滤根据数据包的源 IP、目的 IP、协议类型(TCP/UDP/ICMP)、源端口、目的端口等包头信息及数据包传输方向灯信息来判断是否允许数据包通过。
  • 应用层防火墙:也称为应用层代理防火墙,基于应用层协议的信息流检测,可以拦截某应用程序的所有封包,提取包内容进行分析。有效防止 SQL 注入或者 XSS(跨站脚本攻击)之类的恶意代码。
  • 状态检测防火墙:结合包过滤和应用层防火墙优点,基于连接状态检测机制,将属于同一连接的所有包作为一个整体的数据流看待,构成连接状态表(通信信息,应用程序信息等),通过规则表与状态表共同配合,对表中的各个连接状态判断。

iptables介绍

iptables 是 Linux 下的配置防火墙的工具,用于配置 Linux 内核集成的 IP 信息包过滤系统,使增删改查信息包过滤表中的规则更加简单。

iptables 分为四表五链,表是链的容器,链是规则的容器,规则指定动作。

四表

表名 作用
filter 用于包过滤
nat 网络地址转发
mangle 对特定数据包修改
raw 不做数据包链路跟踪

五链

链路名 作用
INPUT 本机数据包入口
OUTPUT 本机数据包出口
FORWARD 经过本机转发的数据包
PREROUTING 防火墙之前,修改目的地址(DNAT)
POSTROUTING 防火墙之后,修改源地址(SNAT)

表中的链

filter INPUT/OUTPUT/FORWARD
nat PREROUTING/POSTROUTING/OUTPUT
mangle PREROUTING/POSTROUTING/INPUT/OUTPUT/FORWARD
raw PREROUTING/OUTPUT

命令格式

iptables [-t table] 命令 [chain] 匹配条件 动作
命令 描述
-A, append 追加一条规则
-I, insert 插入一条规则,默认链头,后跟编号,指定第几条
-D, delete 删除一条规则
-F, flush 清空规则
-L, list 列出规则
-P, policy 设置链缺省规则
-m, module 模块,比如state、multiport
-i 入口网卡
-o 出口网卡
-s 源地址
-d 目标地址
-p 协议类型
--sport 源端口
--dport 目的端口

动作

动作 描述
ACCEPT 允许数据包通过
DROP 丢弃数据包不做处理
REJECT 拒绝数据包,并返回报错信息
SNAT 一般用于nat表的POSTROUTING链,进行源地址转换
DNAT 一般用于nat表的PREROUTING链,进行目的地址转换
MASQUERADE 动态源地址转换,动态IP时使用

模块

模块 描述
state 包状态,有四个:NEW/RELATED/ESTABLISHED/INVALLD
mac 源MAC地址
limit 包速率限制
multiport 多端口,以逗号分隔
iprange 端口范围,以逗号分隔

示例

iptables -F
    # 清空表规则,默认filter表

iptables -t nat -F
    # 清空nat表
    
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    # 允许TCP的22端口访问
    
iptables -I INPUT -p udp --dport 53 -j ACCEPT
    # 允许 UDP 的 53 端口访问,插入在第一条
iptables -A INPUT -p tcp --dport 22:25 -j ACCEPT
    # 允许端口范围访问

iptables -D INPUT -p tcp --dport 22:25 -j ACCEPT
    # 删除这条规则

iptables -A INPUT -p tcp -m multiport --dports 22,80,8080 -j ACCEPT
    # 允许多个 TCP 端口访问

iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
    # 允许 192.168.1.0 段 IP 访问

iptables -A INPUT -s 192.168.1.10 -j DROP
    # 对 1.10 数据包丢弃

iptables -A INPUT -i eth0 -p icmp -j DROP
    # eth0 网卡 ICMP 数据包丢弃,也就是禁 ping

iptables -A INPUT -i lo -j ACCEPT
    # 允许来自 lo 接口,如果没有这条规则,将不能通过 127.0.0.1 访问本地服务

iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 30 -j REJECT
    # 限制并发连接数,超过 30 个拒绝

iptables -I INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
    # 限制每个 IP 每秒并发连接数最大 3 个

iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

iptables –t nat -A POSTROUTING -s [内网 IP 或网段] -j SNAT --to [公网 IP]
    # iptables 服务器作为网关时,内网访问公网

iptables –t nat -A PREROUTING -d [对外 IP] -p tcp --dport [对外端口] -j DNAT --to [内网 IP:内网端口]
    # 访问 iptables 公网 IP 端口,转发到内网服务器端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
    # 本地 80 端口转发到本地 8080 端口

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    # 允许已建立及该链接相关联的数据包通过

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o pppo -j MASQUERADE
    # ASDL 拨号上网

iptables -P INPUT DROP
    # 设置 INPUT 链缺省操作丢弃所有数据包,只要不符合规则的数据包都丢弃。注意要在最后设置,以免把自己关在外面!