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):veth1veth2

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