Como criar um proxy SOCKS com o ssh?

1

Eu quero usar meu computador como um proxy SOCKS. Você só precisa fazer ssh -D port_number hostname ? Eu tenho que colocar meu nome de usuário Linux como hostname ?

    
por Raffaele D'Arco 27.03.2018 / 21:32

1 resposta

1

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 usa B:$port_number como endereço SOCKS; pode haver muitos clientes.
  • B é a máquina onde ssh -D $port_number C é executado e onde o TCP $port_number escuta as conexões de entrada de qualquer A .
  • C é o $hostname B conectado a; comunicação que normalmente vai para D de A agora alcança D de C .
  • D é qualquer servidor, ele vê a comunicação de C e pode não estar ciente de que A e B 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 ( AB , 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 com ssh -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 se A = B ) para o seu ssh -D ... já em execução, portanto, o firewall não interfere nem -g é necessário; isso pode ser feito por ssh -L $some_port:localhost:$port_number $your_IP invocado ao lado deles ou ssh -R $some_port:localhost:$port_number $their_IP invocado ao seu lado; os clientes usarão localhost:$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 to port on the local side, optionally bound to the specified bind_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, and ssh will act as a SOCKS server. Only root can forward privileged ports. [...]

-f
Requests ssh 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. [...]

    
por 28.03.2018 / 11:07