简介
- netfilter/iptables组成Linux平台下的包过滤防火墙
- iptables和netfilter的关系
- iptables只是Linux防火墙的管理工具而已,真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构
数据包传输过程
iptables-001.jpg
- 数据包进入网卡,先进入PREROUTING链
- 内核根据数据包目的IP进行路由
- 若数据包目的是本机,那么进入INPUT链
- 若数据包目的不是本机,则进入FORWARD,然后经POSTROUTING出去
- 本机发出数据先进入OUTPUT链,然后经POSTROUTING链出去
表和链
iptables-002.jpg
- iptables内置了4个表
- filter表
- 过滤数据包
- 内核模块:iptable_filter
- INPUT,FORWARD,OUTPUT
- nat表
- 网络地址转换(IP,端口)
- 内核模块:iptable_nat
- PREROUTING,OUTPUT,POSTROUTING
- mangle表
- 修改数据包服务类型,TTL,可以配置路由实现QOS
- 内核模块:iptable_mangle
- PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
- raw表
- 决定数据包是否被状态跟踪机制处理
- 内核模块:iptable_raw
- PREROUTING,OUTPUT
- 优先级
- raw > mangle > nat > filter
- 规则链
- 符合规则,处理;不符合,传递下去;全不符合,默认策略处理
- 入站数据流向
- PREROUTING规则链处理(是否修改数据包地址等)
- 路由选择(判断数据包该发往何处)
- 如果数据包目标主机是防火墙本机(比如Internet用户访问防火墙主机中的Web服务器),那么内核将其传给INPUT链进行处理(决定是否允许通过等)
- 过了INPUT以后交给系统上层应用(比如Apache服务器)
- 转发数据流向
- PREROUTING规则链处理
- 路由选择
- 如果数据包目标地址是外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截)
- POSTROUTING规则链(是否修改数据包地址等)
- 出站数据流向
- OUTPUT规则链处理
- 路由选择
- POSTROUTING规则链(是否修改数据包的地址等)
iptables配置
iptables-003.jpg
iptables-004.jpg
-A # 链末尾添加(append)一条规则
-D # 删除(delete)链中某一规则,可按规则序号或内容
-I # 链中插入(insert)一条规则,默认在第一行
-R # 修改、替换(replace)链中某一规则,可按规则序号或内容
-L # 列出(list)链中所有的规则
-E # 重命名用户自定义链,不改变链本身
-F # 清空(flush)
-N # 新建一条用户自定义链(new-chain)
-X # 删除表中用户自定义链(delete-chain)
-P # 设置链的默认策略(policy)
-Z # 清零所有表的所有链的字节和数据包计数器
-n # 使用数字形式(numeric)显示输出结果
-v # 查看表详细信息(verbose)
-V # 查看版本(version)
-h # 获取帮助(help)
- 防火墙处理数据包方式
- ACCEPT:允许通过
- DROP:直接丢弃,不给任何回应
- REJECT:拒绝通过,必要时会给数据发送端一个响应
- LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
- 语法格式
- iptables [-t 表名] command [链名] [条件匹配] [-j 目标动作或跳转]
规则保存与恢复
- iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载
# 指定文件
iptables-save > /etc/sysconfig/iptables
# 默认文件
service iptables save
- 计算机启动时,rc.d下的脚本将用命令iptables-restore调用该文件,从而恢复规则
例子
# 删除INPUT链第1条规则
iptables -D INPUT 1
# 拒绝所有ICMP协议数据
iptables -I INPUT -p icmp -j REJECT
# 允许转发除ICMP协议外的所有数据
iptables -A FORWARD -p ! icmp -j ACCEPT
# 拒绝192.168.1.11数据,放行192.168.0.0/24网段数据
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
# 丢弃从eth1进入的私网数据
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
# 仅允许202.13.0.0/16网段通过22端口访问
iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# 开放20-1024端口
iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
# 允许转发来自192.168.0.0/24网段的DNS解析请求
iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
# 禁外ping本机,允许本机ping外
iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
iptables -I INPUT -p icmp --icmp-type Destination-Unreachable -j ACCEPT
# 禁止转发来自00:0c:29:27:55:3F的数据
iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP
# 开放20,21,25,110,1250:1280端口
iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
# 禁止转发来自192.168.1.20-192.168.1.99数据
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
# 禁止转发新建连接的非sync信号
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
# 只允许已存在连接或与连接相关的数据
# 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
# 开放20,21,80,20450:20480
# 开放其他端口的应答数据包
iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
网友评论