iptables 并不是真正意义上的防火墙,我们可以理解为一个客户端工具,用户通过ipatbles这个客户端,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter。 哦,也就是给门上面安装密码、指纹、人脸识别之类的,你符合我的要求,才能进去!!!

netfilter才是防火墙真正的安全框架,netfilter位于内核空间。

iptables是一个命令行工具,位于用户空间,通过这个命令行工具来操作netfilter。

安卓iptables路由 android iptables详解_NAT

根据上图,我们能够想象出某些常用场景中,报文的流向:

到本机某进程的报文:PREROUTING --> INPUT

由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING

由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

I. IPTABLES 表和链

IPTables 有以下 4 个内置表。


说明

filter表

负责过滤功能,防火墙;内核模块:iptables_filter

nat表

network address translation,网络地址转换功能;内核模块:iptable_nat

mangle表

拆解报文,做出修改,并重新封装 的功能;iptable_mangle

raw表

关闭nat表上启用的连接追踪机制;iptable_raw

iptables为我们定义了4张"表",当他们处于同一条"链"时,执行的优先级如下。
优先级次序(由高而低):raw --> mangle --> nat --> filter

1.过滤表

过滤器是 iptables 的默认表。所以,如果你没有定义你自己的表,你将使用过滤表。iptables 的过滤表有以下内置链。

  • INPUT 链 – 传入防火墙。用于到达本地服务器的数据包。
  • OUTPUT 链 – 从防火墙传出。用于本地生成并离开本地服务器的数据包。
  • FORWARD 链 – 本地服务器上另一个 NIC 的数据包。对于通过本地服务器路由的数据包。

2. NAT表

iptable 的 NAT 表具有以下内置链。

  • PREROUTING 链 – 在路由之前更改数据包。即在数据包到达系统之后(并且在路由之前)立即发生数据包转换。这有助于将数据包的目标 IP 地址转换为与本地服务器上的路由匹配的内容。这用于 DNAT(目标 NAT)。
  • POSTROUTING 链 – 在路由后更改数据包。即当数据包离开系统时发生数据包转换。这有助于将数据包的源 IP 地址转换为可能与目标服务器上的路由匹配的内容。这用于 SNAT(源 NAT)。
  • OUTPUT 链 – 防火墙上本地生成的数据包的 NAT。

3. Mangle 表

iptables 的 Mangle 表用于专门的数据包更改。这会改变 TCP 报头中的 QOS 位。Mangle 表具有以下内置链。

  • 预路由链
  • 输出链
  • 正向链
  • 输入链
  • POSTROUTING 链

4. 原始表

Iptable 的 Raw 表用于配置例外。原始表具有以下内置链。

  • 预路由链
  • 输出链

链和表的关系:

链(钩子)

表(功能)

PREROUTING

可以存在于:raw表,mangle表,nat表

INPUT

可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)

FORWARD

可以存在于:mangle表,filter表

OUTPUT 

可以存在于:raw表mangle表,nat表,filter表

POSTROUTING

mangle表,nat表

但是,我们在实际的使用过程中,往往是通过"表"作为操作入口,对规则进行定义的,之所以按照上述过程介绍iptables,是因为从"关卡"的角度更容易从入门的角度理解,但是为了以便在实际使用的时候,更加顺畅的理解它们,此处我们还要将各"表"与"链"的关系罗列出来:

表和链的关系:

表(功能)

链(钩子)

raw

REROUTING,OUTPUT

mangle

REROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat

REROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)

filter

INPUT,FORWARD,OUTPUT

结合上述所有的描述,我们可以将数据包通过防火墙的流程总结为下图:

安卓iptables路由 android iptables详解_NAT_02

二、IPTABLES 规则

以下是 iptables 规则要记住的要点。

  • 规则包含一个标准和一个目标。
  • 如果条件匹配,则转到目标中指定的规则(或)执行目标中提到的特殊值。
  • 如果条件不匹配,则继续执行下一条规则。

目标值

以下是您可以在目标中指定的可能的特殊值(处置动作)。

动作

含义

ACCEPT

    允许数据包通过

DROP

直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。

REJECT

拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息

SNAT

源地址转换,解决内网用户用同一个公网地址上网的问题

MASQUERADE

是SNAT的一种特殊形式,适用于动态的、临时会变的ip上

DNAT

目标地址转换

REDIRECT

在本机做端口映射

LOG

在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配

如果您执行 iptables –list (或) service iptables status,您将看到系统上所有可用的防火墙规则。以下 iptable 示例显示此系统上没有定义防火墙规则。如您所见,它显示默认输入表,带有默认输入链、前向链和输出链。

# iptables -t filter --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

执行以下操作以查看 mangle 表。

# iptables -t mangle --list

执行以下操作以查看 nat 表。

# iptables -t nat --list

执行以下操作以查看原始表。

# iptables -t raw --list

注意:如果不指定 -t 选项,它将显示默认过滤器表。因此,以下两个命令是相同的。

# iptables -t filter --list
(or)
# iptables --list

下面的 iptable 示例显示了在过滤表的输入、转发和输出链中定义了一些规则。

# iptables --list
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255
3    ACCEPT     esp  --  0.0.0.0/0            0.0.0.0/0
4    ACCEPT     ah   --  0.0.0.0/0            0.0.0.0/0
5    ACCEPT     udp  --  0.0.0.0/0            224.0.0.251         udp dpt:5353
6    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:631
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:631
8    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
10   REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

iptables –list 命令输出中的规则包含以下字段:

  • num - 特定链中的规则编号
  • target – 我们上面讨论的特殊目标变量
  • prot - 协议。tcp、udp、icmp等,
  • opt – 该特定规则的特殊选项。
  • source – 数据包的源 IP 地址
  • destinaton - 数据包的目的地 IP 地址

二、iptables命令详解

常用命令:

常用选项

说明

-A

在指定链尾部添加规则

-D

删除匹配的规则

-R

替换匹配的规则

-I

在指定位置插入规则(例:iptables -I INPUT 1 --dport 80 -j ACCEPT(将规则插入到filter表INPUT链中的第一位上)

-L/S

列出指定链或所有链的规则

-F

删除指定链或所有链的规则

-N

创建用户自定义链[例:iptables -N allowed]

-X

删除指定的用户自定义链

-P

为指定链设置默认规则策略,对自定义链不起作用

-Z

将指定链或所有链的计数器清零

-E

更改自定义链的名称[例:iptables -E allowed disallowed]

-n

ip地址和端口号以数字方式显示[例:iptables -nL]

常见设置参数介绍:

参数

作用

–dport

指定目标TCP/IP端口 如 –dport 80

–sport

指定源TCP/IP端口 如 –sport 80

-p

tcp 指定协议为tcp

icmp 指定协议为ICMP

udp 指定协议为UDP

-j 

DROP 拒绝

ACCEPT 允许

REJECT 拒绝并向发出消息的计算机发一个消息

LOG 在/var/log/messages中登记分组匹配的记录

-m

mac –mac 绑定MAC地址

limit –limit 1/s 1/m 设置时间策列

-s

192.168.1.153或192.168.1.0/24 指定源地址或地址段

! 192.168.1.0 指定源地址以外的

-d

192.168.1.153或192.168.1.0/24 指定目标地址或地址段

实例:

  • 配置允许特定源ip ssh 22 端口连接
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
  • 设置默认的规则
iptables -P INPUT DROP # 配置默认的不让进
iptables -P FORWARD DROP # 默认的不允许转发
iptables -P OUTPUT ACCEPT # 默认的可以出去
  • 允许本地回环地址可以正常使用
iptables -A INPUT -i lo -j ACCEPT
#本地圆环地址就是那个127.0.0.1,是本机上使用的,它进与出都设置为允许
iptables -A OUTPUT -o lo -j ACCEPT
  • 配置白名单
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允许机房内网机器可以访问
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允许183.121.3.7访问本机的3380端口
  • 启动网络转发规则公网210.14.67.7让内网192.168.188.0/24上网
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
  • 端口映射本机的 2222 端口映射到内网 虚拟机的22 端口
iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22
  • 阻止Windows蠕虫的攻击
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
  • 防止SYN洪水攻击
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT

参考资料:

https://wangchujiang.com/linux-command/c/iptables.html#%E9%85%8D%E7%BD%AE%E7%99%BD%E5%90%8D%E5%8D%95