我需要将一个程序绑定到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 以指向可访问的 dnsmasq IP:
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
网络命名空间还隔离了环回接口,您似乎在该接口上运行 dnsmasq 作为解析器。这就是您的命名空间无法解析域名的原因。如果您的命名空间已连接到 Internet,您可以通过更改名称服务器来轻松测试这一点解析配置文件可以从命名空间访问,例如Google 公共 DNS。
使用域名系统作为您的解析器,您需要将其配置为监听可以从命名空间访问的地址,并相应地更改 resolv.conf。
答案2
可能是因为您创建了一个新的网络命名空间,新的命名空间使用 /etc/resolv.conf 配置。
您的配置使用名称服务器 127.0.0.1,它不能在新的命名空间中使用。
您可以创建文件
/etc/netns/命名空间名称/resolv.conf
,并在其中放置一个好的 dos 服务器,就像
nameserver 8.8.8.8
现在您的命名空间使用了正确的 DNS 服务器,也许可以解决这个问题。
看这关联。