iptables
前提
如果学过CCNA,或者TCP/IP,Socket什么的就会很好理解,或者玩过路由器什么的
组件
- Tables
- Chains
- Rules
Tables
总共有一下5个表,表是链的容器
- Filter:对包进行过滤
- NAT:网络地址转换
- Mangle:对数据包进行修改
- Raw:一般是为了不再让iptables对数据包进行跟踪,提高性能
- Security:SELinux Tagging
Chains
总共有一下5个链,链是规则的容器
- PRE ROUNTING:
- 在数据包刚到达防火墙时、进行路由判断之前执行的规则、改变包的目的地址(DNAT功能)端口等
- INPUT
- 作用于所有目的地址是本机地址的数据包
- FORWARD
- 作用与转发向你电脑的包(与NAT表相关)
- OUTPUT
- 作用于所有原地址是本机地址的数据包
- POST ROUTING
- 在数据包离开防火墙时进行路由判断之后执行的规则、改变包的源地址
PRE ROUNTING | INPUT | FORWARD | OUTPUT | POST ROUTING | |
---|---|---|---|---|---|
路由决定 | √ | ||||
Raw | √ | √ | |||
连接Tracking | √ | √ | |||
Mangle | √ | √ | √ | √ | √ |
NAT(DNAT) | √ | √ | |||
路由决定 | √ | √ | |||
Filter | √ | √ | √ | ||
Security | √ | √ | √ | ||
NAT(SNAT) | √ | √ |
1 | Pre -> Input -> Forward -> Output |
- 目标地址为本机的包
graph LR PRE_ROUNTING --> INPUT
- 目标地址为其他主机的包
graph LR PRE_ROUNTING --> FORWARD --> POST_ROUTING
- 本机发出去的包
graph LR OUTPUT --> POST_ROUTING
Rules
规则决定那些类型的包,做什么事情(允许,拒绝),本质为一条指令设定的规则
1 | Usage: iptables -[ACD] chain rule-specification [options] |
- 例
1 | iptables -A INPUT -s 10.10.10.10 -j DROP |
Target
决定做什么事情
:就是一下的事情
- Terminating Targets
DROP
:丢弃(无作为)ALLOW
:允许Queue
:队列Reject
:拒绝(会带来安全隐患,别人知道你拒绝它了)Return
:返回User-Defined
:自定义
- Non-Terminating Targets
Continue the chain
:
工作流程
稍微做过权限管理的,大概都清楚怎么工作流程,对于一条链,规则从上到下(编号)依次匹配,匹配到后就立刻执行,不继续向下匹配,最后没有匹配的规则会执行默认规则。
常用指令
1 | iptables -t [table] -操作 [chain] 匹配 动作 |
-t
:指定表
- 操作
-A
: 添加(Append)-D
:删除(Delete)编号-I
:插入(Insert)-R
:替换(Replace)-C
:检查(Check)-L
:列出(List)-Z
:清零(Zero)-P
:策略(Policy)-E
:改名(Rename)-F
:清空(Flush)-X
:删除(Delete)-N
:新建(New)
- 匹配
-s
:指定源ip-d
:指定目标ip-p
:指定协议-i
:指定入网络接口-o
:指定出网络接口
- tcp
sport
dport
--tcp-flags
- 复杂
-m
-j
:Target
1 | # 如果不指定[chain], 一般操作Filter链 |
原理
iptables是Linux内核Netfilter的一个接口,相当于一个操作界面。
- 当一个数据包进入网卡时,数据包首先进入PREROUTING链, 内核根据数据包目的IP判断是否需要转发出去。
- 如果数据包就是进入本机的,数据包就会沿着图继续向上层协议栈流动,这时候,数据包将继续向上层协议栈流动。在它进入传输层之前,Netfilter 会设置一个名叫 INPUT 的“检查点”。到这里,数据包流入路径(Input Path) 结束。接下来,这个 数据包通过传输层进入用户空间,交给用户进程处理。而处理完成后,用户进程会 通过本机发出返回的 数据包。这时候,这个数据包就进入了流出路径(Output Path)。此时,数据包首先还是会经过主机的路由表进行路由。路由结束后,Netfilter 就会设置一个名叫 OUTPUT 的“检查点”。然后,在 OUTPUT 之后,再设置一个名叫 POSTROUTING“检查点”。在流出路径设置两个检查点的原因见下方黄色字体。
- 如果数据包是要转发出去的,且内核允许转发,在这种情况下,这个 数据包不会进入传输层,而是会继续在网络层流动,从而进入到转发路径 (Forward Path)。在转发路径中,Netfilter 会设置一个名叫 FORWARD 的“检查点”。而在 FORWARD“检查点”完成后,IP 包就会来到流出路径。而转发的 IP 包由于目的地已经确定,它就不会再经过路由,也自然不会经过 OUTPUT,而是会直接来到 POSTROUTING“检 查点”。