River008

 

双网卡网线连接自环测试方法

背景:

如图PC上有两个网卡,eth0和eth1,以网线互联,如有想要在PC上运行iperf3既作为server端又作为client端,进行性能测试(需要报文外发走网线),有什么办法呢?通常情况下,由于路由是一套,通常情况下报文没有办法出接口。

eth0
eth1
+++++++++++++++ + + + eth0--------+ + PC + | + eth1--------+ + + +++++++++++++++

参考链接3的方法可以达到目的,主要借助了iptable的SNAT和DNAT(参考2),运行的命令如下, 

ifconfig eth0 10.50.0.1 netmask 255.255.255.0
ifconfig eth1 10.50.1.1 netmask 255.255.255.0
iptables -t nat -L
iptables
-t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1 iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1
iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1 iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1 ip route add 10.60.1.1 dev eth0 arp -i eth0 -s 10.60.1.1 00:22:45:f1:18:53 # eth1's mac address ip route add 10.60.0.1 dev eth1 arp -i eth1 -s 10.60.0.1 02:22:23:f1:18:52 # eth0's mac address
#上述命令运行完毕后,如下运行iperf3 server端和client端,tcpdump可以在接口上抓到报文。
# server
iperf3 -B 10.50.0.1 -s -u -w 256k -l 1KB &
# client
iperf3 -B 10.50.1.1 -c 10.60.0.1 -u -b 600M -w 256k -l 1KB -P 10 -t 60

是如何做到的呢?详细过程如下

原始报文 10.50.1.1 -----> 10.60.0.1
匹配上如下命令设置的规则在POSTROUTING路由后进行源NAT替换,报文修改为10.60.1.1 -----> 10.60.0.1,由于目的地址是一个
iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1
 10.60.1.1 -----> 10.60.0.1报文匹配上如下命令设置的路由规则,可以确保报文从eth1接口发出到eth0
ip route add 10.60.0.1 dev eth1
eth0收到报文后,网卡需要查看报文的目的MAC是否为本接口eth0的,否则网卡直接丢包,所以需要如下arp表确保eth1发出去10.60.1.1 -----> 10.60.0.1的时候目的MAC为eth0的MAC
arp -i eth1 -s 10.60.0.1 02:22:23:f1:18:52 # eth0's mac address
eth0收到报文后,进入协议栈,匹配上如下配置对于的规则,进行DNAT替换目的地址,
iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1
此后报文修改为10.60.1.1 -----> 10.50.0.1,目的地址修改为了eth0的ip,被iperf3 server监听的就是10.50.0.1,报文收上来了
iperf3 server程序收上来后,将报文发回client端,报文为10.50.0.1---->10.60.1.1匹配如下路由规则进行DNAT
iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1
此时报文修改为10.60.0.1---->10.60.1.1,匹配如下路由
ip route add 10.60.1.1 dev eth0
  报文可以从eth0接口发出去到eth1了,IP为10.60.0.1---->10.60.1.1,eth1收到后,目的MAC检查可以通过(参考上述过程),然后匹配如下规则进行DNAT
iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1
 此后报文修改为10.60.0.1---->10.50.1.1, 10.50.1.1正是iperf3 client端使用的地址,iperf3 clent端程序正常收上报文来。完成一次交互
 

 

查看CPU占有率

sar -P 3 -u 1 5 查看CPU3的占有率,一秒采样一次,共采集五次

BTW:

DPDK testpmd使用相同的拓扑如何环回收包呢?主要是--port-topology=loop参数

dpdk-hugepages.py -p 1G --setup 2G

dpdk-devbind   绑定网卡

./app/dpdk-testpmd -l 2,3,4 -n 4 -- -i --total-num-mbufs 2048 --port-topology=loop

testpmd>start tx_first

 

参考:

 

1. https://www.embeddedsystemtesting.com/2015/03/how-to-run-iperf-traffic-on-same.html

2. https://www.cnblogs.com/whych/p/9147900.html

3. https://gist.github.com/pkorpine/dda468d25416b7553cc589423c910f2e

4. https://stackoverflow.com/questions/67957228/how-to-set-a-loop-forwarding-using-one-nic-to-tx-packets-and-rx-them-itself-in-d

 

posted on 2023-01-18 20:43  River008  阅读(1333)  评论(0编辑  收藏  举报

导航