iptables #
Linux 的包过滤功能,即 Linux 防火墙,
它由 netfilter
和 iptables
两个组件组成。
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 #
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
iptables 是一个非常强大且复杂的工具,用于在 Linux 上设置、维护和检查 IPv4 数据包过滤规则。它拥有许多参数和选项,允许用户精确控制网络流量。以下是一些主要的 iptables 参数和选项:
主要命令选项
-A, --append:向链末尾添加一条或多条规则。
-D, --delete:删除一条或多条规则。
-I, --insert:向指定位置插入一条或多条规则。
-R, --replace:替换指定位置的规则。
-L, --list:列出链中的所有规则。
-F, --flush:删除链中的所有规则。
-Z, --zero:将链中所有规则的计数器归零。
-N, --new-chain:创建一个新的链。
-X, --delete-chain:删除一个空链。
-P, --policy:为链设置默认策略(ACCEPT、DROP 等)。
-E, --rename-chain:重命名链。
匹配选项
-p, --protocol:协议(tcp, udp, icmp 等)。
-s, --source:来源地址。
-d, --destination:目标地址。
--sport, --source-port:源端口(用于 tcp 和 udp)。
--dport, --destination-port:目标端口(用于 tcp 和 udp)。
-i, --in-interface:输入网卡接口。
-o, --out-interface:输出网卡接口。
-m, --match:加载额外的匹配模块。
目标选项
-j, --jump:跳转到指定的目标(如 ACCEPT, DROP, REJECT, LOG 等)。
--to-ports:用于 REDIRECT 目标的端口转发。
--to-destination:用于 DNAT 目标的地址转发。
--to-source:用于 SNAT 目标的地址转发。
专用于 NAT 表的选项
--to-ports:用于 REDIRECT 和 MASQUERADE 目标,指定改写目标端口。
--to-destination:用于 DNAT,指定目的地址和端口。
--to-source:用于 SNAT 和 MASQUERADE,指定源地址。
专用于控制日志记录的选项
--log-prefix:指定日志条目的前缀字符串。
--log-level:指定日志记录级别。
其他
-t, --table:指定要操作的表(如 filter, nat, mangle, raw)。
这只是 iptables 功能的一个概览,每个选项都有其详细用法和上下文。iptables 也支持通过扩展和模块来增强功能,如 conntrack、state 等,这些可以用来执行更复杂的条件匹配。通过组合这些选项和参数,您可以创建强大且灵活的网络策略来保护和管理您的网络环境。
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。