Skip to content

Commit 118f8d8

Browse files
committed
Add IPv6 support
1 parent 6cdd4df commit 118f8d8

2 files changed

Lines changed: 91 additions & 2 deletions

File tree

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,22 @@ Con:
193193

194194
Doesn't support older versions of Ubuntu, and the command is a bit more complicated. But you can use my script.
195195

196+
### IPv6
197+
198+
[Enable IPv6 support](https://forums.docker.com/t/docker-user-chain-for-ip6tables/133961/3) in Docker by specifying ULA range (RFC 4193) in `/etc/docker/daemon.json`
199+
```json
200+
{
201+
"experimental": true,
202+
"ipv6": true,
203+
"ip6tables": true,
204+
"fixed-cidr-v6": "fd00:dead:beef::/48"
205+
}
206+
```
207+
208+
Restart Docker
209+
```shell
210+
systemctl restart docker
211+
```
196212

197213
### Conclusion
198214

ufw-docker

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ fi
2424
test -n "$ufw_docker_agent_image"
2525

2626
function ufw-docker--status() {
27-
ufw-docker--list "$GREP_REGEXP_INSTANCE_NAME"
27+
ufw-docker--list "$GREP_REGEXP_INSTANCE_NAME" | uniq
2828
}
2929

3030
function ufw-docker--list() {
@@ -42,13 +42,19 @@ function ufw-docker--list() {
4242
NETWORK="[[:graph:]]*"
4343
fi
4444

45+
# IPv4
4546
ufw status numbered | grep "# allow ${INSTANCE_NAME}\\( ${INSTANCE_PORT}\\/${PROTO}\\)\\( ${NETWORK}\\)\$" || \
4647
ufw status numbered | grep "# allow ${INSTANCE_NAME}\\( ${INSTANCE_PORT}\\/${PROTO}\\)\$" || \
4748
ufw status numbered | grep "# allow ${INSTANCE_NAME}\$"
49+
50+
# IPv6
51+
ufw status numbered | grep "# allow ${INSTANCE_NAME}_IPv6\\( ${INSTANCE_PORT}\\/${PROTO}\\)\\( ${NETWORK}\\)\$" || \
52+
ufw status numbered | grep "# allow ${INSTANCE_NAME}_IPv6\\( ${INSTANCE_PORT}\\/${PROTO}\\)\$" || \
53+
ufw status numbered | grep "# allow ${INSTANCE_NAME}_IPv6\$"
4854
}
4955

5056
function ufw-docker--list-number() {
51-
ufw-docker--list "$@" | sed -e 's/^\[[[:blank:]]*\([[:digit:]]\+\)\].*/\1/'
57+
ufw-docker--list "$@" | sed -e 's/^\[[[:blank:]]*\([[:digit:]]\+\)\].*/\1/' | uniq
5258
}
5359

5460
function ufw-docker--delete() {
@@ -68,6 +74,7 @@ function ufw-docker--allow() {
6874
die "Docker instance \"$INSTANCE_NAME\" doesn't exist."
6975

7076
mapfile -t INSTANCE_IP_ADDRESSES < <(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{"\n"}}{{end}}' "$INSTANCE_NAME" 2>/dev/null | remove_blank_lines)
77+
mapfile -t INSTANCE_IP_V6_ADDRESSES < <(docker inspect --format='{{range .NetworkSettings.Networks}}{{.GlobalIPv6Address}}{{"\n"}}{{end}}' "$INSTANCE_NAME" 2>/dev/null | remove_blank_lines)
7178

7279
[[ -z "${INSTANCE_IP_ADDRESSES:-}" ]] && die "Could not find a running instance \"$INSTANCE_NAME\"."
7380

@@ -92,6 +99,17 @@ function ufw-docker--allow() {
9299
ufw-docker--add-rule "$INSTANCE_NAME" "$IP" "${PORT_PROTO%/*}" "${PORT_PROTO#*/}" "${INSTANCE_NETWORK}"
93100
RETVAL="$?"
94101
done
102+
103+
ITER_V6=0
104+
for IP in "${INSTANCE_IP_V6_ADDRESSES[@]}"; do
105+
INSTANCE_NETWORK="${INSTANCE_NETWORK_NAMES[$ITER_V6]}"
106+
ITER_V6=$((ITER_V6+1))
107+
if [[ -n "$NETWORK" ]] && [[ "$NETWORK" != "$INSTANCE_NETWORK" ]]; then
108+
continue
109+
fi
110+
ufw-docker--add-rule "${INSTANCE_NAME}_IPv6" "$IP" "${PORT_PROTO%/*}" "${PORT_PROTO#*/}" "${INSTANCE_NETWORK}"
111+
RETVAL="$?"
112+
done
95113
fi
96114
done
97115
if [[ "$RETVAL" -ne 0 ]]; then
@@ -290,13 +308,17 @@ function ufw-docker--raw-command() {
290308
}
291309

292310
after_rules="/etc/ufw/after.rules"
311+
after6_rules="/etc/ufw/after6.rules"
293312

294313
function ufw-docker--check() {
295314
err "\\n########## iptables -n -L DOCKER-USER ##########"
296315
iptables -n -L DOCKER-USER
297316

298317
err "\\n\\n########## diff $after_rules ##########"
299318
ufw-docker--check-install && err "\\nCheck done."
319+
320+
err "\\n\\n########## diff $after6_rules ##########"
321+
ufw-docker--check-install_ipv6 && err "\\nCheck IPv6 done."
300322
}
301323

302324
declare -a files_to_be_deleted
@@ -352,6 +374,43 @@ function ufw-docker--check-install() {
352374
diff -u --color=auto "$after_rules" "$after_rules_tmp"
353375
}
354376

377+
function ufw-docker--check-install_ipv6() {
378+
DOCKER_IPV6_NETWORK=$(sed -En 's/.*"fixed-cidr-v6":.?"([^"]*).*/\1/p' /etc/docker/daemon.json)
379+
[[ -z "${DOCKER_IPV6_NETWORK:-}" ]] && die "Could not find \"fixed-cidr-v6\" in \"/etc/docker/daemon.json\"."
380+
381+
after6_rules_tmp="${after6_rules_tmp:-$(mktemp)}"
382+
rm-on-exit "$after6_rules_tmp"
383+
384+
sed "/^# BEGIN UFW AND DOCKER/,/^# END UFW AND DOCKER/d" "$after6_rules" > "$after6_rules_tmp"
385+
>> "${after6_rules_tmp}" cat <<-\EOF
386+
# BEGIN UFW AND DOCKER
387+
*filter
388+
:ufw6-user-forward - [0:0]
389+
:ufw6-docker-logging-deny - [0:0]
390+
:DOCKER-USER - [0:0]
391+
-A DOCKER-USER -j ufw6-user-forward
392+
393+
-A DOCKER-USER -j RETURN -s {DOCKER_IPV6_NETWORK}
394+
395+
-A DOCKER-USER -p udp -m udp --sport 53 --dport 1024:65535 -j RETURN
396+
397+
-A DOCKER-USER -j ufw6-docker-logging-deny -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -d {DOCKER_IPV6_NETWORK}
398+
-A DOCKER-USER -j ufw6-docker-logging-deny -p udp -m udp --dport 0:32767 -d {DOCKER_IPV6_NETWORK}
399+
400+
-A DOCKER-USER -j RETURN
401+
402+
-A ufw6-docker-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW DOCKER BLOCK] "
403+
-A ufw6-docker-logging-deny -j DROP
404+
405+
COMMIT
406+
# END UFW AND DOCKER
407+
EOF
408+
409+
sed -i "s/{DOCKER_IPV6_NETWORK}/${DOCKER_IPV6_NETWORK/\//\\/}/g" "$after6_rules_tmp"
410+
411+
diff -u --color=auto "$after6_rules" "$after6_rules_tmp"
412+
}
413+
355414
function ufw-docker--install() {
356415
if ! ufw-docker--check-install; then
357416
local after_rules_bak
@@ -366,6 +425,20 @@ function ufw-docker--install() {
366425
err " sudo service ufw restart"
367426
fi
368427
fi
428+
429+
if ! ufw-docker--check-install_ipv6; then
430+
local after6_rules_bak
431+
after6_rules_bak="${after6_rules}-ufw-docker~$(date '+%Y-%m-%d-%H%M%S')~"
432+
err "\\nBacking up $after6_rules to $after6_rules_bak"
433+
cp "$after6_rules" "$after6_rules_bak"
434+
cat "$after6_rules_tmp" > "$after6_rules"
435+
err "Please restart UFW service manually by using the following command:"
436+
if type systemctl &>/dev/null; then
437+
err " sudo systemctl restart ufw"
438+
else
439+
err " sudo service ufw restart"
440+
fi
441+
fi
369442
}
370443

371444
function ufw-docker--help() {

0 commit comments

Comments
 (0)