|
本帖最后由 ltycomputer 于 2020-3-9 15:38 编辑
Linux namespace是内核级虚拟化机制,其中网络namespace可以创建多个具有独立IP、路由表、iptables的命名空间。
你可以创建一个namespace,给它配置好局域网IP(如192.168.1.2),在这个namespace内运行的程序产生的流量源IP就是192.168.1.2,就像局域网里真的有一台电脑在运行这个程序一样。
举几个例子,看看它能给Openwrt固件带来什么:
一、增强QoS效果
首先创建3个namespace——ns2、ns3、ns4,分别配置IP为192.168.2/3/4,分别在里面运行袋里服务。
再将QoS流控规则按照三个源IP分别设定不同的优先级/限速规则。
对于下载软件/浏览器,只要将袋里设置为这几个ns上的袋里地址,就可以保证这个软件产生的全部流量都被QoS规则识别,告别L7协议识别慢和L2规则匹配难的问题。
二、对路由器上运行的软件进行QoS
路由本身上运行的软件直接从wan口通讯,不受QoS规则控制。
如果在一个IP为192.168.1.2的namespace里运行transmission,就可以用路由本身的QoS功能对其进行灵活限速
三、针对不同程序,指定不同宽带出口和不同负载均衡策略
创建namespace和袋里同上,将不同源IP在mwan3上设置不同的出口策略,不同软件设置不同袋里,即可做到不同软件不同出口策略。(例如下载软件走不同的宽带)
三、更灵活的透明袋里(iptables REDIRECT/Tproxy)
以往的教程都是直接在网关(或旁路由)上添加iptables规则,一台硬件只能转发到一个出口,调整iptables规则也比较麻烦。
可以创建多个namespace,分别分配多个IP地址,每个namespace内添加iptables规则。
局域网设备指定一个ns的IP做网关是走一个出口,另一个IP做网关是另一个出口。
四、路由器NAT性能测试
创建多个namespace,就像添加多张虚拟网卡一样,可以在几个namespace里配置好NAT环境(iperf3客户端-iptables NAT-iperf3服务端)
可以摆脱网口影响,测量路由器纯CPU转发能力。
让Openwrt固件支持network namespace需要进行以下操作:
make menuconfig
Global build settings --->
Kernel build options --->
Enable kernel namespaces
Network namespace
为了创建namespace所需的虚拟网卡(veth),需要安装kmod-veth
make menuconfig
Kernel modules
Network Support
kmod-veth
创建一个名称为NAME的namespace并连接到Openwrt lan的操作如下
ip netns add NAME #创建一个名为NAME的netns
ip netns exec NAME ip link set dev lo up #为NAME启用loopbak(127.0.0.1)
ip link add vetha type veth peer name vethb #创建一对虚拟网卡,一端名为vetha,另一端名为vethb(可自定义)
ip link set vethb netns NAME #将vethb接到NAME这个netns里
ip link set vetha up #启动vetha
ip link set dev vetha master br-lan #将vetha接入到Openwrt的LAN口(br-lan)
ip netns exec NAME ip addr add 192.168.1.2/24 dev vethb #在netns里设置IP配置
ip netns exec NAME ip link set vethb up #启动vethb
ip netns exec NAME ip route add default via 192.168.1.1 dev vethb #添加netns里的默认路由
mkdir -p /etc/netns/NAME
echo "nameserver 192.168.1.1" >/etc/netns/NAME/resolv.conf #设置netns里的默认DNS服务器地址
创建完毕以后,使用 "ip netns exec NAME 命令" 即可在NAME这个namespace里执行命令
例如:
ip netns exec NAME ping 192.168.1.1 相当于一台IP 192.168.1.2的 "主机" ping了192.168.1.1,反之192.168.1.1也能ping通192.168.1.2
ip netns exec NAME sysctl -w net.ipv4.ip_forward=1 此时192.168.1.2就开启转发,其他设备将网关设置为192.168.1.2,数据就经过192.168.1.2-192.168.1.1-wan流通了
删除虚拟网卡对的命令为ip link delete vetha,删除虚拟网卡的一端,另一端也会消失
删除namespace的命令为ip netns del NAME
network namespace只占用几十KB的内存,不占用CPU,却拥有完整的Linux网络栈
在AR9344这样的低配路由器上创建十几个netns,不执行命令的话没有任何明显的资源占用 |
评分
-
查看全部评分
|