Sysctl Parâmetros accept_local e rp_filter Não funciona na máquina Dual-NIC

1
root@host-3:~# uname -a
Linux host-3 4.4.35-1-pve #1 SMP Fri Dec 9 11:09:55 CET 2016 x86_64 GNU/Linux
root@host-3:~# cat /etc/debian_version
8.9
root@host-3:~# ifconfig
eth0      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.1.2  Bcast:192.168.1.2.255  Mask:255.255.255.0
          inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3313 errors:0 dropped:0 overruns:0 frame:0
          TX packets:348 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:224843 (219.5 KiB)  TX bytes:29794 (29.0 KiB)

eth1      Link encap:Ethernet  HWaddr xx:xx:xx:xx:xx:xx
          inet addr:192.168.2.2  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: xxxx::xxxx:xxxx:xxxx:xxxx/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3028 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:196588 (191.9 KiB)  TX bytes:1330 (1.2 KiB)

Na configuração abaixo, no host-3, o tráfego não sai para o fio. A pilha simplesmente envia de volta para o aplicativo de recebimento.

Uma captura de pacotes em ambas as interfaces mostra que nenhum pacote chegou realmente a qualquer interface de rede.

Por que isso acontece?

2 HOSTS, 1 NIC / HOST: ISTO FUNCIONA (PARA COMPARAÇÃO COM O host-3 ABAIXO)

---------------------          -------------------------------------------          ---------------------
| Linux Host host-1 |          |        Device Under Test (router)       |          | Linux Host host-2 |
|     192.168.1.2/24|----------|192.168.1.1/24             192.168.2.1/24|----------|192.168.2.2/24     |
---------------------          -------------------------------------------          ---------------------

1 HOST COM 2 NICs: ISTO NÃO TRABALHA

---------------------
| Linux Host host-3 |
|     192.168.1.2/24|--------|
|               eth0|        |
|                   |        |
|                   |        |
|               eth1|        |
|     192.168.2.2/24|---|    |
---------------------   |    |
                        |    |
                        |    |
                        |    |
                        |    |         -------------------------------------------
                        |    |         |        Device Under Test (router)       |
                        |    |---------|192.168.1.1/24             192.168.2.1/24|---------|
                        |              -------------------------------------------         |
                        |                                                                  |
                        |                                                                  |
                        |                                                                  |
                        |                                                                  |
                        |------------------------------------------------------------------|

TABELA DE ROTEAMENTO, INCLUINDO ROTAS ESTÁTICAS PARA O host-3

Destination    Gateway        Genmask            Flags Metric Ref Use Iface
192.168.1.0    0.0.0.0        255.255.255.0      U     0      0   0   eth0
192.168.1.2    192.168.2.1    255.255.255.255    UGH   0      0   0   eth1
192.168.2.0    0.0.0.0        255.255.255.0      U     0      0   0   eth1
192.168.2.2    192.168.1.1    255.255.255.255    UGH   0      0   0   eth0

PARÂMETROS RELEVANTES DE KERNEL PARA o host-3

root@host-3:~# sysctl -a | grep "\.rp_filter"
net.ipv4.conf.eth0.rp_filter = 0
net.ipv4.conf.eth1.rp_filter = 0
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0

root@host-3:~# sysctl -a | grep "accept_local"
net.ipv4.conf.eth0.accept_local = 1
net.ipv4.conf.eth1.accept_local = 1
net.ipv4.conf.all.accept_local = 1
net.ipv4.conf.default.accept_local = 1
net.ipv4.conf.lo.accept_local = 0

UPDATE # 1

Em resposta ao comentário, consulte o tipo de tráfego e se há VMs envolvidas ...

O tráfego é apenas pings. Eu também testei com UDP unicast e não encontrei diferença no comportamento.

Sim, estas são VMs. Na verdade, mais precisamente, eles são contêineres do LXC Linux em execução no Proxmox 4.4.

Além disso, descobri uma outra coisa desde o meu post original.

Durante o ping, se eu usar a opção -I para especificar a saída (ou seja, o endereço IP ), não vejo nenhuma alteração no comportamento. No entanto, se eu usar a opção -I do ping para especificar a interface de saída, as coisas parecem funcionar, com uma ressalva. Eu digo que eles funcionam porque o comando ping recebe respostas com tempos de ida e volta de aproximadamente 40 ms. Isso é sobre o que eu esperaria se os pacotes estivessem realmente saindo e não em curto-circuito pela pilha (nesse caso, os tempos de ida e volta são sub-milissegundos). No entanto, aqui está a advertência ...

As capturas de pacotes nas interfaces de egresso e de entrada mostram apenas o pedido de eco. As capturas não mostram as respostas de eco. Não tenho certeza de como isso pode ser ...

    
por Dave 22.08.2017 / 13:34

2 respostas

1
# ip rule list
0:      from all lookup local 
32766:  from all lookup main 
32767:  from all lookup default

# ip route list table local
[...]
broadcast 192.168.0.0 dev eth0  proto kernel  scope link  src 192.168.0.100
local 192.168.0.100 dev eth0  proto kernel  scope host  src 192.168.0.100
broadcast 192.168.0.255 dev eth0  proto kernel  scope link  src 192.168.0.100

Você não pode modificar a tabela local ; o kernel mantém isso. E esta é a tabela com a maior prioridade, portanto, não importa o que você define nos outros (ou seja, main ). Essas entradas nunca correspondem.

    
por 22.08.2017 / 22:58
1

O tráfego nunca sairá do fio do host 3, conversando com as duas sub-redes de imagem diferentes, porque host3 possui placas de rede com ambas as sub-redes e, portanto, é uma máquina multi-homed pertencendo a ambos ao mesmo tempo. (ou não vai sair do roteador para o que importa, daí você não receber respostas se você forçar a interface out)

Então, o que acontece efetivamente é que qualquer tráfego que tenha um destino 192.168.1.2/24 e 192.168.2.2/24, seja tráfego interno para host3, e irá para o loopback do servidor, portanto você não vê nada sobre o fio.

Eu também recomendo ter apenas um gateway padrão e não dois. O que acontece é que o tráfego para redes não internas para o host3 será enviado para o roteador / gateway padrão; esse não é o caso dos netblocks acima mencionados.

Eu recomendo uma configuração diferente:

---------------------
| Linux Host host-3 |
|     192.168.1.2/24|--------|
|               eth0|        |
|                   |        |
|                   |        |
|               eth1|        |
|     192.168.2.2/24|---|    |
---------------------   |    |
                        |    |
                        |    |
                        |    |
                        |    |         -------------------------------------------
                        |    |         |        Device Under Test (router)       |
                        |    |---------|192.168.3.2/24             192.168.3.1/24|---------|
                        |              -------------------------------------------         |
                        |                                                                  |
                        |                                                                  |
                        |                                                                  |
                        |                                                                  |
                        |------------------------------------------------------------------|

Para ver o tráfego pela rede, você terá que enviar tráfego do host3 para a rede 192.168.3.0/24.

    
por 22.08.2017 / 14:45