Eu tenho uma máquina com várias interfaces que eu posso configurar como eu quero, por exemplo:
- eth1: 192.168.1.1
- eth2: 192.168.2.2
Gostaria de encaminhar todo o tráfego enviado para um desses endereços locais através da outra interface. Por exemplo, todas as solicitações para um servidor iperf, ftp, http em 192.168.1.1 devem não apenas ser roteadas internamente, mas encaminhadas através do eth2 (e a rede externa cuidará do roteamento do pacote para o eth1).
Eu tentei e olhei para vários comandos, como iptables, ip route, etc ... mas nada funcionou.
O comportamento mais próximo que pude ter foi feito com:
ip route change to 192.168.1.1/24 dev eth2
que envia todo o 192.168.1.x no eth2, exceto o 192.168.1.1 que ainda é roteado internamente. Pode ser que eu possa fazer o encaminhamento NAT de todo o tráfego direcionado para 192.168.1.2 falso no eth1, redirecionado para 192.168.1.1 internamente? Na verdade, estou lutando com o iptables, mas é muito difícil para mim.
O objetivo dessa configuração é fazer o teste do driver de interface sem usar dois PCs.
Estou usando o Linux, mas se você souber fazer isso com o Windows, eu compro!
Editar:
A rede externa é apenas um cabo cruzado entre eth1 e eth2. Digamos que eu tenha um servidor http na minha máquina. Agora, quero acessar esse servidor da mesma máquina, mas quero forçar o tráfego TCP / IP a passar por esse cabo eth1 / eth2. Como devo configurar minhas interfaces para isso?
fonte
Respostas:
Expandi a resposta de caladona, pois não conseguia ver os pacotes de resposta. Para este exemplo:
As rotas iptable do PC local são definidas para o tráfego de saída SNAT e DNAT para o IP 'falso'.
As regras fazem o seguinte:
Para resumir, o sistema local agora pode conversar com uma máquina 'virtual' com os endereços 192.168.1.100 e 192.168.2.100.
Em seguida, você deve forçar seu PC local a usar o roteador externo para alcançar seu IP falso. Você faz isso criando uma rota direta para os IPs através do roteador. Você deseja garantir que você force os pacotes para o lado oposto da sub-rede de destino.
Finalmente, para fazer tudo isso funcionar, o roteador externo precisa saber como alcançar os IPs falsificados no seu PC local. Você pode fazer isso ativando os ARPs de proxy no seu sistema.
Com essa configuração, agora você pode tratar os IPs falsos como um sistema real no seu PC local. Enviar dados para a sub-rede .1 forçará os pacotes a sair da interface .2. Enviar dados para a sub-rede .2 forçará os pacotes a sair da interface .1.
fonte
Usei com êxito o seguinte no Linux para testar a taxa de transferência em uma nova placa de 10 Gbps de porta dupla no modo "loopback", ou seja, uma porta conectada diretamente à outra. Isso é apenas um pouco de vodu apenas para forçar os pacotes a sair, mas se não o fizer, o Linux apenas entrará em curto-circuito com o kernel (daí a pergunta do OP). Na resposta de Casey acima, não tenho certeza se era realmente necessário ter um roteador externo ou não acima, mas o seguinte é completamente independente. As duas interfaces são eth2 e eth3.
Dê IPs para as interfaces e coloque-os em redes separadas:
Em seguida, configuraremos um cenário NAT duplo: duas novas redes falsas usadas para alcançar o outro. Na saída, forneça o NAT à sua rede falsa. No caminho, fixe o destino. E vice-versa para a outra rede:
Agora diga ao sistema como chegar a cada rede falsa e preencha as entradas arp (certifique-se de substituir seus endereços MAC, não use o meu):
Isso engana o Linux o suficiente para realmente colocar pacotes no fio. Por exemplo:
sai eth2, o IP de origem 10.50.0.1 recebe NAT para 10.60.0.1 e, quando entra em eth3, o destino 10.60.1.1 recebe NAT para 10.50.1.1. E a resposta segue uma jornada semelhante.
Agora use o iperf para testar a taxa de transferência. Ligue-se aos IPs corretos e verifique com qual IP você está entrando em contato (o endereço falso da outra extremidade):
Verifique se o tráfego está realmente saindo para o fio:
Você também pode assistir / proc / interrupts apenas para ter certeza absoluta de que o cartão está sendo usado:
De qualquer forma, encontrei este post procurando como fazer isso, obrigado pela equipe de perguntas e respostas e espero que isso ajude outras pessoas a encontrar este post no futuro.
fonte
Como sempre - estou um pouco atrasado - mas hoje em dia é possível usar namespaces de rede para isolar as interfaces e impedir o encaminhamento local (e mexer com o iptables :)).
Crie namespaces (todos feitos com as permissões necessárias, por exemplo, como root):
Observe que o status / configuração das interfaces agora deve ser acessado no contexto do espaço para nome atribuído - para que não apareçam se você executar um link IP sem proteção, pois é executado no contexto do espaço para nome padrão. A execução de um comando em um espaço para nome pode ser feita usando
como prefixo.
Agora atribua namespaces às interfaces, aplique a configuração e configure as interfaces:
Agora você pode executar os aplicativos dentro do namespace - para o servidor iperf, execute
e o cliente:
O tráfego agora será enviado pelas interfaces físicas, pois todo o pilha de rede, interface, roteamento ... é isolado pelos espaços de nomes, para que o kernel não consiga corresponder os endereços usados no tráfego com as interfaces locais (disponíveis).
Se você concluiu suas experiências, exclua os espaços para nome:
As interfaces serão reatribuídas ao espaço para nome padrão e todas as configurações feitas no espaço para nome desaparecem (por exemplo, não é necessário excluir os endereços IP atribuídos).
fonte
Ok, finalmente consegui configurar minha configuração.
A idéia é usar outro endereço falso, forçar a rota desse endereço falso para a interface 2 e depois traduzir o endereço falso com o endereço real 2 com NAT / iptables.
Minha configuração é na verdade feita de um roteador que eu posso telnetar entre IF1 (interface 1) e IF2
Na minha configuração, FAKE_ADDR e IF1_ADDR estão na mesma sub-rede.
E no roteador:
Se eu enviar algo para FAKE_ADDR, o pkt será encaminhado pelo IF1 para o roteador, encaminhado novamente para o IF2, e o FAKE_IP será substituído pelo IF2_ADDR. O pacote é processado pelo servidor, o resultado é enviado de volta para IF1_ADDR, a partir de IF2_ADDR, que é substituído por FAKE_ADDR.
Pode ser possível usar uma configuração mais simples com apenas um cabo cruzado, mas como eu não tentei, prefiro dar a minha solução de trabalho.
fonte
A resposta dada acima por Thomas Tannhäuser foi imediata!
Eu tive uma situação semelhante: uma única máquina com duas interfaces enet. Meu plano era usar uma interface como servidor (receptor) e a outra como cliente (remetente). Cada interface seria conectada ao roteador e o iperf direcionaria o tráfego através do roteador para medir a taxa de transferência, PPS, atraso, etc.
Infelizmente, a abordagem do iptables não era intuitiva e cheia de problemas. Depois de algumas horas frustrantes, abandonei esse plano de ataque. Inspirado pela sugestão de Thomas, fiz um pouco de lição de casa nos namespaces IP do Linux e comecei a apreciar a simplicidade e a elegância dessa solução.
Abaixo está uma lista dos comandos exatos que eu usei para configurar o meu Fedora FC26 para servir nessa capacidade. As duas interfaces são enp1s0 e enp3s0. O roteador possui duas interfaces com os endereços 192.168.2.112 e 172.16.16.2. Cada conector FC26 ENET é diretamente conectado à interface do roteador correspondente.
fonte
Parece que você deseja transformar sua caixa Linux em uma caixa do tipo roteador / ponte / gateway / firewall. Os seguintes recursos podem ser o que você está procurando:
O projeto do roteador Linux
Lista de distribuições de roteador ou firewall
Roteador Linux LiveCD
Linux Journal - O roteador Linux
Atualização com base em mais informações:
Eu não acho que você será capaz de fazer o que quiser. O sistema operacional sempre examinará sua tabela de roteamento interno e 'verá' os dois endereços IP localmente. Em seguida, ele encaminhará o tráfego no sistema operacional e nunca o ligará. Você precisará de uma segunda máquina ou duas máquinas virtuais (confira o Xen ).
fonte
Um monte de coisas para passar por aqui, então não posso garantir totalmente minha precisão, mas a pergunta original parece estar procurando o que é conhecido como técnica "enviar para si mesmo" . A pesquisa vinculada mostra o que eu acho que é o patch de kernel mais bem mantido, como principais links + discussões e patches com outras abordagens em várias listas de discussão, esp. LKML.
Eu acho que também devemos olhar para os namespaces da rede , feitos com os "ip netns" do iproute2 . Isso também requer alguma interface extra e mágica de roteamento, portanto, pode até não ser menos complexo do que o enorme tumulto do iptables nas outras respostas.
Os comentários são definitivamente bem-vindos se alguém encontrar algo útil com eles - o como, o quê e o que acontece com sua implementação.
fonte
Veja este artigo. Aqui, as etapas detalhadas são mencionadas para habilitar o acesso da Internet a uma caixa virtual vm usando o encaminhamento NAT.
http://jackal777.wordpress.com/2012/02/13/virtualbox-host-only-networking-nat-for-internet-access/
fonte
aqui está como eu consegui trabalhar para IPV6
ips estáticos atribuídos
configurar somente rotas de host para endereços "FAKE"
preencheu a tabela Vizinho ... como o arp
adicionadas as entradas ip6tables
fonte