Tengo un servidor de desarrollo, al que solo se puede acceder desde 127.0.0.1:8000, no desde 192.168.1.x: 8000. Como truco rápido, ¿hay alguna manera de configurar algo para escuchar en otro puerto (por ejemplo, 8001) para que desde la red local pueda conectar 192.168.1.x: 8001 y así se canalice el tráfico entre el cliente y 127.0 .0.1: 8000?
networking
tcp
tunneling
port-forwarding
waitinforatrain
fuente
fuente
Respuestas:
Usar ssh es la solución más fácil.
Esto reenvía el puerto local 8001 en su estación de trabajo a la dirección localhost en el puerto remote-server.com 8000.
-g
significa permitir que otros clientes en mi red se conecten al puerto 8001 en mi estación de trabajo. De lo contrario, solo los clientes locales en su estación de trabajo pueden conectarse al puerto reenviado.-N
significa que todo lo que estoy haciendo es reenviar puertos, no iniciar un shell.-f
significa bifurcación en segundo plano después de una conexión SSH exitosa e inicio de sesión.El puerto 8001 permanecerá abierto para muchas conexiones, hasta que ssh muera o muera. Si estás en Windows, el excelente cliente SSH PuTTY también puede hacer esto. Use 8001 como el puerto local y localhost: 8000 y el destino y agregue un reenvío de puerto local en la configuración. Puede agregarlo después de una conexión exitosa con PuTTY.
fuente
[email protected]
? Definitivamente no es necesario para el reenvío de puertos, sin embargo, ssh exige tener este argumento, más aún, intenta conectarse allí. Y al configurar esta molesta opción para hostname, se genera…port 22: Connection refused
(no, no utilicé el puerto 22) . A menos que me falte algo, el comando simplemente no funciona.[email protected]
es solo un ejemplo y no debes tomarlo literalmente. Debe reemplazar esto con el nombre de la computadora a la que desea conectarse y su nombre de usuario en esta computadora. Esta información es necesaria para establecer una conexión ssh. Solo después de que se establece la conexión ssh, los puertos se pueden reenviar a través de esta conexión.-N
no significa que no haya conexión SSH. Simplemente significado not execute a remote command
(ver la página del manual ). El<user>@<host>
argumento es necesario, porque esto hace abrir una conexión SSH a<host>
(que para el caso de OP seríalocalhost
), y reenvía el puerto deseado a través de ese túnel SSH. Es una solución para el problema de OP, pero no la más simple. Para reenviar a localhost sin usar ssh, puede usarsocat
onetcat
como en StephaneChazelas y las respuestas de un usuario noCon
socat
en el servidor:De forma predeterminada,
socat
escuchará en el puerto TCP 8001 en cualquier dirección IPv4 o IPv6 (si es compatible) en la máquina. Puede restringirlo a IPv4 / 6 reemplazandotcp-listen
contcp4-listen
otcp6-listen
, o a una dirección local específica agregando un,bind=that-address
.Lo mismo para el zócalo de conexión al que está enviando proxy, puede usar cualquier dirección en lugar de
localhost
, y reemplazartcp
contcp4
otcp6
si desea restringir la resolución de la dirección a direcciones IPv4 o IPv6.Tenga en cuenta que para el servidor que escucha en el puerto 8000, la conexión aparecerá como proveniente del proxy (en el caso de
localhost
que así sealocalhost
), no del cliente original. Debería usar enfoques DNAT (pero que requieren privilegios de superusuario) para que el servidor pueda saber quién es el cliente.fuente
range
ytcpwrap
en lasocat
página de manual).Usar lo tradicional
nc
es la solución más fácil:Esta versión de
nc
está en elnetcat-traditional
paquete en Ubuntu. (Tienes que hacerloupdate-alternatives
o llamarlonc.traditional
).Tenga en cuenta que, a diferencia de ssh, esto no está cifrado. Tenga esto en cuenta si lo usa fuera de un host.
fuente
netcat-openbsd
?netcat
la versión que se incluye enbusybox
:nc -v -lk -p 8001 -e /usr/bin/nc 127.0.0.1 8000
. ( Descripción de los parámetros )nc
comando termina después de la primera conexión remota. Agregue-k
si necesita mantenerlo funcionando.nc: cannot use -p and -l
en CentOS 6.4. ¿Hay alguna solución?OpenBSD netcat está disponible por defecto en Linux y también en OS X.
OSX:
Linux:
Una alternativa que funciona en OS X bash es usar una tubería bidireccional . Puede funcionar en otros Unixes:
fuente
ss -tan
onetstat -tan
.Citando la respuesta de David Spillett en ServerFault
Es un binario simple que toma un archivo de configuración en el formato
bindaddress bindport connectaddress connectport
Por ejemplo:
192.168.1.1 8001 127.0.0.1 8000
o
0.0.0.0 8001 127.0.0.1 8000
si desea vincular el puerto entrante a todas las interfaces.
fuente
fuente
dport
, como ennc -v localhost 2345
, me estoy poniendoConnection refused
. No soy muy bueno en iptables, pero supongo que el dport debe tener una aplicación de escucha.Según la respuesta de Mark A. , tuve que hacer un pequeño ajuste para que funcione en mi Mac (al menos en macOS Mojave Versión 10.14.4)
Esa declaración printf parece ser crucial. De lo contrario, el comando netcat para conectarse al puerto 8000 nunca intentará conectarse realmente, y el comando netcat para escuchar en el puerto 8001 nunca escuchará en el puerto 8001. Sin el printf, cada vez que intentara conectarme al puerto 8001 obtendría conexión denegada.
Mi suposición es que netcat debe bloquear de alguna manera en stdin (tal vez esté tratando de leerlo por alguna razón) antes de realizar cualquier operación de Socket. Como tal, sin la declaración printf escrita en fifo a, el comando netcat nunca comenzará a escucharse en el puerto 8001.
Nota: Hubiera dejado una respuesta en la publicación de Mark, pero aún no tengo reputación.
fuente
Esta es una nueva forma de tunelizar dos puertos udp en el servidor: https://github.com/9crk/udpeer
udpeer 8001 8002
Probar:
fuente