文章目录
- 1.局域网:CSMA/CD
- 2.互联网:ARP,DHCP,NAT
- 3.TCP协议:telnet,tcpdump,syn/accept队列
- 4.HTTPS协议:摘要(sha、md5、crc)。win对文件MD5校验:certutil -hashfile a.tar.gz MD5。linux:md5sum a.tar.gz
- 5.linux的route指令:route add
- 5.1 案例:从ubuntu机器ping 199.199.199.199,配置路由使能通
- 6.防火墙iptables:(ip+tables)对网络上数据包通过表的形式进行规则的修改
- 6.1 filter表:3个链
- 6.2 nat表:4个链
- 7.BMC虚拟多网口:macvlan是kernel提供的一种网卡虚拟化技术,可将网卡(不一定是真实的物理网卡)虚拟出多个接口,这网卡称为master或父接口,这些虚拟接口和外面环境通信都是通过父接口
- 7.1 bridge:ip netns add ns001 / ns002
- 7.2 private:FbOpenbmc和OcpOpenBMC和X86的Ubuntu上验证过, Kernel版本均5.0+
- 编译Kernel:BMC/CPU OS的Linux Kernel Config里面加CONFIG_MACVLAN=m/y
- 创建/启动网卡/获取DHCP地址:创建网卡以eth0为目标物理网口,虚拟网口的MAC地址自定义,mode可以选择private不能互通,bridge内部互通等
- 配置路由表:由于5个网口都被分配在一个网段如10.75.159.0/24(掩码一样),导致linux内部路由会以高优先级的网口如eth0来响应外部的arp/icmp/tcp等各种网络请求(如ping 10.75.159.x都走eth0网卡)。为了达到5个虚拟网口能在同网段以5个独立网口的形式工作需配置路由表
- 远端服务器检查:ping 10.75.159.117/120/121/125/132
- 案例:iproute2,设置路由重启后不丢失/etc/network/interfaces:up route add -host 10.1.1.2 dev eth1
- 7.3 creat_macvlan.sh:macvlan文件夹里file文件夹里有.sh和.service,file文件夹同级有.bb文件
1.局域网:CSMA/CD
1.
早期通过双绞线(只能有一台设备进行数据发送)
,通过10100…高低电平就能表示数据信号。标识:1–>3,3需要表明自己身份是3。
2.
通过集线器广播
给所有设备,2345自己分辨是我的消费了,不是我的数据包丢弃。如果1,2同时广播,4收到2个消息混合解析不出,导致1,2这两个数据包全没法用。针对上面问题提出CSMA/CD
协议:发送前进行载波侦听,检测这链路上有没有其他人正在发送数据,没有的话再进行数据发送防冲突。
hub集线器缺点:1.进行数据的广播
会导致带宽利用率较低。2.在链路上同时只能有一个
设备发送数据,链路利用率低。3.没有标识
,只是广播出去,让设备自己判断是不是自己的,工作效率低。
3.
如下机器1想发到机器3,通过SW寻址到3号口。SW记录了地址
(mac地址)和端口
(此处端口不是电脑端口而是交换机端口)的映射关系不用广播
(集线器),SW用的是网线,里面有8根线,正常情况至少4根线是在工作的,所以实现全双工。
买来交换机里是张空表,怎么建立映射关系?如下机器A插上来后要向B发送数据,发现是空表
,确定A是1号口,B找不到就往每个端口发,4号口对B做出了回应,表记录B对应4号口。桥接
(如没有映射关系,C和D都对应5,5口转到另一个SW,量大之后不断桥接引起消息洪泛)实现几千条存储,几千条不够至少几十亿。如下mac和端口的映射表
不是路由表,局域网
(家庭网,校园网等)使用交换机效率高。
win下ipconfig /all查看无线或有线网的mac地址。
2.互联网:ARP,DHCP,NAT
SW交换机的映射表
只能实现几千存储,如果表中记录满了,新的来会把旧的替代,所以跨网用路由器(也称网关)
。如下家庭网是整个网络2,每台机器都有自己的路由表如ubuntu
有路由表,路由器也是linux系统也有路由表。
本台电脑的路由表会写默认网关是192.168.0.1(这个点在路由器上)
,本台电脑就会把数据包发到路由器上,这个路由器自己也有路由表
路由到1.52这个网卡,1.52和1.254和1.1
在同一个网段下很容易找到。路由器的路由表
比SW交换机的映射表
复杂用到了很多路由算法。
ping 192.168.1.254
可通,那么网络内传输如1.52—>1.254即网络内怎么传数据的呢?同一网段一找就找到这样的说法是错的,若是这样为什么有了IP地址还要mac地址呢?ip地址(抽象地址)
不能直接通信,只能用mac地址(真实地址)
通信,ARP
协议广播询问谁的ip是1.254,1.254收到这询问就会回复一下,说我的地址是1.254,我的mac地址
是。。。1.52知道了1.254对应的mac地址就会在mac层进行传输。
ip的数据包
就是mac的数据部分,越往上层(往里)
ip层包着还有tcp层,ip数据包里数据部分还会有tcp的头,再往上层(往里)
还可能有http的头,最后的数据才是我们要传的数据。
获取mac地址都是通过ARP协议(cat /proc/net/arp)
,如下ip的源目地址是不变的,一直为0.102和1.254,只有mac地址一直在切换(竖着对比)。有个特例NAT(网络地址转换协议)
:源地址ip也会进行切换。
如下手动修改eeprom中mac,和eth无关。
# config_mac
. /usr/local/bin/openbmc-utils.sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
prog=$(basename "$0")
usage()
{
echo "Usage: $prog <mac>"
echo
echo "Examples:"
echo " $prog XX:XX:XX:XX:XX:XX"
echo
exit 1
}
check_parameter()
{
mac=$1
strlen=${#mac}
if [ $# -ne 1 ] ;then
usage
fi
if [ "$strlen" -ne 17 ] ;then
usage
fi
}
set_mac()
{
mac=$(echo "$mac" | sed 's/://g'| tr '[:a-z:]' '[:A-Z:]')
/usr/local/bin/fruid-util base --dump /tmp/base_fru.bin
/usr/local/bin/fruid-util base --modify --PCD2 "$mac" /tmp/base_fru.bin > /dev/null 2>&1
set_mac_eeprom_wp
/usr/local/bin/fruid-util base --write /tmp/base_fru.bin > /dev/null 2>&1
reset_mac_eeprom_wp
}
check_mac(){
fru_mac=$(/usr/local/bin/fruid-util base |grep "Product Custom Data 2" | awk -F ': ' '{print $2}')
if [ "$mac" != "$fru_mac" ] ;then
echo "Set mac fail"
fi
}
check_parameter "$@"
set_mac
check_mac
root@bmc:~# fruid-util base
Product Custom Data 2 : 78D4F15F171D
root@bmc:~# ./config_mac 78:D4:F1:5F:17:1a
root@bmc:~# fruid-util base
Product Custom Data 2 : 78D4F15F171A
如下上电启动,从eeprom读出mac并写进eth。
# /recipes-plats/network/files/eth1_mac_fixup.sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
count=0
while [ $count -lt 3 ]
do
str=$(fruid-util cmm | grep "BMC Base Mac address" | awk -F ":" '{print $2}')
str=$(echo $str |sed 's/ //g')
if [ ${#str} -ne 12 ];then # 获取字符串长度
logger "Loop $count failed to read BMC FRU:$str"
count=$(($count + 1))
sleep 1
continue
fi
mac="${str:0:2}:${str:2:2}:${str:4:2}:${str:6:2}:${str:8:2}:${str:10:2}" #中间有冒号
if [ -n "$mac" -a "${mac/X/}" = "${mac}" ]; then # mac有值返回true,不用管X
logger "Loop $count success to configure BMC MAC: $mac"
#ip link set dev eth1 address "$mac"
#在/etc/rc.d/rc.local里加上如下三句,reboot后就不怕MAC复原了
/sbin/ifdown eth1
/sbin/ifconfig eth1 hw ether $mac # modprobe -r e1000 , modprobe e1000 , ethtool -i eth0
/sbin/ifup eth1 # ifconfig eth0 up , dhclient eth0
sleep 1
exit 0
fi
count=$(($count + 1))
sleep 1
done
if [ $count -ge 3 ]; then
echo "Cannot find out the BMC MAC" 1>&2
logger "Error: cannot configure the BMC MAC"
exit -1
fi
vi /etc/sysconfig/network-scripts/ifcfg-eth0 。MACADDR=00:11:22:33:44:55 。改好执行/etc/init.d/network stop ,/etc/init.d/network start。ifconfig eth0 down ,dhclient eth0,ifconfig eth0 up。
# vi /etc/network/interfaces 重启ip不丢失,改完后systemctl restart network
auto lo
iface lo inet loopback
auto eth1
iface eth1 inet static
address 10.75.159.201
netmask 255.255.255.0
gateway 10.75.159.1
如下TCP/IP架构:以太网协议mac
:把cpu想要发送的数据封装为以太网协议(网卡完成这功能)。ip协议
:实现路径的管理,传输过程中根据想要发送的目标地址,帮我们的报文在网络中选择一条传输路径(路由器完成这功能)。ip协议针对目标是机器与机器之间通信,平时利用网络过程中需要进程与进程的通信,所以传输层(tcp/udp协议)
这层封装有必要。
udp
:实验室内部交流终端,发信息时效性要高
如语音、视频、直播等,丢个一帧两帧影响不大,数据是不停的过来,在ip协议基础上增加了很少一部分功能同时它不是面向连接
的,不需要对方给我一个反馈,减少了传输的成本,相对来说时延也小得多。
tcp
:传一些重要内容
,如发一个公告或给谁发一个文件,这个过程对时效性没那么强,传文件稍微等一会也没事但要求传输的准确不能出错,TCP复杂面向连接
。
如下拆包和粘包,Client和Server间的Packet1被拆包,与Packet2粘包:
如下解决粘包拆包:头/定长/分隔符。
如下是第一种方法,粘包还是会出现,但可以区分开。
如下是第三种方法,自定义分隔符。
交换机 ,二层交换机 ,多接口网桥
是一个东西。路由器 ,三层交换机 ,网关
是一个东西。
从一个HTTP请求来看网络分层原理:内网
里通过网线
进行传输,连接到公网
的话会通过光纤
进行连接。要实现不同介质间信号的转换,还有从光纤到路由器无线脉冲转换
,距离远的话还有信号衰减
问题。如下把问题分层,不同层间定义标准化接口让它们间可进行数据通信。
1.
如下右边一个服务器部署了一个静态页面,通过nginx部署在公网上,看下浏览器里有没有域名对应DNS的缓存
,有的话直接拿到服务端的ip地址,没有的话去浏览器本地的host文件
看有没有配置,没有配置的话才会发起一个DNS请求
用来获取服务器ip地址。
2.
DNS也是台服务器也有自己的ip地址通常配在自己的操作系统上,这时应用层会构造一个DNS请求报文:应用层
会去调用传输层socket的API。传输层
会在DNS请求报文基础上加一个UDP的请求头。网络层
同样在UDP请求报文基础上加IP的请求头,网络层会将IP请求报文交给数据链路层。数据链路层
会将自己的mac头加上去并把对应的请求报文交给下一个机器的mac地址也会加上去。下一个机器的mac地址通过网络层ARP协议找到
,ARP会发送一些请求看下你对应的ip地址的mac地址是多少,最后通过物理层物理介质传出去,通常传到路由器上。
3.
路由器是三层设备(网络/数据链路/物理)从物理层开始连接,物理层交给数据链路层,数据链路层看下地址是不是给我的,是给我的进行解析,不是给我的就丢弃,报文再传给上面一层网络层,网络层把数据传到下一个路由器的地址是多少,会通过运营商的网络接口传到运营商的路由器上
。运营商有自己的DNS服务器,如果配的是运营商自己的DNS服务器的话会直接在这个DNS服务器里找自己对应的域名拿到对应的ip地址,也就是刚请求DNS报文地址,然后原路返回解析直到应用层拿到刚域名对应得ip地址,这样就可以进行HTTP请求报文
的发送。再调用传输层协议是TCP参数,同样每到一层加头。
主机名(hostname)和域名(domain)的区别在于,主机名
通常在局域网内使用,通过hosts文件,主机名就被解析到对应ip。域名
通常在internet上使用,但如果本机不想使用internet上的域名解析,这时就可以更改hosts文件,加入自己的域名解析。
3.TCP协议:telnet,tcpdump,syn/accept队列
如下是TCP报文,Source port源端口如果是发送端的话是随机生成的,tcp三次握手之前要知道对方端口目的Dest port
,和服务器建立连接web服务一般80端口如nginx。unused保留字段,CWR到FIN是报文标识flag,标识报文什么类型的,如果把syn的bit位设为1的话,当前报文是同步序列号
即建立连接的报文,ack的bit为1代表响应报文。Receive window是当前服务器可接受数据大小窗口的值。
如下加上TCP协议头
就是五元组
,基于TCP的基础上就是四元组。如下三次握手主要做了a和b两件事。
如下服务端先进入listen状态,如nginx的话会监听某个端口(如web服务就是80端口),客户端发送请求前会创建一个数据结构
(下面黄色)用来存储要发送的端口号等,客户端报文一发出去,客户端立马进入syn-sent状态,服务端收到syn(Synchronous number,同步序列号)报文时也会在本地创建一个对应的数据结构
。
客户端可以发送很多TCP报文,每个报文都有自己的随机生成算法生成自己的序列号,所以x+1是对x这个报文的响应。建立连接会消耗非常多系统资源(create tcb…),所以不用时要关闭(四次挥手)。中间SYN和ACK可以合在一起节省流量,也可以拆分开。
下面通过实验看三次握手怎么进行的:
如下nc命令会发一个TCP三次握手请求,输入服务器地址和端口。
如下查看tcp连接状态,-t参数查看当前tcp连接状态,-p显示进程,-n数字型显示ip和端口。如下就是win系统和linux系统建立的连接。
如下是tcp四次挥手,关闭连接(客户端或服务端都可以直接关,全双工),主动方会进入time_wait状态
,没有2MSL(报文一个来回时间)
立马关闭会造成第一(服)个
问题:ACK j+1这个报文丢失,服务端没收到ACK会不断重发FIN报文,服务端资源没法释放。第二(客)个
问题:关闭连接意味着资源被释放了,那么端口号被其他进程使用,报文到来时根据tcp的四元组恰好碰到刚释放掉那个连接,造成混乱。
4.HTTPS协议:摘要(sha、md5、crc)。win对文件MD5校验:certutil -hashfile a.tar.gz MD5。linux:md5sum a.tar.gz
Hash散列算法(应用于哈希表和摘要密码学),是把任意长度的输入通过特定的算法变换成固定长度的输出,输出的值就是hash值。这个特定的算法就叫hash算法,hash算法并不是一个固定不变的算法。只要是能达到这个目的的算法都可以说hash算法
。例如MD5,SHA,String.hashcode()都是hash算法。
不同的输入可能会得出相同的hash值,那么这种现象称为hash碰撞
,无论是采用那种hash算法,hash碰撞都是不可避免的,我们只能通过改进hash算法,把出现碰撞的概率降低。hash英语中的意思是剁碎的食物,反应在计算机领域大概就是把任意数据切割打碎,输出固定长度的数据。
先解AES,再用AES解image。
HTTPS利用摘要(也叫hash散列,用于校验信息完整性,确保文件没被修改)
和加密(对称【一个密钥】和非对称【2个密钥】)
算法完成加密通道。
如下用到的公私钥都存在Server端。
5.linux的route指令:route add
如下Gateway指定网关,要访问172.17.0.3这ip,就会根据Destination和Genmask
计算出来满足docker0这一行条件。Flags是标识(不重要),U表示正在使用中,G表示第二列Gateway(不是Genmask)不为*即空)
。H表示指定具体ip(32位掩码,4个255,全掩)而不是网段
。default是指访问一个ip都不满足下面两个路由信息条件,走default这条。255.255.0.0掩了16位即172.17开头的会走第二条,255.255.255.0掩了24位。
PandoraBox.lan其实是个ip,因为在局域网下,默认配置成了域名。172.17.0.7只1跳(直接跳脸上),因为Gateway为*空且都在docker0交换机下。如下命令都是在ubuntu机器上执行,路由信息看该章节最后一张图。
下面用route add
指令添加自己的路由表:两种类型: -net x.x.x.x/xx
指定网络/网段,-host x.x.x.x
指定具体ip。两种指向:-dev
网卡名(指定通过哪个网卡),-gw
网关ip(指定通过哪个网关)。
5.1 案例:从ubuntu机器ping 199.199.199.199,配置路由使能通
先给win机器添加ip,点高级弹出如下最后一张图,填199.199.199.199,255.0.0.0,最后全点击确定。
未添加路由表时199.199.199.199不属于172.或192.两个网络,所以走了default,到了PandoraBox.lan即路由器网关,继续往上找,光猫也没发现继续往上找,传到了联通,199.199.199.199还没被用或不能被ping。
6.防火墙iptables:(ip+tables)对网络上数据包通过表的形式进行规则的修改
6.1 filter表:3个链
man iptables查看有哪些表(table)。filter(过滤器)表【不转发】
会将进入当前机器数据包进行过滤,以及从机器出去的数据包,不符合条件不给发出去。nat表【转发】
改变目的或源地址和端口。
上面的表是由链构成,进入和出去配置规则放在链中:filter表自带的三个链:FORWARD链
:和nat表相关,路由转发的作用,如下第一行-L(list)。INPUT和OUTPUT链
:默认(policy)没有一条规则即都能进来和出去。
如下在192.168.0.12本机器8081端口上启动服务。
如下本机器(192.168.0.12)收到一个包,这个包目的地址是8081且是tcp包
的话丢弃,tproxy是8081一个别称。
如下在其他机器访问0.12的8081端口。
如下删除后又能访问了。
如上是在input链上进行的防火墙的设置,如下也可以设置output链
,将发往0.144包丢弃,如下没有配置端口,所以ssh连接也断了,因为我在0.144win上ssh双向连接到0.12即如下窗口,可修改0.144win的ip地址,再进行ssh连接。
上面通过-A添加规则,先后顺序是第一条成功了按第一条来,不成功第二条,一直往下匹配,最终也没找到匹配就按照policy。想要当前规则最高优先级用-I(insert),不用-A(append),-I INPUT 5会插在第5条。
6.2 nat表:4个链
如下在0.11机器上。
如下在0.144 win机器上。
把0.12(本机)的7788端口转发到0.11的7799端口,实现反向代理。这件事分为下面两步:虽然第一条是请求
转发过去了,但是响应
(第二条)要改为本机,才能发回来。
如下是在0.12机器shell上,第一行对应上面第一条,第二行对应上面第二条。
如下是上一行命令执行结果,查看一下FOREARD有没有过滤掉。
如下重写FORWARD链为ACCEPT即在上面DOCKER-USER规则前面添加一个ACCEPT规则。
如上不是配置xx.conf的服务不需要重启,随时生效,如下两个都能访问了。
如下蓝色filter表,橙色nat表。
7.BMC虚拟多网口:macvlan是kernel提供的一种网卡虚拟化技术,可将网卡(不一定是真实的物理网卡)虚拟出多个接口,这网卡称为master或父接口,这些虚拟接口和外面环境通信都是通过父接口
7.1 bridge:ip netns add ns001 / ns002
macvlan模拟的mac不同,如下第一行和第二行创建两个以ens32为父接口
的macvlan1和macvlan2虚拟网口。
如下添加ip,不通原因是bridge模式和父接口(.138)
是不通的。
7.2 private:FbOpenbmc和OcpOpenBMC和X86的Ubuntu上验证过, Kernel版本均5.0+
编译Kernel:BMC/CPU OS的Linux Kernel Config里面加CONFIG_MACVLAN=m/y
如下在编译的服务器上编译完后,如果找不到就删除build目录重新编译。
如下在烧录的机器上烧录镜像后,vi第一行.dep文件。
如下不用insmod kernel/drivers/net/maclan.ko。
创建/启动网卡/获取DHCP地址:创建网卡以eth0为目标物理网口,虚拟网口的MAC地址自定义,mode可以选择private不能互通,bridge内部互通等
假设生成5个虚拟网口eth0.1-eth0.5命令如下,ifconfig检查5个虚拟网口的IP地址和MAC地址(都不一样):
ip link add link eth0 dev eth0.1 address D6:D2:52:A8:28:28 type macvlan mode private
ip link add link eth0 dev eth0.2 address D6:D2:52:A8:28:29 type macvlan mode private
ip link add link eth0 dev eth0.3 address D6:D2:52:A8:28:2a type macvlan mode private
ip link add link eth0 dev eth0.4 address D6:D2:52:A8:28:2b type macvlan mode private
ip link add link eth0 dev eth0.5 address D6:D2:52:A8:28:2c type macvlan mode private
ifconfig eth0.1 up
ifconfig eth0.2 up
ifconfig eth0.3 up
ifconfig eth0.4 up
ifconfig eth0.5 up
dhclient eth0.1
dhclient eth0.2
dhclient eth0.3
dhclient eth0.4
dhclient eth0.5
配置路由表:由于5个网口都被分配在一个网段如10.75.159.0/24(掩码一样),导致linux内部路由会以高优先级的网口如eth0来响应外部的arp/icmp/tcp等各种网络请求(如ping 10.75.159.x都走eth0网卡)。为了达到5个虚拟网口能在同网段以5个独立网口的形式工作需配置路由表
echo "210 eth0table" >> /etc/iproute2/rt_tables # 210越大优先级越低
echo "220 eth1table" >> /etc/iproute2/rt_tables
echo "230 eth2table" >> /etc/iproute2/rt_tables
echo "240 eth3table" >> /etc/iproute2/rt_tables
echo "250 eth4table" >> /etc/iproute2/rt_tables
ip route add 10.75.159.0/24 dev eth0.1 src 10.75.159.117 table eth0table # 网段(掩码),ip
ip route add 10.75.159.0/24 dev eth0.2 src 10.75.159.120 table eth1table
ip route add 10.75.159.0/24 dev eth0.3 src 10.75.159.121 table eth2table
ip route add 10.75.159.0/24 dev eth0.4 src 10.75.159.125 table eth3table
ip route add 10.75.159.0/24 dev eth0.5 src 10.75.159.132 table eth4table
ip route add default dev eth0.1 via 10.75.159.1 table eth0table # via 网关
ip route add default dev eth0.2 via 10.75.159.1 table eth1table
ip route add default dev eth0.3 via 10.75.159.1 table eth2table
ip route add default dev eth0.4 via 10.75.159.1 table eth3table
ip route add default dev eth0.5 via 10.75.159.1 table eth4table
ip rule add from 10.75.159.117 table eth0table
ip rule add from 10.75.159.120 table eth1table
ip rule add from 10.75.159.121 table eth2table
ip rule add from 10.75.159.125 table eth3table
ip rule add from 10.75.159.132 table eth4table
远端服务器检查:ping 10.75.159.117/120/121/125/132
如下只有发起ping 117才能看到117这个ip,BMC侧IP的MAC地址与远端服务器获取的一致,符合预期。使用tcp方式测试:BMC端(服务端)iperf -s -p port,远端(客户端)iperf -c BMCIP -t 1000 -i 3 -p port。
案例:iproute2,设置路由重启后不丢失/etc/network/interfaces:up route add -host 10.1.1.2 dev eth1
hping3 -I eth0 -a 10.75.159.37 -S 10.75.159.138 -p 8080 -i u100 发起攻击,iptables限制端口,限制连接数防止攻击。
7.3 creat_macvlan.sh:macvlan文件夹里file文件夹里有.sh和.service,file文件夹同级有.bb文件
#!/bin/sh
IP_ROUTEFILE_PATH="/etc/iproute2/rt_tables"
priority_arry=(210 220 230 240)
tablename_arry=(eth0table eth1table eth2table eth3table)
#dynamic routing configuration for macvlan
dynamic_routing()
{
#Initialize basic network information
index=0
for i in $(ifconfig | grep -o ^[a-z0-9.]* | grep -v lo); do
ipaddr_array[$index]=$(ifconfig "$i" | sed -n 2p | awk '{ print $2 }' | tr -d 'addr:')
devname_array[$index]=$i
gateway_array[$index]=$(route | grep "${devname_array[$index]}" | grep 'default' | awk '{print $2}')
iprange_array[$index]="${ipaddr_array[$index]%[^0-9]*}.0/24"
index=$((index + 1))
done
#Create the table and initialize it
index=0
for i in "${tablename_arry[@]}"; do
tablename=$(cat $IP_ROUTEFILE_PATH | grep "${devname_array[$index]}" | sed -n 1p | awk -F ' ' '{print$2}')
if [ "$tablename" != "${tablename_arry[$index]}" ]; then
echo "${priority_arry[$index]} ${tablename_arry[$index]}" >> $IP_ROUTEFILE_PATH
fi
ip route flush table "${tablename_arry[$index]}"
index=$((index + 1))
done
#Configure dynamic routing for the table
index=0
for i in "${tablename_arry[@]}"; do
ip route add "${iprange_array[$index]}" dev "${devname_array[$index]}" src "${ipaddr_array[$index]}" table "${tablename_arry[$index]}"
ip route add default dev "${devname_array[$index]}" via "${gateway_array[$index]}" table "${tablename_arry[$index]}"
ip rule add from "${ipaddr_array[$index]}" table "${tablename_arry[$index]}"
index=$((index + 1))
done
}
###Creat MAC Vlan
ip link add link eth0 dev eth1 type macvlan
ip link add link eth0 dev eth2 type macvlan
ip link add link eth0 dev eth3 type macvlan
ip link set eth1 up
ip link set eth2 up
ip link set eth3 up
sleep 2
#dhclient eth0.01
#dhclient eth0.02
#dhclient eth0.03
dynamic_routing
# macvlan.service
[Unit]
Description=Mac Vlan Server
After=-xyz.openbmc_project.Network.service
[Service]
ExecStart=/usr/bin/creat_macvlan.sh
Type=oneshot
[Install]
WantedBy=multi-user.target
# macvlan.bb
SUMMARY = "Phosphor BMC Macvlan"
LICENSE = "Apache-2.0"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/files/common-licenses/Apache-2.0;md5=89aea4e17d99a7cacdbeed46a0096b10"
inherit pkgconfig
inherit obmc-phosphor-systemd
SYSTEMD_SERVICE:${PN} += "macvlan.service"
DEPENDS += "systemd"
SRC_URI += "file://macvlan.service \
file://creat_macvlan.sh \
"
do_install() {
install -d ${D}${bindir}
install -m 0755 ${WORKDIR}/creat_macvlan.sh ${D}${bindir}/creat_macvlan.sh
}
S = "${WORKDIR}"