如何为每个进程路由使用Linuxnetworking命名空间?

我想通过浏览器抓取网页,并存储每个URL的networkingstream量(不仅HTTP,而且udp,rtmp等)我遇到这种解决scheme,使用Linuxnetworking名称空间为每个进程路由。 以下是我遵循的步骤,但无法浏览网页。

ip netns add test 

创build一对虚拟networking接口(veth-a和veth-b):

 ip link add veth-a type veth peer name veth-b 

改变veth-a接口的活动命名空间:

 ip link set veth-a netns test 

configuration虚拟接口的IP地址

 ip netns exec test ifconfig veth-a up 192.168.163.1 netmask 255.255.255.0 ifconfig veth-b up 192.168.163.254 netmask 255.255.255.0 

在testing命名空间中configuration路由:

 ip netns exec test route add default gw 192.168.163.254 dev veth-a sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' sudo iptables -t nat -A POSTROUTING -s 192.168.163.0/24 -o wlan0 -j MASQUERADE 

在命名空间中打开浏览器并获取以下内容:

 sudo ip netns exec test /usr/bin/firefox http://google.com 

(firefox:15861):GConf-WARNING **:客户端无法连接到D-BUS守护进程:无法连接到套接字/ tmp / dbus-xE8M4KnMPn:连接被拒绝

(firefox:15861):LIBDBUSMENU-GLIB-WARNING **:无法获取会话总线:无法连接:连接被拒绝

wireshark中: sudo ip netns exec test wireshark我可以看到只有从192.168.163到127.0.1.1的传出DNS请求。 请让我知道我在这里错过了什么?

Solutions Collecting From Web of "如何为每个进程路由使用Linuxnetworking命名空间?"

得到它了。 我可以ping通8.8.8.8。 问题在于DNS解析。

更新DNS解析器。

nameserver 8.8.8.8放在/etc/resolvconf/resolv.conf.d/base/etc/resolvconf/resolv.conf.d/head

重新启动网络。

sudo service network-manager restart

现在/etc/resolv.conf看起来像。

 # Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8) # DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN nameserver 8.8.8.8 nameserver 127.0.1.1 

最后。

 sudo ip netns exec test /opt/google/chrome/google-chrome --user-data-dir=/tmp/chrome2/ http://yahoo.com 

而不是修改主机/etc/resolv.conf,更清晰的方法是在以下路径/ etc / netns /中创建网络名称空间特定的resolv.conf。 “ip netns”实用程序会将此路径上的任何resolv.conf绑定到mount命名空间中的/etc/resolv.conf,以便使用新的网络名称空间启动该进程。