Configuración de gateways Linux en redes de producción
Esta guía cubre algunos de los parámetros básicos de configuración de red que pueden impedir que un sistema Linux funcione en un entorno de producción debido al aislamiento de la infraestructura. Tenga en cuenta que las distribuciones de Linux pueden utilizar servicios distintos para los temas siguientes. Por ello, es posible que no pueda ejecutar algunos de los comandos indicados a continuación. Esta sección se ha redactado utilizando como ejemplo una Raspberry Pi con la versión nativa del sistema operativo Debian 12 (bookworm).
Antes de su llamada de soporte con el equipo de SDA, asegúrese de disponer de acceso SSH al dispositivo Linux desde su ordenador para compartir pantalla durante la sesión.
A continuación se presenta una lista de las áreas habituales que pueden impedir la conexión.
Servidores DNS
Un servidor del Sistema de Nombres de Dominio (DNS) resuelve los nombres de dominio en direcciones IP para facilitar la comunicación a través de internet. Una configuración correcta del DNS es fundamental para un sistema Linux que opere en un entorno de red. La resolución de problemas de DNS implica comprobar la accesibilidad del servidor DNS mediante comandos como ping o nslookup. Asegúrese de que el servidor responde y resuelve correctamente los nombres de dominio en direcciones IP. Las configuraciones incorrectas pueden provocar fallos en la resolución de dominios, lo que afecta a las comunicaciones de red y al acceso a internet.
Pruebas
Compruebe las IP de los servidores DNS configurados en el host con:
cat /etc/resolv.conf
Cada servidor DNS puede probarse individualmente con nslookup o dig. Por ejemplo, si el servidor es 8.8.8.8:
nslookup api.eu1.sdaconsole.io 8.8.8.8
dig @8.8.8.8 api.eu1.sdaconsole.io +short
Si estos comandos no están presentes, pueden instalarse con los paquetes dnsutils o bind9-dnsutils en Debian, o bien puede utilizarse un comando nativo como ping o getent para probar la configuración DNS actual:
ping api.eu1.sdaconsole.io
getent hosts api.eu1.sdaconsole.io
Configuración
Los servidores DNS pueden estar gestionados por diferentes servicios, según la instalación de Linux. En una Raspberry Pi, normalmente los gestiona el servicio NetworkManager. El servicio que gestiona la resolución DNS probablemente dejará un comentario en /etc/resolv.conf indicando que generó el archivo, como por ejemplo:
cat /etc/resolv.conf
> # Generated by NetworkManager
> nameserver 192.168.15.1
> nameserver fe80::dec6:37ff:fe36:5ee8%wlan0
cat /etc/resolv.conf
> # Generated by dhcpcd from eth0.dhcp
> # /etc/resolv.conf.head can replace this line
> nameserver 192.168.15.1
- NetworkManager
- dhcpcd
- resolvconf
Para establecer los servidores DNS globales, cree el archivo:
sudo nano /etc/NetworkManager/conf.d/dns.conf
Y añada:
[global-dns-domain-*]
servers=8.8.8.8,4.4.4.4
Reinicie el servicio NetworkManager y compruebe los nuevos valores en /etc/resolv.conf
sudo systemctl restart NetworkManager
# Verify /etc/resolv.conf was updated
cat /etc/resolv.conf
sudo nano /etc/dhcpcd.conf
Añada o modifique al final del archivo:
# Static DNS configuration
static domain_name_servers=8.8.8.8 4.4.4.4
Aplique los cambios reiniciando el servicio dhcpcd y verifique si los servidores DNS se han actualizado:
sudo systemctl restart dhcpcd
# Verify /etc/resolv.conf was updated
cat /etc/resolv.conf
Para comprobar si resolvconf está disponible:
which resolvconf
dpkg -l | grep resolvconf
Configure los servidores DNS mediante resolvconf editando las configuraciones base:
# Edit the base configuration
sudo nano /etc/resolvconf/resolv.conf.d/head
Añada:
nameserver 8.8.8.8
nameserver 4.4.4.4
Actualice el servicio resolvconf y compruebe si los servidores DNS se han actualizado:
sudo resolvconf -u
# Verify /etc/resolv.conf was updated
cat /etc/resolv.conf
Servidores NTP
Un servidor de Protocolo de Tiempo de Red (NTP) se utiliza en los sistemas Linux para sincronizar el reloj del sistema con una fuente de tiempo, como un reloj atómico o un servidor central. Una medición precisa del tiempo es crucial para el registro de eventos, los protocolos de seguridad y la coordinación de acciones en una red. Una configuración incorrecta de un servidor NTP provocará el fallo de las llamadas HTTPS debido a la invalidación de los certificados SSL.
Pruebas
Revise el estado de sincronización NTP y si la fecha y hora actuales son correctas.
# Check NTP sync status
timedatectl status
# Check configured NTP servers
timedatectl timesync-status
timedatectl show-timesync --all
# Check logs from the timesync service
journalctl -u systemd-timesyncd -n 20
# Check if service is active
systemctl is-active systemd-timesyncd
Prueba de la conexión a un servidor específico:
# Using ntpdate, if installed
ntpdate -q 0.debian.pool.ntp.org
# Using Netcat
timeout 2 nc -u -z -v 0.debian.pool.ntp.org 123
Configuración
El servidor NTP puede configurarse con un nombre de dominio, como 0.debian.pool.ntp.org o ntp.myorg.com, o directamente con una dirección IP.
# Configure systemd-timesyncd
sudo nano /etc/systemd/timesyncd.conf
Añada el servidor NTP personalizado en el bloque [Time] y asegúrese de que la línea no esté comentada. Elimine de FallbackNTP cualquier servidor que no sea accesible.
[Time]
NTP=ntp.myorg.com ntp.myorg.local
FallbackNTP=
Reinicie y asegúrese de habilitar el servicio timesync.
# Restart and enable
sudo systemctl restart systemd-timesyncd
sudo systemctl enable systemd-timesyncd
# Force synchronization
sudo timedatectl set-ntp true
# Verify sync
timedatectl timesync-status
Servidores proxy
Un servidor proxy actúa como intermediario entre un cliente y los servidores de destino, reenviando solicitudes y respuestas. En entornos empresariales, los servidores proxy se utilizan habitualmente para el control de seguridad, el filtrado de contenidos, la gestión del ancho de banda y el registro del tráfico de salida. Los sistemas Linux en dichas redes deben configurarse para enrutar sus solicitudes HTTP/HTTPS a través del proxy corporativo con el fin de acceder a recursos externos, incluidos los repositorios de paquetes y los servicios web.
Pruebas
Compruebe si actualmente hay un proxy configurado revisando las variables de entorno y los ajustes de proxy de todo el sistema:
# Check shell environment proxy variables
env | grep -i proxy
# Check system-wide proxy configuration
cat /etc/environment | grep -i proxy
# Check if proxy is set for current user
echo $http_proxy
echo $https_proxy
echo $no_proxy
Para comprobar si es necesario un servidor proxy, intente conectarse directamente a un servidor externo:
# Try direct connection to a public server
timeout 5 curl -I https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json 2>&1
# If it fails with connection errors, proxy might be required
# Common error: "Failed to connect" or "Connection timed out"
Si falla con errores de conexión, puede ser necesario un proxy. Errores habituales son, por ejemplo, Failed to connect o Connection timed out.
Para probar una solicitud con un servidor proxy específico:
# Test with curl
curl -I --proxy http://proxy.company.local:8080 https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json
# Proxy with user authentication
curl -I --proxy http://user@pwd@proxy.company.local:8080 https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json
# Test without proxy (direct connection)
curl -I --noproxy "*" https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json
Configuración
Una dirección de proxy tiene uno de estos formatos:
<protocol>://<proxy-address>:<port-number>
<protocol>://<username>:<password>@<proxy-address>:<port-number>
Configure el proxy para todos los usuarios y aplicaciones:
# Edit system-wide environment
sudo nano /etc/environment
Añada o modifique las siguientes líneas:
http_proxy="http://proxy.company.local:8080"
https_proxy="http://proxy.company.local:8080"
no_proxy="localhost,127.0.0.1,*.company.local,10.0.0.0/8,192.168.0.0/16"
# Uppercase variants (some applications check these)
HTTP_PROXY="http://proxy.company.local:8080"
HTTPS_PROXY="http://proxy.company.local:8080"
NO_PROXY="localhost,127.0.0.1,*.company.local,10.0.0.0/8,192.168.0.0/16"
Aplique los cambios:
# Reload environment (or log out and back in)
source /etc/environment
# Verify variables are set
env | grep -i proxy
Para comprobar si el tráfico realmente pasa por el proxy:
# Verbose curl request showing proxy connection
curl -v -I https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json 2>&1 | grep -i proxy
# Should show something like:
# * Uses proxy env variable http_proxy == 'http://proxy.company.local:3128'
# * Trying proxy.company.local:3128...
Algunos proxies realizan inspección SSL. Puede ser necesario instalar los certificados de la CA corporativa:
# Copy corporate CA certificate
sudo cp company-ca.crt /usr/local/share/ca-certificates/
# Update CA trust store
sudo update-ca-certificates
# Verify
curl -I https://repository.eu1.sdaconsole.io/glue/v2/linux/arm64/release.json
Repositorios de Debian
Los repositorios de Debian son servidores que alojan paquetes de software y actualizaciones para sistemas basados en Debian. En entornos empresariales aislados, el acceso a los mirrors públicos de Debian (como deb.debian.org o archive.ubuntu.com) puede estar bloqueado por motivos de seguridad. Las empresas suelen mantener sus propios mirrors internos para controlar qué paquetes están disponibles y reducir el consumo de ancho de banda externo.
Pruebas
Compruebe los repositorios configurados actualmente:
# View configured repositories
cat /etc/apt/sources.list
# Check additional repository files
ls -la /etc/apt/sources.list.d/
cat /etc/apt/sources.list.d/*.list 2>/dev/null
A continuación se muestra un script de bash completo para probar exhaustivamente la conectividad con los repositorios configurados:
# Test if repository servers are reachable
grep -h "^deb http" /etc/apt/sources.list /etc/apt/sources.list.d/*.list 2>/dev/null | \
awk '{print $2, $3}' | sort -u | while read repo suite; do
echo "Testing: $repo (suite: $suite)"
# Test the Release file that APT actually fetches
# This is what APT checks first when doing 'apt update'
release_url="${repo}/dists/${suite}"
# Test with curl (follows redirects, checks certificates)
if curl -fsSL --connect-timeout 5 --max-time 10 -I "$release_url/InRelease" >/dev/null 2>&1; then
echo " > Repository is reachable"
else
if curl -fsSL --connect-timeout 5 --max-time 10 -I "$release_url/Release" >/dev/null 2>&1; then
echo " > Repository is reachable"
else
# If failed, show the specific error
error=$(curl -fsSL --connect-timeout 5 --max-time 10 -I "$repo" 2>&1 | head -1)
echo " X Unreachable: $error"
fi
fi
echo
done
Otro método consiste en intentar actualizar las listas de paquetes para identificar problemas con los repositorios:
# Try to update package lists
sudo apt update
# Check for errors in apt logs
tail -20 /var/log/apt/term.log
Mensajes de error habituales que indican repositorios bloqueados:
Failed to fetch http://deb.debian.org/...Could not resolve 'deb.debian.org'Connection timed outUnable to connect to...
Pruebe manualmente un servidor de repositorio específico:
# Test HTTP connectivity to a repository
curl -sSL -I --connect-timeout 5 http://deb.debian.org/debian/
# Or using wget
wget --spider --timeout=5 http://deb.debian.org/debian/
# Test DNS resolution
getent hosts deb.debian.org
Configuración
Edite el archivo principal de fuentes:
sudo nano /etc/apt/sources.list
Sustituya el contenido por su mirror interno. Para Debian 12 (bookworm):
# Internal Debian Repository Mirror
deb http://mirror.company.local/debian bookworm main contrib non-free non-free-firmware
deb http://mirror.company.local/debian bookworm-updates main contrib non-free non-free-firmware
deb http://mirror.company.local/debian-security bookworm-security main contrib non-free non-free-firmware
# Optionally, backports for newer packages
deb http://mirror.company.local/debian bookworm-backports main contrib non-free non-free-firmware
Si su mirror interno utiliza HTTPS:
deb https://mirror.company.local/debian bookworm main contrib non-free non-free-firmware
Nota: Para repositorios HTTPS, asegúrese de que los paquetes apt-transport-https y ca-certificates estén instalados.
Configurar la prioridad de los repositorios (opcional)
Si necesita utilizar repositorios internos y externos dando preferencia a los internos:
sudo nano /etc/apt/preferences.d/internal-mirror
Añada:
Package: *
Pin: origin mirror.company.local
Pin-Priority: 900
Package: *
Pin: origin deb.debian.org
Pin-Priority: 500
Esto otorga mayor prioridad a los mirrors internos.
Configuración del proxy para los repositorios (opcional)
Si su red requiere un proxy para acceder a los repositorios:
# Configure APT proxy
echo 'Acquire::http::Proxy "http://proxy.company.local:3128";' | \
sudo tee /etc/apt/apt.conf.d/proxy.conf
# For HTTPS repositories
echo 'Acquire::https::Proxy "http://proxy.company.local:3128";' | \
sudo tee -a /etc/apt/apt.conf.d/proxy.conf
# Test
sudo apt update
Actualizar y verificar
Después de configurar los repositorios:
# Update package lists
sudo apt update
# Check for errors
echo $? # Should return 0 if successful
# Verify packages can be found
apt-cache policy apt
# Test installing a small package
sudo apt install --dry-run nano
Problemas habituales
Problema: apt update se queda bloqueado indefinidamente
# Check if repository server is actually responding
timeout 10 curl -v http://mirror.company.local/debian/
# Check for proxy interference
unset http_proxy https_proxy
sudo apt update
Problema: No se encuentran los paquetes después de configurar el mirror
# Verify the mirror has the correct Debian version
curl http://mirror.company.local/debian/dists/ | grep bookworm
# Check if the mirror is properly synced
curl -sI http://mirror.company.local/debian/dists/bookworm/Release | grep Date
Problema: Fuentes de repositorio mezcladas que provocan conflictos
# Check all active sources
grep -rh "^deb" /etc/apt/sources.list /etc/apt/sources.list.d/ | sort -u
# Disable conflicting sources
sudo mv /etc/apt/sources.list.d/problematic.list /etc/apt/sources.list.d/problematic.list.disabled
sudo apt update