Docker端口不受ufw防火墻限制問題及解決過程
官方說明
(ufw) 是 Debian 和 Ubuntu 附帶的前端,它允許您管理防火墻規(guī)則。 Docker 和 ufw 使用 iptables 的方式使它們彼此不兼容。
當您使用 Docker 發(fā)布容器的端口時,進出該容器的流量在通過 ufw 防火墻設(shè)置之前會被轉(zhuǎn)移。
Docker 在表中路由容器流量nat,這意味著數(shù)據(jù)包在到達ufw 使用的鏈INPUT之前會被轉(zhuǎn)移。
OUTPUT數(shù)據(jù)包在應(yīng)用防火墻規(guī)則之前進行路由,從而有效地忽略您的防火墻配置。
現(xiàn)在的問題是需要ufw防火墻生效,盡可能少的修改docker網(wǎng)絡(luò)。
下面是解決方法
修改UFW配置文件
修改 UFW 的配置文件 /etc/ufw/after.rules,在最后添加上如下規(guī)則:
# 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,不生效則重啟服務(wù)器
sudo systemctl restart ufw
現(xiàn)在外部就已經(jīng)無法訪問 Docker 發(fā)布出來的任何端口了
假設(shè)現(xiàn)在我有如下容器
- 容器1 端口映射:8081:8080 docker內(nèi)部IP地址:172.17.0.1
- 容器2 端口映射:8082:8080 docker內(nèi)部IP地址:172.17.0.2
- 容器3 端口映射:8083:8085 docker內(nèi)部IP地址:172.17.0.3
允許訪問端口
ufw route allow 8080
這兒8080是容器內(nèi)部的端口,而不是映射出的docker端口,執(zhí)行這個規(guī)則后,容器1和容器2都能被外部訪問。
ufw route allow 8085
執(zhí)行這個規(guī)則后,只有容器3都能被外部訪問。
想要只有容器1被外部訪問
ufw route allow from any to 172.17.0.1 port 8080
容器具體的IP地址可以通過下面的命令獲得
docker network inspect bridge
可以在輸出中找到容器的ip地址,如果使用了自定義網(wǎng)絡(luò),而不是默認的bridge網(wǎng)絡(luò),將bridge更換為自定義網(wǎng)絡(luò)名。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Docker配置容器開機自啟或服務(wù)重啟后自啟兩種常見方法
Docker容器自啟動是指在系統(tǒng)啟動時自動啟動并運行指定的Docker容器,這通常用于確保關(guān)鍵服務(wù)始終可用,無需手動干預(yù),這篇文章主要介紹了Docker配置容器開機自啟或服務(wù)重啟后自啟的?兩種常見方法,需要的朋友可以參考下2025-08-08

