Linux学习笔记(八)-防火墙

防火墙原理

防火墙的主要作用:用来控制那些主机可以访问本地的那些服务

特别注意:

firewall-cmd和iptables是冲突的。

所以,如果使用firewall-cmd,应该把iptables和其他防火墙服务屏蔽。

# systemctl  mask   {iptables, ip6tables, ebtables}

firewall-cmd的原理

预先定义了很多“区域”

每个区域,相当于一个“大门”。

每个网卡,都被绑定到某个区域(如果不绑定,就走默认区域)

区域内又定义了很多规则

数据包到达某个区域后,就匹配该区域的规则,以决定是否通过。

功能演示:主机A安装Apache服务,主机B来访问主机A的网站。默认是拒绝访问的(因为主机A的防火墙没有允许http服务)

预定义服务:系统把一些常用的网络访问,进行了定义。比如web访问,定义为http, 就是指在80端口使用http协议,比如ssh访问, 就是在22端口使用ssh协议,所以,可以直接对这些“服务”设置规则。

端口:对于不是预定义服务的访问,就可以使用端口设置规则。注意,设置端口时,必须同时设置所使用的协议(tcp或udp),比如: # firewall-cmd --add-port=8000/tcp

firewall-cmd的常用命令

# firewall-cmd   --help
# firewall-cmd   --help  |  grep  zone
# firewall-cmd   --get-zones
# firewall-cmd  --get-default-zone
# firewall-cmd  --set-default-zone=home

查看指定区域(大门)的所有规则

# firewall-cmd   --list-all  --zone=区域名

查看默认区域(大门)的所有规则

# firewall-cmd   --list-all   

防火墙-预定义服务

在默认区域中,添加一个规则:允许http服务通过防火墙,没有指定区域,就表示是默认区域

# firewall-cmd  --add-service=http    

在指定的home区域添加一个规则:允许http服务通过防火墙

# firewall-cmd  --add-service=http  --zone=home

移除服务

# firewall-cmd  --remove-service=http

查询默认区域中是否允许http服务

# firewall-cmd  --query-service=http  

查询默认区域中是否允许http服务

# firewall-cmd  --query-service=http    --zone=home

防火墙-端口

# firewall-cmd  --add-port=80/tcp   
# firewall-cmd  --remove-port=80/tcp

防火墙-网络接口

查看指定的网络接口(网卡),所绑定到的区域

# firewall-cmd   --get-zone-of-interface=eno16777736

一个网络接口,只能绑定到一个区域。

多个网络接口,可以绑定到同一个区域。

# firewall-cmd  --change-interface=eno16777736  --zone=home

把网络接口eno16777736所绑定的区域,修改为home区域,该命令,用于已经被绑定到某区域的网路接口。

# firewall-cmd  --remove-interface=eno16777736  --zone=home

把网络接口eno16777736,从home区域解绑。解绑后,该网路接口,就没有绑定到任何区域(该接口的数据包就传输到默认接口)

# firewall-cmd  --add-interface=eno16777736  --zone=public

把网络接口eno16777736,绑定到public区域,该命令,用于还没有绑定到任何区域的接口。

注意:一个网卡,只能绑定到一个区域

多个网卡,可以绑定到同一个区域。

来源source

需求: server0安装了web服务器,除了desktop0以外,其他任意主机,都不能访问server0的web网站

实现:
在server0上实现:

firewall-cmd  --remove-service=http
firewall-cmd  --add-service=http   --zone=home
firewall-cmd  --add-source=192.168.0.11   --zone=home

如果某个网络接口,被绑定到某区域,那么,来自该网络接口的所有数据包(无论什么主机),都会“流入”到该区域。如果该区域禁止某个服务(比如http),但是,来自该接口的某个数据包,和其他区域的某个“source规则”匹配,那么该数据包就会流入该区域。

如果某个网络接口,没有被绑定到任何区域。那么,来自该网络接口的所有数据包(无论什么主机),都会“流入”到“默认区域”。但是,如果来自该接口的某个数据包,和某个区域的“source规则”匹配,那么该数据包就会流入该区域。

实例:

# firewall-cmd   --remove-source=192.168.168.1/24 

场景:

主机A:

1)安装了Apache服务(http服务)。

2)主机A的网卡被绑定到了public区域。

3) 主机A的public区域又禁止 http服务。

此时导致:

主机B,就不能访问主机A的网站。

但是,主机A的home区域添加一个source规则,以允许主机B(192.168.168.1)访问。同时home区域又允许http服务

# firewall-cmd   -add-source=192.168.168.1/24  

就会导致:

主机B,可以访问主机A的网站。(是“进入”了主机A的home区域)

其他命令:

# firewall-cmd    --remove-source=192.168.168.1/24    删除源
# firewall-cmd    --add-source=192.168.168.0/24    指定一个网络内的所有主机 

ICMP规则

ICMP是一种协议。ping命令发送的数据包,就是使用ICMP协议的。

测试ping的效果

主机A , ping 主机B(192.168.168.1)

在主机A中: # ping 192.168.168.1

在主机B中抓包:# tcpdump -i eno1677728 not port 22

捕获指定网卡的包,除了22端口的数据包以外。

wireshark

就会发现有很多 ICMP echo request包 (ping的请求包)

ICMP echo reply包 (ping的响应包)

主机B禁止ping

# firewall-cmd   --add-icmp-block=echo-request  
# firewall-cmd   --add-icmp-block=echo-reply

主机B禁止icmp请求包或响应包。其他主机都ping不通主机A

伪装

问题:

2.10

A -> C

[ source ip destination ip .... ]

改为:

[ public network ip destination ip .... ]

主机A能ping通主机B,主机A不能ping通主机C

导致:A不能访问“外网”中的主机。C也不能访问“内网”的主机。

解决方案

方案1:在主机B中开启“转发”功能:

# echo 1 >  /proc/sys/net/ipv4/ip_forword

如果把主机c的网关设置为路由器的外网端口,就可以使主机C也能ping通主机A

该方案的弊端:该方案在内网中有效。因为私网的数据包,是不能转发到公网的。即公网中的路由器收到私网数据包时,直接丢弃。

补充:

IP: A类,B类,C类

每类IP地址,都划分了一部分私有IP,

A类IP的私有地址:10.0.0.0/8

B类IP的私有地址:172.16.0.0/16

C类IP的私有地址:192.168.0.0/24

方案2:

在主机B(路由器)中,开启“伪装功能”。

# firewall-cmd   --add-masquerade

效果:外网的主机C 收到的ping请求包中,源地址是内网路由器的公网IP, 而不是真正的内网主机IP。

端口转发

本地转发

实例:

主机A:安装http服务,使用80端口。192.168.168.2

主机B:用22来访问主机A的网站。 192.168.168.2:22

实现:

在主机A中做“端口转发”

# firewall-cmd  --add-forward-port=port=22:proto=tcp:toport=80:toaddr=

把来自22端口的tcp数据包,转发给本地的80端口。

远程转发

实例:

有主机A(192.168.168.2), 主机B(192.168.168.1), 主机C(192.168.30.30)

任意主机,使用ssh登录到B, 实际却登录主机C

root@A#  ssh  192.168.16 
root@C#

实现:

root@B# firewall-cmd  --add-forward-port=port=22:proto=tcp:toport=22:toaddr=192.168.30.30

注意:

使用远程端口转发时,需要开启防火墙的伪装功能,否则无效!

富规则

服务富规则

问题:在某个区域中,添加一个服务或端口等规则时,就会导致:来自对应接口的“所有远程主机”都使用这个规则.

解决方案:使用富规则。

实例:主机B上安装了http服务,不允许主机C访问主机B的网站。

实现1:

root@B#  firewall-cmd  --add-service=http
root@B#  firewall-cmd  --add-rich-rule  'rule 
family="ipv4" 
source address="192.168.30.30" 
service name="http" 
reject'

注意:不能把source address="192.168.30.30" 写成 source address="192.168.30.30/24",

否则等同于source address="192.168.0/24"

实例2:主机B上安装了http服务,仅允许主机C访问主机B的网站。

实现:

root@B#  firewall-cmd  --remove-service=http
root@B#  firewall-cmd  --add-rich-rule 'rule
family=ipv4
service name=http
source address=192.168.30.30
accept'

端口富规则

服务富规则的缺点:只能处理预定义服务!

比如 http服务(就是tcp/80)

当需要处理其他的非预定服务,比如 tcp/8000,就不能使用服务富规则!

实例:主机B上安装了http服务,不允许主机C访问主机B的网站。

实现1:

root@B#  firewall-cmd  --add-service=http
root@B#  firewall-cmd  --add-rich-rule  'rule 
family="ipv4" 
source address="192.168.30.30" 
port  port=80  protocol=tcp   
reject'

端口转发富规则

实例:仅主机A,使用ssh登录到B, 实际却登录主机C

实现:

root@B firewall-cmd  --add-rich-rule 'rule
family=ipv4
source address=192.168.168.2
forward-port  port=22  protocol=tcp  to-port=22  to-addr=192.168.30.30
accept'

伪装富规则

实例:本地局域网内仅主机A可以访问外网的主机C

实现:

root@B firewall-cmd  --add-rich-rule 'rule
family=ipv4
source address=192.168.168.2
masquerade'
|| 版权声明
作者:废权
链接:https://blog.yjscloud.com/archives/25
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。
THE END
分享
二维码
Linux学习笔记(八)-防火墙
防火墙原理 防火墙的主要作用:用来控制那些主机可以访问本地的那些服务 特别注意: firewall-cmd和iptables是冲突的。 所以,如果使用firewall-cmd,应该把i……
<<上一篇
下一篇>>
文章目录
关闭
目 录