Entrar Registrarse

Tu propio servidor proxy en un VPS: instalar 3proxy y probar

Guía paso a paso para principiantes: instala 3proxy en un VPS con un script bash listo, prueba el acceso desde fuera y conecta el navegador. Y cuándo sobra.

Pequeño servidor doméstico con luz cálida y un cable que se aleja hacia una ciudad nocturna

Puedes montar un servidor proxy personal aunque nunca hayas abierto una consola de Linux: el instalador en sí cabe en un minuto. Abajo va la guía paso a paso: alquilar un VPS, ejecutar un script listo, probar el acceso desde fuera y conectar el navegador. El resultado es una IP permanente con HTTP y SOCKS5 con usuario y contraseña.

Al final del artículo veremos en qué tareas un servidor personal pierde frente a un servicio. Nosotros vendemos proxies, así que lo decimos sin rodeos.

Qué necesitas

QuéCuál
ServidorVPS con 1 núcleo y 512 MB de memoria: para un proxy personal basta el plan más pequeño
SistemaUbuntu 22.04 o 24.04, Debian 12 o 13 limpios
Accesousuario root y contraseña del correo del proveedor
TerminalPowerShell en Windows 10 y 11, Terminal en macOS y Linux

Elige el país del VPS según la tarea desde el principio: la dirección del proxy será de ese país, y solo podrás cambiarla mudándote a otro servidor.

Probamos todos los comandos de este artículo en imágenes limpias de los cuatro sistemas de la tabla, con 512 MB de memoria y un núcleo cada uno. La instalación llevó de 10 a 31 segundos, y 3proxy sin carga ocupó menos de 8 MB.

Instalaremos 3proxy. Un solo programa atiende HTTP y SOCKS5, gasta poca memoria y se configura con un archivo. Squid solo funciona como proxy HTTP y Dante solo como SOCKS, así que con ellos habría que configurar dos servicios. Los repositorios de Ubuntu no tienen el paquete 3proxy, por eso el script toma el paquete oficial del desarrollador y comprueba su suma de control.

Paso 1. Conéctate al servidor

Abre un terminal e introduce el comando con la dirección del correo del proveedor:

Tu ordenador
ssh root@SERVER_IP

En el primer acceso el sistema pregunta si confías en el servidor: escribe yes. La contraseña no se muestra al escribirla, y así está pensado. Escríbela a ciegas o pégala y pulsa Enter. Si el proveedor te dio un usuario normal en vez de root, ejecuta sudo -i tras entrar.

Paso 2. Ejecuta el instalador

Pulsa Copiar, pega el bloque entero en la ventana del terminal y pulsa Enter. Crea el archivo y lo ejecuta por sí solo.

Servidor: instalación
cat > install-proxy.sh <<'SCRIPT'
#!/usr/bin/env bash
# Installs 3proxy with HTTP and SOCKS5, login and password required.
# Ubuntu 22.04+ or Debian 12+. Run as root on a clean server.
set -euo pipefail

VERSION="1.0.2"
CONF_DIR="/usr/local/3proxy/conf"

if [ "$(id -u)" -ne 0 ]; then
  echo "Run as root: sudo bash install-proxy.sh"
  exit 1
fi

case "$(dpkg --print-architecture)" in
  amd64) ARCH="x86_64"; SHA="d42c0a15ab7bc2e129de2e72fedfb6c908bfc1f7b7f4be15368c56eeb21e9a08" ;;
  arm64) ARCH="arm64";  SHA="e7b8f21bc527b30e9b7fd2ebd5889a11eb14889bb45f71074c94c865fc1b2556" ;;
  *) echo "Only amd64 and arm64 servers are supported"; exit 1 ;;
esac

echo "==> Installing packages"
export DEBIAN_FRONTEND=noninteractive NEEDRESTART_SUSPEND=1
APT="apt-get -o DPkg::Lock::Timeout=300"
$APT update -qq
$APT install -y -qq curl openssl ca-certificates >/dev/null

DEB="/tmp/3proxy-$VERSION.$ARCH.deb"
curl -fsSL -o "$DEB" "https://github.com/3proxy/3proxy/releases/download/$VERSION/3proxy-$VERSION.$ARCH.deb"
echo "$SHA  $DEB" | sha256sum -c --quiet -
$APT install -y -qq "$DEB" >/dev/null
rm -f "$DEB"

echo "==> Creating login, password and ports"
LOGIN="user$(openssl rand -hex 3)"
PASS="$(openssl rand -hex 12)"
HTTP_PORT="$(shuf -i 20000-59999 -n 1)"
SOCKS_PORT="$((HTTP_PORT + 1))"

echo "$LOGIN:CL:$PASS" > "$CONF_DIR/passwd"

cat > "$CONF_DIR/3proxy.cfg" <<EOF
nscache 65536
nserver 1.1.1.1
nserver 8.8.8.8
log /logs/3proxy.log D
rotate 7
maxconn 200
users \$/conf/passwd
auth strong
deny * * 127.0.0.0/8,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,169.254.0.0/16,100.64.0.0/10
deny * * * 25
allow *
proxy -a -p$HTTP_PORT
socks -p$SOCKS_PORT
EOF

chown proxy:proxy "$CONF_DIR/passwd" "$CONF_DIR/3proxy.cfg"
chmod 640 "$CONF_DIR/passwd" "$CONF_DIR/3proxy.cfg"

if command -v ufw >/dev/null && ufw status | grep -q "Status: active"; then
  echo "==> Opening ports in ufw"
  ufw allow "$HTTP_PORT/tcp" >/dev/null
  ufw allow "$SOCKS_PORT/tcp" >/dev/null
fi

echo "==> Starting the service"
systemctl enable 3proxy >/dev/null 2>&1
systemctl restart 3proxy
sleep 2

if ! systemctl is-active --quiet 3proxy; then
  echo "3proxy did not start. Details: journalctl -u 3proxy -n 30"
  exit 1
fi

SERVER_IP=""
for URL in https://ifconfig.me https://api.ipify.org; do
  SERVER_IP="$(curl -s --max-time 20 -x "http://$LOGIN:$PASS@127.0.0.1:$HTTP_PORT" "$URL" || true)"
  [ -n "$SERVER_IP" ] && break
done

if [ -z "$SERVER_IP" ]; then
  echo "The proxy runs but its test request failed. Details: tail /usr/local/3proxy/logs/3proxy.log.*"
  exit 1
fi

umask 077
cat > /root/proxy.txt <<EOF
Server:     $SERVER_IP
HTTP port:  $HTTP_PORT
SOCKS port: $SOCKS_PORT
Login:      $LOGIN
Password:   $PASS

curl -x "http://$LOGIN:$PASS@$SERVER_IP:$HTTP_PORT" https://ifconfig.me
curl --socks5-hostname "$LOGIN:$PASS@$SERVER_IP:$SOCKS_PORT" https://ifconfig.me
bash check-proxy.sh $SERVER_IP $HTTP_PORT $SOCKS_PORT $LOGIN $PASS
EOF

echo
echo "Done. These details are saved in /root/proxy.txt"
echo
cat /root/proxy.txt
SCRIPT
bash install-proxy.sh

Esto es lo que hace el script, por orden:

  • instala el paquete 3proxy y comprueba que el archivo se descargó sin manipulación;
  • genera usuario, contraseña y dos puertos al azar del rango superior, donde los escáneres miran menos que en 3128 y 1080;
  • prohíbe conectarse sin usuario y cierra el acceso desde el proxy a las direcciones internas del servidor y de servicio de la nube;
  • bloquea el puerto de correo 25, para que si se filtra la contraseña los spammers no metan tu dirección en listas negras;
  • quita de las cabeceras HTTP los datos del cliente: el sitio no verá tu IP real;
  • activa el arranque automático tras reiniciar y abre los puertos en ufw si ese cortafuegos está activo.

Al final aparece un informe así, solo que con tus valores:

Ejemplo de salida
Done. These details are saved in /root/proxy.txt

Server:     203.0.113.10
HTTP port:  34512
SOCKS port: 34513
Login:      user4f2a9c
Password:   8c1f0e77a2d94b36c5e1a07d

curl -x "http://user4f2a9c:8c1f0e77a2d94b36c5e1a07d@203.0.113.10:34512" https://ifconfig.me
curl --socks5-hostname "user4f2a9c:8c1f0e77a2d94b36c5e1a07d@203.0.113.10:34513" https://ifconfig.me
bash check-proxy.sh 203.0.113.10 34512 34513 user4f2a9c 8c1f0e77a2d94b36c5e1a07d

Copia estos datos. En el servidor están en el archivo /root/proxy.txt, y el comando cat /root/proxy.txt los muestra de nuevo.

Paso 3. Abre los puertos en el panel del proveedor

Algunos proveedores ponen delante del servidor su propio cortafuegos de red, que se configura en el panel de cliente. Si tienes uno, permite allí ambos puertos por TCP. Si el panel no tiene esa sección, puedes saltarte este paso.

Paso 4. Prueba el proxy desde fuera

La prueba se hace desde tu ordenador: así ves el servidor con los ojos del mundo exterior. En Linux y macOS pega el bloque en un terminal: crea el archivo check-proxy.sh. Luego pega y ejecuta la última línea del informe del instalador, que ya lleva tus datos.

Tu ordenador: comprobación
cat > check-proxy.sh <<'SCRIPT'
#!/usr/bin/env bash
# Usage: bash check-proxy.sh HOST HTTP_PORT SOCKS_PORT LOGIN PASSWORD
# Run it from your own computer: only an outside check shows the real picture.
set -u
if [ "$#" -ne 5 ]; then
  echo "Usage: bash check-proxy.sh HOST HTTP_PORT SOCKS_PORT LOGIN PASSWORD"
  exit 2
fi
HOST="$1"; HTTP_PORT="$2"; SOCKS_PORT="$3"; LOGIN="$4"; PASS="$5"
URL="https://ifconfig.me"
FAILED=0

pass() { echo "[ OK ] $1"; }
fail() { echo "[FAIL] $1"; FAILED=$((FAILED + 1)); }
info() { echo "[INFO] $1"; }

MY_IP=$(curl -4 -s --max-time 10 "$URL" || curl -4 -s --max-time 10 https://api.ipify.org || true)
info "Your own IP: ${MY_IP:-unknown}"

HTTP_IP=$(curl -s --max-time 20 -x "http://$LOGIN:$PASS@$HOST:$HTTP_PORT" "$URL" || true)
if [ -n "$HTTP_IP" ]; then pass "HTTP proxy works, exit IP $HTTP_IP"; else fail "HTTP proxy gave no answer"; fi

SOCKS_IP=$(curl -s --max-time 20 --socks5-hostname "$LOGIN:$PASS@$HOST:$SOCKS_PORT" "$URL" || true)
if [ -n "$SOCKS_IP" ]; then pass "SOCKS5 proxy works, exit IP $SOCKS_IP"; else fail "SOCKS5 proxy gave no answer"; fi

if [ -n "$HTTP_IP" ] && [ "$HTTP_IP" = "$MY_IP" ]; then
  info "Exit IP equals your IP: fine on the server itself, a problem anywhere else"
fi

CODE=$(curl -s --max-time 20 -o /dev/null -w "%{http_code}" -x "http://$HOST:$HTTP_PORT" "http://ifconfig.me" || true)
if [ "$CODE" = "407" ]; then pass "HTTP without login is refused (407)"; else fail "HTTP without login returned $CODE, expected 407"; fi

CODE=$(curl -s --max-time 20 -o /dev/null -w "%{http_code}" -x "http://$LOGIN:wrong-$PASS@$HOST:$HTTP_PORT" "http://ifconfig.me" || true)
if [ "$CODE" = "407" ]; then pass "HTTP with a wrong password is refused (407)"; else fail "HTTP with a wrong password returned $CODE, expected 407"; fi

if [ -n "$SOCKS_IP" ]; then
  if curl -s --max-time 20 -o /dev/null --socks5-hostname "$HOST:$SOCKS_PORT" "$URL"; then
    fail "SOCKS5 lets you in without a login: the proxy is open"
  else
    pass "SOCKS5 without login is refused"
  fi
fi

if [ -n "$MY_IP" ] && [ -n "$HTTP_IP" ] && [ "$HTTP_IP" != "$MY_IP" ]; then
  if curl -s --max-time 20 -x "http://$LOGIN:$PASS@$HOST:$HTTP_PORT" "http://ifconfig.me/all" | grep -qF "$MY_IP"; then
    fail "The site can see your own IP in the proxy headers"
  else
    pass "Your own IP is not visible in the headers"
  fi
fi

echo
if [ "$FAILED" -eq 0 ]; then
  echo "All checks passed."
else
  echo "Failed checks: $FAILED"
  exit 1
fi
SCRIPT

Si todo está bien configurado, la salida será así:

Ejemplo de salida
[INFO] Your own IP: 198.51.100.7
[ OK ] HTTP proxy works, exit IP 203.0.113.10
[ OK ] SOCKS5 proxy works, exit IP 203.0.113.10
[ OK ] HTTP without login is refused (407)
[ OK ] HTTP with a wrong password is refused (407)
[ OK ] SOCKS5 without login is refused
[ OK ] Your own IP is not visible in the headers

All checks passed.

En Windows el script se ejecuta en Git Bash. Sin él bastan dos comandos en PowerShell, y cada uno debe mostrar la dirección de tu servidor. Escribe exactamente curl.exe: un simple curl en PowerShell llama a otro comando.

PowerShell
curl.exe -x "http://LOGIN:PASSWORD@HOST:HTTP_PORT" https://ifconfig.me
curl.exe --socks5-hostname "LOGIN:PASSWORD@HOST:SOCKS_PORT" https://ifconfig.me

Si la prueba falla

Qué vesQué ocurreQué hacer
Ambas líneas «gave no answer», código 000puertos cerrados en el camino al servidorábrelos en el panel del proveedor y en ufw, comprueba la dirección del servidor
El proxy respondió solo en el propio servidorcortafuegos del proveedorrepite el paso 3, escribe al soporte del proveedor
Código 407 con la contraseña correctaerror en usuario o contraseña, o tu IP no está entre las permitidascompara con /root/proxy.txt y la línea allow de los ajustes
SOCKS5 deja entrar sin usuarioajustes cambiados a manoejecuta de nuevo el instalador, recibirás datos nuevos
El instalador dice «did not start»el servicio no arrancómira la causa: journalctl -u 3proxy -n 30
El instalador dice «test request failed»el servicio funciona, pero el servidor no sale a internet por el proxymira el registro: tail /usr/local/3proxy/logs/3proxy.log.*
Error de dependencias al instalarsistema anterior a Ubuntu 22.04 y Debian 12reinstala un SO reciente en el panel del proveedor

Paso 5. Conecta el proxy

En el navegador usa el puerto HTTP: Chrome y Firefox sin extensiones no saben pedir usuario y contraseña para SOCKS5. Dónde va cada cosa lo vemos en el artículo sobre configuración manual de proxy. Los programas suelen aceptar una línea del tipo IP:PORT:LOGIN:PASSWORD, y si necesitan otro formato, el conversor de proxies la reescribe.

¿Conectado? Abre la comprobación de anonimato a través del proxy: la página muestra qué dirección y qué cabeceras ve un sitio. En qué se diferencia HTTP de SOCKS5 y qué puerto usar para cada software lo vemos en la comparación de protocolos.

Cómo gestionar el servidor

Todos los comandos de abajo se ejecutan en el servidor. Estado del servicio y registro de conexiones de hoy. 3proxy crea un archivo nuevo cada día y los guarda una semana. Para salir del registro usa Ctrl+C:

Servidor
systemctl status 3proxy --no-pager
tail -f "$(ls -t /usr/local/3proxy/logs/* | head -1)"

Cambiar la contraseña. Sustituye LOGIN por el usuario del informe. El comando muestra la contraseña nueva, la antigua deja de funcionar al instante, y en /root/proxy.txt quedan los datos anteriores:

Servidor
NEW="$(openssl rand -hex 12)"
sed -i "s/^LOGIN:CL:.*/LOGIN:CL:$NEW/" /usr/local/3proxy/conf/passwd
systemctl restart 3proxy
cat /usr/local/3proxy/conf/passwd

Añadir un segundo usuario:

Servidor
echo "friend:CL:$(openssl rand -hex 12)" >> /usr/local/3proxy/conf/passwd
systemctl restart 3proxy
cat /usr/local/3proxy/conf/passwd

Permitir el acceso solo desde tu dirección, si es permanente. Sustituye YOUR_IP por tu IP. Desde otras direcciones el proxy responderá con código 407 incluso con la contraseña correcta:

Servidor
sed -i 's/^allow \*$/allow * YOUR_IP/' /usr/local/3proxy/conf/3proxy.cfg
systemctl restart 3proxy

Eliminar todo cuando ya no necesites el servidor:

Servidor
systemctl disable --now 3proxy
apt-get purge -y 3proxy </dev/null
rm -rf /usr/local/3proxy /etc/3proxy /root/proxy.txt

Lista de seguridad

Un proxy con un error en el acceso se vuelve público. Los escáneres recorren las direcciones de los proveedores sin parar, y un puerto abierto llega pronto a las listas gratis: luego te esperan tráfico ajeno, canal consumido y quejas al proveedor. El script cierra lo básico, lo demás depende de ti:

  1. Activa el cortafuegos con el comando de abajo, usando los puertos del informe: hacia fuera solo quedan SSH y el proxy.
  2. Activa las actualizaciones automáticas del sistema. 3proxy es un paquete aparte, así que cada pocos meses comprueba si hay una versión nueva.
  3. Recuerda que el usuario y la contraseña del proxy viajan sin cifrar. En una red pública un vecino puede interceptarlos, así que en cafeterías y aeropuertos conéctate al proxy por VPN o limita el acceso a tu IP. Más en el análisis del Wi-Fi público.
  4. Una vez al mes revisa el registro en busca de direcciones desconocidas y comprueba la IP del servidor en las listas negras RBL.
Servidor
DEBIAN_FRONTEND=noninteractive apt-get install -y ufw unattended-upgrades </dev/null
printf 'APT::Periodic::Update-Package-Lists "1";\nAPT::Periodic::Unattended-Upgrade "1";\n' > /etc/apt/apt.conf.d/20auto-upgrades
ufw allow 22/tcp
ufw allow HTTP_PORT/tcp
ufw allow SOCKS_PORT/tcp
ufw --force enable

Si tu SSH está en otro puerto, cambia 22 por él antes de ejecutar, o perderás el acceso al servidor.

Qué ganas y qué pierdes

VPS propioServicio de proxy
Control y registrostotalmente tuyosen manos del operador
Direccionesuna, unas pocas como muchopools de miles de direcciones
Tipo de direccióncentro de datos del proveedordesde centro de datos hasta domésticas y celulares
Ubicaciónel país de tu VPSelección de país, ciudad en residenciales
Rotaciónno, la dirección es permanentepor petición o por sesión
Mantenimientoactualizaciones y disponibilidad a tu cargoincluido en el precio
Precio de entradaalquiler de VPS más tiempodesde una suscripción por horas

Lo más importante aquí es la fila del tipo de dirección. Un VPS vive en una subred de hosting, y cualquier sitio lo ve por el sistema autónomo: comprueba tu servidor con la consulta ASN. Los marketplaces y las redes sociales miran esos rangos con recelo, y un servidor personal no cambia nada allí. Su dirección no se volverá doméstica ni celular.

Con el dinero tampoco hay ilusiones. Un VPS barato comparte procesador y canal con los vecinos, por eso las caídas de velocidad por la tarde son normales. Muchos proveedores limitan el tráfico, y el exceso cuesta bastante más que un gigabyte en un servicio de proxy.

Cuándo se justifica un proxy propio

  • IP permanente para tus servicios. Paneles de administración e internos abiertos solo desde una dirección: un VPS te la da barata y por mucho tiempo.
  • Túnel entre tus máquinas. Oficina y servidor conectados directamente, y tú decides qué pasa por ese punto.
  • Requisitos de registros. Los registros de tráfico deben quedar solo contigo.
  • Aprendizaje. Montarlo, romperlo y arreglarlo: es la forma más rápida de entender cómo funciona un proxy por dentro.

Cuándo hace falta un servicio

Un servidor personal queda fuera en cuanto la tarea necesita más de una dirección, rotación o un tipo concreto de IP: mantener cientos de VPS cuesta más que cualquier plan. El scraping, la monitorización de precios, el trabajo con cuentas y la comprobación de anuncios viven en pools. Para ellos sirven nuestros planes: paquetes con lista ip:port y direcciones residenciales con elección de país. Muchos tienen ambas cosas: un servidor personal para acceder a sus sistemas y un pool de servicio para el trabajo.

Sigue leyendo

Tres túneles luminosos de formas distintas convergen en un arco en un centro de datos oscuro

Proxy

Tipos de servidores proxy: cómo difiere HTTP de SOCKS5

El protocolo decide cómo el software pasa la petición al proxy: un proxy HTTP la lee entera, CONNECT abre un túnel para TLS y SOCKS5 transmite el flujo y admite UDP. Vemos los cuatro protocolos con…

8 min de lectura

Todos los artículos

Precios Prueba una hora gratis