linux防火墙配置

注意
本文最后更新于 2024-12-04,文中内容可能已过时。

bash

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 删除上面建立的某条规则

ufw是用来管理linux防火墙的工具,其使用比iptables更加简单。但是docker中映射出的端口无法通过ufw来阻止,除非使用后文中的解决方法。 debian和ubuntu中一般自带ufw 如果没有可以安装。

bash

sudo apt-get update && sudo  apt-get install ufw

bash

sudo ufw status verbose

##  注意先配置允许放行22端口的ssh服务再启动。
sudo ufw enable|disable ##  开启/关闭防火墙
  1. 基本使用。

bash

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服务
  1. 放行一段端口。

bash

sudo ufw allow 30000:30100/tcp
sudo ufw allow 30000:30100/udp   
  1. 放行来自某一个主机的所有流量。

bash

sudo ufw allow from 192.168.1.100 ##  允许此IP访问所有的本机端口  
  1. 设置默认则。

bash

sudo ufw default allow outgoing ## 默认允许所有数据出站
sudo ufw default deny incoming ## 默认禁止所有数据入站
  1. 删除规则。

bash

sudo ufw delete allow smtp 删除上面建立的某条规则  
sudo ufw delete allow 2333/tcp
  1. 通过序号来删除。

bash

sudo ufw status numbered
sudo ufw delete 4 ## 删除上面的第4条规则

默认情况下,使用docker映射出来的端口,即使在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,在最后添加上如下规则:

text

##  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 之后规则也无法生效,请重启服务器。

使用这种方法意味着放弃了 docker 的网络管理功能,很典型的现象就是容器将无法访问外部网络。 参考这篇文章里的 https://keng42.com/blog/article/docker-ufw/