linux防火墙配置
目录
注意
本文最后更新于 2024-12-04,文中内容可能已过时。
1 ufw常见用法
ufw status ## 检查防火墙的状态
sudo ufw allow smtp 允许所有的外部IP访问本机的25/tcp (smtp)端口
sudo ufw allow 22/tcp 允许所有的外部IP访问本机的22/tcp (ssh)端口
sudo ufw enable|disable ## 开启/关闭防火墙
sudo ufw default allow outgoing ## 默认允许所有数据出站
sudo ufw default deny incoming ## 默认禁止所有数据入站
sudo ufw allow 53 允许外部访问53端口(tcp/udp)
sudo ufw allow from 192.168.1.100 允许此IP访问所有的本机端口
sudo ufw allow proto udp 192.168.0.1 port 53 to 192.168.0.2 port 53
sudo ufw allow 30000:30100/tcp
sudo ufw allow 30000:30100/udp
sudo ufw deny smtp 禁止外部访问smtp服务
sudo ufw delete allow smtp 删除上面建立的某条规则
2 简介安装
ufw是用来管理linux防火墙的工具,其使用比iptables更加简单。但是docker中映射出的端口无法通过ufw来阻止,除非使用后文中的解决方法。 debian和ubuntu中一般自带ufw 如果没有可以安装。
sudo apt-get update && sudo apt-get install ufw
3 使用方法
3.1 启动停止与查看状态
sudo ufw status verbose
## 注意先配置允许放行22端口的ssh服务再启动。
sudo ufw enable|disable ## 开启/关闭防火墙
3.2 配置规则-放行端口或服务
- 基本使用。
sudo ufw allow smtp 允许所有的外部IP访问本机的25/tcp (smtp)端口
sudo ufw allow 22/tcp 允许所有的外部IP访问本机的22/tcp (ssh)端口
sudo ufw allow 53 允许外部访问53端口(tcp/udp)
sudo ufw deny smtp 禁止外部访问smtp服务
- 放行一段端口。
sudo ufw allow 30000:30100/tcp
sudo ufw allow 30000:30100/udp
- 放行来自某一个主机的所有流量。
sudo ufw allow from 192.168.1.100 ## 允许此IP访问所有的本机端口
- 设置默认则。
sudo ufw default allow outgoing ## 默认允许所有数据出站
sudo ufw default deny incoming ## 默认禁止所有数据入站
- 删除规则。
sudo ufw delete allow smtp 删除上面建立的某条规则
sudo ufw delete allow 2333/tcp
- 通过序号来删除。
sudo ufw status numbered
sudo ufw delete 4 ## 删除上面的第4条规则
4 解决与docker的冲突
默认情况下,使用docker映射出来的端口,即使在ufw中组织了或者没有放行,仍然可以访问。有以下两种解决方式。
4.1 调整ufw配置文件(推荐)
方法来自 https://github.com/chaifeng/ufw-docker## %E8%A7%A3%E5%86%B3-ufw-%E5%92%8C-docker-%E7%9A%84%E9%97%AE%E9%A2%98
目前新的解决方案只需要修改一个 UFW 配置文件即可,Docker 的所有配置和选项都保持默认。
修改 UFW 的配置文件 /etc/ufw/after.rules
,在最后添加上如下规则:
## BEGIN UFW AND DOCKER
*filter
:ufw-user-forward - [0:0]
:ufw-docker-logging-deny - [0:0]
:DOCKER-USER - [0:0]
-A DOCKER-USER -j ufw-user-forward
-A DOCKER-USER -j RETURN -s 10.0.0.0/8
-A DOCKER-USER -j RETURN -s 172.16.0.0/12
-A DOCKER-USER -j RETURN -s 192.168.0.0/16
-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d 172.16.0.0/12
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 192.168.0.0/16
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 10.0.0.0/8
-A DOCKER-USER -j ufw-docker-logging-deny -p udp -m udp --dport 0:32767 -d 172.16.0.0/12
-A DOCKER-USER -j RETURN
-A ufw-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
-A ufw-docker-logging-deny -j DROP
COMMIT
## END UFW AND DOCKER
然后重启 UFW,sudo systemctl restart ufw
。现在外部就已经无法访问 Docker 发布出来的任何端口了,但是容器内部以及私有网络地址上可以正常互相访问,而且容器也可以正常访问外部的网络。可能由于某些未知原因,重启 UFW 之后规则也无法生效,请重启服务器。
4.2 调整docker(不推荐)
使用这种方法意味着放弃了 docker 的网络管理功能,很典型的现象就是容器将无法访问外部网络。 参考这篇文章里的 https://keng42.com/blog/article/docker-ufw/