Docker y Muro Costero

16

Estoy usando Shorewall en mi servidor como un simple firewall independiente y me gustaría usar Docker también.

Mediante el uso de un contenedor Docker y su redirección de puertos, Docker configura sus propias reglas / cadenas de iptables que se eliminarán si se reinicia Shorewall. Entonces el contenedor se volverá inalcanzable .

¿Alguien logró guardar / restaurar las reglas de la ventana acoplable al reiniciar el muro costero o alguien tiene otra solución?

Ver también:

jaltek
fuente

Respuestas:

19

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 eth0a 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 dockse relaciona la zona:

#ZONE           INTERFACE               OPTIONS
dock            docker0

/ etc / shorewall / zonas

Crea una nueva zona; tenga en cuenta que dockeres 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 ACCEPTpolítica de tráfico desde fwque dock, si no ya lo abre con fwaall .

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.

fazy
fuente
1
IP_FORWARDING=Yesy IP_FORWARDING=Truetrabajar también Lo tengo en varios enrutadores de producción, pero su respuesta es mucho más clara que la mía. Buen trabajo.
Aaron C. de Bruyn
Perdone mi ignorancia: cuando reinicio el muro costero después de agregar las reglas dadas, recibo una advertencia de que el muelle es una "INTERFAZ VACÍA" ... y de hecho, al leer lo anterior, no me queda claro cómo el muro costero puede inferir la conexión entre el 172.17 direcciones y la zona 'dock'. ¿Me estoy perdiendo algo obvio sobre cómo funciona el muro de contención?
John Clements
Lo siento, me perdí un cambio en el archivo de interfaces. He editado la respuesta, ver nueva sección /etc/shorewall/interfaces.
Fazy
Gracias. También funciona bien con shorewall 5 (que es compatible con acopladores), para que el host se una a sus contenedores.
Drasill
la configuración de masq es muy importante, de lo contrario, un contenedor acoplable no podrá acceder a otro contenedor utilizando una IP externa - se bloqueará
Eugen Mayer
6

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:

  • Permite iniciar / detener / reiniciar Shorewall y Docker en cualquier orden
  • Evita la necesidad de mantener una secuencia de comandos de extensión
linuxhackerman
fuente
2

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/masqy 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 ifconfigpara 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 utilizando ifconfiguna vez más para buscar la interfaz docker0.

Aaron C. de Bruyn
fuente
2

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 DOCKERcadena 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.

womble
fuente
0

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.

átomo
fuente
0

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:

sudo shorewall refresh

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.

lenybernard
fuente
0

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.

DukeLion
fuente