同台機器的網路孔對接,執行 iperf 程式

要在同台機器上,對接網路孔,並同時執行 iperf 的 server 端 及 client 端程式,是蠻複雜的做法,好在已經有高手做出,在此來理解此做法。

 

 

設定以 loopback 方式執行 iperf

利用 ifconfig 指令確認可以認到網路介面(eno1, eno2)後,接下來就是設定 loopback 介面,把 eno1 及 eno2 以網路線對接之後,使 eno1 與 eno2 對打封包。

第一步驟,對 interface 設定 IP address:
# ifconfig eno1 10.50.0.1/24
ifconfig eno2 10.50.1.1/24

第二步驟,設定 NAT(Network Address Translation) 規則:
// 2-1,當 source IP 為 10.50.0.1 且 destination IP 為 10.60.1.1,則把 source IP 改為 10.60.0.1 (時間點:封包快送出去時)
# iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1

// 2-2,當 destination IP 為 10.60.0.1,則把 destination IP 改為 10.50.0.1 (時間點:一收到封包時)
# iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1

// 2-3,當 source IP 為 10.50.1.1 且 destination IP 為 10.60.0.1,則把 source IP 改為 10.60.1.1 (時間點:封包快送出去時)
# iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1

// 2-4,當 destination IP 為 10.60.1.1,則把 destination IP 改為 10.50.1.1 (時間點:一收到封包時)
# iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1

第三步驟,設定 Routing table 及 ARP(Address Resolution Protocol) 規則:
// 3-1,在 eno1 介面,新增 routing 規則: IP 為 10.60.1.1
# ip route add 10.60.1.1 dev eno1
// 在 ARP Table 新增規則: IP Address: 10.60.1.1 對應到 MAC Address: 00:00:00:00:01:01
# arp -i eno1 -s 10.60.1.1 00:00:00:00:01:01 # eno2's mac address

// 3-2,在 eno2 介面,新增 routing 規則: IP 為 10.60.0.1, MAC 為 00:00:00:00:01:00
ip route add 10.60.0.1 dev eno2
// 在 ARP Table 新增規則: IP Address: 10.60.0.1 對應到 MAC Address: 00:00:00:00:01:00
# arp -i eno2 -s 10.60.0.1 00:00:00:00:01:00 # eno1's mac address

 

規則設定完成後,再分別執行 iper3 的 server 及 client 端程式即可:
// server 端 ip 為 10.50.0.1
# iperf3 -B 10.50.0.1 -s -p 8080

// client 端 ip 為 10.50.1.1,與 10.60.0.1 連線
# iperf3 -B 10.50.1.1 -c 10.60.0.1 -t 60 -i 10 -p 8080

 

 

封包流程圖
loopback_packet_flow.jpg

Client 端會先送出封包給 Server 端,此時的封包是:
src: 10.50.1.1
dst: 10.60.0.1

根據 2-3 的規則,在封包即將送出時,修改 src IP 為 10.60.1.1:
src: 10.60.1.1
dst: 10.60.0.1

根據 3-2 的規則,dst 為 10.60.0.1 的封包由 eno2 傳送,並設定 dst MAC 為 00:00:00:00:01:00:
src: 10.60.1.1
dst: 10.60.0.1, 00:00:00:00:01:00

eno1 收到封包後(因為符合 MAC address),根據 2-2 的規則,馬上修改 dst IP 為 10.50.0.1,所以上層應用程式可以順利收到封包。
src: 10.60.1.1
dst: 10.50.0.1

 

同樣的 Server 端要回覆封包給 Client 端,把該封包的 src address 作為 dst address,所以此時的封包是:
src: 10.50.0.1
dst: 10.60.1.1

根據 2-1 的規則,在封包即將送出時,修改 src IP 為 10.60.0.1:
src: 10.60.0.1
dst: 10.60.1.1

根據 3-1 的規則,dst 為 10.60.1.1 的封包由 eno1 傳送,並設定 dst MAC 為 00:00:00:00:01:01:
src: 10.60.0.1
dst: 10.60.1.1, 00:00:00:00:01:01

eno1 收到封包後(因為符合 MAC address),根據 2-4 的規則,馬上修改 dst IP 為 10.50.1.1,所以上層應用程式可以順利收到封包。
src: 10.60.0.1
dst: 10.50.1.1

 

 

Script file

#!/bin/bash

intf1_name="eno1"
intf1_mac="00:00:00:00:01:00"

intf1_ip="10.50.0.1"
intf1_nat_ip="10.60.0.1"
intf1_netmask="24"


intf2_name="eno2"
intf2_mac="00:00:00:00:01:01"

intf2_ip="10.50.1.1"
intf2_nat_ip="10.60.1.1"
intf2_netmask="24"



ifconfig ${intf1_name} ${intf1_ip}/${intf1_netmask}
ifconfig ${intf2_name} ${intf2_ip}/${intf2_netmask}


# nat: Change source IP from ${intf1_ip} to ${intf1_nat_ip}, if destination IP is ${intf2_nat_ip}
iptables -t nat -A POSTROUTING -s ${intf1_ip} -d ${intf2_nat_ip} -j SNAT --to-source ${intf1_nat_ip}
# nat inbound ${intf1_nat_ip} -> ${intf1_ip}
iptables -t nat -A PREROUTING -d ${intf1_nat_ip} -j DNAT --to-destination ${intf1_ip}

# nat: Change source IP from ${intf2_ip} to ${intf2_nat_ip}, if destination IP is ${intf1_nat_ip}
iptables -t nat -A POSTROUTING -s ${intf2_ip} -d ${intf1_nat_ip} -j SNAT --to-source ${intf2_nat_ip}
# nat inbound ${intf2_nat_ip} -> ${intf2_ip}
iptables -t nat -A PREROUTING -d ${intf2_nat_ip} -j DNAT --to-destination ${intf2_ip}


ip route add ${intf2_nat_ip} dev ${intf1_name}
arp -i ${intf1_name} -s ${intf2_nat_ip} ${intf2_mac} # ${intf2_name}'s mac address
ip route add ${intf1_nat_ip} dev ${intf2_name}
arp -i ${intf2_name} -s ${intf1_nat_ip} ${intf1_mac} # ${intf1_name}'s mac address

 

 

 

Reference

用同一臺PC的兩個網口實現Iperf的server端和client端

 

文字內容 或 影像內容 部份參考、引用自網路,如有侵權,請告知。

 

arrow
arrow
    全站熱搜

    silverwind1982 發表在 痞客邦 留言(0) 人氣()