Skip to content

Commit 0bf8bbe

Browse files
Add fail2ban - default disable
1 parent 73b5ae7 commit 0bf8bbe

7 files changed

Lines changed: 76 additions & 4 deletions

File tree

docker/Dockerfile

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@ RUN set -eux; \
1313
bind-tools \
1414
bind-dnssec-tools \
1515
openssl \
16-
tzdata; \
16+
tzdata \
17+
fail2ban \
18+
iptables \
19+
ip6tables; \
1720
tar -C / -Jxpf /tmp/s6-overlay-noarch.tar.xz; \
1821
tar -C / -Jxpf /tmp/s6-overlay-x86_64.tar.xz; \
1922
rm -rf /tmp/* /var/cache/apk/* /etc/bind/*; \
@@ -22,6 +25,8 @@ RUN set -eux; \
2225
COPY ./bind /etc/bind
2326
COPY ./services.d /etc/services.d
2427
COPY ./cont-init.d /etc/cont-init.d
28+
COPY ./fail2ban/jail.local /etc/fail2ban/jail.local
29+
COPY ./fail2ban/filter.d /etc/fail2ban/filter.d
2530

2631
RUN chmod +x /etc/services.d/*/run /etc/cont-init.d/*
2732

docker/bind/logging.conf

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
logging {
22
channel default_log { syslog daemon; severity info; print-severity yes; print-category yes; print-time yes; };
33
channel errors_log { syslog daemon; severity warning; print-severity yes; print-category yes; print-time yes; };
4+
channel security_file {
5+
file "/var/log/named/security.log" versions 3 size 10m;
6+
severity dynamic;
7+
print-severity yes;
8+
print-category yes;
9+
print-time yes;
10+
};
411

512
category default { default_log; };
613
category config { default_log; };
7-
category security { errors_log; };
8-
category xfer-in { default_log; };
9-
category xfer-out { default_log; };
14+
category security { errors_log; security_file; };
15+
category xfer-in { default_log; security_file; };
16+
category xfer-out { default_log; security_file; };
1017
category update { default_log; };
1118
category dnssec { default_log; };
1219
category queries { default_log; };

docker/cont-init.d/02-fail2ban.sh

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#!/bin/sh
2+
3+
log() {
4+
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
5+
}
6+
7+
[ "${FAIL2BAN_ENABLED:-false}" = "true" ] || { log "fail2ban disabled, skipping setup"; exit 0; }
8+
9+
log "Create fail2ban runtime directories"
10+
mkdir -p /run/fail2ban /var/lib/fail2ban /var/log/fail2ban
11+
12+
log "Create named log directory"
13+
mkdir -p /var/log/named
14+
chown named:named /var/log/named
15+
16+
log "Pre-create security log so fail2ban can monitor it from startup"
17+
touch /var/log/named/security.log
18+
chown named:named /var/log/named/security.log
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Fail2ban filter for BIND9 / named security events
2+
#
3+
# Catches:
4+
# - Refused recursive queries (query cache denied)
5+
# - Refused zone transfers
6+
# - Bad/unauthorized RNDC requests
7+
8+
[Definition]
9+
10+
_daemon = named
11+
12+
failregex = ^%(__prefix_line)s\s*client(?:\s+@\w+)?\s+<HOST>#\d+\s+(?:\(\S+\)\s+)?:\s*(?:view\s+\S+:\s+)?query \(cache\) '.*' denied\s*$
13+
^%(__prefix_line)s\s*client(?:\s+@\w+)?\s+<HOST>#\d+\s*:\s*(?:view\s+\S+:\s+)?(?:transfer of '.*': REFUSED|zone transfer '.*' denied)\s*$
14+
^%(__prefix_line)s\s*client(?:\s+@\w+)?\s+<HOST>#\d+\s*:\s*request has invalid signature\s*$
15+
16+
ignoreregex =
17+
18+
# Log format example:
19+
# 30-May-2026 10:15:23.456 security: client @0x7f1234567890 192.168.1.100#54321 (example.com): query (cache) 'example.com/ANY/IN' denied

docker/fail2ban/jail.local

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
[DEFAULT]
2+
# Ban duration: 1 hour
3+
bantime = 3600
4+
# Scan last 10 minutes for offenses
5+
findtime = 600
6+
# Default max retries before ban
7+
maxretry = 5
8+
9+
[named-security]
10+
enabled = true
11+
filter = named-security
12+
logpath = /var/log/named/security.log
13+
# Ban after 3 violations (refused queries / zone transfer attempts)
14+
maxretry = 3
15+
bantime = 3600
16+
banaction = iptables-allports

docker/services.d/fail2ban/run

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/sh
2+
[ "${FAIL2BAN_ENABLED:-false}" = "true" ] || { echo "fail2ban disabled"; exec tail -f /dev/null; }
3+
exec fail2ban-server -f -x -s /run/fail2ban/fail2ban.sock 2>&1

example/docker-compose.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ services:
77
- "53:53/tcp"
88
# - "953:953/tcp"
99
restart: always
10+
environment:
11+
- FAIL2BAN_ENABLED=false
12+
cap_add:
13+
- NET_ADMIN
1014
volumes:
1115
- bind_keys:/var/cache/bind/keys
1216
- ./bind:/etc/bind

0 commit comments

Comments
 (0)