[学习笔记] - iptables

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
2
3
4
5
6
7
8
9
10
Usage: iptables -[ACD] chain rule-specification [options]
iptables -I chain [rulenum] rule-specification [options]
iptables -R chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LS] [chain [rulenum]] [options]
iptables -[FZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 如果不指定[chain], 一般操作Filter链

# 清除所有规则 --flush
iptables –F [chain]
# 删除用户自定义的链 --delete-chain
iptables –X [chain]
# 链的计数器清零
iptables –Z [chain [rulenum]]
# 详细输出带编号的所有规则
iptables -L -n -v
# 默认拒绝
iptables -P INPUT DROP

# 新建名为LOGGING的链
iptables -N LOGGING
# 将所有来自INPUT链中的数据包跳转到LOGGING链中
iptables -A INPUT -j LOGGING
# 为这些包自定义个前缀,命名为”IP Tables Packet Dropped”
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IP Tables Packet Dropped: " --log-level 7
# 丢弃这些数据包
iptables -A LOGGING -j DROP

原理

iptables是Linux内核Netfilter的一个接口,相当于一个操作界面。

  • 当一个数据包进入网卡时,数据包首先进入PREROUTING链, 内核根据数据包目的IP判断是否需要转发出去。
  • 如果数据包就是进入本机的,数据包就会沿着图继续向上层协议栈流动,这时候,数据包将继续向上层协议栈流动。在它进入传输层之前,Netfilter 会设置一个名叫 INPUT 的“检查点”。到这里,数据包流入路径(Input Path) 结束。接下来,这个 数据包通过传输层进入用户空间,交给用户进程处理。而处理完成后,用户进程会 通过本机发出返回的 数据包。这时候,这个数据包就进入了流出路径(Output Path)。此时,数据包首先还是会经过主机的路由表进行路由。路由结束后,Netfilter 就会设置一个名叫 OUTPUT 的“检查点”。然后,在 OUTPUT 之后,再设置一个名叫 POSTROUTING“检查点”。在流出路径设置两个检查点的原因见下方黄色字体。
  • 如果数据包是要转发出去的,且内核允许转发,在这种情况下,这个 数据包不会进入传输层,而是会继续在网络层流动,从而进入到转发路径 (Forward Path)。在转发路径中,Netfilter 会设置一个名叫 FORWARD 的“检查点”。而在 FORWARD“检查点”完成后,IP 包就会来到流出路径。而转发的 IP 包由于目的地已经确定,它就不会再经过路由,也自然不会经过 OUTPUT,而是会直接来到 POSTROUTING“检 查点”。

参考