iptables相关操作

iptables 是 Linux 防火墙工作在用户空间的管理工具,是 netfilter/iptablesIP 信息包过滤系统是一部分,用来设置、维护和检查 Linux 内核的 IP 数据包过滤规则。

iptables由两部分组成,一部分是ip另外一部分就是tables。因此iptables就是通过表的形式对ip进行各种操作。

iptables的重点是五链四表

四表五链
链就是位置:共有五个 进路由( PREROUTING)、进系统(INPUT) 、转发(FORWARD)、出系统(OUTPUT)、出路由(POSTROUTING);
表就是存储的规则;数据包到了该链处,会去对应表中查询设置的规则,然后决定是否放行、丢弃、转发还是修改等等操作。

四表

  • raw表,待学习

  • mangle表,操作系统级别的表,主要应用在修改数据包、流量整形、给数据包打标识,默认的规则链有:INPUTOUTPUTforwardPOSTROUTINGPREROUTING

  • filter表,过滤表,对进入的不符合条件的流量过滤。对不符合规则输出流量也进行过滤;

  • nat表,对目的地址、目的端口、源地址源端口进行修改;

五链

  • INPUT
  • OUTPUT
  • FPRWARD
  • POSTROUTING
  • PREROUTING

五链

iptables-Page-1-2drawio

iptables-五表四链drawio
  1. 当一个数据包进入网卡时,它首先进入 PREROUTING 链,内核根据数据包目的 IP 判断是否需要转送出去。
  2. 如果数据包就是进入本机的,它就会沿着图向下移动,到达 INPUT 链。数据包到了 INPUT 链后,任何进程都会收到它。
  3. 本机上运行的程序可以发送数据包,这些数据包会经过 OUTPUT 链,然后到达POSTROUTING 链输出。
  4. 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD 链,然后到达 POSTROUTING 链输出。

小结

整体数据包分两类:1、发给防火墙本身的数据包 ;2、需要经过防火墙的数据包.

数据包的流程:数据包进入到链中之后,会根据此时的状态去对应的表中查询对应的规则。

匹配流程示意图

iptables-示意图drawio

因此,在这五条链中。不同链承担的角色是不一样的。

PREROUTING:承担SNAT的作用;

POSTROUTING:承担DNAT的作用;

FPRWARD:承担转发的作用,如果需要对转发流量进行限制则可以在这里进行限制;

INPUT:承担流量输入的作用,如果想要主机不收到某些流量,则可以在这里进行限制;

OUTPUT:承担流量输出的作用,如果想要主机不发出去某些流量,则可以在这里进行限制。

iptables语法

iptables-Optiondrawio

这张图描述了iptables的相关语法命令。

四表

filter表

查看规则

1
iptables -t filter -L -n

可以看到结果

image-20211112214242489

添加规则

追加规则,将所有进入流量的80端口的流量丢弃掉。

1
iptables -t filter -A INPUT -j DROP -p tcp --dport 80

追加规则,将出口到某个192.168.0.144的流量全部丢弃

1
iptables -t filter -A OUTPUT -j DROP -p tcp -d 192.168.0.144

查看iptables表

image-20211112215324542

删除规则

将设置的第一条规则删除掉。

1
iptables -t filter -D INPUT 1

nat表

查看nat 表

image-20211112215806952

查询规则

如图所示

iptables-查询规则2drawio

查询规则

-L 列出规则,在L之前还可以添加其他参数,如下所示:

  • v:显示详细信息,包括每条规则匹配的包数和匹配字节号;
  • x:在v的基础上,禁止自动单位换算(K、M)
  • n:只显示IP地址与端口号码,不显示服务名称

用详细方法列出filter表的的所有规则,只显示IP地址与端口号:

第一种

1
2
3
4
5
root@wjshuai:~# iptables -t filter -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
35 2100 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
# Warning: iptables-legacy tables present, use iptables-legacy to see them

第二种

1
2
3
4
5
root@wjshuai:~# iptables -t filter -v -n -L  INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
35 2100 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
# Warning: iptables-legacy tables present, use iptables-legacy to see them

匹配规则

按网络接口匹配

-i,匹配数据进入的网络接口

1
2
-i eth0 匹配是否从网络接口eth0进入
-i ppp0 匹配是否从网络接口ppp0进入

-o,匹配数据流出的网络接口

1
2
-o eth0 匹配是否从网络接口eth0出去
-o ppp0 匹配是否从网络接口ppp0出去

按照地址进行匹配

-s,匹配来源地址

可以是IP、NET、Domain也可以为空(任何)

1
2
-s 192.168.0.1 匹配来自192.168.0.1的数据包
-s 192.168.1.0/24 匹配来自192.168.1.0/24网络段的数据包

-d,匹配目的地址

可以是IP、NET、Domain也可以为空(任何)

1
2
3
-d 202.106.0.20 匹配去往202.106.0.20的数据包
-d 202.106.0.0/16 匹配去往202.106.0.0/16网络段的数据包
-d www.adc.com 匹配前往域名www.abc.com的数据包

按照协议类型进行匹配

-p,匹配协议类型

可以是任何的网络协议

1
2
3
-p tcp
-p udp
-p icmp

按照端口进行匹配

–sport,匹配源端口

1
2
--sport 1000 匹配源端口是1000的数据包
--sport 1000:3000 匹配源端口是1000到3000的数据包(包含1000与3000)

–dport,匹配目的端口

1
2
--dport 80
--dport 1000:6000

ps:如果需要匹配端口那就需要规则中必须有-p参数。

附加匹配模块

按包状态匹配

state

-m state –state 状态

状态

  • NEW,有别于tcp的syn
  • ESTABLISHED,连接状态

例子

1
ipttables -A INPUT -m state --state NEW.ESTABLISHED -j ACCEPT

按来源MAC匹配

mac

-m mac –mac-source MAC

例如

阻断来自某MAC地址的数据包

1
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP

按包速率匹配

limit

用一定的速率去匹配数据包,而不是去限制数据包。

多端口匹配

multiport

1
iptables -A INPUT -p tcp -m multiports --ports 21,22,23	-j DROP

ps:如果需要匹配端口那就需要规则中必须有-p参数。

target

动作,处理方式,按照规则匹配到流量后,对该流量进行的动作。有如下处理方式:

  • ACCEPT
  • DROP
  • SNAT
  • DNAT
  • MASQUERADE

ACCEPT

接受数据流量

DROP

丢弃数据流量

SNAT

源地址转换,nat表的POSTROUTING

例如

1
2
# 将内网192.168.0.0/24源地址修改为1.1.1.1
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1

DNAT

目的地址转换,DNAT支持 转换为单IP,也支持转换到IP地址池

1
2
# 从ppp0接口进来的要访问TCP/80端口的数据包目的地址修改为192.168.0.1
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1

转发流量

使用iptables的转发流量功能前,需要先开启转发功能

开启转发功能

1
2
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
sysctl -p

清除下所有默认的iptables表

1
2
3
iptables -F
iptables -t nat -F
service iptables save

SNAT策略

策略概述

SNAT策略的典型应用环境

  • 局域网主机共享单个公网IP地址接入Internet

SNAT策略的原理

源地址转换,Source Network Address Translation

  • 修改数据包的源地址

SNAT未使用前

如果SNAT没有使用的话,那么就会像下图以下,无法进行通信。

image-20211113054542183

SNAT使用后

可以进行相互通信了

image-20211113054621095

SNAT 规则编写

1
[root@localhost ~]# iptables -t nat -A POSTROUTING -s A.A.A.0/24 -o eth0 -j SNAT --to-source D.D.D.D

SNAT效果

如果SNAT设置成功,那么就会实现以下效果

  • 在局域网主机 A.A.A.A 中能够访问外网的Web服务器 C.C.C.C

  • 查看Web主机 C.C.C.C 的访问日志,记录的来访者应是网关主机的外网IP地址 D.D.D.D

    1
    2
    3
    4
    [root@localhost ~]# less /var/log/httpd/access_log
    ……
    D.D.D.D - - [26/May/2011:15:26:23 +0800] "GET / HTTP/1.1" 200 28 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2;
    .NET CLR 2.0.50727; Media Center PC 6.0)"

DNAT策略

DNAT的典型应用环境:在Internet中发布内网服务器。

image-20211113060033937

策略编写

1
2
[root@localhost ~]# iptables -t nat -A PREROUTING -i eth0 -d D.D.D.D 
-p tcp --dport 80 -j DNAT --to-destination A.A.A.A

验证DNAT

如何验证,很简单只要实现以下方式就算验证成功。

  • 在外网客户机 C.C.C.C 中能够访问位于企业内网的Web服务,访问地址为 http://D.D.D.D/

  • 查看Web服务器 A.A.A.A 的访问日志,记录了外网客户机的IP地址 C.C.C.C

流量转发

转发TCP流量

1
2
iptables -t nat -A PREROUTING -p tcp --dport [源端口号] -j DNAT --to-destination [目标IP:目标端口号]
iptables -t nat -A POSTROUTING -p tcp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [中转服务器IP]

转发UDP流量

1
2
iptables -t nat -A PREROUTING -p udp --dport [源端口号] -j DNAT --to-destination [目标IP:目标端口号]
iptables -t nat -A POSTROUTING -p udp -d [目标IP] --dport [目标端口号] -j SNAT --to-source [中转服务器IP]

PS:执行完毕后,必须进行保存 请使用service iptables save 进行保存。

参考文献

  1. 开源Linux. iptables系列教程(一)| iptables入门篇[EB/OL]. 2020/05/13 [2021/11/13]. https://bbs.huaweicloud.com/blogs/164852.
  2. 2020/05. iptables系列教程(二)| iptables语法规则[EB/OL]. 2020/05[2021/11]. https://bbs.huaweicloud.com/blogs/detail/165033.
  3. 开源Linux. iptables系列教程(三)| iptables 实战篇[EB/OL]. 2020/05/13[2021/11/13]. https://bbs.huaweicloud.com/blogs/167485.
  4. 乃逸夫. https://zhuanlan.zhihu.com/p/26325389[EB/OL]. 2017/04/12[2021/11/13]. https://zhuanlan.zhihu.com/p/26325389.
  5. 一本正经的搞事情. iptables 四表五链[EB/OL]. 2018/09/26[2021/11/13]. https://www.cnblogs.com/zhujingzhi/p/9706664.html.