1

Мне нужно привязать одну программу к интерфейсу wlan1 , все остальные программы по умолчанию должны использовать wlan0 .

По этой причине я настроил выделенное пространство имен сети:

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

После этого я ожидаю, что разрешение доменных имен будет работать в моем новом пространстве имен, но, очевидно, это не так, почему ?:

$ 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

... в то время как разрешение корневого пространства имен работает нормально (wlan1 не подключен к Интернету, поэтому потеря пакетов, но не беспокойтесь об этом):

# 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

Когда я использую ping/curl с IP вместо доменного имени, запросы правильно отправляются. У меня закончились идеи, почему разрешение не работает. Я делаю это в RaspberryPi 3, Raspbian, ядро 4.9. Пожалуйста, найдите ниже то, что я уже исследовал.

Файл nsswitch.conf:

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

Ответ resolvconf для корневого пространства имен:

$ 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 в моем пространстве имен:

$ 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 в корневом пространстве имен

$ 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 в моем пространстве имен:

$ 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

РЕДАКТИРОВАТЬ - пробное решение, предложенное в ответе ниже, без результата

Настроил resolvconf, чтобы он указывал на достижимый IP-адрес dnsmasq:

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>>

Чтобы доказать, что IP доступен, dig правильно, решает доменное имя:

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

... пока ping прежнему имеет проблемы:

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

1 ответ1

1

Сетевое пространство имен также изолирует петлевой интерфейс, на котором вы, кажется, запускаете dnsmasq в качестве распознавателя. Вот почему ваше пространство имен не может разрешить доменные имена. Если ваше пространство имен подключено к Интернету, вы можете легко проверить это, изменив сервер имен в resolv.conf на тот, к которому вы можете обратиться из пространства имен, например, Google Public DNS.

Чтобы использовать dnsmasq в качестве распознавателя, вам необходимо настроить его на прослушивание адреса, доступного из пространства имен, и соответственно изменить resolv.conf.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .