【NetDevOps】新一代网工需要了解的那点事儿(五)---iptables

5 iptables

  有人说在Linux中iptables就是防火墙,其实它并不是真正的防火墙。一般情况我们可以通过类似"service iptables start"命令启动iptables,但iptables并没有守护进程,所以它还不能算真正意义上的服务。如果非要给iptables给一个定义,那么称它为Linux内核提供的功能一点不为过。而Linux中真正的防火墙是netfilter,它位于Linux内核空间。netfilter/iptables与大多数的Linux软件一样,这个包过滤防火墙也是免费的,它可以完成防火墙的基本功能。比如包过滤、包的重定向、NAT等。

5.1 iptables基础

  实际上iptables是执行我们设定的rules,而这些预设的rules一般都是由相关管理员来设置。这些rules都存储在内核空间的信息包过滤表中,这些rules不仅需要指定源地址、目的地址、传输协议、源服务类型、目标协议,还需要指定如果数据包匹配到rules后如何操作,一般有accept、drop和reject。说到这里其实有关iptables的操作和传统网络防火墙比较类似,日常的维护无外乎就是增删改查这些rules。
  如下图所示,当我们启用了防火墙功能后,数据包在进入我们的主机时会经过如下各种"关卡"。如果客户端发来的请求报文目的地是本机,那么由Prerouting、Postrouting、Input和Output"关卡"来负责数据包的放行与转发。那么如果客户端发来的请求报文目的地不是本机,这时会由Prerouting、Forward、Postrouting"关卡"来负责数据包的放行与转发。在Linux的iptables中我们提到的这些"关卡"被称作Chains(也就是常说的链)。
  这五个链中,Prerouting链主要处理刚到达本机并在路由转发前的数据包,通常用于DNAT;Input链主要处理来自外部的数据;Output链主要处理向外发送的数据;Forward链主要处理数据转发;Postrouting链主要处理即将离开本机的数据包,通常用于SNAT。

5.2 iptables的结构

  iptables的结构:iptables -> Tables -> Chains -> Rules。也就是说tables由chains组成而chains又由rules组成,他们之间是互相包含的关系。如下图所示:

                        +-----------------------------------------------------------------------------------+
                        |                                     IPTABLES                                      |
                        |                                                                                   |
                        |  +------------------------------+              +------------------------------+   |
                        |  | Table 1                      |              | Table N                      |   |
                        |  |                              |              |                              |   |
                        |  | +-------------------------+  |              | +-------------------------+  |   |
                        |  | | Chain 1                 |  |              | | Chain 1                 |  |   |
                        |  | |  +-------------------+  |  |              | |  +-------------------+  |  |   |
                        |  | |  |      Rule 1       |  |  |              | |  |      Rule 1       |  |  |   |
                        |  | |  +-------------------+  |  |              | |  +-------------------+  |  |   |
                        |  | |                         |  |              | |                         |  |   |
                        |  | |  +-------------------+  |  |              | |  +-------------------+  |  |   |
                        |  | |  |      Rule 2       |  |  |              | |  |      Rule 2       |  |  |   |
                        |  | |  +-------------------+  |  |              | |  +-------------------+  |  |   |
                        |  | +-------------------------+  |  .........   | +-------------------------+  |   |
                        |  |                              |              |          .........           |   |
                        |  | +-------------------------+  |              | +-------------------------+  |   |
                        |  | | Chain 2                 |  |              | | Chain N                 |  |   |
                        |  | |  +-------------------+  |  |              | |  +-------------------+  |  |   |
                        |  | |  |      Rule 1       |  |  |              | |  |      Rule 1       |  |  |   |
                        |  | |  +-------------------+  |  |              | |  +-------------------+  |  |   |
                        |  | |                         |  |              | |                         |  |   |
                        |  | |  +-------------------+  |  |              | |  +-------------------+  |  |   |
                        |  | |  |      Rule 2       |  |  |              | |  |      Rule 2       |  |  |   |
                        |  | |  +-------------------+  |  |              | |  +-------------------+  |  |   |
                        |  | +-------------------------+  |              | +-------------------------+  |   |
                        |  +------------------------------+              +------------------------------+   |
                        |                                                                     By:[F0rGeEk]  |
                        +-----------------------------------------------------------------------------------+
  • Rules
      所谓的规则主要是相关管理员定义的准入条件,这个规则的主旨是:如果数据包符合xx条件,那么就将这个数据包yy。一般rules需要制定源地址、目的地之、传输协议、服务类型或端口等,而数据包匹配规则后的操作则有accept、reject或drop。这里的rules就好比物理防火墙中的一条条安全策略,只不过在物理防火墙中数据被匹配后的动作是permit、deny和drop其实意义都一样。

  • Chains
      上文中我们说将这些决定数据包流向的"关卡"称为"链",为什么要称为链呢?一般情况下,防火墙的作用就是对经过的数据报文进行规则匹配,然后执行相应的动作。所以当一个数据包要经过防火墙时,那么它就要进行规则的匹配,而现实情况是一个关卡可能会有很多的规则,这些规则又是串联在一起的,由于形似所以就被称为。这里我们也可以把它可以理解为物理防火墙中的策略组,一般情况下一个策略组中我们也会做很多类似的"规则"。

  • Tables
      Iptables中的表也比较好理解,试想我们对于每条链上都有很多的rule,但这些rule可能会有一些相似的。比如均是开启80端口或者都是拒绝SSH等,那么如果每个链都需要这样的策略,如果有很多个链需要修改的话那管理员的烦恼就来了。所以这里引入表,所谓的表就是可以将相同功能的rule放在一起的合集。看到这里网工又开心了,这部就是物理防火墙中的策略表嘛😅😅😅当然可以这样理解,物理防火墙根据性能不同可以创建N多个策略表,但是Iptables为我们内建了4种表(fiter、nat、mangle、raw),而我们定义的每条rule也都离不开这四种表。

5.3 表链关系

  现在我们已经知道iptables有四个内建表:Filter表、NAT表、Mangle表和Raw表,它还有五个链:PREROUTING链、INPUT链、OUTPUT链、FORWARD链、POSTROUTING链。下面我们就简单来说说这"四表五链"之间的关系。

  • Filter表
      Filter表为iptables的默认表,也就是说如果你没有自定义表,那么默认就使用Filter表,它主要负责报文过滤。内核模块为iptables_filter,它具有3个内建链:INPUT链、OUTPUT链 、FORWARD链 。

  • NAT表
      众所周知NAT为Network Address Translation的缩写,主要提供网络地址转换功能。其内核模块为iptables_nat,它具有3个内建链:PREROUTING链、POSTROUTING链 、OUTPUT链。

  • Mangle表
      Mangle表主要用于指定如何处理数据包,拆解并作出修改,然后重新封装的功能。其内核模块为iptables_mangle,它具有5个内建链:PREROUTING链、OUTPUT链、FORWARD链、INPUT链和POSTROUTING链。

  • Raw表
      Raw表主要用于处理异常,可以关闭NAT表上启用的连接追踪机制。它的内核模块为iptables_raw,它具有2个内建链:PREROUTING链和OUTPUT链。
      这时我们在看数据报文经过防火墙的流程就更清晰了:

  这里我们需要注意一点,那就是当这四个表都在一个链时,它们被匹配也是有顺序的:raw-->mangle-->nat-->filter。由上图我们也可以看出,有些链是不能使用某些表中的规则,目前仅有OUTPUT链可以同时匹配四张表中的规则。为了方便管理员的管理,iptables支持自定义链。这一点就好比物理防火墙中针对某个应用创建的策略组,这里需要注意iptables中自定义的链不能直接使用,它只能被某个默认的链当作执行动作去调用。

5.4 iptables Rules

  上文我们说过,所谓的规则就是制定匹配条件然匹配每个经过的数据报文,一旦匹配成功则进行预设的动作,如果匹配为成功则判断下一条rule。所以对于任何一个rule来说,它的结构则是由匹配条件和执行动作来组成。

  • 匹配条件
      匹配条件一般包含源地址(SOURCE IP)和目的地址(DESTINATION IP),以及扩展条件。这些扩展条件实际上是netfiler中的一部分,比如源端口、目的端口、协议等。

  • 执行动作
      执行动作在iptables中被称为target,一般的执行动作有ACCEPT(允许数据包通过)、REJECT(拒绝数据包通过,必要是回复客户端拒绝响应信息)、DROP(拒绝数据包通过并直接丢弃不回复任何响应信息)。在实际应用中我们还经常会使用一些扩展动作:SNAT(源地址转换,比如局域网用户使用同一个公网IP上网)、DNAT(目的地址转换,可用来保护内网重要信息)、REDIRECT(在本地进行端口映射)、MASQUERADE(SNAT的一种特殊形式,适用于动态IP)以及LOG(仅对数据包进行记录不做任何操作)。

5.5 iptables基础操作

  1. 查询防火墙可用规则
 # 以下输出说明当前系统没有启用防火墙,仅有默认的filter表以及默认的链。
[root@d1 ~]# iptables --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
  1. 查询某个表
 # 用法iptables -t 表名 --list
 # 如下查询nat表
[root@d1 ~]# iptables -t nat --list
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
  1. 清空所有rules
[root@d1 ~]# iptables --flush
 # 或者
[root@d1 ~]# iptables -F
 # 执行完以上两条命令。并不意味着所有规则都清空了
 # 因为在有的Linux版本中,通过以上命令不会清空NAT表,所以最好手动清空NAT:
[root@d1 ~]# iptables -t NAT -F
  1. 保存修改
[root@d1 ~]# iptables-save
 # Generated by iptables-save v1.8.4 on Fri Mar  27 15:26:45 2020
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
 # Completed on Fri Mar  27 15:26:45 2020
 # Generated by iptables-save v1.8.4 on Fri Mar  27 15:26:45 2020
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
 # Completed on Fri Mar  27 15:26:45 2020
  • 追加规则
      首先我们来了解一下iptables的常用参数:
参数 描述 参数 描述
-p 指定协议 -A 追加到链
-s 指定源地址 -C 检查存在的rule
-d 指定目的地址 -D 从指定链中删除rule
-j 指定执行target -I 通过指定rulenum插入rule
-i 指定入接口 -R 替换指定rulenum的rule
-o 指定出接口 -F 清空所有rules
-t 指定要操作的表 -N 创建一个自定义链
-g 跳转到指定的链 -P 修改指定链中的策略
-m 匹配扩展模块 -X 删除用户自定义的链
  还有一些扩展参数:
参数 描述
--sport 源端口,默认匹配所有端口
--dport 目的端口,与--sport类似
--tcp-flags TCP标志,一般有SYN、ACK、FIN、RST、URG、PSH
--icmp-type ICMP类型,一般0表示echo reply,1表示echo
--timestart 根据起始时间匹配数据
--timestop 和timestart配合使用,用来指定一个时间段
--connlimit-above 限制每个IP地址链接到server的链接数

比如我们将一台Linux做成SSH跳板机,这时我们可以使用iptables来做一些限制:

 # 发出的数据包目的端口为22
[root@d1 ~]# iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

 # 接收的数据包源端口为22
[root@d1 ~]# iptables -A INPUT -i eth0 -p tcp--sport 22 -m state --state ESTABLISHED -j ACCEPT

5.6 常用命令总结

  • 将12.1.1.1访问10.1.1.1的所有包都拒绝
[root@d1 ~]# iptables -t filter -I INPUT -s 12.1.1.1 -d 10.1.1.1 -j DROP
[root@d1 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      *       12.1.1.1             10.1.1.1
  • 所有访问12.1.1.1的包均拒绝
[root@d1 ~]# iptables -t filter -I INPUT -d 12.1.1.1 -j DROP
[root@d1 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      *       0.0.0.0/0            12.1.1.1
  • 允许12.1.1.1SSH10.1.1.1
[root@d1 ~]# iptables -t filter -I INPUT -s 12.1.1.1 -d 10.1.1.1 -p tcp --sport 22 -j ACCEPT
[root@d1 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      *       12.1.1.1             10.1.1.1             tcp spt:22
  • 拒绝由某网卡流入的icmp
[root@d1 ~]# iptables -t filter -I INPUT -i ens33 -p icmp -j DROP
[root@d1 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       icmp --  ens33  *       0.0.0.0/0            0.0.0.0/0
  • 允许任意源访问10.1.1.1的80、443端口
[root@d1 ~]# iptables -t filter -I INPUT -d 10.1.1.1 -p tcp -m multiport --dports 80,443 -j ACCEPT
[root@d1 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            10.1.1.1             multiport dports 80,443
  • 将所有filter表以序号标记显示
[root@d1 ~]# iptables -nL -t filter --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            10.1.1.1             multiport dports 80,443
2    DROP       icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     tcp  --  12.1.1.1             10.1.1.1             tcp spt:22
4    DROP       all  --  0.0.0.0/0            12.1.1.1
5    DROP       all  --  12.1.1.1             10.1.1.1
6    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
7    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
8    INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0
9    INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
10   INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
11   DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
12   REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
  • 删除已添加的rule
[root@d1 ~]# iptables -D INPUT 5
[root@d1 ~]# iptables -nL -t filter --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            10.1.1.1             multiport dports 80,443
2    DROP       icmp --  0.0.0.0/0            0.0.0.0/0
3    ACCEPT     tcp  --  12.1.1.1             10.1.1.1             tcp spt:22
4    DROP       all  --  0.0.0.0/0            12.1.1.1
5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
6    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
7    INPUT_direct  all  --  0.0.0.0/0            0.0.0.0/0
8    INPUT_ZONES_SOURCE  all  --  0.0.0.0/0            0.0.0.0/0
9    INPUT_ZONES  all  --  0.0.0.0/0            0.0.0.0/0
10   DROP       all  --  0.0.0.0/0            0.0.0.0/0            ctstate INVALID
11   REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
  • 清除已有的rules
[root@d1 ~]# iptables -F
[root@d1 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 19 packets, 1852 bytes)
 pkts bytes target     prot opt in     out     source               destination
posted @ 2020-04-01 10:59  为极客而生  阅读(270)  评论(0编辑  收藏  举报