Ini bisa dilakukan di linux dengan iptables
dan tc
. Anda mengkonfigurasi iptables ke MARK
paket pada koneksi di mana beberapa byte telah ditransfer. Anda kemudian gunakan tc
untuk 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. tc
tidak 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 eth0
dan 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 FOWARD
dengan 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 ifb
dapat 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 connbytes
bergantung pada conntrack
modul, 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