Como definir uma rota estática para um endereço IP externo

3

Estou colocando um novo roteador em nossa rede para ajudar a gerenciar nossas conexões de rede privada e controlar melhor o roteamento para o exterior. Decidi simplificar essa questão removendo referências a uma segunda rede privada em nosso roteador (mas esteja ciente de que há razões para essa pergunta, então a resposta é não para deixar o roteador antigo como padrão gateway).

Eu tenho o seguinte roteamento em meus iptables em nosso roteador:

# Allow established connections, and those !not! coming from the public interface
# eth0 = public interface
# eth1 = private interface #1 (129.2.2.0/25)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW ! -i eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the private interface
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

# Masquerade (NAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Don't forward any other traffic from the public to the private
iptables -A FORWARD -i eth0 -o eth1 -j REJECT

Esta configuração significa que os usuários serão encaminhados através de um modem / roteador que tenha um endereço público - tudo isso é bom para a maioria dos propósitos e, em geral, não importa que todos os computadores estejam escondidos atrás do único endereço público. IP.

No entanto, alguns usuários precisam ser capazes de acessar um proxy em 192.111.222.111:8080 - e o proxy precisa identificar esse tráfego como vindo através de um gateway em 129.2.2.126 (o roteador antigo) - ele não responderá caso contrário.

Eu tentei adicionar uma rota estática em nosso roteador com:

route add -host 192.111.222.111 gw 129.2.2.126 dev eth1

Eu posso pingar com sucesso 192.111.222.111 do roteador. Quando eu traço a rota, ele lista o gateway 129.2.2.126, mas acabei de receber o *** em cada um dos seguintes saltos (acho que isso faz sentido, já que isso é apenas um proxy da Web e requer autenticação).

Quando tento pingar esse endereço de um host na rede 129.2.2.0/25, ele falha.

Devo fazer isso na cadeia do iptables? Como eu configuraria esse roteamento?

Diagrama de rede

Aqui está a configuração das interfaces para o roteador:

auto eth0
iface eth0 inet static
    address     150.1.2.2
    netmask     255.255.255.248
    gateway     150.2.2.1

auto eth1
iface eth1 inet static
    address     129.2.2.125
    netmask     255.255.255.128

E aqui está a tabela de roteamento (sem minha rota estática adicionada):

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         eth1202.sa.adsl 0.0.0.0         UG    100    0        0 eth0
localnet        *               255.255.255.0   U     0      0        0 eth1
129.2.2.0       *               255.255.255.128 U     0      0        0 eth1

Para reafirmar - quero que o tráfego de 129.2.2.7 (por exemplo) passe por nosso roteador (129.2.2.125). Mas este roteador precisa encaminhar 8080 pedidos com o destino de 192.111.222.111 - que está em algum lugar do outro lado do roteador antigo (129.2.2.126 - que não é gerenciável por nós).

    
por HorusKol 21.09.2012 / 03:18

2 respostas

4

O que você está tentando fazer é inteiramente possível e, na verdade, é uma técnica bastante usada. Você também tem a maior parte da configuração já. O que você pode estar perdendo é uma regra "ACEITAR" em "novo roteador" permitindo fluxos de tráfego de eth1 para eth1 . Basta adicioná-lo usando

iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -j ACCEPT

Deve ser suficientemente seguro não contornar nenhuma das regras e medidas de segurança em vigor e, ainda assim, ser genérico o suficiente para permitir qualquer um dos clientes e protocolos da sua rede. Depois de configurar e solucionar problemas, você pode restringir a regra aos protocolos e destinos que você usará:

iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p icmp -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p tcp --dport 8080 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p tcp --sport 8080 ! --syn -j ACCEPT

Note que, no caso típico, você dificilmente veria qualquer fluxo de tráfego através do "novo roteador" para 192.111.222.111. O Linux felizmente enviaria mensagens de redirecionamento do ICMP informando aos hosts da sua sub-rede para usar "roteador antigo" para tráfego para 192.111.222.111 na primeira ocorrência do pacote. E a maioria dos hosts seguiria (assumindo que recebeu a mensagem - ou seja, não foi filtrada em qualquer lugar) e enviou todos os pacotes subseqüentes para 192.111.222.111 diretamente via "antigo roteador" .

    
por 24.09.2012 / 16:53
1

Se você estiver roteando para um host específico, não acredito que o uso da máscara de rede esteja correto. Especificar 0.0.0.0 implicaria um gateway padrão para todo o tráfego, já que essa máscara corresponderia a TODOS os IPs IPv4.

Na verdade, um 255.255.255.255 completo é necessário para uma única regra de correspondência de host.

E talvez seja óbvio, mas você deve especificar um gateway que esteja em uma rede conectada diretamente coberta pela sua tabela de roteamento existente.

Ao trabalhar com iptables e roteamento, sugiro configurar uma regra de LOG para enviar pacotes descartados para um log. Isso dirá se você está descartando pacotes que podem parecer problemas de roteamento.

Isso configura uma cadeia LOGDROP.

-A LOGDROP -j LOG --log-prefix "LOGDROP "
-A LOGDROP -j DROP

E então, no final de várias cadeias que você deseja registrar, você pula para a cadeia LOGDROP no final:

-A INPUT -j LOGDROP

Em vez de simplesmente descartar os pacotes. Várias cadeias LOGDROP com diferentes rótulos permitirão obter mais granularidade na compreensão do que você está vendo.

    
por 21.09.2012 / 03:40