本文索引
- 介绍
- 链和表
- 数据包传输过程
- mangle表
- nat表
- filter表
- 数据包状态
- TCP连接
- UDP连接
- ICMP连接
- 网络不可达
- 主机不可达
- 复杂协议连接(以FTP为例)
- 主动模式
- 被动模式
- 规则基础
- command
- option选项
- match匹配(常见几种)
- 通用匹配
- TCP匹配
- UDP匹配
- ICMP匹配
- 显式匹配
- limit匹配
- mac地址匹配
- 多端口匹配
- 状态匹配
- targets/jumps
- ACCEPT
- DNAT
- SNAT
- DROP
- MASQUERADE
- REJECT
- 参考引用
介绍
本文的iptables由yum安装完成,不需要编译安装。需要编译安装的,可以参考本文末尾引用的 ==iptables指南==,里面有详细的说明,随便说下,本文基本取自该指南!另外由于时间问题,文中的部分知识已经不适用当前,这里只参考借鉴。
链和表
数据包传输过程
mangle表的规则设定比较复杂,所以下列的mangle步骤的操作全部使用默认策略修改数据包
- 目标主机为本机,只用到2种链:PREROUTING、INPUT
步骤 | 表 | 链 | 说明 |
1 | 网络上的数据包通过接口准备进入本机 | ||
2 | mangle | PREROUTING | mangle数据包,修改内部信息 |
3 | nat | PREROUTING | 主要用作DNAT,不要做过滤操作[选择步骤] |
4 | 路由判断(是否转发) | ||
5 | mangle | INPUT | 本地接收前,mangle数据包信息 |
6 | filter | INPUT | 数据包过滤 |
7 | 到达本机 |
- 源主机为本机,也只用到2种链:OUTPUT、POSTROUTING
步骤 | 表 | 链 | 说明 |
1 | 本机发送数据包 | ||
2 | 路由判断:源地址、接口等 | ||
3 | mangle | OUTPUT | mangle数据包 |
4 | nat | OUTPUT | 做DNAT操作[选做步骤] |
5 | filter | OUTPUT | 过滤数据包 |
6 | mangle | POSTROUTING | 对即将离开本机的数据包进行mangle操作 |
7 | nat | POSTROUTING | 做SNAT操作[选择步骤] |
8 | 离开接口,在网络上传输数据包 |
- 本机转发数据包,使用到3中链:PREROUTING、FORWARD、POSTROUTING
步骤 | 表 | 链 | 说明 |
1 | 网络上的数据包经过本机接口准备进入 | ||
2 | mangle | PREROUTING | 进入前先mangle数据包信息 |
3 | nat | PREROUTING | 根据情况选择执行DNAT操作 |
4 | 路由判断 | ||
5 | mangle | FORWARD | 特殊情况下使用,转发阶段mangle数据包 |
6 | filter | FORWARD | 对转发的数据包执行过滤操作 |
7 | mangle | POSTROUTING | 数据包出去前mangle信息 |
8 | nat | POSTROUTING | 执行SNAT包括masquerade伪装[可选操作] |
9 | 离开本机接口传输 |
mangle表(比较难设置,了解下)
mangle表常见的几种操作
- TOS:设置数据包的服务类型域
- TTL:修改数据包的生存时间
- MARK:设置特殊标记
- SECMARK(1.1.19版本无):设置安全的标记
- CONNSECMARK(1.1.19版本无):从完整链接或单个数据包内拷贝安全标记说明
nat表(主要是前3项)
- DNAT:目标地址转换,修改目的地址,重定向至指定ip
- SNAT:源地址转换,可以很好的隐藏源地址
- MASQUERADE:ip伪装,查找匹配数据包可用ip地址,适用于对动态分配的ip地址
filter表
iptables设置的主要部分,对数据包进行匹配过滤,具体配置本文后面会逐渐点出。
数据包状态(状态机)
- NEW:处理的连接的第一个数据包,例如tcp的SYN包
- ESTABLISHED:只要是对发出信息的应答都是
- RELATED:与ESTABLISHED连接相关的连接
- INVALID:无法识别的数据包,一般被DROP
- UNTRACKED:在raw表内被执行NOTRACK的标记的数据包
TCP连接
TCP三次握手时的数据包状态
步骤 | C(客户端)/S(服务器) | 防火墙(状态) |
1 | C --> SYN | NEW |
2 | S --> SYN/ACK | ESTABLISTED |
3 | C --> ACK | ESTABLISED |
TCP关闭连接
步骤 | C(客户端)/S(服务器) | 防火墙(状态) |
1 | C --> FIN | ESTABLISED |
2 | S --> ACK | ESTABLISED |
3 | S --> FIN | ESTABLISED |
4 | C --> ACK | CLOSED |
(在最后一个ACK包发出前,2端的连接不会关闭)
UDP连接
UDP是无状态的,没有连接的建立和关闭过程,其数据包是无序的!
客户端发送UDP包,经过防火墙时,此时状态位==NEW==;该包被服务器端接收,状态自然变为==EATABLISED==。
ICMP连接
ICMP也是无状态的,它用于控制而不是建立连接。
步骤 | 客户端/服务器 | 防火墙(状态) |
1 | S --> ICMP echo请求包 | NEW |
2 | C --> ICMP echo应答包 | ESTABLISED |
3 | 连接建立,客户端处理数据 |
应答包必须符合一定的标准,连接状态才是ESTABLIED
网络不可达
目标网络存在问题,导致返回网络不可达信息包
步骤 | 客户端/服务器 | 防火墙(状态) |
1 | C --> SYN | NEW |
2 | S --> ICMP net unreachable | RELATED |
3 | 客户端终止连接 |
主机不可达
目标主机不可达,服务器端发送ICMP Net Prohibited包,连接状态位related。
步骤 | 客户端/服务器 | 防火墙(状态) |
1 | C --> UDP包 | NEW |
2 | S --> ICMP Net Prohibited | RELATED |
3 | 客户端终止连接 |
复杂协议连接(以FTP为例)
FTP协议数据传输首先要建立一个控制连接;控制连接有2个模式:主动模式和被动模式。
- 主动模式
客户端==主动==发送端口和ip信息给服务器端,同时打开该端口;服务器接收到该数据包后打开自己的20端口建立与客户端端口的连接,之后就可以传输数据了!主动连接建立阶段的数据包状态如下:
步骤 | C/S | 防火墙 |
1 | S --> SYN | RELATED |
2 | C --> ACK/SYN | ESTABLISHED |
3 | S <-- ACK | 数据传输连接确立 |
- 被动模式
建立控制连接的过程与主动连接一致;。数据传输建立:客户端发送服务器有关数据要求,服务器发送数据连接的相关端口和ip,客户端依此建立连接,接收数据。被动连接阶段的数据包状态如下:
步骤 | C/S | 防火墙 |
1 | C --> SYN | RELATED |
2 | S --> ACK/SYN | ESTABLISHED |
3 | C <-- ACK | 被动连接建立 |
规则基础
规则是决定如何处理一个包的语句。语法格式如下:
iptables [-t table] command [match] [target/jump]
command
command | 举例 | 说明 |
-A | iptables -A INPUT ... | 在链未添加规则 |
-D | iptables -D INPUT --dport 80 -j DROP | 在所选链中删除规则 |
-R | iptables -R INPUT 1 -s 192.168.0.1 -j DROP | 替换所选链的指定行的规则 |
-I | iptables -I IUPUT 1 --dport 80 -j ACCEPT | 在所选链的指定规则序号前插入,不指定默认为序号1 |
-L | iptables -L INPUT | 显示所选链的所有规则 |
-F | iptables -F INPUT | 清空所选链的规则 |
-Z | iptables -Z INPUT | 清空指定链的所有计数器 |
-N | iptables -N allowed | 创建一个新链 |
-X | iptables -X allowed | 删除指定链 |
-P | iptables -P INPUT DROP | 设置链的默认策略 |
-E | iptables -E allowed disallowed | 重命名链 |
option选项
- -nvL 查看链内规则的详细信息
- --line-numbers 显示链中规则的序号
match匹配(常见几种)
- 通用匹配
match | 举例 | 说明 |
-p | iptables -A INPUT -p tcp | 匹配指定的协议 |
-s | iptables -A INPUT -s 102.168.1.1 | 匹配源地址的数据包 |
-d | iptables -A INPUT -d 192.168.1.1 | 匹配目标地址的数据包 |
-i | iptables -A INPUT -i eth0 | 匹配数据包进入时的接口 |
-o | iptables -A FORWRAD -o eth0 | 匹配数据包出去时的接口 |
-f | iptables -A INPUT -f | 匹配一个被分片的包的第二片或之久的部分 |
- TCP匹配,必须有-p tcp前提
match | 举例 | 说明 |
--sport | iptables -A INPUT -p tcp --sport 22 | 基于tcp包的源端口匹配,可以设置连续的端口,也可以加!取反 |
--dport | iptables -A INPUT -p tcp --dport 22 | 基于tcp包的目的端口匹配 |
--tcp-flags | iptables -p tcp --tcp-flags SYN | 匹配tcp的指定包 |
- UDP匹配,必须有-p udp
match | 举例 | 说明 |
--sport | iptables -A INPUT -p udp --sport 22 | 基于udp包的源端口匹配,可以设置连续的端口,也可以加!取反 |
--dport | iptables -A INPUT -p udp --dport 22 | 基于udp包的目的端口匹配 |
- ICMP匹配
match | 举例 | 说明 |
--icmp-type | iptables -A INPUT -p icmp --icmp-type 8 | 根据ICMP类型匹配包,8代表echo request(ping请求) |
- 显式匹配(常见有用的几种)
- limit匹配
match | 举例 | 说明 |
--limit | iptables -A INPUT -m limit --limit 3/hour | 设置单位时间内可以匹配包数,默认1小时3次 |
--limit-burst | iptables -A INPUT -m limit --limit-burst 5 | 单位时间最多匹配的包数 |
- mac地址匹配
基于包的mac源地址匹配包
match | 举例 | 说明 |
--mac-source | iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 |
地址格式:XX:XX:XX:XX:XX:XX;也可以使用!取反
- 多端口匹配
必须配合-m multiport使用
注:同一个规则内不能同时使用标准端口匹配和多端口匹配如 --sport 1024:63353 -m multiport 22,53,80
- 状态匹配 必须配合 ==-m state==使用,常用的几个状态:RELATED,ESTABLISHED
例:iptables -A INPUT -m state --state RELATED,ESTABLISHED
targets/jumps
决定匹配的数据包如何处理,语法:-j target
- ACCEPT target 接收数据包
- DNAT target
将接收的数据包的目的地址修改为本地ip;设置多个ip可以实现负载均衡!
选项 | --to-destination |
例子 | iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 194.236.50.155-194.236.50.160:1024-32000 |
说明 | 指定源地址和端口 |
- SNAT target
多个主机共享一个Internet连接,将所有从本地出去的包的源地址哪位Internet的地址。
选项 | --to-source |
例子 | iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 192.168.1.1-192.168.1.10 |
说明 | 指定要写入ip头的地址,即转发到的ip地址 |
- DROP target 丢弃数据包
- MASQUERADE target (只能用于nat表的POSTROUTING链)
选项 | --to-ports |
例子 | iptables -t nat -A POSTROUTING -p tcp -j MASQUERADW --to-ports 1024-31000 |
说明 | 在指定TCP或UDP的前提下,设置外出包能使用的端口 |
- REJECT target
选项 | --reject-with |
例子 | iptables -A FORWARD -p tcp --dport 22 -j REJECT --reject-with tcp-reset |
说明 | 指定reject数据包时返回什么信息 |
参考引用
- "iptables tutorial 1.2.2" by Oskar Andreasson https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
- "Iptables 指南 1.1.19" by sllscn https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html
- ICMP类型表: https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#ICMPTYPES
本文为上述引用中的2个iptables指南(应该说是1个,作者Oskar Andreasson)的部分基础知识。