![在 docker 容器中使用 fail2ban 阻止传入连接](https://linux22.com/image/784069/%E5%9C%A8%20docker%20%E5%AE%B9%E5%99%A8%E4%B8%AD%E4%BD%BF%E7%94%A8%20fail2ban%20%E9%98%BB%E6%AD%A2%E4%BC%A0%E5%85%A5%E8%BF%9E%E6%8E%A5.png)
我尝试在 docker 容器中使用 fail2ban 来阻止进入我的 nextcloud(也在 docker 容器中运行)的连接。但是,我只能让 fail2ban 更改其自身容器的 iptables,而不能更改 docker 主机的 iptables。
我当前的设置如下:
docker-compose
app:
image: nextcloud:latest
container_name: nextcloud_app
restart: always
ports:
- 7000:80
- 7001:443
...
fail2ban:
image: lscr.io/linuxserver/fail2ban:latest
container_name: nextcloud_fail2ban
network_mode: host
restart: always
environment:
- PUID=1000
- PGID=1000
volumes:
- ./data/fail2ban:/config
- ./data/nextcloud/data:/var/log:ro # the directory of the nextcloud log
cap_add:
- NET_ADMIN
- NET_RAW
jail.d/nextcloud.conf
[nextcloud]
enabled = true
port = 80,443,7000,7001
protocol = tcp
filter = nextcloud
Tlogpath = /var/log/nextcloud.log
maxretry = 3
bantime = 86400
findtime = 14400
# banaction = docker-action
# chain = DOCKER-USER
# action = iptables[actname=iptables-input, name=HTTPS, port=https, protocol=tcp]
# iptables[actname=iptables-forward, name=HTTPS-DOCKER, chain=FORWARD, port=443, protocol=tcp]
这会导致在 fail2ban 容器上正确设置 iptables(例如禁止 192.168.1.125):
root@grievous:/# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N f2b-nextcloud
-A INPUT -p tcp -m multiport --dports 80,443,7000,7001 -j f2b-nextcloud
-A f2b-nextcloud -s 192.168.1.125/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-nextcloud -j RETURN
但主机 iptables 保持不变。这对我没有太大帮助,因为我不想阻止到 fail2ban 容器的流量,而是阻止到 nextcloud 容器的流量(或者一般来说,阻止从被禁止的 ip 地址到 docker 主机的所有传入流量)。
我在网上查找了一些解决方案,但无法将难题拼凑起来。我想我必须使用链DOCKER-USER
。然而,使用它时没有创建任何 iptables。
有人建议安装 fail2ban baremetal,但我不想要。
我还尝试使用我找到的 docker-action.conf,但这也没有帮助,因为它还在 fail2ban 容器上创建了 iptables
[Definition]
actionstart = iptables -N f2b-npm-docker
iptables -A f2b-npm-docker -j RETURN
iptables -I FORWARD -p tcp -m multiport --dports 0:65535 -j f2b-npm-docker
actionstop = iptables -D FORWARD -p tcp -m multiport --dports 0:65535 -j f2b-npm-docker
iptables -F f2b-npm-docker
iptables -X f2b-npm-docker
actioncheck = iptables -n -L FORWARD | grep -q 'f2b-npm-docker[ \t]'
actionban = iptables -I f2b-npm-docker -s DROP <ip >-j
actionunban = iptables -D f2b-npm-docker -s DROP <ip >-j
所以我想我的问题/疑问是如何告诉 fail2ban 在 docker 主机上安装 iptables 而不是在其自己的容器上。也许我必须更改network_mode
?
正如这篇文章所述https://serverfault.com/a/1032094/1005675fail2ban 将作为附加 pod 运行,并需要写入主机 iptables
非常感谢您的帮助=)
答案1
我也在探索这一点。你在这里有什么进展吗?从我目前的理解来看,将 fai2ban 集成到 Nextcloud 容器本身中可能会更容易。
这意味着要在 Nextcloud 镜像之上构建。例如,请参见:
FROM nextcloud:25.0.4-apache
RUN apt-get update && apt-get install -y supervisor \
&& rm -rf /var/lib/apt/lists/* \
&& mkdir /var/log/supervisord /var/run/supervisord
COPY supervisord.conf /
ENV NEXTCLOUD_UPDATE=1
CMD ["/usr/bin/supervisord", "-c", "/supervisord.conf"]
这里的目的是添加supervisor
到 Nextcloud 容器中,这样就cron
可以在没有另一个专用的 Nextcloud 映像的情况下运行。
这个项目可能是另一个难题,因为它将 fail2ban 集成到 Asterisk docker 镜像中。