所有的云平台的网络流量的进出基本上有三层,首先是虚拟网的流量控制,一般是通过子网访问控制列表来控制vpc也好子网也好的流量出入,其次是安全组控制一层,通过安全组规则控制一类/一组主机(指EC2/ECS/VM/CE这些资源)的流量出入,最后是主机内部的防火墙
redhat系默认使用firewalld服务,ubuntu默认使用ufw,一部分debian系和小众发行版还在使用默认的iptables,不管是哪一种本质上都是在iptables层面上设置的,只不过ufw是更加容易使用的一种封装而已
debian系
更新,安装,启动 ufw
sudo apt update
sudo apt install ufw
sudo ufw enable
redhat系
如果是从redhat下载的镜像可能还需要先用subscription-manager进行注册
sudo yum install epel-release
sudo yum update
sudo yum install ufw
sudo ufw enable
对于流量,有入方向和出方向两种,ufw提供的一般格式为
ufw [allow/deny/reject] [ip/port/service] [incoming/outgoing]
[incoming/outgoing] 指定了流量的方向是出还是入
[ip/port/service] 指定了流量的目标或者来源
[allow/deny/reject] 指定了某个目标(或者来源)的入方向(或者出方向)流量是被接受还是拒绝
激活ufw
ufw enable
禁用ufw
ufw disable
以上都是在系统重启的时候生效 要启动ufw或者修改之后发现网络设置不生效可以用
ufw reload
ufw status
可以列出所有已经存在的规则
其中可以看到ssh已经被允许通过了,但是具体来说是允许进入还是允许出去并没有显示出来
如果使用
ufw status numbered
的话可以看到被允许的流量方向以及规则的标号
以4396为例,先用status查看是否开放了这个端口,然后使用命令ufw allow
ufw allow 4396
果然已经添加成功了
如果要禁用端口4396的话只需要使用命令ufw deny即可
ufw deny 4396
deny和reject都是拒绝的动作,但是对于数据包的处理稍有不同,deny是把被拒绝的数据包直接丢弃掉,并不返回错误信息,通常被拒绝的发送者会等待超时,但是reject拒绝之后可以提供一条错误响应
所以从网络测试来说返回的错误响应有助于调试程序,从安全性来说直接丢弃更加隐蔽
取决于实际使用时的需求,在这里先默认使用deny,因为二者的写法格式是相同的
和端口的写法略有不同的是:
端口只需要一个端口号就可以,IP地址多了两个关键词,以 192.168.0.10为例
允许出方向的写法是
ufw allow to 192.168.0.10
允许入方向的写法是
ufw allow from 192.168.0.10
拒绝也是同理
如果同时指定了目标和源的话也可以,比如可以允许从192.168.0.9到any
ufw allow from 192.168.0.10 to any
如果不是特定的单一IP,而是针对一整个子网允许或者拒绝的话,就要把IP地址换成CIDR地址
比如来自10.0.0.1~10.0.0.255的访问全部都拒绝的话,那也就是拒绝了10.0.0.0/24这个子网
ufw deny from 10.0.0.0/24
如果不仅仅是IP地址或者端口的情形,而是上述的简单情形组合在一起的时候
只要在端口号的后面用 / 并且加上协议名称就行
允许通过tcp的4396端口
ufw allow 4396/tcp
ps:ufw的规则基于源地址、目标地址和端口,但不包括源端口,所以如果想指定从
10.0.0.1 port xxx 到 10.0.0.2 port xxx 的话要么等新版本要么得用iptables进行更加精细的设置
ufw allow from 10.0.0.1 to 10.0.0.2 port 4396
ufw allow proto tcp from 10.0.0.1 to 10.0.0.2 port 7777
ufw allow from 10.0.0.0/24 to 10.0.1.0/24 port 4396
比如要允许流量从宽带进入但是拒绝从wifi进入的流量(这要求也是少见)
其中 wifi的接口是 wlan0,宽带的接口是eth0
on后接网络接口名,in是指入站流量,如果是出站的话就是改成out
ufw allow in on eth0
ufw deny in on wlan0
对于已经允许的端口,如果需要使用默认规则(而非禁用这个端口)的话,就可以删除掉之前添加的规则,而写法比较鬼畜,就是用 delete 加上那条规则本身
比如已经允许了 4396端口
ufw allow 4396
删除它的命令就应该是
ufw delete allow 4396
这种写法对于上述组合的情况而言比较麻烦,所以通常来说是使用
ufw status numbered
先查看带序号的规则然后根据序号删除规则,假如是要删除的是规则7
ufw delete 7
由于某种情况,想要放弃掉所有的规则还原到最初的防火墙设定的话
ufw reset
基本的使用就是以上几种,其中最常用的可能就是端口的情形,对于云平台中的流量控制有NACls和安全组,没有特别设计的情况下本地防火墙的设置通常是保持默认规则
祝大家玩得开心