Como alterar o endereço IP de origem padrão para algo diferente do endereço voltado para a rota padrão?

Como alterar o endereço IP de origem padrão para algo diferente do endereço voltado para a rota padrão?

Informações básicas

  • Estou usando um sistema Linux para rotear o tráfego para um pequeno bloco de endereços IPv4 públicos (habilitando o encaminhamento de IP sysctrl.conf).

  • O roteador está se conectando ao ISP eth1usando PPPoE.

  • O endereço de peer local usado para ppp é um endereço IP configurado manualmente e especificado pelo ISP. O endereço do par local é 10.0.0.10.

  • O endereço de ponto remoto usado para ppp também é um endereço IP configurado manualmente e especificado pelo ISP. O endereço do peer remoto é 10.0.0.9.

  • A rota padrão do roteador é 10.0.0.9via 10.0.0.10.

  • O roteador está conectado a um switch Ethernet via eth0. eth0está configurado para usar um dos endereços públicos.

  • O switch conecta todos os outros hosts públicos. Cada host conectado usa um endereço IP público.

  10.0.0.9
ISP ----------+
              |   10.0.0.10                       X.X.X.X
              +------------- (eth1) ROUTER (eth0) --------------- SWTICH 
                                                                     |     
                                                                     +-- X.X.X.Y
                                                                     +-- X.X.X.Z
                                                                     ...

Meu problema

Tudo funciona conforme o esperado, exceto os programas em execução no roteador. Qualquer aplicativo que eu executo no roteador usa 10.0.0.10como endereço IP de origem ao iniciar conexões com a Internet. Isso é compreensível, pois eth1é onde a Internet está disponível. No entanto, como o endereço não é roteável publicamente, apt, pinge outros programas não funcionam. Se eu definir explicitamente o endereço de origem nos aplicativos que o suportam (ou seja ping), os aplicativos funcionarão.

Minha pergunta

Como posso configurar o roteador para rotear pacotes desconhecidos via eth1/ 10.0.0.9enquanto também uso o endereço IP público eth0como fonte padrão ao iniciar novas conexões?

Responder1

Nota: considerarei que a LAN do seu roteador é 192.0.2.0/24 e o IP da LAN está ligadoeth0é 192.0.2.1/24, para poder dar explicações concretas e uma solução.

Seu ISP, para poupar alguns endereços IP públicos, atribuiu a você IPs privados para fins de roteamento interno. Tudo bem porque este IP nunca foi feito para ser visto do lado de fora (e seria rapidamente descartadoEncaminhamento estrito de caminho reversoao longo do caminho, se alguma vez for colocado no fio além do roteador ISP, ou se não, por não ser roteável, nunca obterá uma resposta). Mas isso torna sua configuração mais complexa para evitar que esse IP seja utilizado em todos os casos, exceto na conectividade com o ISP, do seu roteador.

Você provavelmente tem algo semelhante a isto (pode ser um pouco diferente, não importa):

# ip route
default via 10.0.0.9 dev ppp0 
10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10 
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.1 

É possível, por exemplo, que você tenha default via 10.0.0.9 dev ppp0 src 10.0.0.10, ou que via 10.0.0.9nem apareça, já que é um link da camada 3 e não um link da camada 2, tornando- viao desnecessário (mas ainda aceito). Basta adaptar as configurações abaixo de acordo.

Atualmente, o kernel escolhe o IP aparentemente mais adequado, aquele definido no mesmo lado para acessar a Internet, já que nada indica o contrário (ou diz explicitamente para usar o IP que você não deseja):

# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 10.0.0.10 uid 0 
    cache 

Você só precisa substituir o comportamento de roteamento quando o kernel verifica como acessar a Internet e indicar um endereço IP de origem preferencial específico. Esteja ciente de que você poderá perder conectividade em caso de erros e problemas imprevistos. Tenha acesso alternativo (console), se possível:

# ip route replace default via 10.0.0.9 dev ppp0 src 192.0.2.1
# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 192.0.2.1 uid 0 
    cache 

É isso, seu roteador irá rotear normalmente, mas quando precisar escolher um IP de saída originado localmente, selecionará 192.0.2.1, a menos que seja explicitamente informado o contrário (por exemplo: processar vinculando explicitamente o IP de origem em seu soquete).

Esta rota deve ser definida novamente cada vez que o link for desativado e reativado. Cabe a você integrar isso em algum script pppoe, depois que o link estiver totalmente estabelecido.

Observe também que o nome da interfaceppp0pode mudar parappp1ou qualquer outro nome. Cabe a você lidar com isso em seus scripts de configuração.


Métodos alternativos para definir esta mesma configuração de rota:

  1. adicione uma métrica inferior, quando uma métrica for definida inicialmente

    Se a métrica original foi definida (ou seja, não era 0, digamos que era 100), você pode adicionar uma rota padrão alternativa com uma métrica inferior em vez de substituir a anterior:

    # ip route add default via 10.0.0.9 dev ppp0 src 192.0.2.1 metric 50
    
  2. regra de roteamento dedicada

    Se você teme a interação de diversas ferramentas envolvidas no pppoe que possam remover a rota acima, você pode instalar esta configuração em uma tabela de roteamento alternativa e dar-lhe precedência nas regras de roteamento, com uma cópia parcial da tabela principal para evitar interrupções. Isso ainda terá que ser refeito após cada desconexão/reconexão, pois a rota ainda desaparecerá. Aqui iif loé especial e realmente significa "pacote de saída originado localmente" em vez de entrada, e 109 é um valor de tabela escolhido arbitrariamente:

    # ip rule add iif lo lookup 109 # needed only once
    # ip route add table 109 10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10 # to keep using 10.0.0.10 for local link, just in case
    # ip route add table 109 192.0.2.0/24 dev eth0 src 192.0.2.1 # will disappear if eth0 is brought down
    # ip route add table 109 default via 10.0.0.9 dev ppp0 src 192.0.2.1 # will disappear if ppp0 is brought down
    

    Se você adicionou outras entradas de roteamento na tabela principal, é provável que você também precise copiá-las acima.

    # ip route get 8.8.8.8
    8.8.8.8 via 10.0.0.9 dev ppp0 table 109 src 192.0.2.1 uid 0 
        cache 
    
  3. regras de roteamento com rota simplificada

    Pode-se manter as rotas na tabela principal e substituir apenas a rota padrão por um supressor baseado em prefixo na regra: Isso evita ter que copiartodosrotas: basta copiar e alterar a rota padrão.

    Substitua 2. por (informando os valores de preferência, ainda colocando-os em ordem decrescente, como aconteceria sem indicá-los):

    # ip rule add pref 32765 iif lo lookup 109 # needed only once
    # ip rule add pref 32764 iif lo lookup main suppress_prefixlength 0 # needed only once
    
    # ip rule
    0:      from all lookup local
    32764:  from all iif lo lookup main suppress_prefixlength 0
    32765:  from all iif lo lookup 109
    32766:  from all lookup main
    32767:  from all lookup default
    
    # ip route add table 109 default via 10.0.0.9 dev ppp0 src 192.0.2.1 # will disappear if ppp0 is brought down
    

    A tabela de roteamento principal será usada primeiro para qualquer coisa que não seja a rota padrão e, em seguida, para o tráfego de saída originado localmente, a rota padrão será fornecida na tabela de roteamento 109. Qualquer outra coisa continuará e procurará novamente na tabela principal a rota padrão como habitual.

    A vantagem sobre 2. é que não há necessidade de duplicar rotas (não padrão) da tabelaprincipalna tabela 109 mais. Abaixo, tabelaprincipalfornece o resultado para uma rota não padrão, ao contrário do 2. método:

    # ip route get 8.8.8.8
    8.8.8.8 via 10.0.0.9 dev ppp0 table 109 src 192.0.2.1 uid 0 
        cache 
    # ip route get 192.0.2.2
    192.0.2.2 dev eth0 src 192.0.2.1 uid 0 
        cache 
    

Responder2

Assim como você disse. Os outros clientes no switch com seu roteador como gateway possuem endereços IP públicos. Seu roteador não. Possui um endereço LAN que não será roteado. Como o seu provedor de serviços de Internet NÃO lhe forneceu um endereço público, o roteador NÃO poderá sair.

Se você tiver outro IP público, crie uma configuração eth virtual na eth1 e roteie-a corretamente. Então seu roteador também pode desligar.

informação relacionada