恩山无线论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 257|回复: 0

Network Namespace给Openwrt固件带来更多可能

[复制链接]
发表于 2020-3-9 15:34 | 显示全部楼层 |阅读模式
本帖最后由 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,不执行命令的话没有任何明显的资源占用

评分

参与人数 1恩山币 +1 收起 理由
easyteacher + 1 感谢你的分享,无论怎样,你都是最无私的人!来,说说,你E盘上还有啥一起给我吧!

查看全部评分

我的恩山、我的无线 The best wifi forum is right here.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )|网站地图

GMT+8, 2021-1-27 09:03

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表