Nilai batas jaringan tetapi biarkan meledak per koneksi TCP sebelum membatasi

8

Kami memiliki router Cisco yang memungkinkan untuk membatasi tingkat (mereka menyebutnya policing) tetapi mengizinkan meledak pada basis koneksi per-TCP. Misalnya, kita dapat membatasi bandwidth pada 50mbit, tetapi batasannya tidak akan dikenakan hingga 4 megabyte telah ditransfer. Ini diberlakukan per setiap koneksi TCP yang dibuat.

Apakah ada cara untuk melakukan ini di Linux? Juga, apakah ada kelemahan untuk solusi seperti itu? Jika itu membantu bagi siapa pun, perintah Cisco untuk mengatur bursting adalah parameter ketiga dari perintah polisi yang dijalankan di bawah peta kebijakan (setidaknya pada ASA 5505 kami).

Tujuannya adalah untuk memungkinkan server memanfaatkan 95/5 bursting dan melayani halaman web secepat mungkin untuk pengguna normal tetapi mengurangi kemungkinan meledak lebih dari 5% dari waktu (seperti jika melakukan server ke server mentransfer atau file besar sedang diunduh dari situs web). Saya mengerti dengan serangan DDoS yang berlangsung terlalu lama ini mungkin bukan solusi, tetapi karena berbagai alasan itu bukan masalah di sini.

sa289
sumber

Jawaban:

6

Ini bisa dilakukan di linux dengan iptablesdan tc. Anda mengkonfigurasi iptables ke MARKpaket pada koneksi di mana beberapa byte telah ditransfer. Anda kemudian gunakan tcuntuk meletakkan paket-paket yang ditandai di kelas dalam disiplin antrian untuk mengatur bandwidth.

Satu bagian yang agak sulit adalah membatasi koneksi untuk unggahan dan unduhan. tctidak mendukung pembentukan lalulintas jalan masuk. Anda dapat menyiasatinya dengan membentuk jalan keluar pada antarmuka yang menghadap server-web Anda (yang akan membentuk unduhan ke server-web Anda), dan membentuk jalan keluar pada antarmuka yang menghadap ke penyedia-hulu Anda (yang akan membentuk unggahan dari server Anda). Anda tidak benar-benar membentuk lalu lintas masuk (unduh), karena Anda tidak dapat mengontrol seberapa cepat penyedia hulu Anda mengirim data. Tetapi, membentuk antarmuka webserver Anda akan menghasilkan paket yang dijatuhkan dan pengunggah menyusut jendela TCP mereka untuk mengakomodasi batas bandwidth.

Contoh: (menganggap ini pada router berbasis linux, di mana antarmuka server web menghadap ke atas eth0dan ke atas eth1)

# mark the packets for connections over 4MB being forwarded out eth1
# (uploads from webserver)
iptables -t mangle -A FORWARD -p tcp -o eth1 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50

# mark the packets for connections over 4MB being forwarded out eth0
# (downloads to webserver)
iptables -t mangle -A FORWARD -p tcp -o eth0 -m connbytes --connbytes 4194304: --connbytes-dir both --connbytes-mode bytes -j MARK --set-mark 50

# Setup queuing discipline for server-download traffic
tc qdisc add dev eth0 root handle 1: htb
tc class add dev eth0 parent 1: classid 1:50 htb rate 50mbit

# Setup queuing discipline for server-upload traffic
tc qdisc add dev eth1 root handle 1: htb
tc class add dev eth1 parent 1: classid 1:50 htb rate 50mbit

# set the tc filters to catch the marked packets and direct them appropriately
tc filter add dev eth0 parent 1:0 protocol ip handle 50 fw flowid 1:50
tc filter add dev eth1 parent 1:0 protocol ip handle 50 fw flowid 1:50

Jika Anda ingin melakukan ini pada server web itu sendiri dan bukan pada router linux, Anda masih dapat menggunakan bagian unggahan dari hal-hal di atas. Satu perubahan penting adalah Anda akan menggantinya FOWARDdengan OUTPUT. Untuk mengunduh, Anda harus menyiapkan disiplin antrian menggunakan perangkat "Intermediate Functional Block", atau ifb. Singkatnya, ia menggunakan antarmuka virtual sehingga Anda dapat memperlakukan lalu lintas masuk sebagai jalan keluar, dan membentuknya dari sana menggunakan tc. Info lebih lanjut tentang cara mengatur ifbdapat ditemukan di sini: /server/350023/tc-ingress-policing-and-ifb-mirroring

Perhatikan bahwa jenis barang ini cenderung membutuhkan banyak penyetelan skala. Salah satu kekhawatiran langsung adalah yang connbytesbergantung pada conntrackmodul, yang cenderung mengenai dinding penskalaan dengan sejumlah besar koneksi. Saya akan merekomendasikan pengujian beban berat.

Peringatan lain adalah bahwa ini tidak bekerja sama sekali untuk UDP, karena tidak memiliki kewarganegaraan. Ada teknik lain untuk mengatasi itu, tetapi sepertinya persyaratan Anda hanya untuk TCP.

Juga, untuk membatalkan semua hal di atas, lakukan hal berikut:

# Flush the mangle FORWARD chain (don't run this if you have other stuff in there)
iptables -t mangle -F FORWARD

# Delete the queuing disciplines
tc qdisc del dev eth0 root
tc qdisc del dev eth1 root
alienth
sumber