本文索引

  • 介绍
  • 链和表
  • 数据包传输过程
  • 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步骤的操作全部使用默认策略修改数据包

  1. 目标主机为本机,只用到2种链:PREROUTING、INPUT

步骤



说明

1

网络上的数据包通过接口准备进入本机

2

mangle

PREROUTING

mangle数据包,修改内部信息

3

nat

PREROUTING

主要用作DNAT,不要做过滤操作[选择步骤]

4

路由判断(是否转发)

5

mangle

INPUT

本地接收前,mangle数据包信息

6

filter

INPUT

数据包过滤

7

到达本机

  1. 源主机为本机,也只用到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

离开接口,在网络上传输数据包

  1. 本机转发数据包,使用到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匹配(常见几种)
  1. 通用匹配

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

匹配一个被分片的包的第二片或之久的部分

  1. 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的指定包

  1. UDP匹配,必须有-p udp

match

举例

说明

--sport

iptables -A INPUT -p udp --sport 22

基于udp包的源端口匹配,可以设置连续的端口,也可以加!取反

--dport

iptables -A INPUT -p udp --dport 22

基于udp包的目的端口匹配

  1. ICMP匹配

match

举例

说明

--icmp-type

iptables -A INPUT -p icmp --icmp-type 8

根据ICMP类型匹配包,8代表echo request(ping请求)

  1. 显式匹配(常见有用的几种)
  • 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数据包时返回什么信息

参考引用
  1. "iptables tutorial 1.2.2" by Oskar Andreasson https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
  2. "Iptables 指南 1.1.19" by sllscn https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html
  3. ICMP类型表: https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#ICMPTYPES

本文为上述引用中的2个iptables指南(应该说是1个,作者Oskar Andreasson)的部分基础知识。