iptables的规则说明和实践

时间:2022-01-13 07:53:50

1Iptables简介

1.1 Iptables的介绍

     iptables的前身叫ipfirewall(内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

 

TCP/IP协议栈必须经过、可以实现读取规则的地方叫做netfilter(网络过滤器)。

Iptables在内核中一共有5个位置:

  1、内核空间中:从一个网络接口中进来,到另一个网络接口中

  2、数据包从内核流入用户空间的

  3、数据包从用户空间流出的

  4、进入/离开本机的外网接口

  5、进入/离开本机的内网接口

 

1.2 Iptables的工作机制

上面5个位置对应5个钩子函数,也叫做5个规则链:

 

1、 PREROUTING(路由前)

2、 INPUT(数据包流入口)

3、 FORWARD(转发)

4、 OUTPUT(数据包出口)

5、 POSTROUTING(路由后)

   

     如上是NetFilter5个规则链,任何一个数据包,只要经过本机,必须经过这5个链中的其中一个链。

 

1.3防火墙的策略

防火墙策略一般分为两种一种是“通”策略,一种是“堵”策略,通策略默认门是关着的,必须定义谁能进,堵策略是,大门是洞开的,但是你必须有身份认证,否则不能进。

 

我们用的比较多的功能有3个:

 

1、 filter定义允许或者不允许的

2、 nat定义地址转换的

3、 manage功能修改报文原数据

 

对于filter,只能用于3个规则链:INPUTFORWARD、OUTPUT

对于nat,只能用于:PREROUTING、OUTPUT、POSTROUTING

manage 5个规则链都可以PREROUTINGINPUTFORWARDOUTPUTPOSTROUTING

 

Iptables/netfilter 是工作在用户空间的。Iptables被做成一个服务,启动服务:使过滤规则生效,停止服务:将规则撤销。

 

2Iptables规则用法

2.1规则的写法

格式:iptables [-t table] COMMAND chain CRETIRIA –j ACTION

 

   -t table: 3filter  nat   manage

 

  COMMAND 定义对规则进行管理

  Chain:指定你接下来的规则到底是在哪个链上进行操作的,当定义策略的时候可以省略

  CRETIRIA:指定匹配标准

  -j ACTION: 指定如何进行管理

 

例如:不允许 10.167.199.30/24进行访问。

 

  Iptables -t filter -A INPUT -p tcp -s 10.167.199.30/24 --dport 22 -j DROP

 

  如上,针对10.167.199.30/2422端口不允许访问,其中24表示的是子网掩码,后面有内容会针对这个做具体解释。

 

  如果想要拒绝的更彻底:

 

  Iptabels -t filter -A INPUT -p tcp -s 10.167.199.30/24 --dport 22 -j REJECT

 

 使用 iptables -L -n -v  查看定义规则的详细信息

 

2.2 详解COMMAND

2.2.1 链管理命令

-P :设置默认策略(默认门是开着还是关着的)

 

    默认策略一般只有两种

    iptables -P INPUT (DROP|ACCEPT)

    比如:

    iptables -P INPUT DROP 这就默认把所有访问请求都给拒绝了。并且没有定义哪个动作

 

-F: FLASH ,清空规则链的

  Iptables -t nat -F PREROUTING

      Iptables -t nat -F 清空nat表的所有链

-NNEW支持用于新建一个链

       Iptables -N inbound_tcp_web

-X 删除用户自己定义的链和计数

-Z 清空链,及链中默认规则的计数器

 

2.2.2 规则管理命令

-A:追加,在当前链的最后新增一个规则

-I num : 插入,把当前规则插入为第几条。

   -I 3 :插入为第三条

-R numReplays替换/修改第几条规则

  格式:iptables -R 3…………

-D num:删除,明确指定删除第几条规则

 

我们经常使用的是以追加-A的方式增加过滤规则,但是请记住有时候选择插入是必须的,例如:当配置一个基于白名单规则的防火墙时,规则的最后面肯定是针对所有通信关闭的,这时候在它的后面再追加,新加的规则是不会生效的,这时候就只能使用插入的方式。

 

2.2.3 查看过滤规则

查看iptables规则使用 -L参数

 

附加子命令

 -n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。

 -v:显示详细信息

 -vv

 -vvv :越多越详细

 -x:在计数器上显示精确值,不做单位换算

 --line-numbers : 显示规则的行号

 -t nat:显示所有的关卡的信息

 

如上整体命令就是 iptables –L –n……

 

2.3 匹配规则

2.3.1 通用匹配:源地址目标地址的匹配

-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP

IP | IP/MASK | 0.0.0.0/0.0.0.0

而且地址可以取反,加一个!”表示除了哪个IP之外

-d:表示匹配目标地址

 -p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP

 -i eth0:从这块网卡流入的数据

流入一般用在INPUTPREROUTING

-o eth0:从这块网卡流出的数据

流出一般在OUTPUTPOSTROUTING

2.3.2 扩展匹配

隐含扩展:对协议的扩展

p tcp :TCP协议的扩展。一般有三种扩展

--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如

--dport 21  或者 --dport 21-23 (此时表示21,22,23或者可以表示为21:23)

--sport:指定源端口

--tcp-flagsTCP的标志位(SYN,ACKFIN,PSHRST,URG

    对于它,一般要跟两个参数:

1.检查的标志位

2.必须为1的标志位

--tcpflags syn,ack,fin,rst syn   =    --syn

表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN1的包,还有一种简写方式,叫做--syn

    -p udpUDP协议的扩展

        --dport

        --sport

    -p icmpicmp数据报文的扩展

        --icmp-type

echo-request(请求回显),一般用8来表示

所以 --icmp-type 8匹配请求回显数据包

echo-reply (响应的数据包)一般用0来表示

 

显式扩展(-m

扩展各种模块

      -m multiport:表示启用多端口扩展

      之后我们就可以启用比如 --dports 21,23,80

2.4 -j Aciton 详解

常用的ACTION

 DROP:悄悄丢弃

一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表

 REJECT:明示拒绝

 ACCEPT:接受

custom_chain:转向一个自定义的链

 DNAT

 SNAT

 MASQUERADE:源地址伪装

 REDIRECT:重定向:主要用于实现端口重定向

 MARK:打防火墙标记的

 RETURN:返回

在自定义链执行完毕后使用返回,来返回原规则链。

 

3、Iptables的实践

3.1 黑名单

 iptables -t filter -A INPUT -p tcp -s 192.168.0.100 --dport 22 -j DROP

如上,在本地虚拟机上设置过滤规则,丢弃我本机对于虚拟机22号端口的访问

 

 iptables的规则说明和实践

如上,在设置完过滤规则后,再次使用putty连接就连不上了。

 

 iptables的规则说明和实践

 

 

使用nmap扫描该虚拟机上的22号端口

 

 iptables的规则说明和实践

 

如上,显示 22号端口被过滤了。

 

 iptables的规则说明和实践

 

 iptables的规则说明和实践

 

如上,通过vmware的管理工具连上虚拟机,使用iptables -F命令清空过滤规则,再次使用putty就能正常连接了。

 

如上,我们针对具体的端口进行丢弃,相当于做了一个黑名单,不允许指定的IP和端口访问机器。

 

3.2 白名单配置

通常,在防火墙的大多数使用场景中,我们都是以设置白名单的方式来配置的,只允许被许可的IP和端口访问机器的指定端口或者任意端口。

 

首先,我们需要设置允许访问的过滤规则。

例如:

  iptables -t filter -A INPUT -i eth0 -p tcp -s 192.168.46.1 -d 192.168.46.145 --dport 22 -j ACCEPT

 如上,我们针对eth0网卡,允许本机192.168.0.100访问虚拟机的22号端口。

然后,加上黑名单,关闭所有端口访问。

 iptables -t filter -A INPUT -i eth0 -j DROP

 

 iptables的规则说明和实践

 

如上截图所示,在设置允许访问的规则后,对eth0设置所有的访问都不允许。使用iptables -L-n查询当前生效的防火墙过滤规则。

 

从上面截图中也可以看到,我们设置所有访问DROP后,本机的putty依然能正常连接虚拟机的22号端口,说明白名单生效了。

 

 

 iptables的规则说明和实践

 

 

iptables的规则说明和实践

如上,设置白名单规则后,nmap扫描,22号端口open,除22号端口以外的任何端口,不管虚拟机上当前是否开启都显示为filter过滤。

 

注:iptables设置白名单,白名单规则一定要在黑名单之前,否则白名单规则不生效。

3.3 规则保存和恢复

  保存配置文件

使用iptables-save命令进行重定向

如:iptables-save > iptables.save.cfg

  恢复配置文件

使用 iptables-restore < iptables.save.cfg

 

 iptables的规则说明和实践

   如上截图,在使用iptables-save保存过滤规则后,iptables -F清空过滤规则,然后使用iptables-restore进行恢复。

3.4 永久化保存

   和很多其他的Linux功能一样,iptables设置也是只在本次机器运行期间生效,机器重启后就恢复为初始化状态了。如果需要永久保存,需要在开机自启动脚本里加恢复命令。

  3.3 一样,先使用iptables-save 命令,保存当前系统已经配置的过滤规则。

  iptables-save >/etc/iptables-script

 然后

   echo '/sbin/iptables-restore /etc/iptables-script' >>/etc/init.d/rc.local

/etc/rc.d/rc.local启动脚本中加入恢复命令

 iptables的规则说明和实践

 

如上,设置完成后,reboot重启,重启完成后,查看,过滤规则还在。