29
2023
11
15:25:16

Linux之防火墙 iptable firewalld

iptable

数据包的流向

数据包的流向,数据包从网卡进入,到内核空间到PREROUTING,到PEREROUTING后通过路由判断是否通过本机,是将数据将进入INPUT,否则流向FORWARD,FORWARD的数据包流向POSTROUTING,POSTROUTING的数据流向网卡,从本机出来的数据包通过路由判断,流向OUTPUT,OUTPUT的数据包流向OPSTROUTING。

四表

iptables有四种表,每一种表有自己功能

表名可以在哪链上使用作用
filterINPUT、FORWARD、OUTPUT过滤数据包
natPREROUTING、INPUT、OUTPUT、POSTROUTING实现网络地址转换(NAT)和端口转发
manglePREROUTING、INPUT、FORWARD、OUTPUT 、POSTROUTING修改数据包的头部信息,包括TOS和TTL等字段
rawPREROUTING、OUTPUT用于禁用连接跟踪,让数据包绕过连接跟踪机制


五链

链名作用
PREROUTING用于在数据包到达本地系统之前修改数据包的目标地址和端口。通常用于实现网络地址转换(NAT)和端口转发等功能。例如,可以使用PREROUTING链将数据包重定向到其他的IP地址或端口
INPUT用于处理进入本地系统的数据包
FORWARD用于处理转发到其他系统的数据包,通常用于限制转发的数据包
OUTPUT用于处理从本地系统发出的数据包,通常用于限制本地系统发出的数据包
POSTROUTING用于在数据包离开本地系统之前修改数据包的源地址和端口,通常用于实现网络地址转换(NAT)和端口转发等功能

参考

iptable 语法

iptables -t 要操作的表    操作命令   要操作的链   规则号码  匹配条件  -j 匹配到以后的动作
iptables  -t [表名称]   -[A | I | D | R | P | F] [链名称]   匹配规则  -j  动作

# -t用来指定表
# -A 、-I 、 -D 、 -R 、-P 、 -F 用来指定对链的操作 
# 流量来源匹配规则  -s指定源ip   -i源指定接口如 eth0   -sport指定源端口 -p指定协议类型 UDP、TCP
# 目的地匹配规则  -d 指定目的地ip -o目的指定接口    -dport指定目的端口 

# -j 用来指定行为,

操作命令(-A、-I、-D、-R、-P、-F、-[vnx]L)

-A<链名>

AAPEND,追加一条规则(放到最后)

iptables -t filter -A INPUT -j DROP

向filter的INPUT链中追加一条规则,匹配所有访问本机的IP的数据包,匹配到丢弃

-I<链名> [规则号码]

INSERT,插入一条规则

iptables -t filter -I INPUT -j DROP

在filter表的INPUT链中插入一条规则(插在第一位置)匹配所有访问本机的IP的数据包,匹配到丢弃

 iptables -t filter -I INPUT 3 -j DROP

在filter表的INPUT链中插入一条规则(插在第3位置)匹配所有访问本机的IP的数据包,匹配到丢弃

-D<链名>[规则号码|具体规则内容]

DELETE,删除一条规则

iptables -t filter -D INPUT 3

删除filter表的INPUT链中第三条规则(不管内容是什么)(按号码匹配)

iptables -t filter -D INPUT -s 192.168.0.1 -j DROP

删除filter表的INPUT链中内容为-s 192.168.0.1 -j DROP 的规则

注意

1、若规则列表中有多条相同规则时,按内容匹配只删除序号最小的一条

2、按号码匹配删除时,确保规则号码<=以有规则,否则报错

3、按内容匹配删除时,确保规则内容存在,否则报错

-R<链名><规则号码><具体规则内容>

REPLACE,替换一条规则

iptables -t filter -R INPUT 3 -j ACCEPT

将原来偏号为3的内容替换为ACCEPT

注意:

确保规则号码<=以有规则,否则报错

-P<链名><动作>

POLICY,设置某个链的默认规则

iptables -t filter  -P INPUT DROP

设置filter 表 INPUT 链的默认规则是DROP

注意:

当数据包没有被规则列表里的任何规则匹配时按此默认规则处理

动作前不能加 -j

-F[链名]

FLUSH,清空规则

iptables -t filter -F INPUT

清空filter 表 INPUT链中所有规则

注意:

-F 仅仅是清空链中规则,并不影响-P设置的默认规则

-P 设置了DROP后。使用 -F一定要小心

如果没有链名,默认清空某表里的所有的链的所有规则

-L

LIST,列出规则

v:显示详细信息,包括每条规则的匹配包数量和匹配字节数

x:在v的基础上,禁止自动单位换算看,(K,M)

n:只显示IP地址和端口号码,不显示域名和服务器名称

iptables -t filter -L

粗略列出filter 表所有链及所有规则

iptables -t nat -vnL

用详细的方式列出 nat 表所有链的所有规则,只显示IP地址和端口号

iptables -t nat -vxnL PREROUTING

用详细方式列出nat表PREROUTING链的所有规则以及详细数字

匹配条件

流入、流出接口(-i、-o)

来源、目的地址(-s、-d)

协议类型(-p)

来源、目的端口(--sport、--dport)

按网络接口匹配

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

-i eth0

匹配是否从网络接口eth0进来

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

-o eth0

匹配是否从网络接口eth0出

按来源目的地址匹配

-s<匹配来源地址>

可以是IP、NET、DOMAIN,也可以为空

-s 192.168.0.1

匹配来自192.168.0.1的数据包

-s 192.168.1.0/24

匹配来自192.168.1.0/24网络数据包

-s 192.168.0.0/16

匹配来自192.168.0.0/16网络数据包

-d<匹配目的地址>

可以是IP、NET、DOMAIN,也可以为空

-d 202.106.0.20

匹配去往202.106.0.20的数据包

-d 202.106.0.0/16

匹配去往202.106.0.0/16网络包

-d www.baidu.com

匹配去往baidu.com的网络数据包

按协议类型匹配

-p<匹配协议类型>

可以是 TCP、UDP、ICMP等,也可以为空

例如

-p  top
-p  udp
-p icmp  --icmp-type 类型

按来源目的端口匹配

--sport<匹配源端口>

--sport 1000

匹配源端口是1000的数据包

--sport 1000:3000

匹配源端口是1000-3000的数据包(含1000、3000)

--sport :3000

匹配源端口是3000以下的数据包包含3000

--sport 1000:

匹配源端口是1000以上的数据包包含1000

--dport<匹配目的端口>

--dport 80

匹配目的端口是80的数据包

--dport 6000:8000

匹配目的端口是6000到8000的数据包(含6000/8000)

--dport :3000

匹配目的端口是3000以下的数据包(含3000)

--dport 2000:

匹配目的端口是2000以上的数据包(含2000)

注意:--sport和--dport必须结合-p参数使用

动作(处理方式)

动作说名
ACCEPT接收
DROP丢弃,不给对端回应
REJECT拒绝,拒绝后,给对端一个回应
SNAT源地址转换
DNAT目的地址转换
MASQUERADE伪装一个公网IP地址

-j ACCEPT

通过,允许数据包通过本链而不拦截它

iptables -A INPUT -j ACCEPT

允许所有访问本机IP的数据包通过

-j DROP

丢弃,阻止数据包通过本链而丢弃它

iptables -A FORWARD -s 192.168.80.39 -j DROP

阻止来源地址为192.168.80.39的数据包通过本机

-j SNAT

-j SNAT --to IP[-IP][:端口-端口](nat 表的POSTROUTING 链)

源地址转换,SNAT 支持转换为单IP,也支持转换地址池(一组连续的IP地址)

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1

将内网192.168.0.0/24的源地址修改为1.1.1.1,用于NAT

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10

同上,只不过修改成一个地址池里的IP

-j DNAT

-j DNAT --to IP[-IP][:端口-端口](nat 表的PREROUTING链)

目的地址转换,DNAT 支持转换为单IP,也支持转换地址池(一组连续的IP地址)

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1

把从ppp0进来要访问 tcp/80的数据包目的地址改成192.168.0.1

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.2:80

把从ppp0进来要访问 tcp/80的数据包目的地址改成192.168.0.2:80

iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.168.0.10


-j MASQUERADE

动态源地址转换(动态ip的情况下使用)

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

将源地址是192.168.0.0、24的数据包进行伪装

附加模块

按包状态匹配(state)

按照源MAC匹配(mac)

按照速率匹配(limit)

多端口匹配(multiport)

按包状态匹配(state)

-m state --state 状态

状态:NEW(刚建立状态)、RELATED(衍生态)、ESTABLISHED(连接状态)、INVALID(不能被识别属于哪个连接或没有任何状态)

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

按照源MAC匹配(mac)

匹配某个MAC地址

-m mac --mac-source MAC

例如

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

阻断来自某个MAC地址的数据包,通过本机

注意:

报文经过路由器后,数据包中原有的MAC信息会替换,所以在路由后的iptables中使用mac模块是没有意义的

iptables -A FORWARD -m mac --mac-source 54:a0:50:d3:14:aa -j DROP

按照速率匹配(limit)

-m limit --limit 匹配速率 [--burst 缓冲数量]

用一定速率去匹配数据包

例如

iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT

注意:

limit 只是按一定速率去匹配而已,50/s表示1秒50个数据包,要想限制的话后面要跟一条DROP

多端口匹配(multiport)

-m multiport <--sport |  --dport | --ports> 端口1[,端口2,.....端口n]

一次性匹配多个端口,可以区分源端口,目标端口或不指定端口

例如

iptables -A INPUT -p tcp -m multiport --dport 21,22,25,80,110 -j ACCEPT

允许所有客户端访问本服务器的 21,22,25,80,110 端口上的服务

注意:

必须与 -p 参数一起使用


firewall-cmd(动态防火墙)

防火墙服务相关操作

开启防火墙服务

systemctl start firewalld

关闭防火墙服务

systemctl stop firewalld

查看防火墙服务状态

systemctl status firewalld

firewall-cmd指定的使用

查看防火墙状态

firewall-cmd --state

重新加载防火墙规则

firewall-cmd --reload

区域(zone)

zone是动态防火墙的一个规则集,没一个规则集里面都定义了防火墙的行为。firewalld一共有9个zone,分别是trusted(信任区域)、 public(公共区域)、external(外部区域)、 home(家庭区域)、internal(内部区域)、 work(工作区域)、dmz(非军事区域)、 block(限制区域)、drop(丢弃区域)。

每一个zone都有如下内容:

#zone的该zone默认行为。当配置到zone规则时放行,否则执行target的行为
target
     #target的值可以是default(默认) ACCEPT (放行) REJECT (拒绝) DROP(丢弃)之一
     

#ICMP协议类型黑白名单开关,当值为on时icmp-blocks中的协议将被拒绝,为yes被允许
icmp-block-inversion

#接口(网卡),
interfaces


#源ip地址,动态防火墙会根据源ip来匹配相应zone
sources

#服务,让指定的服务请求到达时允许通过防火墙,如ssh,http
services

#端口,允许通过防火墙的端口
ports
 
#协议,允许通过防火墙的协议
protocols

#ip伪装,将在防火墙后面的主机发送过来的数据包中的源ip地址换为防火墙的ip,只支持ipv4 
masquerade

#端口转发,将到达防火墙的某个端口数据转发的其他端口或另一台主机或另一台主机的其他端口
forward-ports

#源端口
source-ports

#阻塞icpm协议
icmp-blocks

#富规则
rich rules:

zone的匹配顺序

当一个请求到达时,firewalld会根据source源ip去匹配相应的zone,当没有source源ip时,会根据interface去匹配相应的zone区,当没有source和interface时,firewalld会去到默认区

优先级从高到低:source>interface>默认zone

zone的相关指令

#创建zone
#创建名为myzone的zone区
firewall-cmd --new-zone=myzone ----permanent

#创建后需要重启firewalld
firewall-cmd --reload

#删除zone
#删除myzone
firewall-cmd --delete-zone=myzone --permanent
firewall-cmd --reload

#查看可用的zone
firewall-cmd --get-zones

#查看zone的默认区
firewall-cmd --get-default-zone

#修改zone的默认区
#将lu设为默认区
firewall-cmd --set-default-zone=lu

# 显示生效的zone
firewall-cmd --get-active-zones

#查看ens33接口绑定到的zone
firewall-cmd --get-zone-of-interface=ens33


操作target的命令

#查看指定zone的target值
firewall-cmd --get-target --zone=指定的zone名称

#修改指定zone的target的值
firewall-cmd --set-target=[default | ACCEPT | REJECT | DROP 

#将zone为public改为的target改为ACCEPT
firewall-cmd --set-target=ACCEPT

操作interface的指令

#添加接口(/etc/sysconfig/network-scripts下的网卡配置文件的DEVICE的值)
#添加enp3s0接口,(不加--zone指定zone时,规则会添加到默认的zone,如果要将规则添加到其他的zone,可以通过--zone指定 如 将enp3s1接口添加到drop区:firewall-cmd --add-interface=enp3s1 --zone=drop)
firewall-cmd --add-interface=enp3s0

#删除接口规则
#删除默认区中的interface为enp3s0的规则,如果要操作其他zone区使用--zone
firewall-cmd  --remove-interface=enp3s0

#修改接口
#将public区中的接口规则改为eso
firewall-cmd --change-interface=eso --zone=public

#查看规则是否存在
#查看默认区中interface=enp3s0是否存在,存在返回yes,否则返回on
firewall-cmd --query-interface=enp3s0

#列出默认区的接口规则
firewall-cmd --list-interfaces

操作sources命令

#添加source
#向默认区添加源ip192.168.0.101,一个源ip只能在一个zone区,不能出现在其他zone区
firewall-cmd  --add-source=192.168 0.101

#删除source
#将默认区的源ip为192.168.0.101删除
firewall-cmd --remove-source=192.168.0.101

#查看source是否存在
#查看source为192.168.0.101是否存在
firewall-cmd --query-source=192.168.0.101

#列出默认区的所有source
firewall-cmd --list-sources

操作services指令

#添加服务
#向默认区添加mysql服务
firewall-cmd --add-service=mysql

#删除服务
#删除service=mysql的规则,删除后外部访问mysql的数据包,将不能通过防火墙 
firewall-cmd --remove-service=mysql

#查看指定的service规则是否存在
#查询service=ssh规则是否存在于防火墙规则中,如果存在返回yes,否则返回no
firewall-cmd --query-service=ssh

#列出默认区的所有service
firewall-cmd --list-services

操作port指令

#添加端口
#表示允许端口的数据进入,端口后面跟上协议。允许80端口协议为tcp的流量通过防火墙进入
firewall-cmd --add-port=80/tcp

#删除端口
#删除端口规则,删除端口为80协议为tcp的规则,删除后,80端口协议为tcp的流量包将不能通过防火墙进入
firewall-cmd --remove-port=80/tcp

#查看指定端口规则是否存在
#查询端口为80协议tcp规则是否存在于防火墙规则中,如果存在返回yes,否则返回no
firewall-cmd --query-port=80/tcp

#列出所有的端口规则
#列出所有端口的配置的规则
firewall-cmd --list-ports

操作masquerade指令(IP伪装)

#开启IP伪装
#即将防火墙后面的主机发送出的数据包的源IP换成防火墙的IP
firewall-cmd --add-masquerade

#禁止IP伪装
firewall-cmd --remove-masquerade

#查询IP伪装状态
firewall-cmd --query-masquerade

端口转发(formard-port)

#添加端口转发
#将进入本机的80端口协议为tcp的数据包转发到本机的8080端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080

#将进入本机的80端口协议为tcp的数据包转发到IP地址为192.168.0.101的主机
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.101

#将进入本机的80端口协议为tcp的数据包转发到192.168.0.101的8080端口
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.101:toport=8080

#删除端口转发
#删除forward-port为port=8080:proto=tcp:toport=80的转发规则
firewall-cmd --remove-forward-port=port=8080:proto=tcp:toport=80

#查询转发规则
#查询转发规则为forward=port=8080:proto=tcp:toport=80是否存在于防火墙规则中,如果存在返回yes,否则返回
firewall-cmd --query-forward=port=8080:proto=tcp:toport=80

#列出所有端口转发的规则
firewall-cmd --list-forwall-ports

操作icmp-blocks指令

#添加icmp-blocks
#查看支持的icmp协议类型,可以使用firewall-cmd --get-icmptypes
#ping 阻塞,不返回icmp
firewall-cmd --add-icmp-block=echo-request

#删除icmp-block规则
#删除icmp-block=echo-request的规则
firewall-cmd --remove-icmp-block=echo-request

#查询icmp-block
#查询icmp-block=echo-request规则是否存在于防火墙规则中,如果存在返回yes,否则返回no
firewall-cmd --query-icmp-block=echo-request

#列出所有icmp-block规则
firewall-cmd --list-icmp-blocks

以上命令可以总结为

添加规则命令(--add-)

firewall-cmd --add-[ sources |service | port | masquerade | icmp-block | forward-port | interface ]

删除规则指令(--remove-)

firewall-cmd --remove-[service | port | masquerade | icmp-block | forward-port | interface ]

查询指定的规则是否存在防火墙中(--query-)

firewall-cmd --query-[service | port | masquerade | icmp-block | forward-port |  interface

列出规则(--list-)

firewall-cmd --list-[services | ports | icmp-blocks | forward-ports |  interfaces ]

使防火墙永远生效

直接操作时添加--permanent参数

firewall-cmd  其他规则添加/删除操作  --permanent

#添加--permanent后,需要--reload才能生效
firewall-cmd --reload

富语言

#添加富规则
firewall-cmd --add-rich-rule="RULE"

#删除富规则
firewall-cmd --remove-rich-rule="RULE"

#查看富规则
firewall-cmd --query-rich-rule="RULE"

#列出所有的富规则
firewall-cmd --list-rich-rule="RULE"

富规则模板

rule
 [ family= "IP协议"]

 [ source | destination ]

 address="IP地址 | MASK地址"

 [ 
     [ service name=service名称 ] 
     [ port port=端口或端口范围 protocol="tcp | udp "]
     [ protocol value="协议名称" ]
     [ icmp-block name="ICMP名称"]
     [ masquerade ]
     [ forwaed-port port="端口 | 端口范围" to-port="转发去 端口 | 端口范围"  to-addr="转发去的IP"]
 ]

 [  
     log [ prefix =" prefi text"]  | 
         [ level="日志级别"  ]      |
         [ limit value= "4/s" ]
 ]
 [ audit ]
 [ accept | reject | drop ]

富规则中选项说明

family: 表示协议类型(ipv4 | ipv6),该选项可写可不写
书写格式:family="ipv4" 或 family="ipv6"

source: 表示源,用来修饰address。source address 表示对源IP进行处理
destination 表示目标,用来修饰address。destination address 表示对目标IP进行处理

address: 表示地址,用来指定IP地址或MASK地址
书写格式:address="192.168.0.101"

service:表示服务,用来指定服务
书写格式:service name="服务名称"

port:表示端口,可以是单独的端口或端口范围
书写格式:port port="80" protocol="tcp"

protocol:表示协议,可用在 /etc/protocols查看支持的协议
书写格式:protocol value="协议名称"

icmp-block:表示ICMP类型,查看支持ICMP类型可以通过 firewall-cmd --get-icmptypes
书写格式:icmp-block name="ICMP类型"

masquerade:表示IP伪装,用于将源IP伪装限定在一个范围

forward-port:用于端口转发,将指定的端口的数据包转发到本机的其他端口或另一台主机的其他端口,forwalld-port 后的port表示要转发的端口,to-port表示要转发到的端口,to-addr表示转发到的主机IP

书写格式:forward-port port="80" protocol="tcp" to-port="8080" to-addr="192.168.0.101"

log:表示注册内核日志的连接请求到规则中
    prefix:
    level:表示日志级别(emerg、alert、crit、error、waring、notice、info、debug)
    书写格式:level=info

    limit: 表示持续时间(s、m、h、d)
    书写格式:limit=6s

audit:审核,审核类型有accept、reject、drop。审核类型不在audit指令中指定

动作
  accept:表示所有的连接请求都将被允许
  reject:表示数据包会被拒绝
  drop:表示数据包会被丢弃,并且不会向发起端发送任何信息


#添加一条富规则,将源ip为192.168.0.196 端口为8080 协议为tcp的数据包转发到80端口
firewall-cmd --add-rich-rule="rule family='ipv4' source address='192.168.0.196' forward-port port='8080' protocol='tcp' to-port='80' "






推荐本站淘宝优惠价购买喜欢的宝贝:

image.png

本文链接:https://hqyman.cn/post/4617.html 非本站原创文章欢迎转载,原创文章需保留本站地址!

分享到:
打赏





休息一下~~


« 上一篇 下一篇 »

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

请先 登录 再评论,若不是会员请先 注册

您的IP地址是: