Vincular o tráfego de saída do servidor SOCKS a um IP específico

6

No escritório, temos acesso à web por meio de um servidor SOCKS, que é iniciado com o comando:% ssh localhost -f -N -D *:8888 .

Este servidor tem 2 IPs (mas apenas uma placa de rede):
eth0 xx.yy.zz.1
eth0: 1 xx.yy .zz.2

Portanto, os navegadores estão configurados para usar o proxy de meias xx.yy.zz.2:8888

Quando eu verifico qual é o IP que os sites veem, ele me fornece xx.yy.zz.1 (o IP padrão do servidor).
Mas eu quero que seja o outro (xx.yy.zz.2).

Como posso vincular as conexões de saída ao segundo IP?

EDIT:
Isso poderia ser resolvido com o iptables?
Pode haver uma maneira de saber quais são os pacotes originados de um determinado túnel SSH e, em seguida, modificar seu IP de destino?

EDIT2:
Outra idéia que cruza minha mente, existe algum tipo de comando wrapper que força outro comando a se ligar a um determinado IP?

    
por GetFree 29.03.2014 / 02:13

1 resposta

4

O protocolo SSH não tem como os clientes dizerem ao servidor para se ligar a um determinado endereço ao fazer um encaminhamento dinâmico de portas, portanto, não, você não pode dizer ao seu cliente SSH para fazê-lo. Você não pode dizer ao servidor OpenSSH para fazer isso também. Ele usará cegamente getaddrinfo para se conectar ao host remoto.

A única maneira de corrigir é configurar seu servidor para que ele faça o que você deseja. Infelizmente, não há como saber do roteamento ou iptables qual conexão foi feita pelo servidor OpenSSH. O problema é difícil: o OpenSSH pode abrir a conexão, mas também pode gerar um shell que pode gerar outro processo que também pode abrir conexões. Distinguir dos dois casos é difícil. Seria muito mais fácil se o OpenSSH apenas definisse uma marca ou algo assim, mas isso não acontece.

Portanto, suas soluções são limitadas:

  • Use um servidor SOCKS separado que permita configurar o endereço de vinculação.

  • Configure o seu kernel para que ele use xx.yy.zz.2 por padrão para toda a conexão de saída, ou para os IPs de destino reais que são usados se forem conhecidos antecipadamente.

    Para atribuir um endereço de origem quando não houver nenhum, o kernel examina a entrada de rota usada para seu endereço de destino e, se tiver um endereço de origem preferencial, ele será usado. Caso contrário, escolherá algum endereço que pareça melhor para a tarefa. O que quer que seja escolhido, pode ser verificado pelo comando ip route get (destination) , após o token src :

    $ ip route get 8.8.8.8 8.8.8.8 via (maybe your gateway) dev eth0 src xx.yy.zz.1 [...]

    Você pode modificar sua tabela de roteamento com o comando ip route para adicionar endereços de origem preferidos com ip route change [...] src xx.yy.zz.2 . Você pode até adicionar uma rota mais específica pelo mesmo gateway, mas com um endereço de origem preferido diferente.

  • Coloque o OpenSSH em um namespace de rede que manipule apenas o endereço xx.yy.zz.2. Esta solução é excessiva e pode alterar a configuração de muitos serviços em seu servidor, já que essencialmente isola seus dois endereços. Esta solução envolverá muitas mudanças em seu sistema, especialmente em relação à maneira como o daemon sshd e seu servidor de meias são iniciados.

Não relacionado a tudo isso: "aliases de interfaces" (por exemplo, eth0:1 ) estão obsoletos no Linux. Eles ainda funcionam como compatibilidade retroativa para ferramentas históricas como ifconfig , mas você deve se livrar deles e usar a funcionalidade nativa do kernel para obter vários endereços por interface. Pare de usar ifconfig , route e use ip addr e ip route .

Use ip addr add ... dev eth0 para adicionar um endereço à interface eth0 . Você pode adicionar quantos endereços quiser. Use ip addr para listar todos eles. Veja a página de manual de ip addr e ip route para obter mais informações.

    
por 02.04.2014 / 21:57