tl; dr - procure o texto em negrito abaixo.
Observação: eu uso o prefixo $
para strings que você precisa substituir pelos valores desejados. Esta sintaxe não significa que é totalmente compatível com variáveis em qualquer shell.
O uso de ssh -D
é realmente assim:
ssh -D $port_number $hostname
ou
ssh -D $port_number $username@$hostname
Em que $hostname
identifica alguma máquina; pode ser endereço IP, endereço resolvível via DNS ou via /etc/hosts
arquivo ou via ssh_config
arquivo etc. O primeiro comando usará seu nome de usuário atual (local) a menos que seu arquivo ssh_config
indique o contrário (por padrão não ). Você precisa fornecer credenciais (como $username
e senha quando solicitado) válidas para a máquina $hostname
.
Isso abrirá a porta $port_number
TCP no seu computador local e estabelecerá um servidor SOCKS. Note que você pode não ter permissão para abrir algumas portas como usuário regular, especialmente menor que 1024
, use um número maior então.
Em geral, a situação sem o proxy SOCKS fornecido por ssh
é assim:
A -> D
onde A
é um cliente (por exemplo, navegador da web), D
é um servidor (por exemplo, servidor da web). Mas com o proxy isso é o seguinte:
A -> B -> C -> D
onde:
-
A
representa um único cliente que usaB:$port_number
como endereço SOCKS; pode haver muitos clientes. -
B
é a máquina ondessh -D $port_number C
é executado e onde o TCP$port_number
escuta as conexões de entrada de qualquerA
. -
C
é o$hostname
B
conectado a; comunicação que normalmente vai paraD
deA
agora alcançaD
deC
. -
D
é qualquer servidor, ele vê a comunicação deC
e pode não estar ciente de queA
eB
estão envolvidos; pode haver muitos servidores.
Algumas dessas letras podem se referir à mesma máquina em alguns casos de uso específicos. Obviamente, qualquer caso em que A
= C
não ofereça vantagem direta sobre a simples A -> D
connection, mas há outros casos úteis.
Digamos que você execute o comando ssh
mostrado acima e informe ao seu navegador local para usar o SOCKS em localhost:$port_number
. Este é o caso em que A
= B
. O tráfego do seu navegador será encaminhado e os sites que você visitar ( D
) verão a comunicação proveniente do $hostname
( C
) como se o seu navegador fosse executado lá.
Se você quiser que outros computadores se conectem à sua porta aberta ( A
≠ B
, eles usarão $your_IP:$port_number
como o endereço do servidor SOCKS) que você precisa:
- configure seu firewall para permitir conexões de entrada para a porta TCP
$port_number
; - use a opção
-g
comssh -D
;
ou
- encapsula cada cliente, por exemplo através de sua própria conexão
ssh
separada, para que suas conexões pareçam locais (como seA
=B
) para o seussh -D ...
já em execução, portanto, o firewall não interfere nem-g
é necessário; isso pode ser feito porssh -L $some_port:localhost:$port_number $your_IP
invocado ao lado deles oussh -R $some_port:localhost:$port_number $their_IP
invocado ao seu lado; os clientes usarãolocalhost:$some_port
como endereço do servidor SOCKS em seus navegadores.
Não há nenhuma razão $hostname
não pode ser B
' localhost
; pode. Nesse caso, B
= C
. Isso é inútil quando você usa este proxy SOCKS com seu navegador local ( A
= B
= C
), mas se você permitir conexões de fora, então faz todo o sentido. Eu acho que isso é o que você quer fazer. O comando pode ser:
ssh -g -f -N -D $port_number localhost
Você pode querer estabelecer a autenticação baseada em chave para que essa ssh
conexão de localhost
to localhost
doesn ' t pedir sua senha. A observação acima sobre suportes de firewall. Qualquer pessoa que possa usar $your_IP:$port_number
como endereço do servidor SOCKS será visto pelos servidores que visitar como se estivessem no seu computador.
Fragmentos relevantes de man 1 ssh
:
-D [bind_address:]port
Specifies a local "dynamic" application-level port forwarding. This works by allocating a socket to listen toport
on the local side, optionally bound to the specifiedbind_address
. Whenever a connection is made to this port, the connection is forwarded over the secure channel, and the application protocol is then used to determine where to connect to from the remote machine. Currently the SOCKS4 and SOCKS5 protocols are supported, andssh
will act as a SOCKS server. Only root can forward privileged ports. [...]
-f
Requestsssh
to go to background just before command execution. [...]
-g
Allows remote hosts to connect to local forwarded ports.
-N
Do not execute a remote command. This is useful for just forwarding ports. [...]