Permitir apenas determinado tráfego de saída em determinadas interfaces

15

Eu tenho uma questão bastante estranha. Eu tenho um servidor com duas interfaces de rede eth0e eth1. Cada um está conectado a uma rede diferente. Cada rede possui um gateway de internet. O servidor possui várias conexões de saída : http (alguns scripts nos sites de raspagem de servidor), cliente nfs, cliente samba, cliente dns e um buscador de e-mail para citar apenas alguns.

Por razões pelas quais não vou entrar, preciso dividir esses clientes de saída para que o tráfego http, nfs, samba e dns de saída seja solicitado apenas eth0enquanto o restante ocorrer eth1.

Eu li algumas pesquisas no Google e parece que iptablesé o que eu preciso, mas eu realmente não tenho idéia. Só estou acostumado a gerenciar regras de firewall de entrada ufw.

Alguém poderia começar com algumas regras de exemplo e me dizer como fazer o sistema adotar essas regras na inicialização? Idealmente, sem me bloquear da minha conexão SSH ( posso obter acesso físico, mas prefiro não).

Editar Posso dividir os clientes em dois usuários, se for possível limitar todo o tráfego de saída de uma conta para uma interface. no papel que parece ser mais fácil.

Oli
fonte

Respostas:

12

Eu configuraria uma tabela de roteamento separada e uma política para rotear pacotes marcados usando essa tabela e fazer com que iptables / netfilter marquem determinados pacotes.

Crie uma tabela: echo 1 known >> /etc/iproute2/rt_tables

Crie uma regra de roteamento (o ipcomando é de iproute2 ): ip rule add from all fwmark 1 table known

Criamos uma tabela chamada "conhecida" e criamos uma regra de roteamento que diz que qualquer pacote com uma marca igual a 1 é roteado de acordo com a tabela "conhecida". Eu o chamei apenas conhecido porque é para a lista de protocolos conhecidos - você pode nomear o que quiser. Agora, configuramos a tabela conhecida para rotear da maneira correta.

ip route add default dev eth0 table known

Crie regras do iptables:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

O exemplo marca pacotes nas portas NFS (111, 2049) com um 1. Estamos adicionando esta regra à tabela de ip 'mangle'. Isso é diferente das tabelas de roteamento e não é alterável; a tabela mangle é especificamente para alterar pacotes de qualquer maneira que não seja o NAT.

Agora, para rotear todo o resto pela outra interface, adicionamos uma rota à tabela de roteamento padrão.

ip route add default dev eth1

Para realmente entender isso, leia as seções 4 e 11 do LARTC .

Shawn J. Goff
fonte
Bem, isso é realmente muito mais simples do que eu temia. A pilha de redes Linux é realmente uma fera bonita, não é ?! Fiz um teste rápido e tudo parece funcionar como esperado. Estou monitorando cada interface iftope cada uma mostra o tipo certo de tráfego. Muito obrigado.
28711 Oli
Não sei como o iptables ou o iproute2 armazenam sua configuração. Preciso disparar essas regras a cada inicialização?
Oli
@ Oli Eles são limpos quando você reinicia. Você pode salvar e restaurar as regras com iptables-savee iptables-restore. Se você estiver usando o NetworkManager, poderá configurar os scripts do dispatcher para automatizar o processo. Infelizmente, a página oficial do NM não possui documentação sobre o recurso, mas a documentação do Ubuntu e do Arch Linux o menciona.
Shawn J. Goff
5

Bem, a maneira " mais fácil " deve ser instruir os programas únicos a usar uma interface específica (ou o ip da interface. Por exemplo:

ping -I eth1 8.8.8.8

instrui o ping a usar eth1 como uma interface de origem, enquanto

wget --bind-address 10.0.0.1 http://www.google.it/

instrui o wget a percorrer a interface que tem 10.0.0.1como endereço IP.

Honestamente, eu não sei se é possível com todos os programas que você precisa, mas é um começo para reduzir as regras que você precisa escrever iptablese os iprouteprogramas.

Para começar, você deve ler este tutorial sobre várias conexões com a Internet . Uma boa leitura também é um dos milhares de tutoriais do iptables, especialmente em outbound filtering, process/ pid filteringe port filtering.

Shunz
fonte
4

A maneira correta de fazer isso é ligar () à interface que você deseja usar para pacotes de saída. Desde então, você pode configurar rotas com os comandos ip routee ip rulepara controlar como os pacotes são roteados com base em sua interface de saída. Para o meu exemplo, assumirei a seguinte rede:

  • eth0:
    • Endereço: 192.168.0.2/24
    • Gateway Padrão: 192.168.0.1
  • eth1:
    • Endereço: 192.168.1.2/24
    • Gateway Padrão: 192.168.1.1

Vou criar duas tabelas de roteamento, uma para o tráfego de saída para eth0 chamado alternativo e uma tabela para eth1 chamada main. A tabela de roteamento main sempre existe e é a tabela normal usada pelos comandos routee ip route. A maioria das pessoas nunca lida com outras mesas. Para criar a tabela chamada alternativa, adicionaremos a seguinte linha ao/etc/iproute2/rt_tables :

10    alternate

A tabela principal tem uma prioridade padrão de 254. As regras para as quais a tabela de roteamento está em vigor são controladas pelo ip rule comando. Por padrão, esse comando imprimirá uma lista de regras existentes que devem se parecer com isso:

0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default 

Isso basicamente diz que procurará uma rota na tabela, localque é uma tabela especial mantida pelo kernel para rotas locais, como meu próprio endereço IP. Ele tentará a tabela principal e a tabela padrão. O padrão da tabela normalmente está em branco; portanto, se não houver correspondência principal, não haverá rota para o host. Primeiro, vamos preencher a tabela alternadamente com as regras para eth0.

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

Você normalmente deseja que a alternatetabela seja semelhante àmain tabela. As únicas diferenças são quando o roteamento deve ser diferente. Você pode não querer incluir a segunda linha acima, se desejar literalmente que todo o tráfego NFS, HTTP etc. seja transmitido pelo gateway padrão no eth0, mesmo que seja destinado à rede no eth1. O próximo passo é adicionar uma regra para quando usar esta tabela de roteamento alternativa:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

Esta regra diz que qualquer tráfego proveniente de um endereço na rede 192.168.0 usará a alternatetabela de roteamento em vez da maintabela normal . A última etapa é garantir que todos os clientes que devem usar se eth0liguem a ele. Com wget, por exemplo, definido --bind-address=192.168.0.2, para NFS defina oclientaddr=192.168.0.2opção de montagem. Se você estiver usando o LibWWW com Perl, poderá definir a opção localaddr em LWP :: UserAgent para controlar a interface local à qual se liga. Se você possui um cliente, não pode controlar a fonte de ligação e compilação não é uma opção, poderá usar uma regra iptables para modificar seu endereço, mas isso é mais um hack e pode não funcionar. Você precisaria de uma regra SNAT configurada na cadeia PREROUTING da tabela nat ou da tabela mangle. Você ainda precisará das tabelas de roteamento modificadas fornecidas acima para que isso funcione.

penguin359
fonte