iptables 防火墙详解
iptables 概述
Linux 内核 2.4 版本以后,包过滤机制是 netfilter,管理防火墙规则的命令工具是 iptables
- netfilter 指的是 Linux 内核中实现包过滤防火墙的内部结构,不以程序和文件的形式存在,属于 内核态。
- iptables 指的是管理 Linux 防火墙的命令工具,属于 用户态
iptables 的规则表 和 链
iptables 采用了表和链的分层结构,每个规则表相当于内核空间的一个容器,根据处理数据包的时机不同,表容器内包含不同的规则链。共有四个规则表,五个规则链。
- raw 表 包含 OUPUT PREROUTING
- mangle 表 包含 五个规则链 PREROUTING POSTROUTING INPUT OUTPUT FORWARD
- nat 表 包含 PREROUTING POSTROUTING OUTPUT
- filter 表 包含 INPUT FORWARD OUTPUT
iptables 的基本语法格式
参考网址:http://man.linuxde.net/iptables
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
常用命令选项简介
- -A 在指定链的末尾添加(--append) 一条新的规则
- -D 删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则
- -I 在指定链中插入(--insert)一条新的规则,若未指定插入位置,则默认在链的开头插入
- -L 列出(--list)指定链中所有规则进行查看,若未指定列名,则列出表中所有链的内容
- -F 清空(--flush)指定链中的所有规则,若未指定链名,则清空表中所有链的规则
- -P 设置指定链的默认策略(--policy)
- -n 使用数字形式显示输出结果,如显示主机的 IP 地址而不是主机名
- -v 查看规则表时显示详细的信息
- --line-numbers 查看规则表时,同时显示规则在链中的顺序号
条件匹配
- 通用条件匹配
- 协议匹配:用于检查数据包的网络协议,允许使用的协议名包含在 /etc/protocols 文件中,常见的为 tcp udp icmp all. iptables 命令中使用 “-p 协议名的形式”
iptables -I INPUT -p icmp -j ACCEPT # 允许 ping 主机操作
2. 地址匹配:用于检查数据包的 IP 地址,网络地址。在 iptables 命令中 -s "源地址" -d “目标地址”
iptables -I FORWARD -s 192.168.0.0/24 -j ACCEPT
3. 网络接口匹配:用于检查数据包从防火墙的哪一个接口进入或离开。 在 iptables 中使用 “-i 网络接口名” 和 “-o 网络接口名”
iptables -I INPUT -i eth1 -s 192.168.0.0/16 -j DROP
- 隐含(implicit)条件匹配
1. 端口匹配: 用于检查数据包的TCP 或 UDP 端口号。需要以 “-p tcp ” 和 “-p udp” 匹配为前提。在 iptables 命令中使用 “--sport 源端口” 和 "--sport 目标端口" 的形式
iptables -I INPUT -p tcp --dport 80 -s 192.168.0.0/24 -j ACCEPT # 端口范围用: 例如: 20:1024
2. TCP 标记匹配:用于检查数据包的 TCP 标记位 (--tcp-flags) ,需要以 "-p tcp" 匹配为前提。 在 iptables 命令中使用 "--tcp-flags 检查范围,被设置的标记" 的形式
参考博客:http://blog.chinaunix.net/uid-22780578-id-3346350.html
iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK,SYN -j REJECT # 拒绝访问防火墙本机的数据包
iptables -I INPUT -i eth1 -p tcp --tcp-flags ! SYN,RST,ACK,SYN -j ACCEPT # 允许响应防火墙TCP 请求的数据包进入
3. ICMP 类型匹配:用于检查 ICMP 数据包的类型(--icmp-type), 需要以 "-p icmp" 匹配为前提,在 iptables 命令中使用 "--icmp-type ICMP 类型" 的形式
ICMP 类型: Echo-Request (数字代码为 8) Echo-Reply (数字代码为 0) Destination-Unreachable (数字代码为3) 分别对应 ICMP 协议的请求,回显,目标不可达数据.
经典案例:禁止其他主机 ping 防火墙主机,允许从防火墙上 ping 其他主机. (有个模块叫 state,也可以实现类似功能)
iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP
iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type Destination-Unreachable -j ACCEPT
- 显示(Explicit)条件匹配 # 在 iptables 命令中使用 "-m 模块关键字" 的形式调用显示匹配
1. mac 地址匹配: 主要用于检查数据包的源 MAC 地址,在 iptables 命令中使用 "-m mac" "--mac-source MAC 地址" 的形式
iptables -A FORWARD -m mac --mac-source MAC 地址 -j DROP
2. 多端口匹配:检查数据包的源端口,目标端口,用于匹配多个不连续的端口号。在 iptables 命令中使用 "--dports 端口列表" 和 "--sports 端口列表" 的形式,模块使用 "-m multiport"
iptables -A INPUT -p tcp -m multiport --dport 80,443,22, 1024:1080 -j ACCEPT
3. 多 IP 地址匹配:检查数据包的源地址,目标地址时,用于匹配一段范围内的 IP 地址,在 iptables 命令中使用 "--src-range IP 地址范围" 或者 "--dst-range IP 地址范围" 的形式, 模块使用 -m iprange
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.100.1-192.168.100.50 -j DROP
4. 状态匹配: 基于iptables 的状态跟踪机制,检查数据包的连接状态。在 iptables 命令中使用 "--state 数据包状态" 的形式,模块使用 -m state 。
常见数据包状态: NEW (与任何连接无关的) ESTABLISHED(响应请求或者已经建立连接的) RELATED (与已有连接有相关性的,如 FTP 数据连接)
案例:
拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
iptables -A INPUT -p tcp -m state --state NEW -J DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED RELATED -j ACCEPT
设置防火墙策略:开放本机 80,443,22 端口,放行外部主机发往服务器其他端口的应答数据包,将其他入站数据包均予以丢弃处理
iptables -I INPUT -p tcp -m multiport --dport 80,443,22 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
数据包控制
- ACCEPT 允许数据包通过
- DROP 直接丢弃数据包,不给出任何回应信息
- REJECT 拒绝数据包通过,必要时会给数据发送端一个响应信息
- LOG 在 /var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
LOG 配置案例:记录 SSH 访问数据.
iptables -I INPUT -p tcp --dport 22 -j LOG # 个人建议不要记录
iptables -I INPUT -p tcp --dport 22 -m limit --limit 2/minute --limit-burst 8 -j LOG # 限制日志记录频率
导入导出防火墙规则
- 防火墙配置文件: /etc/sysconfig/iptables
- iptables-save:此命令会将当前内存中的防火墙规则输出到终端
- iptables-save > /etc/sysconfig/iptables : 保存内存中的防火墙规则到配置文件
- iptables-restore < /etc/sysconfig/iptables :从配置文件中导入防火墙规则到内存
编写防火墙脚本注意事项
- 脚本中要善于应用变量
- 开启路由转发功能:/sbin/sysctl -w net.ipv4.ip_forward=1 或者 echo 1 > /proc/sys/net/ipv4/ip_forward # 在防火墙脚本中设置
- 清空用户自定义的链,清空已经存在的防火墙规则,设置 filter 表的默认策略
防火墙高级应用
SNAT 策略
- SNAT 策略简介:更改数据包的源 IP 地址,典型应用是局域网共享上网 ,pptp vpn 访问外网
- 策略应用详解
SNAT 只能用于 nat 表的 POSTROUTING 链,使用 iptables 命令设置 SNAT 策略时,需要结合 "--to-soure IP 地址"
案例:局域网段 192.168.1.0/24, 采用 SNAT 策略,使用共享 IP 上网
- 开启路由转发功能 : vim /etc/sysctl.conf 添加 net.ipv4.ip_forward = 1 然后执行 sysctl -p
- iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 共享IP
- iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE # 动态获取共享 IP , 多用于 ADSL 环境
DNAT 策略
- DNAT策略简介:更改数据包的目标 IP 地址,典型应用是通过一个 IP, 不同端口,访问局域网服务器
- 策略应用详解
DNAT 只能用于 nat 表的 PREROUTING 链和 OUTPUT 链中。使用 iptables 命令设置 SNAT 策略时,需要结合 "--to-destination IP 地址"
案例: 访问网关 80 端口的数据包,将目标地址更改为网站服务器的内网地址
- 开启路由转发功能 : vim /etc/sysctl.conf 添加 net.ipv4.ip_forward = 1 然后执行 sysctl -p
- iptables -t nat -A PREROUTING -i eth0 -d 公网 IP -p tcp --dport 80 -j DNAT --to-destination 内网地址 或 内网地址:端口号

浙公网安备 33010602011771号