iptables 简介和原理
我们先来了解以下社么是防火墙
防火墙: 隔离功能, 工作在网络或主机边缘, 对进出网络或主机的数据包基于一定的规则检查, 并在匹配某规则时由规则定义的行为进行处理的一组功能的组件, 基本上的实现都是默认情况下关闭所有的通过型访问, 只开放允许访问的策略
[ 防火墙的本质是对报文 (包) 进行过滤, 通过过滤器对报文 (包) 按照特征来进行匹配, 将匹配到的报文 (包) 进行处理, 以此来进行过滤]
在 Linux 中真正实现防火墙功能的是 netfilter, 它是一个抽象的框架, 提供了一套 hook 函数的管理机制, 并以此来对数据包进行管理. iptables 是用来在用户空间编写防火墙规则的工具, 用户通过 iptables 以系统调用的方式来管理 netfilter.
在内核中的五个 hook function(INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING), 这五个 hook function 被放在数据包流过协议栈的五个关键点, 以此来对数据包进行检测和处理, 而这五个 hook function 向用户开放, 用户不能直接对内核中的 hook function 进行操作, 但用户可以通过一个命令工具 iptables 向其写入规则, 以系统调用的方式来将规则发送给 hook function.
以下是刚刚提到的五个 hook function:
NF_IP_PRE_ROUTING: 刚刚进入网络层的数据包通过此点(刚刚进行完版本号, 校验 和等检测), 源地址转换在此点进行; IP_Input.c 中 IP_Rcv 调用;
NF_IP_LOCAL_IN: 经路由查找后, 送往本机的通过此检查点, INPUT 包过滤在此点进行, IP_local_deliver 中调用;
NF_IP_FORWARD: 要转发的包通过此检测点, FORWORD 包过滤在此点进行;
NF_IP_POST_ROUTING: 所有马上便要通过网络设备出去的包通过此检测点, 内置的目的地址转换功能 (包括地址伪装) 在此点进行;
NF_IP_LOCAL_OUT: 本机进程发出的包通过此检测点, OUTPUT 包过滤在此点进行.
了解完五个 hook function, 我们再来看看 iptables 的组成
iptables 由五个表和五个链以及一些规则组成
hook function 在执行规则时会一次性执行多条规则, hook 执行的多条规则又按照所处的 hook 分为五个链, 可以理解为 hook 所执行的为链, 按照链中的规则从上至下以此执行. 再把这些链按对数据包的操作或者功能分类, 这样每个功能下会含有多个链, 这样的一个功能类称为一个表, 每个 hook function 中以链为单位存放. 五个表中不是所有表都拥有五个链.
简单的来说 hook function 是框架, 链是这个框架的内容, 而表是链功能的划分. 表和 hook function 是两个不同维度的东西.
接下来我们具体讨论以下表和链
五个表 table
filter: 过滤规则表, 根据预定义的规则过滤符合条件的数据包
nat:network address translation 地址转换规则表
mangle: 修改数据标记位规则表
raw: 关闭 NAT 表上启用的连接跟踪机制, 加快封包穿越防火墙速度
security:(用户的自定义表)用于强制访问控制 (Mac) 网络规则, 由 Linux 安全模块 (如 SELinux) 实现
优先级由高到低的顺序为: security -->raw-->mangle-->nat-->filter
五个内置链 chain
INPUT-- 进来的数据包应用此规则链中的策略
OUTPUT-- 外出的数据包应用此规则链中的策略
FORWARD-- 转发数据包时应用此规则链中的策略
PREROUTING-- 对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理)
POSTROUTING-- 对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
每个表所含有的链
filter: 过滤器, 防火墙 (INPUTE,FORWARD,OUTPUT)
nat:network address translation(PREPOUTING,INPUTE,OUTPUT,POSTROUTING)
mangle: 修改报文(PREROUTING,INPUTE,FORWARD,OUTPUT,POSTROUTING)
raw: 连接追踪功能(PREOUTING,OUTPUT)
了解完这些组成, 我们来看一下 iptables 具体是如何运作的
当数据包 (报文) 进入主机后会有三种情况:
流入本机: PREROUTING --> INPUT-->用户空间进程?
从外界到达防火墙的数据包, 先被 PREROUTING 规则链处理 (是否修改数据包地址等), 之后会进行路由选择(判断该数据包应该发往何处), 如果数据包的目标主机是防火墙本机(比如说 Internet 用户访问防火墙主机中的 web 服务器的数据包), 那么内核将其传给 INPUT 链进行处理(决定是否允许通过等), 通过以后再交给系统上层的应用程序(比如 Apache 服务器) 进行响应.
流出本机: 用户空间进程 -->OUTPUT--> POSTROUTING?
防火墙本机向外部地址发送的数据包 (比如在防火墙主机中测试公网 DNS 服务器时), 首先被 OUTPUT 规则链处理, 之后进行路由选择, 然后传递给 POSTROUTING 规则链(是否修改数据包的地址等) 进行处理.
转发: PREROUTING --> FORWARD --> POSTROUTI
来自外界的数据包到达防火墙后, 首先被 PREROUTING 规则链处理, 之后会进行路由选择, 如果数据包的目标地址是其它外部地址 (比如局域网用户通过网关访问 QQ 站点的数据包), 则内核将其传递给 FORWARD 链进行处理(是否转发或拦截), 然后再交给 POSTROUTING 规则链(是否修改数据包的地址等) 进行处理.
知道了原理那我们该如何配置 iptables 呢, 这就是 iptables 的规则
iptables 规则
规则 rule: 根据规则的匹配条件尝试匹配报文, 对匹配成功的报文根据规则定义的处理动作作出处理, 规则分为匹配条件和处理动作两部分
注意: 规则要添加在链上, 才生效
匹配条件: 默认为与条件, 同时满足
基本匹配: IP
扩展匹配: 通过复杂高级功能匹配 (端口, TCP 的 Flags(SYN,ACK 等)), 扩展匹配又分为隐式扩展(tcp,udp,icmp) 和显式扩展(必须指定扩展模块进行 的扩展)
处理动作: 称为 target, 跳转目标
内建处理动作: ACCEPT(通过),DROP(拒绝并丢弃数据包, 不回应),REJECT(拒绝但 回应对方拒绝的信息),SNAT,DNATMASQUERADE,MARK,LOG...
自定义处理动作: 自定义 chain, 利用分类管理复杂情形
iptables 规则语法
iptables [选项]
-t : 指定表(不写默认 filter 表)
规则管理
-A:add, 向规则链中添加规则(放在规则链的最后)
-I:insert, 向规则链中插入规则(如果不指定第几条则默认插入到第一条)
-D :delete, 删除规则链中的某规则
-R :replace, 替换规则链中的某规则
-F:flush, 清空指定规则(不指定规则将清空正条连)
-Z:zero, 归零计数器(iptables 的每条规则都有两个计数器, 匹配到的报文的个数和匹配到的所有报文的大小)
规则查看
-L:list, 列出一个链的规则, 不指定链则会显示表中的全部规则(默认为 filter)
-n:numberic, 以数字格式显示地址和端口号(不进行反解析, 会大幅提高列出速, port 为端口号, source 和 destination 为 ip, 如果不写 n 选项则会尝试将 port 解析为服务名, source 和 destination 解析为域名, 降低效率)
-v:verbose, 详细信息(pkts 匹配到的报文数总和, bytes 匹配到的报文包的大小总和, target 匹配成功后采取的措施, port 匹配的协议, opt 匹配的选项, in 匹配的报文流入网卡, out 匹配的报文流出网卡, source 匹配报文来源, destination 匹配报文的目标地址)
-vv: 更详细的信息
--line-number: 显示规则编号
-S : 命令格式显示链上规则
链管理
-N:new, 新建一个自定义链
-X: 删除一个空且为被引用的链
-P:policy, 指定一个链的默认规则(在没条链后的括号内)
-E: 重命名一个链
规则保存
iptables-save: 将当前 iptables 配置打印到当前终端, 我们一般会将其导入到文件中, 以便以后直接导入, 建议导入到 / etc/sysconfig/iptables
完整命令:
存 iptables-save>/etc/sysconfig/iptables
取 iptables-save</etc/sysconfig/iptables
具体格式:
- iptables [-t table] {
- -A|-C|-D
- } chain rule-specification
- iptables [-t table] -I chain [rulenum] rule-specification
- iptables [-t table] -R chain rulenum rule-specification
- iptables [-t table] -D chain rulenum
- iptables [-t table] -S [chain [rulenum]]
- iptables [-t table] {
- -F|-L|-Z
- } [chain [rulenum]] [options...]
- iptables [-t table] -N chain
- iptables [-t table] -X [chain]
- iptables [-t table] -P chain target
- iptables [-t table] -E old-chain-name new-chain-name
** 关于 rule-specification
rule-specification 是对规则的定义, 其写法为 rule-specification = [matches...] [target]
其中 matches 是匹配模式, target 为处理方式
matches:
matches 分为基本匹配和扩展匹配, 使用扩展匹配时需指定要加载的扩展模块, 扩展匹配又分为隐式扩展和显式扩展, 隐式扩展在使用 - p 选项指明了特定的协议时, 无需再用 - m 选项指明扩展模块, 可以自动匹配扩展机制, 不需要手动加载扩展模块
-m matchname 指定扩展模块(基本匹配和隐式扩展时省略)
基本匹配:
-s: 指定源 IP 地址或网段
-d: 指定目标 IP 地址或网段
-i: 报文流入的接口(网卡), 只能应用于数据报文流入环节, 只应用于 INPUT,FORWARD,PREROUTING 链
-o: 报文流出的接口(网卡), 只能应用于数据报文流出的环节, 只应用于 FORWARD,OUTPUT,POSTROUTING 链
扩展匹配:
-m 指定扩展的模块
隐式扩展:(主要是协议, 在指定协议时自动匹配模块, 因此不需要指定模块)
-p: 指定协议, 可使用数字如 0(all)
-p tcp
--sport, 匹配报文来源端口
--dport, 匹配报文目标端口
--tcp--flags mask comp, 匹配标志位(mask 可以为 SYN,ACK,FIN,RST 等用 "," 分隔, comp 为标志位必须为 1 的标志位
-p udp
--sport, 匹配报文来源端口
--dport, 匹配报文目标端口
-p icmp
--icmp-type, 匹配响应报文的类型(请求报文为 8, 回应报文为 0)
显示扩展:
-m multiport(用于匹配离散的 ip 只能用于 tcp/udp 协议, 因此要配合 - p udp 或 - p tcp 一起使用)
--deports, 同时匹配多个离散的目标端口("," 隔开 "21:24" 表示 21 号端口到 24 号端口, 在 multiport 中算一个整体, 当作一个端口)
--sports, 同时匹配多个离散的来源端口
-m iprange(用来范围匹配 ip)
--src-range, 匹配一个来源 ip 地址范围(例如 172.1.1.1-172.1.1.100)
--dst-range, 匹配一个目标 ip 地址范围
-m string(用来匹配字符串)
--algo, 选用一个匹配的算法 bm 或 kmp
--string, 指定匹配的字符串, 字符串需用引号引起
-m time(用来匹配时间, 使用时注意检查时区)
--timestart 指定起始时间(02:00:00)
--timestop 指定结束时间
--weekdays 指定一星期的某几天(1,7 为周一和周日)
--monthdays 指定一个月中的某几天(10,20 为 10 号和 20 号)
--datestart 指定起始日期(2018-01-01)
--datestop 指定结束日期
-m connlimit(限制每个 ip 链接到 sever 的数量)
--connlimit-above 链接数大于时匹配
--connlimit-upto 链接数下雨等于时匹配
--connlimit-mask 限制对应掩码的 ip 链接数量(24)
-m limit(限制数据包进入的速度)
--limit 匹配一定时间内的包(10/minute 每分钟 10 个包, 这样设置后 iptables 会每 6s 匹配一个包)
- -m Mac(匹配 Mac 地址)
- --Mac-source
- -m state(匹配报文当前状态, 此扩展比较占用资源)
--state 匹配报文状态
NEW: 新发出请求; 连接追踪信息库中不存在此连接的相关信息条目, 因此, 将其识别为第一次发出的请求
ESTABLISHED:NEW 状态之后, 连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED: 新发起的但与已有连接相关联的连接, 如: ftp 协议中的数据连接与命令连接之间的关
INVALID: 无效的连接, 如 flag 标记不正确
UNTRACKED: 未进行追踪的连接如 raw 表中关闭
target:
ACCEPT: 允许数据包通过
DROP: 直接丢弃数据包, 不进行任何回应
REJECT: 拒绝数据包通过, 但给予回应
RETURN: 返回调用链
REDIRECT: 端口重定向
LOG: 记录日志
MARK: 做防火墙标记
DNAT: 目标地址转换
SNAT: 源地址转换
MASQUERADE: 地址伪装
来源: http://www.bubuko.com/infodetail-2825113.html