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
伪装
问题:
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
声明:如无特别声明本文即为原创文章仅代表个人观点,版权归《废权的博客》所有,欢迎转载,转载请保留原文链接。


共有 0 条评论