Los siguientes cambios de configuración deberían garantizar el flujo de tráfico entre Docker y el host Shorewall. Probado en Shorewall 4.5.21.9 pero debería aplicarse a las versiones más recientes:
/etc/shorewall/shorewall.conf
Asegúrese de que el reenvío de IP esté habilitado (la mayoría de los elementos de configuración son Sí / No, pero este está "Encendido"):
IP_FORWARDING=On
/ etc / shorewall / masq
Habilite el enmascaramiento (NAT) para su red privada de Docker (si usa una red diferente, es decir, inicia Docker con --bip=#.#.#.#/#
, luego cambie en consecuencia). Cambie eth0
a cualquier interfaz en la máquina host con conectividad externa:
#INTERFACE:DEST SOURCE
eth0 172.17.0.0/16
/ etc / shorewall / interfaces
Agregue una entrada de interfaz para que Shorewall sepa con qué interfaz dock
se relaciona la zona:
#ZONE INTERFACE OPTIONS
dock docker0
/ etc / shorewall / zonas
Crea una nueva zona; tenga en cuenta que docker
es demasiado largo y provocará un error de "nombre de zona no válido".
#ZONE INTERFACE
dock ipv4
/ etc / shorewall / policy
Probablemente desee permitir que los contenedores Docker se comuniquen con la máquina host e Internet, por lo que este es un buen punto de partida:
#SOURCE DEST POLICY
# ...(other policies)...
dock all ACCEPT
# ...(other policies, catch-all)...
También puede ser necesario un semejante ACCEPT
política de tráfico desde fw
que dock
, si no ya lo abre con fw
aall
.
Puede ajustar esto aún más en los archivos de políticas o reglas según sea necesario. Por ejemplo, lo anterior no permite explícitamente que el tráfico externo llegue a sus contenedores Docker; revisa tus otras zonas / políticas / reglas para eso.
IP_FORWARDING=Yes
yIP_FORWARDING=True
trabajar también Lo tengo en varios enrutadores de producción, pero su respuesta es mucho más clara que la mía. Buen trabajo./etc/shorewall/interfaces
.Desde que Docker introdujo su función de aislamiento de red, las otras soluciones mencionadas aquí ya no son suficientes si desea utilizar redes personalizadas. Shorewall 5.0.6 presenta soporte para Docker, incluidas las redes de Docker. Esta:
fuente
Lo descubrí en mi caja. Asegúrese de que /etc/shorewall.conf tenga:
IP_FORWARDING=Yes
Docker se basa en el reenvío, y separé que 'puppet' lo establece en 'No' en todos mis servidores.
Actualización: Probablemente también necesite enmascarar el tráfico proveniente de la ventana acoplable de su interfaz WAN.
Edite
/etc/shorewall/masq
y necesitará una línea similar a:br0 172.17.0.0/12
En este caso, mi interfaz WAN es en realidad br0 (un puente), pero la suya probablemente será algo así como eth0. (Use
ifconfig
para ver sus interfaces y sus direcciones IP). En mi máquina, la ventana acoplable utiliza 172.17.0.0/24, que es un rango de direcciones privadas RFC1918. Esto puede diferir en otros sistemas, pero puede ver el rango utilizandoifconfig
una vez más para buscar la interfazdocker0
.fuente
Puede asegurarse de que el conjunto de reglas de Docker sobreviva a un reinicio del muro costero creando scripts de extensión que guarden la
DOCKER
cadena antes del reinicio y luego la restauren nuevamente. Acabo de publicar una publicación con un ejemplo de cómo hacer esto , aunque estoy seguro de que está lejos de ser el único método posible.fuente
El servicio de Docker se puede reiniciar sin afectar los contenedores en ejecución, y se puede ejecutar después de un reinicio de Shorewall para volver a cargar las reglas específicas de Docker. Obviamente, habrá un corto tiempo en el que se interrumpe la conexión en red a los contenedores.
Esto es cierto al menos en mis pocas instalaciones de Archlinux.
fuente
La acción de actualización no purga el iptable, por lo que si solo desea actualizar las reglas o políticas, puede ejecutar la actualización en lugar de reiniciar:
Obviamente, el problema aún persiste si realmente necesita reiniciar el muro de contención. Luego, debe reiniciar la ventana acoplable y volver a cargar sus contenedores.
fuente
Una opción posible es ejecutar Docker con la opción --net = host, para permitir que la aplicación en contenedores acceda a la red de host sin reenvío de IP y NAT.
fuente