Короче решение нашёл такое.
Я использую ipv6, поэтому есть свои нюансы. Версия docker-compose должна быть из серии 2.x, т.к. в версии 3 еще не доступна настройка enable_ipv6. Так же нужно добавить контейнер
robbertkl/ipv6nat, помогающий с работой ipv6.
___IPv6___ - ваш внешний ip v6
___IPv4___ - ваш внешний ip v4
В docker-compose.yml,:
version: '2.4'
services:
#...
ipv6nat:
container_name: ipv6nat
restart: always
image: robbertkl/ipv6nat
privileged: true
network_mode: host
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- /lib/modules:/lib/modules:ro
networks:
default:
driver: bridge
driver_opts:
com.docker.network.bridge.host_binding_ipv4: "___IPv4___"
com.docker.network.bridge.enable_ip_masquerade: "false"
com.docker.network.bridge.host_binding_ipv6: "___IPv6___"
enable_ipv6: true
ipam:
driver: default
config:
#наши ip, которые будут выдаваться контейнерам, указанным внутри docker-compose
- subnet: 172.16.238.0/24
- subnet: 2001:3984:3989::/64
Далее в iptables (и ip6tables) нужно прописать следующие правила:
sudo iptables -D -t nat -A POSTROUTING -s 172.16.238.0/16 ! -o __NETWORKNAME__ -j SNAT --to-source ___IPv4___
sudo ip6tables -t nat -A POSTROUTING -s 2001:3984:3989::/64 ! -o __NETWORKNAME__ -j SNAT --to-source ___IPv6___
Где __NETWORKNAME__ это название сети, которую создает docker-compose при запуске. По умолчанию она имеет вид %username%
_default
ПС. Не забываем, что после перезагрузки хоста, правила iptables пропадут, поэтому нужно предусмотреть их внесение при загрузке хоста.