Sebuah program yang melekat pada kait XDP kernel Linux melalui (e)BPF untuk pemrosesan paket cepat dan melakukan penerusan lapisan dasar 3/4. Program ini melakukan pemetaan port sumber yang mirip dengan IPTables dan NFTables untuk menangani koneksi. Koneksi yang ada diprioritaskan berdasarkan paket koneksi per nanodetik. Ini berarti jika port habis, koneksi dengan paket per nanodetik paling sedikit akan diganti. Saya yakin ini yang terbaik karena koneksi dengan paket per nanodetik yang lebih tinggi akan lebih sensitif.
Selain itu, jika konfigurasi jaringan host atau kartu antarmuka jaringan (NIC) tidak mendukung hook XDP DRV (asli AKA; terjadi sebelum pembuatan SKB), program akan mencoba untuk melampirkan ke hook XDP SKB (generik AKA; terjadi setelah SKB pembuatan yang merupakan tempat IPTables dan NFTables diproses melalui modul kernel netfilter
). Anda dapat menggunakan override melalui baris perintah untuk memaksa mode SKB atau offload.
Oleh karena itu, alasan konfigurasi jaringan host tidak mendukung hook DRV XDP mungkin adalah sebagai berikut.
Saya harap proyek ini membantu para insinyur/pemrogram jaringan yang tertarik untuk memanfaatkan XDP atau siapa pun yang tertarik untuk mendalami bidang tersebut! Router/penerusan paket berperforma tinggi dan mitigasi/pencegahan (D)DoS adalah bagian penting dari Keamanan Cyber dan memahami konsep jaringan dan aliran paket pada tingkat rendah-menengah tentu akan membantu mereka yang mengejar karir di bidang tersebut?
PERINGATAN - Masih banyak hal yang perlu dilakukan pada proyek ini dan saat ini, proyek ini hanya mendukung IPv4. Dukungan IPv6 akan ditambahkan sebelum rilis resmi. Saat ini, program ini mungkin mengandung bug dan fitur penerusan belum tersedia.
Port sumber maksimum default yang dapat digunakan per alamat pengikatan adalah 21 dan diatur di sini (Anda dapat menyesuaikannya jika mau). Kami menggunakan rentang port 500 - 520 secara default, tetapi ini dapat dikonfigurasi.
Pada awalnya, saya mencoba menggunakan sebagian besar port yang tersedia (1 - 65534). Namun, karena keterbatasan pemverifikasi BPF, saya harus menaikkan beberapa konstanta di dalam kernel Linux dan mengkompilasi ulang kernel. Saya membuat tambalan untuk ini dan mendokumentasikan semuanya di sini. Saya dapat menjalankan program dengan 65534 port maksimal per alamat pengikatan tanpa masalah apa pun dengan kernel khusus yang saya buat menggunakan tambalan yang saya buat. Namun, perlu diingat, semakin banyak port sumber yang tersedia, semakin banyak pemrosesan yang harus dilakukan program XDP saat memeriksa port yang tersedia.
Jika Anda berencana menggunakan ini untuk produksi, saya sangat menyarankan untuk mengkompilasi kernel Anda sendiri dengan konstanta yang disebutkan di atas. 21 port sumber maksimum per alamat pengikatan tidaklah banyak, namun sayangnya, pembatasan verifikator BPF default tidak memungkinkan kami melangkah lebih jauh saat ini.
Kode utama yang menyebabkan keterbatasan ini terletak di sini dan terjadi ketika kita mencoba mencari port sumber terbaik untuk digunakan pada koneksi baru. Benar-benar tidak ada cara lain untuk memeriksa port sumber terbaik yang tersedia dengan jumlah fleksibilitas yang kami miliki sesuai pemahaman saya karena kami harus mengulang semua port sumber dan memeriksa paket per nilai nanodetik (pencarian peta BPF berdasarkan kunci).
Anda memerlukan make
, clang
, libelf
, dan llvm
karena kami menggunakan paket ini untuk membangun proyek. Selain itu, Anda juga memerlukan libconfig
( libconfig-dev
adalah paket pada sistem Ubuntu/Debian) untuk menguraikan file konfigurasi.
Untuk Ubuntu/Debian, yang berikut ini seharusnya berfungsi.
apt install build-essential make clang libelf-dev llvm libconfig-dev
Saya berasumsi nama paket serupa di distro Linux lainnya.
Untuk menggunakan xdpfwd-add
dan xdpfwd-del
, Anda harus memasang sistem file BPF karena program XDP menyematkan peta BPF ke /sys/fs/bpf/xdpfwd
. Ada kemungkinan besar hal ini sudah dilakukan untuk Anda melalui iproute2
atau yang serupa, namun jika belum, Anda dapat menggunakan perintah berikut.
mount -t bpf bpf /sys/fs/bpf/
Penggunaan baris perintah dasar mencakup hal berikut.
-o --offload => Attempt to load XDP program with HW/offload mode. If fails, will try DRV and SKB mode in that order.
-s --skb => Force program to load in SKB/generic mode.
-t --time => The amount of time in seconds to run the program for. Unset or 0 = infinite.
-c --config => Location to XDP Forward config (default is /etc/xdpfwd/xdpfwd.conf).
-l --list => List all forwarding rules.
-h --help => Print out command line usage.
Memindahkan program XDP/BPF Anda ke NIC sistem Anda memungkinkan pemrosesan paket tercepat yang dapat Anda capai karena NIC memproses/meneruskan paket dengan perangkat kerasnya. Namun, tidak banyak produsen NIC yang mendukung fitur ini dan Anda terbatas pada memori/pemrosesan NIC (misalnya ukuran peta BPF Anda akan sangat terbatas). Selain itu, biasanya ada batasan pemverifikasi BPF yang lebih ketat untuk program BPF yang diturunkan, namun Anda dapat mencoba menghubungi produsen NIC untuk mengetahui apakah mereka akan memberi Anda versi khusus driver NIC mereka yang meningkatkan batasan ini (inilah yang saya lakukan dengan satu produsen saya menggunakan).
Sampai saat ini, saya tidak mengetahui adanya produsen NIC yang dapat memindahkan alat ini sepenuhnya ke NIC karena kompleksitas BPF dan persyaratan loopnya. Sejujurnya, di era jaringan saat ini, saya yakin yang terbaik adalah menyerahkan program yang tidak dimuat ke pencarian peta BPF dan pemeriksaan paket minimum. Misalnya, pencarian peta tabel rute lapisan 2 BPF sederhana dan kemudian mengirim kembali paket-paket tersebut keluar dari NIC. Namun, XDP masih sangat baru dan saya membayangkan kita akan melihat pembatasan ini dilonggarkan atau dihilangkan di tahun-tahun mendatang. Inilah sebabnya saya menambahkan dukungan untuk mode offload ke dalam program ini.
Eksekusi xdpfwd-add
yang ditambahkan ke $PATH
melalui /usr/bin
saat instalasi menerima argumen berikut.
-b --baddr => The address to bind/look for.
-B --bport => The port to bind/look for.
-d --daddr => The destination address.
-D --dport => The destination port.
-p --protocol => The protocol (either "tcp", "udp", "icmp", or unset for all).
-a --save => Save rule to config file.
Ini akan menambahkan aturan penerusan saat program XDP sedang berjalan.
Eksekusi xdpfwd-del
yang ditambahkan ke $PATH
melalui /usr/bin
saat instalasi menerima argumen berikut.
-b --baddr => The address to bind/look for.
-B --bport => The port to bind/look for.
-p --protocol => The protocol (either "tcp", "udp", "icmp", or unset for all).
-a --save => Remove rule from config file.
Ini akan menghapus aturan penerusan saat program XDP sedang berjalan.
File konfigurasi default terletak di /etc/xdpfwd/xdpfwd.conf
dan menggunakan sintaks libconfig
. Berikut ini contoh konfigurasi yang menggunakan semua fiturnya saat ini.
interface = "ens18"; // The interface the XDP program attaches to.
// Forwarding rules array.
forwarding = (
{
bind = "10.50.0.3", // The bind address which incoming packets must match.
bindport = 80, // The bind port which incoming packets must match.
protocol = "tcp", // The protocol (as of right now "udp", "tcp", and "icmp" are supported). Right now, you must specify a protocol. However, in the future I will be implementing functionality so you don't have to and it'll do full layer-3 forwarding.
dest = "10.50.0.4", // The address we're forwarding to.
destport = 8080 // The port we're forwarding to (if not set, will use the bind port).
},
...
);
Dengan asumsi Anda telah mengunduh semua paket yang diperlukan, membangun proyek ini seharusnya mudah. Anda dapat menggunakan perintah shell dan Bash berikut!
# Clone respository and its sub-modules such as LibBPF.
git clone --recursive https://github.com/gamemann/XDP-Forwarding
# Change directory.
cd XDP-Forwarding
# Make project using all cores.
make -j $( nproc )
# Install binaries to PATH as root so you may use 'xdpfwd', 'xdpfwd-add', 'xdpfwd-del'.
sudo make install