iptables

iptables #

Linux 的包过滤功能,即 Linux 防火墙, 它由 netfilteriptables 两个组件组成。

netfilter 组件位于内核空间,是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

iptables 组件是一种工具,位于用户空间,它使插入、修改和除去信息包过滤表中的规则变得容易。


iptables 是 linux 系统下用来配置 netfilter 子系统的一个 client tool

iptables 其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过 iptables 这个代理,将用户的安全设定执行到对应的 “安全框架” 中, 这个 “安全框架” 才是真正的防火墙,这个框架的名字叫 netfilter。

配套的常用命令有:

  • iptables: 对表、链、规则进行配置
  • iptables-save: dump 已配置的规则,可以用 > 重定向到一个文件中
  • iptables-restore: 从之前导出的 iptable 规则配置文件加载规则。

原理 #

  • 一个数据包进入网卡时,它首先进入 PREROUTING 链,内核根据数据包目的 IP 判断是否需要转发出去
  • 如果数据包就是进入本机的,它就会沿着图向下移动,到达 INPUT 链
  • 数据包到了 INPUT 链后,任何进程都会收到它。
  • 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD 链,
  • 然后到达 POSTROUTING 链输出。
  • 本机上运行的程序可以发送数据包,这些数据包会经 过 OUTPUT 链
  • 然后到达 POSTROUTING 链输出

状态 #

ESTABLISHED #

状态 ESTABLISHED 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。

INVALID #

INVALID 状态指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。

NEW #

状态 NEW 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。

RELATED 表示该信息包正在启动新连接,以及它与已建立的连接相关联。


规则 /rules #

  • 规则(rules)其实就是网络管理员预定义的条件,
  • 规则一般的定义为 “如果数据包头符合这样的条件,就这样处理这个数据包”。
  • 规则存储在内核空间信息包过滤表中,
  • 这些规则分别指定了**源地址、目的地址、传输协议(如 TCP、UDP、ICMP)和服务类型(如 HTTP、FTP 和 SMTP)**等。
  • 当数据包与规则匹配时,iptables 就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。
  • 配置防火墙的主要工作就是添加、修改和删除这些规则。

表 /tables #

这 5 张表的优先级从高到低是:raw、mangle、nat、filter、security。

  • iptables 的(chain)对应 netfilter 的 5 处钩子
  • iptables 的规则就是挂在 netfilter 钩子上的函数,用来修改数据包的内容或过滤数据包
  • iptables 的就是所有规则的 5 个逻辑集合

iptables 不支持用户自定义表。

Raw #

  • RAW 表 只使用在 PREROUTING 链和 OUTPUT 链上,因为优先级最高,

  • 从而可以对收到的数据包在连接跟踪前进行处理。

  • 一但用户使用了 RAW 表,在 某个链上,RAW 表处理完后,将跳过 NAT 表和 ip_conntrack 处理,

  • 即不再做地址转换和数据包的链接跟踪处理了.

Mangle #

  • 主要用于对指定数据包进行更改,
  • 在内核版本 2.4.18 后的 linux 版本中该表包含的链为:INPUT 链(处理进入的数据包),RORWARD 链(处理转发的数据包),OUTPUT 链(处理本地生成的数据包)POSTROUTING 链(修改即将出去的数据包),PREROUTING 链(修改即将到来的数据包)

NAT #

  • 主要用于网络地址转换 NAT,该表可以实现一对一,一对多,多对多等 NAT 工作,
  • iptables 就是使用该表实现共享上网的,
  • NAT 表包含了 PREROUTING 链(修改即将到来的数据包),POSTROUTING 链(修改即将出去的数据包),OUTPUT 链(修改路由之前本地生成的数据包)

Filter #

  • Filter 表是默认的表,

  • 如果没有指定哪个表,iptables 就默认使用 filter 表来执行所有命令,

  • filter 表包含了 INPUT 链(处理进入的数据包),RORWARD 链(处理转发的数据包),OUTPUT 链(处理本地生成的数据包)

  • 在 filter 表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改

security #

用于强制访问控制网络规则

表具有的链类型 #

规则名称 raw mangle nat filter security
PREROUTING
INPUT
OUTPUT
POSTROUTING
FORWARD

命令选项 #

命令选项用于指定 iptables 的执行方式,包括插入规则,删除规则和添加规则,如下表所示

短命令 长命令 说明
-P –policy 定义默认策略
-L –list 查看 iptables 规则列表
-A –append 在规则列表的最后增加 1 条规则
-I –insert 在指定的位置插入 1 条规则
-D –delete 从规则列表中删除 1 条规则
-R –replace 替换规则列表中的某条规则
-F –flush 删除表中所有规则
-Z –zero 将表中数据包计数器和流量计数器归零
-X –delete-chain 删除自定义链
-v –verbose 与 - L 他命令一起使用显示更多更详细的信息

链 /chains #

  • 当一个数据包到达一个链时,iptables 就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。
  • 如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则 iptables 将继续检查下一条规则,
  • 如果该数据包不符合链中任一条规则,iptables 就会根据该链预先定义的默认策略来处理数据包。

PREROUTING 链 #

内核根据数据包目的 IP 判断是否需要转发出去

INPUT 链 #

处理来自外部的数据

OUTPUT 链 #

处理向外发送的数据

FORWARD 链 #

将数据转发到本机的其他网卡设备上。

POSTROUTING 链 #


iptables 调用链 #


条件匹配 #

短命令 长命令
-i –in-interface 网络接口名 指定数据包从哪个网络接口进入
-o –out-interface 网络接口名 指定数据包从哪个网络接口输出
-p —proto 协议类型 指定数据包匹配的协议,如 TCP、UDP 和 ICMP 等
-s –source 源地址或子网 指定数据包匹配的源地址
–sport 源端口号 指定数据包匹配的源端口号
–dport 目的端口号 指定数据包匹配的目的端口号
-m –match 匹配的模块 指定数据包规则所使用的过滤模块

目标动作或跳转 #

ACCEPT、REJECT、DROP、REDIRECT 、MASQUERADE

还有 LOG、ULOG、DNAT、RETURN、TOS、SNAT、MIRROR、QUEUE、TTL、MARK


NAT #

DNAT #

公网 ip -> 内部地址

SNAT #

内部地址 -> 公网 ip


保存 iptables 修改 #

方法一:service iptables save

方法二:

  • 修改 /etc/sysconfig/iptables-config

  • 将里面的 IPTABLES_SAVE_ON_STOP=“no”, 改为 “yes”

  • 这样每次服务在停止之前会自动将现有的规则保存在 /etc/sysconfig/iptables   这个文件中去。


基础命令 #

iptables [ -t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]

iptables v1.4.21

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)

Commands:
Either long or short options are allowed.
  --append  -A chain		Append to chain
  --check   -C chain		Check for the existence of a rule
  --delete  -D chain		Delete matching rule from chain
  --delete  -D chain rulenum
				Delete rule rulenum (1 = first) from chain
  --insert  -I chain [rulenum]
				Insert in chain as rulenum (default 1=first)
  --replace -R chain rulenum
				Replace rule rulenum (1 = first) in chain
  --list    -L [chain [rulenum]]
				List the rules in a chain or all chains
  --list-rules -S [chain [rulenum]]
				Print the rules in a chain or all chains
  --flush   -F [chain]		Delete all rules in  chain or all chains
  --zero    -Z [chain [rulenum]]
				Zero counters in chain or all chains
  --new     -N chain		Create a new user-defined chain
  --delete-chain
            -X [chain]		Delete a user-defined chain
  --policy  -P chain target
				Change policy on chain to target
  --rename-chain
            -E old-chain new-chain
				Change chain name, (moving any references)
Options:
    --ipv4	-4		Nothing (line is ignored by ip6tables-restore)
    --ipv6	-6		Error (line is ignored by iptables-restore)
[!] --protocol	-p proto	protocol: by number or name, eg. `tcp'
[!] --source	-s address[/mask][...]
				source specification
[!] --destination -d address[/mask][...]
				destination specification
[!] --in-interface -i input name[+]
				network interface name ([+] for wildcard)
 --jump	-j target
				target for rule (may load target extension)
  --goto      -g chain
                              jump to chain with no return
  --match	-m match
				extended match (may load extension)
  --numeric	-n		numeric output of addresses and ports
[!] --out-interface -o output name[+]
				network interface name ([+] for wildcard)
  --table	-t table	table to manipulate (default: `filter')
  --verbose	-v		verbose mode
  --wait	-w [seconds]	maximum wait to acquire xtables lock before give up
  --wait-interval -W [usecs]	wait time to try to acquire xtables lock
				default is 1 second
  --line-numbers		print line numbers when listing
  --exact	-x		expand numbers (display exact values)
[!] --fragment	-f		match second or further fragments only
  --modprobe=<command>		try to insert modules using this command
  --set-counters PKTS BYTES	set the counter during insert/append
[!] --version	-V		print package version.

默认是 filter 表

iptables -L -n

iptables -t nat -L -n

教程 #

超级详细的 iptable 教程文档 #

常见 iptables 使用规则场景整理 #


本文访问量

本站总访问量

本站总访客数