双网卡网线连接自环测试方法
背景:
如图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
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
iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1
查看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