Linux中网络命名空间基本操作
Linux中网络命名空间基本操作
前言
网络命名空间(Network Namespace,简写: netns)是Linux内核提供的一种实现网络资源隔离的方法,允许不同的网络命名空间拥有独立的网络协议栈及网络配置,包括IP地址、路由表、网络设备、iptables规则等。docker便是基于netns实现的网络隔离。
大多数现代Linux发行版默认支持这一特性,主要是内核netns相关配置(如CONFIG_NET_NS
)需要打开。
基本操作
创建网络命名空间及设备
创建网络命名空间demo
:
#创建
sudo ip netns add demo
#查看
sudo ip netns list
demo
添加两个端对端的虚拟网络设备(veth peer):veth1
、veth2
sudo ip link add veth1 type veth peer name veth2
veth2
留在本机,veth1
添加到命名空间demo
将虚拟网络一端(veth1
)添加到命名空间
sudo ip link set veth1 netns demo
配置本机veth2
虚拟设备
给本机veth2
配置IP,并启用
#配置IP
sudo ip addr add 172.17.0.1/24 dev veth2
#启用
sudo ip link set dev veth2 up
#查看网络
ifconfig -v veth2
配置网络命名空间veth1
设备
给网络命名空间虚拟设备(veth1
)配置IP,并启用:
#配置IP
sudo ip netns exec demo ip addr add 172.17.0.2/24 dev veth1
#启用veth1
sudo ip netns exec demo ip link set dev veth1 up
#启用回环lo
sudo ip netns exec demo ip link set dev lo up
#查看网络
sudo ip netns exec demo ifconfig
互ping测试
本机中:
ping 172.17.0.1 ping 172.17.0.2
在
demo
空间中:sudo ip netns exec demo ping 172.17.0.1 sudo ip netns exec demo ping 172.17.0.2
删除网络命名空间
sudo ip netns delete demo
其他相关命令
ip netns
帮助信息:xdd@yyy:~$ ip netns help Usage: ip netns list ip netns add NAME ip netns attach NAME PID ip netns set NAME NETNSID ip [-all] netns delete [NAME] ip netns identify [PID] ip netns pids NAME ip [-all] netns exec [NAME] cmd ... ip netns monitor ip netns list-id [target-nsid POSITIVE-INT] [nsid POSITIVE-INT] NETNSID := auto | POSITIVE-INT
进入网络命名空间demo
sudo ip netns exec demo bash
网络命名空间访问外网
在这些隔离的网络命名空间中,默认情况下是不能直接访问外网的,需要在前面操作的基础上做些配置才能实现。
设置路由,配置 NAT(网络地址转换)
#添加路由
sudo ip netns exec demo route add default gw 172.17.0.2
#查看路由
sudo ip netns exec demo route
#启用IP转发
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
#设置iptables规则以进行NAT,这里eth0是主机上连接到外网的接口
sudo iptables -t nat -A POSTROUTING -s 172.17.0.2/24 -o eth0 -j MASQUERADE
验证:demo
空间ping外网
sudo ip netns exec demo ping 114.114.114.114
创建DNS解析
- 通过resolv.conf文件: 在网络命名空间中创建或修改
/etc/resolv.conf
文件,添加DNS服务器地址。sudo ip netns exec demo sh -c 'echo "nameserver 114.114.114.114" > /etc/resolv.conf'
- 通过
systemd-resolved
(如果使用systemd): 如果你的系统使用systemd-resolved
,你可以通过它来管理DNS设置。首先,确保systemd-resolved
服务在主机上运行,然后创建网络命名空间的链接。sudo mkdir -p /etc/netns/demo sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/netns/demo/resolv.conf
- 通过环境变量: 在网络命名空间中运行的程序可以通过设置环境变量LD_PRELOAD来覆盖默认的DNS解析行为。
sudo ip netns exec demo LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libnss_dns.so.2 getent hosts example.com
验证:
sudo ip netns exec demo nslookup baidu.com
#或使用ping
sudo ip netns exec demo ping baidu.com
注意:具体的配置步骤可能会根据您的网络环境和需求有所不同。比如防火墙,网络配置等
参考
互联网及chatglm等AI工具
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 DD'Notes!
评论