Seguridad

Creación manual de contenedores mediante espacios de nombres: uso de espacios de nombres de red para VPN

Durante el último año, he estado escribiendo para Enable Sysadmin sobre algunos de los espacios de nombres de Linux más utilizados.en un Publicación anterior, demuestro varias técnicas para crear e interactuar con espacios de nombres de red. Este artículo amplía este ejercicio creando un espacio de nombres para una única conexión VPN. Si desea continuar leyendo este artículo, asegúrese de leer la primera parte. Establece las bases que necesita configurar para seguir adelante.

Por supuesto, no es necesario que administre los espacios de nombres manualmente. Los contenedores de Linux brindan esta funcionalidad a través de aplicaciones fáciles de usar que incluyen Podman, Budachy Kubernetes. Sin embargo, descubrí que crear espacios de nombres es una excelente manera de dominar los componentes básicos.

Si leyó mi artículo sobre espacios de nombres de red, conectó varios espacios de nombres de red con un solo conmutador virtual, por lo que en este artículo está listo para explorar la creación de un espacio de nombres único mediante conexiones OpenVPN.Saco este ejemplo de un buen ejemplo. GitHub por James MCM.

Aprovecharé esta oportunidad para mostrar algunos aspectos diferentes del espacio de nombres de red. Como descubrirá a continuación, realizar esta tarea es más adecuado para lenguajes que no sean Bash. Deberá adjuntar dos sesiones diferentes al host que está tratando de alcanzar. Para mayor claridad, indicaré cuándo se realiza el trabajo en el host (en el espacio de nombres raíz) y cuándo se realiza en el nuevo espacio de nombres.

Supongo que no estás corriendo Firewall en la computadora local para este ejemplo. Como en el post anterior, recomiendo configurar algunas variables para que sea más fácil adaptarse a esta situación.

Sentar las bases

Comience con un shell en el espacio de nombres raíz.A diferencia de otros objetivos de esta serie, debe usar privilegios elevados porque no sé cómo modificar una interfaz de red en el espacio de nombres raíz sin usar sudo o acceso completo a la raíz.

Primero establezca algunas variables de entorno para que sea más fácil de ajustar:

#on the host 
export VPN_NAMESPACE=vpn-ns
VETH1=host
VETH2=vpn-namespace
VETH1_IP=172.25.0.1
VETH2_IP=172.25.0.2
SUBNET_BITS=24
VPN_NETWORK=172.25.0.0/$SUBNET_BITS
MAIN_INTERFACE=`ip route |grep default |awk '{print $5}'`

Como mencioné en mi última publicación, puede crear un directorio a continuación /etc/netns Ayuda con los espacios de nombres resolv.conf pregunta.En este caso, puede utilizar este directorio para almacenar resolv.conf Archivos que se montarán más tarde:

$ sudo mkdir -p /etc/netns/$VPN_NAMESPACE
$ sudo chown -R $USER /etc/netns/$VPN_NAMESPACE/
$ sudo echo "nameserver 37.235.1.174" > /etc/netns/$VPN_NAMESPACE/resolv.conf

notas: El servidor de nombres 37.235.1.174 aparece en zona libre, que afirma no realizar ningún registro. Si bien nadie puede verificar esto sin una orden judicial, prefiero estos servidores al 8.8.8.8 de Google, que es conocido por recopilar datos.

Es posible que haya notado que rellené previamente resolv.conf documento.Por lo general, NetworkManager o resolvd maneja esto.Sin embargo, este ejemplo usa OpenVPN en la línea de comando, aunque tiene up y down en su parte .ovpn archivo, por simplicidad, la secuencia de comandos monta el pre-rellenado resolv.confEl siguiente comando crea un script que se ejecutará cuando OpenVPN se conecte a un punto final específico.Esto se define por conexión VPN, por lo que no se llamará a menos que se agregue a cada conexión VPN. .ovpn documento:

$ sudo -Eu root bash -c 'cat << EOF > /etc/openvpn/set_container_resolver.sh
#!/usr/bin/env bash
case \$script_type in
up)
    mount -o bind /etc/netns/${VPN_NAMESPACE}/resolv.conf /etc/resolv.conf
    ;;
down)
    umount /etc/resolv.conf
    ;;
esac
exit 0
EOF'

$ sudo chmod +x /etc/openvpn/set_container_resolver.sh

A continuación, abra una nueva terminal para crear un nuevo espacio de nombres en el que se establecerá la conexión OpenVPN.Las variables de entorno son similares a las anteriores, excepto VPN_NETWORK y MAIN_INTERFACE se reemplaza con PS1 Cambiando.Esta PS1 Las variables controlan el indicador de shell de Bash. Esto es decorativo y ayuda a distinguir entre diferentes espacios de nombres:

# open a new terminal/shell
$ unshare --user --map-root-user --net --mount --fork 

VPN_NAMESPACE=vpn-ns
VETH1=host
VETH2=vpn-namespace
VETH1_IP=172.25.0.1
VETH2_IP=172.25.0.2
SUBNET_BITS=24
PS1='\[email protected]${VPN_NAMESPACE} $'

La primera línea en el bloque de código a continuación crea el par VETH del nuevo espacio de nombres y lo conecta al pid 1.

Esta ip link comando tiene un subcomando llamado netnsy cuando un espacio de nombres no tiene nombre, puede identificarlo por su PID:

ip link add $VETH2 netns $$ type veth peer name $VETH1 netns 1
ip addr add 127.0.0.1/8 dev lo
ip link set lo up
ip link set $VETH2 up
ip addr add $VETH2_IP/$SUBNET_BITS dev $VETH2
ip route add default via $VETH1_IP dev $VETH2

Aunque puede agregar un VETH dispositivo al espacio de nombres raíz, no puede establecerlo en UP, tampoco puedo darle una IP. Hacerlo requiere privilegios elevados en el espacio de nombres raíz. Además, es posible que el sistema no tenga activado el reenvío de IP. Los siguientes comandos emitidos en el espacio de nombres raíz realizarán ambas tareas:

# on the host
$ sudo ip link set $VETH1 up
$ sudo ip addr add $VETH1_IP/$SUBNET_BITS dev $VETH1

$ sudo iptables -t nat -A POSTROUTING -s $VPN_NETWORK -o $MAIN_INTERFACE -j MASQUERADE
$ sudo sysctl -q net.ipv4.ip_forward=1

La siguiente parte es opcional.cuando usas unshare comando, no estará disponible ni visible ip netns Pedido.Esto es porque unshare existe /proc/ y ip netns El comando espera que el espacio de nombres esté en /run/netns/Hay varias formas de arreglar esto, pero quizás la más fácil es vincular el montaje /proc/ Ingresar /run/netnsinstalando efectivamente el espacio de nombres en dos ubicaciones.

Es posible que desee hacer esto porque la creación de un espacio de nombres solo contiene ip netns El comando solo crea el espacio de nombres de la red. También hace esto como root.Esto significa que si está buscando una capa adicional de aislamiento a través del espacio de nombres de usuario, no puede usar ip netns Pedido.Sin embargo ip Los comandos proporcionan una manera muy conveniente de interactuar con un espacio de nombres que ya se está ejecutando. El siguiente comando vinculará el montaje del espacio de nombres vpn-ns que está utilizando:

$ sudo mkdir -p /run/netns
$ sudo -Eu root bash -c 'touch /run/netns/$VPN_NAMESPACE'
$ sudo -Eu root bash -c "mount -o bind /proc/`lsns |grep unshare |awk '{print $4}' |uniq`/ns/net /run/netns/$VPN_NAMESPACE"

[ Get a hands-on introduction to daily life as a developer crafting code on OpenShift. Get the eBook OpenShift for Developers. ]

Prueba la VPN

Ejecute los siguientes comandos en el espacio de nombres de red y el espacio de nombres raíz:

$ curl ifconfig.co/city

Esto debería devolver el mismo resultado (preciso o no). Puede usar este resultado para verificar que la conexión VPN se aisló correctamente en un espacio de nombres específico.

La siguiente es una breve descripción general de los archivos OpenVPN. Este artículo no pretende ser un tutorial de OpenVPN, por lo que no me sumergiré en él. En teoría, debe seguir los mismos pasos para Wireguard, PPTP o la mayoría de los demás protocolos VPN admitidos por Linux.

Archivo de configuración de OpenVPN

Los archivos utilizados por OpenVPN generalmente se escriben con .ovpnComo con la mayoría de los archivos en Linux, la extensión del archivo es para la legibilidad humana, no para los programas.fácilmente podría tener uno .txt archivo o sin extensión, a OpenVPN no le importa siempre que el contenido sea el esperado. Aquí está el archivo OpenVPN que estoy usando con algunos detalles como certificados cambiados o eliminados e IP/URL remotas:

script-security 2
up /etc/openvpn/set_container_resolver.sh
down /etc/openvpn/set_container_resolver.sh
dev tun
persist-tun
persist-key
cipher AES-256-CBC
auth SHA256
tls-client
client
resolv-retry infinite
remote some.example.com 1194 udp
verify-x509-name "vpn-ns-demo" name
auth-user-pass
remote-cert-tls server
comp-lzo adaptive


-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----



-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----



-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----


key-direction 1



-----BEGIN OpenVPN Static key V1-----
-----END OpenVPN Static key V1-----

La parte importante de este tutorial está en la parte superior.Esta up y down Las secciones del archivo hacen referencia a un script que creé anteriormente que instala y desinstala resolv.conf documento. no tengo esto, resolv.conf No se actualizará y depende del extremo de la VPN, lo que significa que el tráfico de Internet no se resolverá.Esta Sitio web OpenVPN Si está interesado en leer más, hay algunas instrucciones sobre cómo comenzar con los perfiles de clientes.

Prueba la VPN

Dentro del espacio de nombres, inicie la VPN:

$ openvpn --config Downloads/pfSense-UDP4-1194-stratusvpn-config.ovpn

notas: porque no pusiste el archivo de credenciales en openvpn comando, que consumirá el shell de primer plano después de iniciar sesión.Esta es parte de la razón por la que los montajes de enlace son útiles Espacios de nombres ip netns El comando puede interactuar con él.

Ahora hay dos formas de interactuar con los espacios de nombres.puedes encontrar el pid y usar nsenter:

$ sudo nsenter  -t `lsns |grep unshare |awk '{print $4}' |uniq -a`

Esto le da un shell raíz donde puede ejecutar curl Pedido:

# curl ifconfig.co/city
Windsor

notas: el indicador de shell no ha cambiado porque PS1 La variable está vinculada a la sesión de Bash porque no se exporta globalmente.

Confirme que el espacio de nombres raíz está registrado en una ciudad diferente:

$ curl ifconfig.co/city
Sioux Falls

Esto funciona para varios programas, pero no para el navegador. Intentar iniciar el navegador da como resultado un comportamiento extraño:

# firefox
Running Firefox as root in a regular user's session is not supported.
($HOME is /root which is owned by nobody.)

Esta es la verdadera razón para enlazar espacios de nombres de montaje.Puedes hacer esto usando ip netns Pedido:

# On the host
$ sudo ip netns exec $VPN_NAMESPACE sudo -u $USER firefox

Ahora tiene un navegador ejecutándose en un espacio de nombres que envía todo el tráfico fuera de la conexión VPN, mientras que el resto del sistema continúa usando la conexión local.

envolver

Ahora ha creado un espacio de nombres de red para el tráfico de VPN, de modo que solo las aplicaciones que se ejecutan en el espacio de nombres puedan enrutarse a través de la VPN.

La creación de su propio espacio de nombres le brinda la flexibilidad de adaptar su entorno a sus necesidades específicas sin tener que descargar un contenedor lleno de archivos binarios que no pretendía instalar. Los espacios de nombres proporcionan una interfaz muy personalizable para tareas como aislar el tráfico de aplicaciones.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Botón volver arriba