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