文章目录

  • 一、iptables基础
  • 1.1、概述
  • 1.2、重点概念
  • 1.3、四表
  • 1.3.1、raw
  • 1.3.2、mangle
  • 1.3.3、nat
  • 1.3.4、filter
  • 1.4、五链
  • 1.5、iptables流程图
  • 二、iptables部署
  • 2.1、安装iptables软件
  • 2.2、加载模块
  • 2.3、开机启动
  • 2.4、保存防火墙规则
  • 三、iptables语法
  • 3.1、操作命令
  • 3.2、匹配条件
  • 3.2.1、通用匹配
  • 3.2.2、隐含匹配
  • 3.2.3、显示匹配
  • 3.3、处理动作
  • 3.3.1、ACCEPT
  • 3.3.2、DROP
  • 3.3.3、REJECT
  • 3.3.4、SNAT
  • 3.3.5、DNAT
  • 3.3.6、MASQUEREAD
  • 3.3.7、LOG
  • 3.3.8、REDIRECT
  • 四、iptables高级
  • 4.1、基于扩展匹配
  • 4.1.1、iprange模块
  • 4.1.2、multiport模块
  • 4.1.3、limit模块
  • 4.1.4、connlimit模块
  • 4.1.5、string模块
  • 4.1.6、time模块
  • 4.1.7、state模块
  • 4.2、基于扩展动作
  • 4.2.1、LOG
  • 4.2.2、SNAT
  • 4.2.3、DNAT
  • 4.2.4、DROP与REJECT
  • 总结:整理不易,如果对你有帮助,可否点赞关注一下?




一、iptables基础

1.1、概述

netfilter官网对iptables的描述:

iptables is the userspace command line program used to configure the Linux 2.4.x and later packet filtering ruleset. It is targeted towards system administrators.Since Network Address Translation is also configured from the packet filter ruleset, iptables is used for this, too.The iptables package also includes ip6tables. ip6tables is used for configuring the IPv6 packet filter.

个人理解:

iptables其实只是位于用户空间的一个面向系统管理员的Linux防火墙的管理工具。严格来说iptables并不是真正意义上的防火墙,我们可以理解为一个客户端代理,用户通过客户端这个代理,将用户定义的安全设定执行到对应的安全框架中,这个框架就是netfilter。netfilter才是防火墙真正的安全框架( framework),位于内核空间。iptables其实是个命令行工具,位于用户空间,我们用这个工具操作真正的框架。

iptables对应在内核中的模块应该是ip_tables,查看系统内核中ip_tables的信息的时候可以看到ip_tables.ko这个模块是位于netfilter这个目录下的。如下图所示:

iptables 目标多IP_源地址


1.2、重点概念

1、table(表):iptables内置4个table,不同的table代表不同的功能,每个table可以包含许多chain,不同类型的table对所能包含的chain和策略中的target的使用做了限定,一些target不能在一些table中使用。用户不能自定义table;
2、chain(链):chain可用包括一系列的策略,通过配置不同的chain可以对不同作用的策略进行分类,iptables内置5个chain对应netfilter的5个hook,用户也可以自定义chain;
3、command(命令):command是对表或链的操作动作,比如添加、删除、修改等等;
4、rule-specification(策略):包括下面的匹配规则和目标;
5、match(匹配规则):定义本条策略适用于那些数据包,匹配规则可以包括协议、源/目的地址、端口等等;
6、target(目标):对匹配上规则的数据包采取的操作,target可以是一个动作或者自定义chain,常见的动作有丢弃(DROP)、允许(ACCEPT)、NAT等等,当target是自定义chain时,数据包进入自定义chain继续匹配;
7、policy(默认策略):内置chain的默认动作,每个chain只能有一个policy,如果数据包匹配某条chain匹配完最后一条策略依然没有匹配上,那么就采用policy的默认动作。policy不匹配规则,而且target只能是丢弃(DROP)或允许(ACCEPT),自定义chain不能定义policy。

如下所示:

名词

含义

对比

容器

存放东西/存放内容

Netfilter/iptables

是表的容器

国家

表(table)

表是用来存放链的容器


链(chain)

链存放规则的容器


规则(policy)

准许/拒绝访问

区/县


1.3、四表

iptables的四个表iptable_filter,iptable_mangle,iptable_nat,iptable_raw,默认表是filter。表的处理优先级:raw>mangle>nat>filter


1.3.1、raw

raw表:主要用来决定是否对数据包进行状态跟踪。对应的内核模块为:iptable_raw,其表内包括两个链:output、prerouting

如下图所示:

iptables 目标多IP_运维_02


1.3.2、mangle

mangle表:主要用来修改数据包的服务类型,生存周期,为数据包设置标记,实现流量整形、策略路由等。对应的内核模块为:iptable_mangle,其表内包括五个链:prerouting、postrouting、input、output、forward。

如下图所示:

iptables 目标多IP_服务器_03


1.3.3、nat

nat表:nat 全称:network address translation 网络地址转换,主要用来修改数据包的 IP 地址、端口号信息。对应的内核模块为:iptable_nat,其表内包括四个链:prerouting、postrouting、input、output。centos6中nat表没有INPUT链,centos7中nat表中有INPUT链。

如下图所示:

iptables 目标多IP_运维_04


nat表中链介绍如下所示:

NAT功能一般企业工作场景
1.用于做企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)
2.做内部外部ip地址一对一映射(dmz),通过使用iptables防火墙映射ip到内部服务器,ftp服务。(PREROUTING)
3.单个端口的映射,例如:映射80端口(PREROUTING)

OUTPUT:和主机发出去的数据包有关,改变主机发出数据包的目标地址。
PREROUTING:在数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口。
POSTROUTING:在数据包防火墙时进行路由判断之前执行的规则,作用是改变数据包的源地址、源端口。

1.3.4、filter

filter表:用来对数据包进行过滤,具体的规则要求决定如何处理一个数据包。对应的内核模块为:iptable_filter,其表内包括三个链:input、forward、output。

如下图所示:

iptables 目标多IP_服务器_05


filter表中链介绍如下所示:

强调:主要和主机自身有关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)。filter表示iptables默认使用的表,这个表定义了三个链(chain):INPUT、FORWARD、OUTPUT。

INPUT:负责过滤所有主机目标地址是本机地址的数据包,通俗来讲,就是过滤进入主机的数据包。
FORWARD:负责转发流经主机的数据包,起转发的作用,和Nat关系很大。
OUTPUT:处理所有源地址是本机地址的数据包,通俗来讲,就是处理从主机发出去的数据包

1.4、五链

iptables的五个链PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。

1、PREROUTING链:应用于所有进入机器的ip包,包括目的地址是本机和目的地址非本机的包。
2、INPUT链:应用于所有目的是本机的包,也就是目的IP是本机接口地址,所有发给本地socket的数据都经过它。
3、OUPUT链:应用于所有由本机产生的包,所有应用程序发出的数据都经过它。
4、FORWARD链:应用于所有经过路由决策被转发的包,也就是目的地址不是本机的数据包。
5、POSTROUGING链:应用于所有发出机器的IP包,包括本机发出的和从本机转发的数据包。

1.5、iptables流程图

如下图所示:

iptables 目标多IP_iptables 目标多IP_06


二、iptables部署

2.1、安装iptables软件

yum install iptables -y && yum install iptables-services -y

2.2、加载模块

[root@host-48 ~]# modprobe iptable_nat
[root@host-48 ~]# modprobe iptable_filter
[root@host-48 ~]# modprobe iptable_raw
[root@host-48 ~]# modprobe iptable_mangle
[root@host-48 ~]# lsmod | egrep 'iptable_nat|iptable_filter|iptable_raw|iptable_mangle'
iptable_mangle         12695  0 
iptable_raw            12678  0 
iptable_nat            12875  0 
nf_nat_ipv4            14115  1 iptable_nat
iptable_filter         12810  0 
ip_tables              27126  4 iptable_filter,iptable_mangle,iptable_nat,iptable_raw

2.3、开机启动

[root@host-48 ~]# systemctl start iptables.service && systemctl enable iptables.service
[root@host-48 ~]# systemctl stop firewalld.service && systemctl mask firewalld.service
[root@host-48 ~]# systemctl list-unit-files | grep firewalld
[root@host-48 ~]# systemctl list-unit-files | grep iptables

2.4、保存防火墙规则

[root@host-48 ~]# iptables-save >/etc/sysconfig/iptables

三、iptables语法

iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 处理动作]

3.1、操作命令

-t<表>:指定要操纵的表
-A:向规则链末尾中添加,追加条目;(append)
-I:向规则链的开头(或者指定序号)中插入条目,未指定规则序号时,默认作为第一规则;(insert)
-R:修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换;
-L:显示规则链中已有的条目;(list)

-D:从规则链中删除条目;(delete)
-F:清除规则链中已有的条目,若位置定规则序号,则默认清空所有;(flush)
-Z:清空规则链中的数据包计算器和字节计数器;
-X:删除没有用户配置文件相关的chain

-N:创建新的用户自定义规则链;
-P:定义规则链中的默认目标;(police)
-h:显示帮助信息;
-p:指定要匹配的数据包协议类型;
-s:指定要匹配的数据包源ip地址;
-j<目标>:指定要跳转的目标;
-i<网络接口>:指定数据包进入本机的网络接口;
-o<网络接口>:指定数据包要离开本机所使用的网络接口。

-v: 查看规则列表时显示详细信息(verbose)
--line-number:给每个链中的规则加上行号
-n:使用数字形式(numeric)显示输出结果
-L:显示表中的规则

3.2、匹配条件

对于同一条防火墙规则,可以指定多个匹配条件,表示这些条件必须都满足规则才会生效,根据数据包的各种特征,结合iptables的模块结构,匹配条件的设置包括三大类:通用匹配、隐含匹配、显示匹配。如下所示:

类别

条件类型

用法

通用匹配

协议匹配

-p 协议名

通用匹配

地址匹配

-s 源地址、-d 目的地址

通用匹配

接口匹配

-i 入站网卡、-o 出站网卡

隐含匹配

端口匹配

–sport 源端口、–dport 目的端口

隐含匹配

TCP标记匹配

–tcp-flags 检查范围 被设置的标记

隐含匹配

ICMP类型匹配

–icmp-type ICMP类型

显示匹配

多端口匹配

-m multiport --sports

显示匹配

ip范围匹配

-m iprange --src-range ip范围

显示匹配

MAC地址匹配

-m mac --mac-source MAC地址

显示匹配

状态匹配

-m state --state 连接状态


3.2.1、通用匹配

通用匹配也称为常规匹配,这种匹配方式可以独立使用,不依赖于其他条件或扩展模块。常见的通用匹配包括协议匹配、地址匹配、网络接口匹配。

1、协议匹配

iptables规则时使用"-p 协议名’的形式指定,用于检查数据包所使用的网络协议,如tcp、udp、icmp、all等,协议存放在/etc/protocols文件中。

丢弃通过icmp协议访问防火墙本机的数据包
[root@deploy-tools-test1 ~]# iptables -I INPUT -p icmp -j DROP

2、地址匹配

iptables规则时使用"-s 源地址" 或 “-d 目标地址” 的形式指定,用来检查数据包的源地址(source)或目标地址(destination)。IP地址、网段地址等红豆是可以接受,但不建议使用主机名、域名地址。

拒绝转发源地址为192.168.1.38的数据包,允许转发源地址位于192.168.10.0/24网段的数据
[root@deploy-tools-test1 ~]# iptables -t filter -A FORWARD -s 192.168.1.38 -j REJECT
[root@deploy-tools-test1 ~]# iptables -t filter -A FORWARD -s 192.168.10.0/24 -j ACCEPT

3、网络接口匹配

iptables规则时使用"-i 接口名" 和"-o 接口名"的形式,用于检查数据包从防火墙的那一个节后进入或发出,分别对应入站网卡,出站网卡。

丢弃从外网接口(eth1)访问防火墙本机且源地址为私有地址的数据包
[root@deploy-tools-test1 ~]# iptables -t filter -A INPUT -i eth1 -s 192.168.10.0/24 -j DROP
[root@deploy-tools-test1 ~]# iptables -t filter -A INPUT -i eth1 -s 192.168.20.0/24 -j DROP
[root@deploy-tools-test1 ~]# iptables -t filter -A INPUT -i eth1 -s 192.168.30.0/24 -j DROP

3.2.2、隐含匹配

这种匹配方式要求以指定的协议匹配作为前提条件,相当于子条件,因此无法独立使用,其对应的功能由iptables在需要时自动载入内核,常见的隐含匹配包括端口匹配,TCP标记匹配,ICMP类型匹配。

1、端口匹配

构建Vsftpd服务器时,若要开放20,21端口,以及用于被动模式的端口范围200~300
[root@deploy-tools-test1 ~]# iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
[root@deploy-tools-test1 ~]# iptables -t filter -A INPUT -p tcp --dport 200:300 -j ACCEPT

2、tcp标记匹配

iptables可通过匹配TCP的特定标志而设定更加严谨的防火墙规则,tcp-flags参数使用如下:-p tcp --tcp-flags。匹配指定的TCP标记,有两个参数列表,列表内部用逗号为分隔符,两个列表之间用空格分开。第一个列表用作参数检查,第二个列表用作参数匹配。可用以下标志:SYN、ACK、FIN、RST 、URG、PSH、ALL、NONE。ALL是指选定所有的标记,NONE是指未选定任何标记。

防止Xmas扫描
[root@deploy-tools-test1 ~]# iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

防止TCP Null扫描
[root@deploy-tools-test1 ~]# iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

拒绝TCP标记为SYN/ACK但连接状态为NEW的数据包,防止ACK欺骗
[root@deploy-tools-test1 ~]# iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j DROP

3、icmp类型匹配

iptabels规则时使用"–icmp-type ICMP类型"的形式,针对的协议为ICMP用来检查ICMP数据包的类型。ICMP类型使用字符串货数字代码表示,如"Echo-Rwquest" (代码为8)、“Echo-Reply” (代码为0)、“Destunation-Unreachable”(代码为3)、分别对应ICMP协议的请求、回显、目标不可达。

1、禁止其他主机ping本机,允许本机ping其他主机
[root@deploy-tools-test1 ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
或
[root@deploy-tools-test1 ~]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP

2、禁止本机ping其他主机,允许其它主机ping本机
[root@deploy-tools-test1 ~]# iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP
或
[root@deploy-tools-test1 ~]# iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP

3.2.3、显示匹配

1、多端口匹配

iptbales规则时使用"-m multiport --dports 端口列表"、"-m multiport --sports 端口列表"的形式,用来检查数据包的源端口,多个端口之间以逗号进行分隔。

允许本机开放80,443,18080端口
[root@deploy-tools-test1 ~]# iptables -t filter -A INPUT -p tcp -m multiport --dport 80,443,18080 -j ACCEPT

2、ip范围匹配

iptables规则时使用"-m iprange --src-range IP 范围"、"-m iprange --dst-range IP 范围"的形式,用来检查数据包的源地址,目标地址,其中IP范围采用"起始地址-结束地址"的形式表示。

禁止转发源IP地址位于192.168.1.8与192.168.2.8之间的TCP数据包
[root@deploy-tools-test1 ~]# iptables -t filter -A FORWARD -m iprange --src-range 192.168.1.8-192.168.2.8 -j ACCEPT

3、MAC地址匹配

iptables规则时使用"-m mac --mac-source MAC地址"的形式,用来检查数据包的源MAC地址。由于MAC地址本身的局限性,此类匹配条件一般只适用于内部网络。

禁止mac地址为00:0c:29:04:e4:dc的主机访问本机的ssh端口
[root@deploy-tools-test1 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -m mac --mac-source 00:0c:29:04:e4:dc -j DROP

4、状态匹配

iptabls规则时使用"-m state --state连接状态"的形式,基于iptables的状态跟踪机制用来检查数据包的链接状态(State)。常见的连接状态包括NEW(与任何连接无关的)、EXTABLISHED(响应请求或者已建立连接的)和RELATED(与已有连接相关性的,如FTP数据连接。)

只开放本机的Web服务,但对发给本机的TCP应答报文予以放行,其他入站报文均丢弃
[root@deploy-tools-test1 ~]# iptables -I INPUT -p tcp -m multiport --dport 22,53000 -j ACCEPT
[root@deploy-tools-test1 ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@deploy-tools-test1 ~]# iptables -P INPUT DROP

3.3、处理动作

通过-j参数指定,分为基本动作和扩展动作,扩展动作通过自定义链实现的


3.3.1、ACCEPT

ACCEPT:允许数据包通过。


3.3.2、DROP

DROP: 直接丢弃数据包,不作处理,这时候客户端会感觉自己的请求沉入大海,等过了超时时间才会有反应。


3.3.3、REJECT

REJECT:拒绝数据包,会给一个拒绝的响应 --reject-with ‘message’ 可以指定如果被拒绝的情况下的回应消息,message默认是icmp-port-unreachable,还可以有如下选择

icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable
icmp-proto-unreachable
icmp-net-prohibited
icmp-host-prohibited
icmp-admin-prohibited

3.3.4、SNAT

SNAT:源地址转换(Source Network Address, Translation):内部报文发送出去时,报文的源IP被修改,SNAT报文必须存在POSTROUTING链中,也就是从内部发出去的报文经过的最后一道关卡,对应的–to-source选项

#所有从内部机器IP=192.168.10.111发过来的报文都会被隐藏源IP,并转发到192.168.1.111机器上
iptables -t nat -I POSTROUTING -s 192.168.10.111 -j SNAT --to-source 192.168.1.111

3.3.5、DNAT

DNAT:目标地址转换(Destination Network Address, Translation): 外部报文响应时,目标IP再次被修改,从外部网络发送到内部网络的报文,目的IP被修改,一般配置在 PREROUTING链中

#所有从外部访问主机192.168.1.34对应的端口为53000的服务,都会被转发到192.168.100.100:53000 上,目标IP被修改
iptables -t nat -A PREROUTING -d 192.168.1.34 -p tcp -m tcp --dport 53000 -j DNAT --to-destination 192.168.100.100:53000

3.3.6、MASQUEREAD

MASQUEREAD:MASQUEREAD与SNAT 类似,也是将内部发出去的报文映射成公网IP,不同是MASQUEREAD可以指定网卡,而不需要关心IP是什么,即使IP发生变化也可以正常映射

iptables -t nat -I POSTROUTING -s 192.168.10.111 -j  -o eth0 MASQUEREAD

3.3.7、LOG

LOG:打印日志,对匹配到规则的请求打印日志,然后将数据包传给下一个规则,不做任何处理,日志会被记录到/var/log/messages里

--log-level 可以给指定的日志加级别:emerg,alert,crit,error,warn,notice,debug,info
--log-prefix 可以给指定的日志加标签,便于查看

3.3.8、REDIRECT

REDIRECT:在本机做端口映射

#将本机的80端口转发到8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

四、iptables高级

4.1、基于扩展匹配

4.1.1、iprange模块

-m iprange:指定IP地址范围,–src-range :指定源IP的范围,–dst-range:指定目标IP的范围

如下所示:

[root@deploy-tools-test1 ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.1.48-192.168.1.100 -j REJECT

4.1.2、multiport模块

多端口匹配,该模块需与-p tcp和-p udp联合使用。–source-ports 或 --sports: 最多允许使用15个端口,–destination-prots或–dprots :目标端口,–ports:仅匹配端口,源端口或端口均可生效

如下所示:

[root@deploy-tools-test1 ~]# iptables -t filter -I INPUT -p tcp -m multiport --dports 20,21,22,25,80,110 -j ACCEPT

4.1.3、limit模块

限速,按数据包的速率进行匹配,–limit 单位时间内匹配的数据包数量,–limit-burst 可选,允许最大数据包数量,默认为5,/s /h /m 单位时间。

如下所示:

每分钟允许通过1个ICMP数据包,最多不超过10个
[root@deploy-tools-test1 ~]# iptables -A INPUT -p icmp -m limit --limit 1/m --limit-burst 10 -j ACCEPT
[root@deploy-tools-test1 ~]# iptables -A INPUT -p icmp  -j DROP

4.1.4、connlimit模块

connlimit模块允许你限制每个客户端IP的并发连接数,即每个IP同时连接到一个服务器个数。connlimit模块主要可以限制内网用户的网络使用,对服务器而言则可以限制每个IP发起的连接数。

connlimit参数:
  --connlimit-above n    #限制为多少个
  --connlimit-mask n     #这组主机的掩码,默认是connlimit-mask 32 ,即每个IP

如下所示:

1、仅允许每个客户端有两个ssh连接
[root@deploy-tools-test1 ~]# iptables -t filter -I INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT

2、只允许每组C类IP同时2个ssh连接
[root@deploy-tools-test1 ~]# iptables -t filter -I INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 --connlimit-mask 24 -j REJECT

4.1.5、string模块

一般iptables自带的都有string模块,这个模块的作用就是匹配字符串,匹配到泛域名的URL,然后就把数据包丢弃,就实现了屏蔽泛域名的功能。

命令详解:

-A
#添加iptables规则;
-D
#删除iptables规则(把添加防火墙规则时代码中的-A改成-D即可删除添加的规则);
-m string
#指定模块;
--string "xx.com"
#指定要匹配的字符串(域名、关键词等);
--algo bm
#指定匹配字符串模式/算法(还有一种更复杂的算法:kmp);
--to 65535
#指定端口,这里代表所有端口(1-65535);
-j DROP
#指匹配到数据包后处理方式,这里是丢弃数据包。

实例如下:

#添加屏蔽规则,阻止主机访问外部qq.com为主的所有一级、二级、三级等域名网站地址
[root@deploy-tools-test1 ~]# iptables -t filter  -A OUTPUT -m string --string "qq.com" --algo bm --to 65535 -j DROP

#添加屏蔽规则,阻止主机访问含有百度一下报文的网址
[root@deploy-tools-test1 ~]# iptables -t filter -I INPUT -m string --algo bm --string "百度一下" -j REJECT

如下图所示:

iptables 目标多IP_服务器_07


4.1.6、time模块

通过time扩展模块,根据时间段区匹配报文,如果报文到达的时间在指定的时间范围以内,则符合匹配条件。

字段详解

-m time:表示使用time扩展模块,
--timestart 指定时间范围的开始时间,不可取反
--timestop 指定时间范围的结束时间,不可取反
--weekdays 指定星期几 可取反
--monthdays 指定几号,可取反
--datestart 用于指定日期范围的开始日期 不可取反
--datestop 用于指定日期范围的结束时间 不可取反

实例如下:

#限制2021-11-16到2021-11-17时间内主机不能访问外网
[root@deploy-tools-test1 ~]# iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --datestart 2021-11-16 --datestop 2021-11-17 -j REJECT
[root@deploy-tools-test1 ~]# iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --datestart 2021-11-16 --datestop 2021-11-17 -j REJECT

#限制星期一到星期四主机不能访问外网
[root@deploy-tools-test1 ~]# iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 1,2,3,4 -j REJECT
[root@deploy-tools-test1 ~]# iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --weekdays 1,2,3,4 -j REJECT

#限制每月的16日、17日、18日三天主机不能访问外网
[root@deploy-tools-test1 ~]# iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 16,17,18 -j REJECT
[root@deploy-tools-test1 ~]# iptables -t filter -I OUTPUT -p tcp --dport 443  -m time --monthdays 16,17,18 -j REJECT

4.1.7、state模块

state模块的连接其中的报文可以分为5种状态,报文状态可以为NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED

字段详解

- NEW:请求建立连接的包、对于防火墙来说完全陌生
- ESTABLISHED:将要或已经建立连接的包
- RELATED:与已知某个连接相关联的包
- INVALID:无对应连接,或连接无效
- UNTRACKED:未跟踪状态的包

实例如下:

#允许任何主机状态为NEW,ESTABLISHED的状态连接,这里要注意当写成0.0.0.0/0.0.0.0 表示任意地址的时候是可以省略的,如下即可:
[root@deploy-tools-test1 ~]# iptables -A INPUT -d 192.168.1.48 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

#允许本机的ESTABLISHED状态出去,为了防止有反弹时木马,让服务器主动向外发起请求
[root@deploy-tools-test1 ~]# iptables -A OUTPUT -s 192.168.1.48 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

#之后再修改默认权限为拒绝即可
[root@deploy-tools-test1 ~]# iptables -P INPUT DROP
[root@deploy-tools-test1 ~]# iptables -P OUTPUT DROP

#现在在本机ping 127.0.0.1,发现时不同的,所以要允许本机,下面在写一个:
[root@deploy-tools-test1 ~]# iptables -I INPUT 1 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
[root@deploy-tools-test1 ~]# iptables -I OUTPUT 1 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

4.2、基于扩展动作

4.2.1、LOG

此处理动作用于记录日志,不做数据包的处理。默认情况LOG处理动作将日志记录在/var/log/messages系统日志中,也可以将iptables的日志交给rsyslog,需要配置syslog。

字段详解

--log-level level 此选项表示定义日志的级别,这个日志级别同rsyslog的日志级别类似,日志级别有debug、info、notice、warning、error、crit、alert、emerg
--log-prefix prefix 此选项表示定义日志的前缀信息,用于区别不同的日志,最多29个字符

方法一、默认日志查看

实例如下:

记录来访本机的22端口的报文日志,日志级别是info,日志前缀为"ssh log"
[root@deploy-tools-test1 ~]# iptables -t filter -I INPUT 1 -p tcp --dport 22 -j LOG --log-level info --log-prefix "sshlog"

如下图所示:

iptables 目标多IP_linux_08


方法一、syslog日志查看

修改日志记录:

1、修改配置文件
vim /etc/rsyslog.conf
添加以下内容
#iptables log
kern.notice /var/log/iptables.log

2、重启rsyslog
service rsyslog restart

实例如下:

记录来访本机的80端口的报文日志,日志级别是info,日志前缀为"nginx"
[root@deploy-tools-test1 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j LOG --log-level notice --log-prefix "nginx"

如下图所示:

iptables 目标多IP_iptables 目标多IP_09


4.2.2、SNAT

SNAT:源地址转换(Source Network Address, Translation):内部报文发送出去时,报文的源IP被修改,SNAT 报文必须存在POSTROUTING链中,也就是从内部发出去的报文经过的最后一道关卡,对应的–to-source选项。

实例:允许位于局域网中的主机可以访问外网

实验拓扑图如下所示:

iptables 目标多IP_linux_10


操作步骤如下:

1、确保snat主机开启了路由转发功能
[root@snat ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

2、确保snat主机设置防火墙规则,实现SNAT地址转换
[root@snat ~]# iptables -t nat -A POSTROUTING -s  192.168.149.0/24 -p tcp --dport 80 -j SNAT --to-source 192.168.1.34

3、在client主机上进行测试
[root@client ~]# curl http://192.168.1.48
hello

4、在web主机上查看nginx的日志
[root@web ~]# tail -1000f /var/log/nginx/access.log
192.168.1.34 - - [17/Nov/2021:14:23:30 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
192.168.1.34 - - [17/Nov/2021:14:23:30 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
192.168.1.34 - - [17/Nov/2021:14:23:31 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"

通过日志会发现,客户端是先伪装成了192.168.1.34这个ip后再访问的web服务器!

4.2.3、DNAT

DNAT:目的地址转换。当外网主机访问内网的某台服务器的时候,如果直接暴露服务器的IP于公网,可能会遭受各种各样的攻击,而DNAT的主要作用就是在服务器前面添加一台防火墙。将防火墙的地址公布出去,让外网客户端通过访问防火墙的地址就可以访问到本地服务器。这样就起到了保护服务器的目的;

实验拓扑图如下所示:

iptables 目标多IP_源地址_11


操作步骤如下:

1、确保dnat主机设置防火墙规则,实现DNAT地址转换
[root@dnat ~]# iptables -t nat -A PREROUTING -d 192.168.149.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.48

2、本机上并没有监听80端口
[root@dnat ~]# ss -tnulp |grep 80

3、在client主机上测试
[root@client ~]# curl http://192.168.149.100:80
hello

4、在web主机上查看nginx的日志
[root@web ~]# tail -1000f /var/log/nginx/access.log
192.168.149.101 - - [17/Nov/2021:14:51:51 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
192.168.149.101 - - [17/Nov/2021:14:51:51 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"
192.168.149.101 - - [17/Nov/2021:14:51:52 +0800] "GET / HTTP/1.1" 200 6 "-" "curl/7.29.0" "-"

4.2.4、DROP与REJECT

1、REJECT动作会返回一个拒绝(终止)数据包(TCP FIN或UDP-ICMP-PORT-UNREACHABLE),明确的拒绝对方的连接动作,对应报错为Connection refused。

2、DROP动作只是简单的直接丢弃数据,并不反馈任何回应。需要Client等待超时,Client容易发现自己被防火墙所阻挡,对应报错为Connection timed out。

实例一:DROP

1、在host-34主机上设置DROP规则
[root@host-34 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -s 192.168.1.48 -j DROP

2、在host-48主机上测试
[root@host-48 ~]# nc -vz 192.168.1.34 80
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connection timed out.

实例二:REJECT

1、在host-34主机上设置REJECT规则
[root@host-34 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -s 192.168.1.48 -j REJECT

2、在host-48主机上测试
[root@host-48 ~]# nc -vz 192.168.1.34 80
Ncat: Version 7.50 ( https://nmap.org/ncat )
Ncat: Connection refused.

总结:DROP与REJECT相比,REJECT更节约时间,更省带宽。


总结:整理不易,如果对你有帮助,可否点赞关注一下?

更多详细内容请参考:Linux运维实战总结