碎碎念
所有的云平台的网络流量的进出基本上有三层,首先是虚拟网的流量控制,一般是通过子网访问控制列表来控制vpc也好子网也好的流量出入,其次是安全组控制一层,通过安全组规则控制一类/一组主机(指EC2/ECS/VM/CE这些资源)的流量出入,最后是主机内部的防火墙
redhat系默认使用firewalld服务,ubuntu默认使用ufw,一部分debian系和小众发行版还在使用默认的iptables,不管是哪一种本质上都是在iptables层面上设置的,只不过ufw是更加容易使用的一种封装而已
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提供的一般格式为
ufw [allow/deny/reject] [ip/port/service] [incoming/outgoing]
[incoming/outgoing] 指定了流量的方向是出还是入
[ip/port/service] 指定了流量的目标或者来源
[allow/deny/reject] 指定了某个目标(或者来源)的入方向(或者出方向)流量是被接受还是拒绝
启动 / 停止 ufw
激活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是把被拒绝的数据包直接丢弃掉,并不返回错误信息,通常被拒绝的发送者会等待超时,但是reject拒绝之后可以提供一条错误响应
所以从网络测试来说返回的错误响应有助于调试程序,从安全性来说直接丢弃更加隐蔽
取决于实际使用时的需求,在这里先默认使用deny,因为二者的写法格式是相同的
允许 / 拒绝 特定的IP地址
和端口的写法略有不同的是:
端口只需要一个端口号就可以,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
IP和端口的组合
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
IP 端口 协议的组合
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和安全组,没有特别设计的情况下本地防火墙的设置通常是保持默认规则
祝大家玩得开心