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.

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 |
|---|---|
| Servidor | VPS con 1 núcleo y 512 MB de memoria: para un proxy personal basta el plan más pequeño |
| Sistema | Ubuntu 22.04 o 24.04, Debian 12 o 13 limpios |
| Acceso | usuario root y contraseña del correo del proveedor |
| Terminal | PowerShell 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:
ssh root@SERVER_IPEn 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.
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.shEsto 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:
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 8c1f0e77a2d94b36c5e1a07dCopia 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.
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
SCRIPTSi todo está bien configurado, la salida será así:
[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.
curl.exe -x "http://LOGIN:PASSWORD@HOST:HTTP_PORT" https://ifconfig.me
curl.exe --socks5-hostname "LOGIN:PASSWORD@HOST:SOCKS_PORT" https://ifconfig.meSi la prueba falla
| Qué ves | Qué ocurre | Qué hacer |
|---|---|---|
| Ambas líneas «gave no answer», código 000 | puertos 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 servidor | cortafuegos del proveedor | repite el paso 3, escribe al soporte del proveedor |
| Código 407 con la contraseña correcta | error en usuario o contraseña, o tu IP no está entre las permitidas | compara con /root/proxy.txt y la línea allow de los ajustes |
| SOCKS5 deja entrar sin usuario | ajustes cambiados a mano | ejecuta 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 proxy | mira el registro: tail /usr/local/3proxy/logs/3proxy.log.* |
| Error de dependencias al instalar | sistema anterior a Ubuntu 22.04 y Debian 12 | reinstala 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:
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:
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/passwdAñadir un segundo usuario:
echo "friend:CL:$(openssl rand -hex 12)" >> /usr/local/3proxy/conf/passwd
systemctl restart 3proxy
cat /usr/local/3proxy/conf/passwdPermitir 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:
sed -i 's/^allow \*$/allow * YOUR_IP/' /usr/local/3proxy/conf/3proxy.cfg
systemctl restart 3proxyEliminar todo cuando ya no necesites el servidor:
systemctl disable --now 3proxy
apt-get purge -y 3proxy </dev/null
rm -rf /usr/local/3proxy /etc/3proxy /root/proxy.txtLista 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:
- Activa el cortafuegos con el comando de abajo, usando los puertos del informe: hacia fuera solo quedan SSH y el proxy.
- Activa las actualizaciones automáticas del sistema. 3proxy es un paquete aparte, así que cada pocos meses comprueba si hay una versión nueva.
- 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.
- Una vez al mes revisa el registro en busca de direcciones desconocidas y comprueba la IP del servidor en las listas negras RBL.
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 enableSi 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 propio | Servicio de proxy | |
|---|---|---|
| Control y registros | totalmente tuyos | en manos del operador |
| Direcciones | una, unas pocas como mucho | pools de miles de direcciones |
| Tipo de dirección | centro de datos del proveedor | desde centro de datos hasta domésticas y celulares |
| Ubicación | el país de tu VPS | elección de país, ciudad en residenciales |
| Rotación | no, la dirección es permanente | por petición o por sesión |
| Mantenimiento | actualizaciones y disponibilidad a tu cargo | incluido en el precio |
| Precio de entrada | alquiler de VPS más tiempo | desde 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

Proxies en China: quién necesita una IP china y qué aporta
El segmento chino de la red tiene sus propias reglas, y verlo desde fuera casi no sirve: algunos sitios solo responden a direcciones de China, y los precios y resultados difieren de los globales…
5 min de lectura
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
Proxies en Europa: quién necesita IP europea y cuál elegir
Los sitios atan cada vez más el contenido al país del visitante: precios, resultados, existencias y anuncios difieren entre Berlín y París. Vemos las tareas que exigen una dirección europea y…
5 min de lectura