萬兆線速ddos攻擊測試工具pktgen-dpdk
萬兆線速ddos攻擊測試工具pktgen-dpdk
簡介
dpdk是Intel發(fā)起的高速網(wǎng)絡(luò)處理工具,能夠旁路Linux在用戶空間接管CPU、內(nèi)存和網(wǎng)卡隊(duì)列,進(jìn)行高度并行的網(wǎng)絡(luò)收發(fā)包。pktgen-dpdk是Linux內(nèi)核發(fā)包工具的dpdk加強(qiáng)版,本文介紹了使用此工具如何從一臺(tái)服務(wù)器上提供超過100Gbps的DDOS發(fā)包壓力測試。
安裝
安裝過程需要設(shè)置hugepage以支持dpdk,編譯加載dpdk模塊和綁定網(wǎng)卡,編譯pktgen-dpdk,運(yùn)行pktgen-dpdk查看網(wǎng)卡cpu對(duì)應(yīng)關(guān)系以設(shè)定cpu分配關(guān)系。
為順利安裝,需要Linux系統(tǒng)18.04或以上,以及支持dpdk的網(wǎng)卡,dpdk官網(wǎng)可以查詢你的網(wǎng)卡是否支持。
內(nèi)核開啟巨頁支持
編輯內(nèi)核啟動(dòng)參數(shù),按物理內(nèi)存容量分配適當(dāng)?shù)腍ugePages容量,頁大小可以是2MB和1GB二者之一,這里設(shè)置1GB x 8。
compile dpdk per kernel update
vi?/etc/default/grub: GRUB_CMDLINE_LINUX="default_hugepagesz=1g?hugepagesz=1g?hugepages=8" ls?/boot/grub/?&&?update-grub reboot
重啟系統(tǒng)后,應(yīng)能查看到如下結(jié)果:
tail?/proc/meminfo CmaFree:???????????????0?kB HugePages_Total:???????8 HugePages_Free:????????8 HugePages_Rsvd:????????0 HugePages_Surp:????????0 Hugepagesize:????1048576?kB Hugetlb:????????67108864?kB DirectMap4k:??????305912?kB DirectMap2M:?????6938624?kB DirectMap1G:????128974848?kB
編譯dpdk
下載并解壓dpdk (以版本18.11.5為例),按如下步驟編譯。其中前2行export需要放到環(huán)境變量中以供以后運(yùn)行使用。
export?RTE_SDK=/path/to/dpdk export?RTE_TARGET=x86_64-native-linuxapp-gcc cd?${RTE_SDK} apt?install?make apt?install?make-guile apt?install?gcc apt?install?libnuma-dev make?install?T=${RTE_TARGET}??-j4 insmod?${RTE_SDK}/${RTE_TARGET}/kmod/igb_uio.ko insmod?${RTE_SDK}/${RTE_TARGET}/kmod/rte_kni.ko
為了快速綁定網(wǎng)卡到dpdk或者解綁回到Linux內(nèi)核,可以創(chuàng)建腳本dpdk_bind_ports.sh:
#!/bin/bash ports=(0?1)?#?dpdk?nic?number,?start?from?0 #?NIC's?interface?name?like?eth1/enp130s0f0/eno1 nic=(enp130s0f0?enp130s0f1) #?NIC's?PCI-ID ids=(82:00.0?82:00.1) #Linux?kenerl?NIC?driver,?like?i40e/ixgbe/tg3 drv="i40e" cd?${RTE_SDK} if?[?""?=?"-u"?];?then ??for?i?in?${ports[@]};?do ????./usertools/dpdk-devbind.py?-u?${ids[$i]} ????./usertools/dpdk-devbind.py?-b?$drv?${ids[$i]} ??done else ??insmod?./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko?2>/dev/null ??insmod?./x86_64-native-linuxapp-gcc/kmod/rte_kni.ko?2>/dev/null ??for?i?in?${ports[@]};?do ????ifconfig?${nic[$i]}?down ????./usertools/dpdk-devbind.py?-u?${ids[$i]} ????./usertools/dpdk-devbind.py?-b?igb_uio?${ids[$i]} ??done fi ./usertools/dpdk-devbind.py?--status-dev?net
執(zhí)行./dpdk_bind_ports.sh將上述所列的兩個(gè)網(wǎng)口綁定到dpdk,可以看到如下類似結(jié)果:
Network?devices?using?DPDK-compatible?driver ============================================ 0000:82:00.0?'Ethernet?Controller?X710?for?10GbE?SFP+?1572'?drv=igb_uio?unused=i40e 0000:82:00.1?'Ethernet?Controller?X710?for?10GbE?SFP+?1572'?drv=igb_uio?unused=i40e Network?devices?using?kernel?driver =================================== 0000:01:00.0?'NetXtreme?BCM5720?Gigabit?Ethernet?PCIe?165f'?if=eno1?drv=tg3?unused=igb_uio?*Active*
請(qǐng)按自己的網(wǎng)卡信息編輯上述腳本,ports為0開始的順序編號(hào),nic和ids數(shù)目應(yīng)該與其一致。
若不知道網(wǎng)卡接口名字,可以先修改驅(qū)動(dòng)名和PCI-ID正確,未知網(wǎng)卡名隨意填充,執(zhí)行./dpdk_bind_ports.sh -u恢復(fù)網(wǎng)卡到Linux 內(nèi)核接管,則輸出結(jié)果或者ifconfig -a 都可以查到網(wǎng)卡名字。最后,再次執(zhí)行./dpdk_bind_ports.sh將網(wǎng)卡綁定到dpdk。
編譯pktgen-dpdk
下載并解壓pktgen-dpdk,執(zhí)行如下步驟編譯:
cd?/path/to/pktgen-dpdk apt?install?liblua5.3-dev apt?install?libpcap-dev make?-j4
執(zhí)行 ./app/x86_64-native-linuxapp-gcc/pktgen 進(jìn)入交互式界面,輸入page config命令得到網(wǎng)卡和cpu的交互圖,以創(chuàng)建-m綁定關(guān)系。
Socket???:????0?????????1??????Port?description ??Core???0?:?[?0,20]???[?1,21]???0000:01:00.0?:?Broadcom?Inc.?and?subsidiaries?NetXtreme?BCM5720?Gigabit?Ethernet?PCIe ??Core???1?:?[?2,22]???[?3,23]???0000:01:00.1?:?Broadcom?Inc.?and?subsidiaries?NetXtreme?BCM5720?Gigabit?Ethernet?PCIe ??Core???2?:?[?4,24]???[?5,25]???0000:02:00.0?:?Broadcom?Inc.?and?subsidiaries?NetXtreme?BCM5720?Gigabit?Ethernet?PCIe ??Core???3?:?[?6,26]???[?7,27]???0000:02:00.1?:?Broadcom?Inc.?and?subsidiaries?NetXtreme?BCM5720?Gigabit?Ethernet?PCIe ??Core???4?:?[?8,28]???[?9,29]???0000:82:00.0?:?Intel?Corporation?X710?for?10GbE?SFP+?(rev?01) ??Core???5?:?[10,30]???[11,31]???0000:82:00.1?:?Intel?Corporation?X710?for?10GbE?SFP+?(rev?01) ??Core???6?:?[12,32]???[13,33] ??Core???7?:?[14,34]???[15,35] ??Core???8?:?[16,36]???[17,37] ??Core???9?:?[18,38]???[19,39]
上述信息表明有2個(gè)物理cpu 0 和1,每個(gè)cpu有10個(gè)核心,操作系統(tǒng)統(tǒng)一編號(hào)后為0~19,開啟超線程之后為0~39。
dpdk綁定的2個(gè)網(wǎng)口因?yàn)樵谝粋€(gè)網(wǎng)卡上(PCI-ID是連號(hào)的),而同一個(gè)網(wǎng)卡物理上只會(huì)連到一個(gè)物理CPU的PCI-Express Lane,所以這兩個(gè)網(wǎng)口(dpdk編號(hào)0/1)能綁定的CPU編號(hào)要么左邊一列方括號(hào)[8,28]/[10,30],要么右邊一列方括號(hào)[9,29]/[11,31] (注意方括號(hào)里逗號(hào)右邊的是超線程cpu核心編號(hào))。
Core???4?:?[?8,28]???[?9,29]???0000:82:00.0?:?Intel?Corporation?X710?for?10GbE?SFP+?(rev?01) ??Core???5?:?[10,30]???[11,31]???0000:82:00.1?:?Intel?Corporation?X710?for?10GbE?SFP+?(rev?01)
那么可以先試試能否正確加載:
./app/x86_64-native-linuxapp-gcc/pktgen?-m?8.0?-m?10.1
若報(bào)告錯(cuò)誤,類似 “port 0 on socket ID 1 has different socket ID for lcore 8 socket ID 0”,則左邊數(shù)字加1再試:
./app/x86_64-native-linuxapp-gcc/pktgen?-m?9.0?-m?10.1
總能把這對(duì)網(wǎng)口配到正確的物理cpu上:
Copyright?(c)?<2010-2019>,?Intel?Corporation.?All?rights?reserved.?Powered?by?DPDK EAL:?Detected?40?lcore(s) EAL:?Detected?2?NUMA?nodes EAL:?Multi-process?socket?/var/run/dpdk/rte/mp_socket EAL:?Probing?VFIO?support... EAL:?PCI?device?0000:82:00.0?on?NUMA?socket?1 EAL:???probe?driver:?8086:1572?net_i40e EAL:?PCI?device?0000:82:00.1?on?NUMA?socket?1 EAL:???probe?driver:?8086:1572?net_i40e Lua?5.3.3??Copyright?(C)?1994-2016?Lua.org,?PUC-Rio ***?Copyright?(c)?<2010-2019>,?Intel?Corporation.?All?rights?reserved. ***?Pktgen?created?by:?Keith?Wiles?--?>>>?Powered?by?DPDK?<<< ?Port:?Name?????????IfIndex?Alias????????NUMA??PCI ????0:?net_i40e????????0???????????????????1???8086:1572/82:00.0 ????1:?net_i40e????????0???????????????????1???8086:1572/82:00.1
測試
最終,創(chuàng)建test.cfg并進(jìn)入攻擊交互式界面:
#./app/x86_64-native-linuxapp-gcc/pktgen -- -l ./pktgen.log -PGNT -m 9.0 -m 11.1 -f test.cfg
運(yùn)行 start 0開始第一個(gè)網(wǎng)口,stop 0停止第一個(gè)網(wǎng)口,第二個(gè)網(wǎng)口類似;
運(yùn)行 start all開始所有網(wǎng)口,stop all停止所有網(wǎng)口;
運(yùn)行page help可以看到可用命令,主要有page stats, page xstats, page rate, quit
test.cfg為交互式命令的集合版本,可以參考官方文檔生成各種協(xié)議的包和指定發(fā)包策略。
這里簡單列舉一個(gè)0網(wǎng)口全速發(fā)udp? 64字節(jié)小包的例子:
clear?0?stats reset?0 enable?screen enable?0?range disable?0?vlan set?0?size?64 set?0?rate?100 set?0?burst?64 set?0?type?ipv4 set?0?proto?udp set?0?dst?ip?192.168.0.1/24 set?0?src?ip?172.0.0.1/16 set?0?sport?12325 set?0?dport?12325 set?0?dst?mac?20:04:0f:34:aa:3d set?0?src?mac?f8:f2:1e:1a:d6:00 range?0?proto?udp range?0?src?port?10000?10000?60000?1 range?0?dst?port?10000?10000?60000?1 set?0?src?ip?172.0.0.1/16 range?0?src?ip?start?172.0.0.1 range?0?src?ip?min?172.0.0.1 range?0?src?ip?max?172.0.255.254 range?0?src?ip?inc?0.0.0.1 set?0?dst?ip?192.168.0.1 range?0?dst?ip?start?192.168.0.1 range?0?dst?ip?min?192.168.0.1 range?0?dst?ip?max?192.168.0.1 range?0?dst?ip?inc?0.0.0.0 disable?0?process disable?0?bonding disable?0?mac_from_arp start?0?arp?request range?0?dst?mac?start?20:04:0f:34:aa:3d range?0?dst?mac?min?20:04:0f:34:aa:3d range?0?dst?mac?max?20:04:0f:34:aa:3d range?0?src?mac?start?f8:f2:1e:1a:d6:00 range?0?src?mac?min?f8:f2:1e:1a:d6:00 range?0?src?mac?max?f8:f2:1e:1a:d6:00
也可以用bash腳本gencfg一次性生成多個(gè)port的配置:
#!/bin/bash ports="0?1" smacs=("f8:f2:1e:1a:d6:00"?"f8:f2:1e:1a:d6:02") dmacs=("20:04:0f:34:aa:3d"?"20:04:0f:34:aa:3d") dips=("192.168.0.1"?"192.168.0.1") set_nic(){ i=$1 smac=$2 dmac=${3:-"20:04:0f:34:aa:3d"} dip=${4:-"192.168.0.1"} cat?< 最后執(zhí)行: ./gencfg > test.cfg 這個(gè)配置實(shí)測過,可以從一臺(tái)Dell R620 (2 * E5-2660 v2 / 64GB Mem / 8個(gè)10G Intel網(wǎng)口)服務(wù)器 ,輕松打滿8x10Gbps的udp小包,發(fā)包總速率達(dá)到8x15=120Mpps??紤]到CPU 隊(duì)列并未用完,如果有更多的網(wǎng)卡,超過100Gbps沒有懸念。 DDos高防 DDOS 壓力測試
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。