O espaço do usuário não deve poder selecionar a rota usada. Se você quer apenas
use uma rota para o tráfego SSH e outra para o tráfego HTTP, faça o seguinte. Nota
que a abordagem abaixo é usada porque estamos roteando com base na camada 4
endereço de destino. Se fosse apenas baseado em IP, você poderia adicionar rotas extras.
Não se esqueça de substituir endereços IP, números de porta e nomes de interface
apropriado. Eu tenho regras do udev para renomear o link para o iPhone com base no
Endereço MAC. Você não pode e provavelmente será exibido como outro dispositivo eth *.
Os números da tabela e da marca podem ser alterados, desde que sejam consistentes como
são agora.
-
Crie uma tabela de roteamento com um gateway padrão, para cada link.
ip route add 172.20.10.0/24 dev iphone0 table 1234
ip route add default via 172.20.10.1 dev iphone0 table 1234
ip route add 192.0.2.0/24 dev eth0 table 4321
ip route add default via 192.0.2.1 dev eth0 table 4321
-
Como as regras de roteamento IP são apenas , , camada de IP, marque o tráfego pretendido
para qualquer link, usando iptables. Observe como é pré-encaminhamento .
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 2
-
Crie regras de roteamento para lidar com vários gateways padrão. Estes
deve vir primeiro, pois eles forçam o tráfego a voltar para a mesma interface
de onde veio, ao invés de outro se, por exemplo, você mudou
o tráfego SSH de interface deve usar.
ip rule add from 172.20.10.2 table 1234 priority 1000
ip rule add from 192.0.2.2 table 4321 priority 1001
-
(Opcional, a menos que o tráfego em uma sub-rede não seja roteado pelo gateway no
outra sub-rede - por exemplo, talvez tráfego RFC 1918) Crie regras de roteamento para forçar
tráfego para as sub-redes às quais você está diretamente conectado para passar pelo
interface apropriada, independentemente do que você especificou como o link a ser
usado para um tipo de tráfego específico.
ip rule add to 172.20.10.0/24 table 1234 pref 1002
ip rule add to 192.0.2.0/24 table 4321 pref 1003
-
Criar regras de roteamento
ip rule add fwmark 1 table 1234 pref 1004
ip rule add fwmark 2 table 4321 pref 1005
-
Defina o gateway padrão para todos os outros tráfegos.
ip route add default via 192.0.2.1 dev eth0 # implicit "table main" here
Quanto a mudar a conexão que é usada em tempo real, não deve haver
comando nos repositórios oficiais (se escritos e publicados). Você
tem que escrever um script que leia apenas a regra existente do RPDB,
calcular a tabela 'oposta', excluir a regra antiga e criar uma regra para
tráfego para usar a outra tabela. Por exemplo:
#! /bin/sh
case $1 in
ssh) PREF=1004
http) PREF=1005
*) echo "Unknown." 1>&2; exit 1
esac
TABLE='ip rule list | grep ^$PREF: | awk '{print $NF}' | rev'
ip rule del pref $PREF
ip rule add fwmark 1 table $TABLE pref $PREF
Aqui, a escolha do número da tabela acima é importante porque estou usando um
truque para "alternar" o número da tabela.
Não foi testado porque não tenho o que preciso em mãos.
O acima pode ser generalizado para outras situações com dois links e diferentes
esquemas de endereçamento.
Além disso, se você estiver usando o OpenSSH, ele terá um sinalizador para especificar o endereço ao qual será vinculado, -b
. Como as regras de configuração acima são roteadas com base no endereço de origem, você pode fazer apenas ssh -b insert_iphone_address_here [email protected]
ou o outro endereço para escolher qual rota tomar. Não tenho conhecimento de nenhum dos principais navegadores que permitem ao usuário definir o endereço de ligação.