Docker不遵守ufw規(guī)則
如果你在服務(wù)端使用 Docker 映射了某個(gè)宿主機(jī)端口,然后公網(wǎng)訪問(wèn)這個(gè)端口的話漆枚,你會(huì)發(fā)現(xiàn)仍然可以訪問(wèn)雹嗦,即使 ufw 禁用了這個(gè)端口骂维,卻不起效果。
因?yàn)槟J(rèn)狀態(tài)下的 Docker 并不遵守 ufw 的防火墻規(guī)則
解決ufw和docker的問(wèn)題
解決方案:https://github.com/chaifeng/ufw-docker
目前新的解決方案只需要修改一個(gè) UFW 配置文件即可楣责,Docker 的所有配置和選項(xiàng)都保持默認(rèn)。
修改 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穿扳,sudo systemctl restart ufw
。現(xiàn)在外部就已經(jīng)無(wú)法訪問(wèn) Docker 發(fā)布出來(lái)的任何端口了国旷,但是容器內(nèi)部以及私有網(wǎng)絡(luò)地址上可以正趁铮互相訪問(wèn),而且容器也可以正常訪問(wèn)外部的網(wǎng)絡(luò)跪但。可能由于某些未知原因履羞,重啟 UFW 之后規(guī)則也無(wú)法生效,請(qǐng)重啟服務(wù)器屡久。
如果希望允許外部網(wǎng)絡(luò)訪問(wèn) Docker 容器提供的服務(wù)忆首,比如有一個(gè)容器的服務(wù)端口是 80。那就可以用以下命令來(lái)允許外部網(wǎng)絡(luò)訪問(wèn)這個(gè)服務(wù):
ufw route allow proto tcp from any to any port 80
添加禁止 ICMP ping 的規(guī)則
在 before.rules 文件中被环,找到 *filter 和 COMMIT 之間的位置糙及,通常在文件的頂部。然后筛欢,添加以下規(guī)則來(lái)禁止 ICMP ping 請(qǐng)求:
# Block ICMP ping
-A INPUT -p icmp --icmp-type echo-request -j DROP
重新加載 ufw 配置
為了使更改生效浸锨,需要重新加載 ufw:
sudo ufw reload