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 tokensrc
:$ 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 comip 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.