iptables简介

iptables实际上就是一种包过滤型防火墙。iptables是Linux系统下最常见的防火墙命令,但实际上它只是一个命令行工具,真正的内核防火墙是位于操作系统内核空间的netfilter通过iptables命令制定规则并执行,即可使得netfilter在内核层对数据包作出相应的处理



四表五链

iptables中的存放链的容器,而存放规则的容器。在数据包进入系统的时候,防火墙会对其报文作规则匹配,并执行相应的动作

四表:

  • filter表:用于过滤数据包
  • nat表:网络地址转换功能(IP+端口)
  • mangle表:拆封且修改数据报文并重新封装
  • raw表:关闭nat表上启用的链接追踪机制,为了提高效率使用的,raw本身的含义是指“原生的”、“未经过加工的”,符合raw表所对应规则的数据包将会跳过一些检查,这样就可以提高效率

        优先级为 : raw > mangle > nat > filter

五链:

  • PREROUTING链:用于目标地址转换(DNAT)   数据包进入路由之前
  • INPUT链:用于处理进入本机的数据包
  • OUTPUT链:用于处理由本机出去的数据包
  • FORWARD链:用于处理转发数据包
  • POSTROUTING链:用于源地址转换(SNAT) 发送到网卡之前

Ⅰ.【链】

链是规则的容器。在链上有一系列的规则处理动作。报文进入主机的整个链路如下图。

Ⅰ 进入主机的报文(通常为请求报文),进入路由选择前,进行判断其目标是否为本机IP,如果是则进入INPUT链执行该链上设定的规则,将请求送至应用层处理;若不是本机IP,则会执行FORWARD链上的规则,将请求报文转发到目标主机,并通过POSTROUTING链送出。

Ⅱ 本机发起的报文(通常为响应报文),则会执行OUTPUT链上的规则,再由POSTROUTING链送出。

由此可见,任何报文进出都必须PREROUTING和POSTROUTING两条链的。

linux下iptables实现nat iptables -nl命令_linux下iptables实现nat

Ⅱ. 【表】

表是链的容器。前面有说到,规则分为很多种,比如说过滤端口、修改报文、转发数据包等等。具有相同功能的规则的集合就叫做表。iptables默认有4张表,分别是负责过滤的filter表(默认缺省操作即针对该表)、负载转换网络地址的nat表、负责修改报文的mangle表以及负责数据跟踪处理的raw表。那表和链是什么关系呢?表的功能不同,决定了链上的规则所能处于的表也是不同的。也就是说,不同的链所能具有表对应的功能是不同的;反过来说,不同的表上能存在的链是固定的。其对应关系如下图所示:

linux下iptables实现nat iptables -nl命令_IP_02

表是有优先级的,其优先顺序如上图所示,从左往右,优先级由高到低。

Ⅲ. 【规则】

前面一直在说规则。规则是由匹配条件和指定动作组成的集合。设定好匹配条件和指定处理动作以后,报文进入链路,会根据匹配条件去匹配报文,匹配成功以后就会按设定的动作去处理,比如接受包、拒绝包、转发包等。

  • 匹配条件

iptables可以根据报文的源地址、目的地址、传输协议、服务类型等信息进行匹配。这些条件通常用命令参数来设定。常见的命令参数如下表:

参数

说明

-P

设置默认策略

-F

清空规则链

-L

查看规则链

-I num

num缺省为0,即在规则链的顶部加入新规则;num可设定加入的位置

-A

在规则链的末尾加入新规则

-D num

删除指定位置的规则

-s

匹配报文来源地址

-d

匹配报文目标地址

-i

匹配指定网卡流入的数据

-o

匹配指定网卡流出的数据

-p

匹配协议,可选项TCP、UDP、ICMP

-m

使用扩展模块来匹配报文

—dport

匹配目标端口号

—sport

匹配来源端口号

  • 指定动作

动作

说明

ACCEPT

允许数据包通过

DROP

直接丢弃数据包,不给出响应

REJECT

拒绝数据包通过,给出拒绝响应

REDIRECT

本机端口重定向、映射、透明代理

SNAT

源地址转换

DNAT

目标地址转换

MASQUERADE

IP伪装(NAT),用于ADSL

LOG

日志记录


举例说明

下面举例说明iptables的用法。iptables

Ⅰ 举例:仅允许远程主机访问本机的80端口,本机地址10.0.0.254

iptables -F
iptables -A INPUT -p tcp -d 10.0.0.254 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -j DROP

Ⅱ 举例:将本地的80端口的请求转发到8080端口,本机地址10.0.0.254

# 方式1:redirect
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 

# 方式2:DNAT
iptables -t nat -A PREROUTING -p tcp -d 10.0.0.254 --dport 80 -j DNAT --to-destination 10.0.0.254:8080

这里列了两种方式,第一种redirect方式实际上是端口重定向,只对本机IP有效,效率比DNAT高。第二种则是DNAT转发模式,它既可以转发到本机IP,也可以转发到外部其他主机。

Ⅲ 举例:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.137.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。

iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -A INPUT -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT



小结

  1. 使用-t参数来指定对哪个表进行操作,缺省状态下默认是对filter表。
  2. 要重视规则的顺序,默认是由上到下进行匹配,前面若匹配成功并执行相应的动作以后,后面再有规则可以匹配到之前的报文,也无法执行相应的动作。这里举例说明下:

举例:仅允许远端IP为192.168.0.1的主机访问本机的22端口。

先来看常见的错误写法:

iptables -P INPUT ACCEPT

iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT

上例中的规则想要实现仅允许远端192.168.0.1的IP访问本机的22端口。本机INPUT规则链预设为ACCEPT允许所有包流入,第一条规则匹配到对本机的22端口的所有请求报文并执行丢弃动作,第二条规则匹配到来源于192.168.0.1对本机22端口的访问,这时候允许执行动作是没有任何效果的;因为第一条规则直接拒绝了所有的包。所以这种写法有误。正确的写法应该是:

iptables -P INPUT ACCEPT

iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

或者:

iptables -P INPUT DROP

iptables -A INPUT -p tcp --dport 22 -j DROP
iptables -A INPUT -p tcp -s 192.168.0.1 --dport 22 -j ACCEPT

iptables的基本概念以及常见参数先总结到这里。关于iptables更多常用的命令,之后再抽时间总结整理吧。

The End.

 

最常用就是
开协议访问端口=安全组
禁止某些ip访问
禁止某些ip访问某个服务(协议,端口)
允许某些ip
允许某些ip访问某些服务(协议,端口)
端口转发(既访问1025端口转到80上)(像docker的端口映射)

 

iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT

linux下iptables实现nat iptables -nl命令_python_03