Problema de pesquisa de domínio dentro do namespace da rede

1

Eu preciso ligar um programa à interface wlan1 , por padrão, todos os outros programas devem usar wlan0 .

Por esse motivo, configurei o namespace de rede dedicado:

ip netns add wlan1_ns
ip link add vwlan1a type veth peer name vwlan1b
ip link set vwlan1a netns wlan1_ns
ip addr add 10.200.1.1/24 dev vwlan1b
ip link set vwlan1b up
ip netns exec wlan1_ns ip addr add 10.200.1.2/24 dev vwlan1a
ip netns exec wlan1_ns ip link set vwlan1a up
ip netns exec wlan1_ns ip link set lo up
ip netns exec wlan1_ns ip route add default via 10.200.1.1
iptables -t nat -A POSTROUTING -s 10.200.1.0/255.255.255.0 -o wlan1 -j MASQUERADE
iptables -A FORWARD -i wlan1 -o vwlan1b -j ACCEPT
iptables -A FORWARD -o wlan1 -i vwlan1b -j ACCEPT

Depois de fazer isso, espero que a resolução de nomes de domínio funcione em meu novo namespace, mas aparentemente não é, por quê?:

$ sudo ip netns exec wlan1_ns ping -v google.com
ping: socket: Permission denied, attempting raw socket...
ping: socket: Permission denied, attempting raw socket...
ping: google.com: Temporary failure in name resolution

... enquanto na resolução do host de namespace raiz funciona bem ( wlan1 não está conectado à Internet, portanto perda de pacote, mas não se preocupe com isso):

# ping google.com
PING google.com (216.58.212.238) 56(84) bytes of data.
^C
--- google.com ping statistics ---
122 packets transmitted, 0 received, 100% packet loss, time 125718ms

Quando eu uso ping / curl com IP em vez de nome de domínio do que as solicitações saem corretamente. Eu fiquei sem ideias porque a resolução não funciona. Eu estou fazendo isso em RaspberryPi 3, Raspbian, kernel 4.9. Por favor, encontre abaixo o que eu já investiguei.

arquivo nsswitch.conf:

$ cat /etc/nsswitch.conf | grep host
hosts:          files mdns4_minimal [NOTFOUND=return] dns

respostas resolvconf para namespace raiz:

$ resolvconf -l
# resolv.conf from lo.dnsmasq
nameserver 127.0.0.1

# resolv.conf from wlan1
# resolv.conf for wlan1
domain coova.org
nameserver <<ANONYMIZED DNS IP>>
nameserver <<ANONYMIZED DNS IP>>

resolvconf no meu namespace:

$ ip netns exec wlan1_ns resolvconf -l
# resolv.conf from lo.dnsmasq
nameserver 127.0.0.1

# resolv.conf from wlan1
# resolv.conf for wlan1
domain coova.org
nameserver <<ANONYMIZED DNS IP>>
nameserver <<ANONYMIZED DNS IP>>

iptables no namespace raiz

$ sudo iptables -v --list
Chain INPUT (policy ACCEPT 641 packets, 63289 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 171 packets, 90385 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     all  --  wlan1  vwlan1b  anywhere             anywhere
   32  1816 ACCEPT     all  --  vwlan1b wlan1   anywhere             anywhere

Chain OUTPUT (policy ACCEPT 802 packets, 91050 bytes)
 pkts bytes target     prot opt in     out     source               destination

iptables no meu namespace:

$ sudo ip netns exec wlan1_ns iptables -v --list
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

EDIT - solução experimentada sugerida na resposta abaixo, sem resultado

Configurado o resolvconf para apontar o IP dnsmasq alcançável:

pi@raspberrypi:~ $ sudo sh -c "echo nameserver 172.24.1.1 | resolvconf -a lo.dnsmasq"
Too few arguments.
Too few arguments.
pi@raspberrypi:~ $ resolvconf -l
# resolv.conf from lo.dnsmasq
nameserver 172.24.1.1

# resolv.conf from wlan1
# resolv.conf for wlan1
domain coova.org
nameserver <<ANONYMIZED _IP>>
nameserver <<ANONYMIZED _IP>>

Para provar que o IP está acessível, dig resolve corretamente o nome de domínio:

pi@raspberrypi:~ $ sudo sh -c "ip netns exec wlan1_ns dig +short @172.24.1.1 google.com"
172.217.17.142

... enquanto ping ainda tem problemas:

pi@raspberrypi:~ $ sudo sh -c "ip netns exec wlan1_ns ping -v google.com"
ping: socket: Permission denied, attempting raw socket...
ping: socket: Permission denied, attempting raw socket...
ping: google.com: Temporary failure in name resolution
    
por Paweł Gutowski 22.09.2017 / 15:18

1 resposta

1

O namespace de rede também isola a interface de loopback, na qual você parece rodar o dnsmasq como seu resolvedor. É por isso que seu namespace não resolve nomes de domínio. Se o seu namespace estiver conectado à Internet, você pode facilmente testar isso alterando o nameserver em resolv.conf para um que você pode acessar a partir do namespace, como DNS público do Google .

Para usar dnsmasq como seu resolvedor, você precisa configurá-lo para escutar no endereço que pode ser alcançado a partir do namespace e alterar o resolv.conf de acordo.

    
por 24.09.2017 / 21:27