Freebsd traffic shaping: erinevus redaktsioonide vahel

Allikas: Kuutõrvaja
Mine navigeerimisribaleMine otsikasti
Resümee puudub
Jj (arutelu | kaastöö)
 
(ei näidata 4 kasutaja 73 vahepealset redaktsiooni)
1. rida: 1. rida:
'''ipfw ja dummynet'''
{{Täienda}}


kldload ipfw
===Sissejuhatus===
kldload dummynet


ALTQ lühend tähendab äraseletatult "ALTernate Queueing framework for BSD UNIX". ALTQ võimaldab pakettide järjestamist ning teisi QoS-i komponente, mis on vajalikud QoS-i edukaks teostamiseks võrgus, seda kasutatakse enamasti BSD operatsioonisüsteeme kasutatavates ruuterites. ALTQ on osa FreeBSD ja NetBSD distributsioonidest ning on integreeritud Packet Filter tulemüüri.


  #!/bin/sh
ALTQ lihtsamalt öeldes pakub võrguliikluse kontrollvõimalusi ,et suurendada
  i="/sbin/ipfw -q"
teatud teenuste töökindlust ja tähtsamale liiklusele tagada kõrgemaid prioriteete ja kanali suurust
ning samas piirata mitmet laadi ebasobivat liiklust võrkudes ja vähendada
selle ribalaiust.
 
Ametlik ALTQ koduleht http://www.sonycsl.co.jp/person/kjc/kjc/software.html
Ning põhjalikku juttu ja näiteid leiab OpenBSD packet filteri lehelt http://www.openbsd.org/faq/pf/queueing.html
 
Pakette ALTQ's paigutatakse järjekordadesse (Queue). Järjekordadega
tegeleb omakorda scheduler. Võimalik on kasutada kahte tüüpi schedulere
 
    * Class Based Queueing (CBQ)
    * Priority Queueing (PriQ)
 
A couple of downsides to this. One is that you need to have one queue for incoming and outgoing if you want to limit both ways. The other problem is that if you want to NAT and shape based on the inside IP address, because the shaper happens on the out, the NAT has already happened, so you no longer have traffic split out by the inside IP address.
 
'''CBQ'''
 
Igale järjekorrale on seadistatud tema liiklus. Järjekord saab ka laenata (borrow) endale ribalaiust
lisaks enda juurjärjekorrast.
 
Näiteks juurjärjekord 2Mbps mis jaotatakse laiali kolme alamjärjekorra vahel
 
Root Queue (2Mbps)
  Queue A (1Mbps)
  Queue B (500Kbps)
  Queue C (500Kbps)
 
Seda hirearhiat saab laiendada veel defineerides alamjärjekordi, näiteks
 
Root Queue (2Mbps)
  UserA (1Mbps)
    ssh (50Kbps)
    bulk (950Kbps)
  UserB (1Mbps)
    ssh (100Kbps)
    ftp (900Kbps, borrow)
 
Veel saab igale järjekorrale seadistada tema prioriteedi taseme. Järjekorraga millel on kõrgem propriteet tegeletakse
kõige esimesena
 
  Root Queue (2Mbps)
    UserA (1Mbps, priority 1)
      ssh (100Kbps, priority 5)
      ftp (900Kbps, priority 3)
    UserB (1Mbps, priority 1)
 
Kui prioriteet on sama leveliga, nagu näites on userA ja userB järjekordadel siis tegeletakse järjekordadega round-robin laadselt. Muide
kui tegeletakse userA järjekorraga tegeletakse ka tema alamjärjekordadega samaaegselt. Näites hetkel on ssh järjekorral kõrgem
prioriteet ning saab eelised ftp üle kuid ainult antud kasutaja liikluse piires.
 
'''PRIQ'''
 
Võimaldab erinevatele järjekordadele seadistada erinevaid prioriteetide tasemeid. Järjekorraga mis on kõrgema
prioriteediga tegeletakse alati esimesena ja edasi vastavalt temast madalamal olevatega.
 
Root Queue (2Mbps)
  Queue A (priority 1)
  Queue B (priority 2)
  Queue C (priority 3)
 
'''RED''' Random Early Detection
 
Tegeleb pideva jälgimisega ,et järjekord ei saaks täis. Võimalik on kasutada ainult tcp liiklusel mitte udp või icmp
 
===FreeBSD's ALTQ kasutamine===
 
Kernelisse tuleb lisada ja kompileerida järgnevad võtmed
 
options        ALTQ
options        ALTQ_CBQ        # Class Bases Queuing (CBQ)
options        ALTQ_RED        # Random Early Detection (RED)
options        ALTQ_RIO        # RED In/Out
options        ALTQ_HFSC      # Hierarchical Packet Scheduler (HFSC)
options        ALTQ_PRIQ      # Priority Queuing (PRIQ)
options        ALTQ_NOPCC      # Required for SMP build
 
Kontrollida tuleks ka manualist kas võrgukaart mis asub ruuteris
sobib tööks.
 
===Viis näidet ALTQ kasutusest levinud reaalsetes olukordades===
 
Kiire näide kuidas anda veebilehtede suunas väljuvale liiklusele kõrgem prioriteet kui on väljuval
Torrentiliiklusel.
 
altq on $ext_if priq bandwidth 650Kbps queue { http_out_queue, torrent_out_queue }
 
Enables altq on the outgoing interface with 650Kbps of upstream bandwidth, and places the http out and torrent out queues on this interface.
 
queue http_out_queue priority 15 priq(red)
 
Gives traffic in the http_out_queue a priority of 15 with random early detection enabled.
 
queue torrent_out_queue priority 13 priq(red)
 
Traffic in the torrent_out_queue has a lower priority.
 
pass out on $ext_if inet proto tcp from $ext_if to any port 80 queue http_out_queue
Allows traffic to port 80 out on the external interface, and places this traffic in the http_out_queue.
 
  pass out on $ext_if inet proto tcp from $ext_if to any port 6881:6999 queue torrent_out_queue
 
Lets traffic to the default torrent ports out on the external interface and lumps the traffic into the torrent_out_queue.
 
===Näide===
 
Altq võrgulahendus, kus vaja oleks limiteerida wifi klientidele
jagatava võrguühenduse uploadi. Ehk siis võrgu tavakasutajad saaksid
hea ja garanteeritud kiirusega üleslaadimise ning kõikvõimalikud
laptopid oleksid pisut piiratult.
 
Loome 10 megase queue ja lõikame selle koheselt 10 ja 2 megasteks. kümnene
saab top prioriteedi ja võib laenata ribalaiust teiselt järjekorralt.
other järjekord saab endale ülejäänud ribalaiuse ja ta kasutab
ecn'i (Explicit Congestion Notification) täitumise korral. Mis tähendab
peamiselt pakettide minemaviskamist.
 
altq on $wifi_if cbq bandwidth 10Mb queue { kontor, wifi }
   
   
  $i -f flush
  queue kontor  bandwidth 10Mb priority 1 cbq(borrow)
  $i -f pipe flush
queue wifi bandwidth 2Mb  priority 7 cbq(default ecn)
 
Seejärel seome järjekorrad reeglitega
 
  my_hosts = "192.168.1.0/24"
   
   
  $i pipe 1 config bw 55KB/s
  pass  out quick on $wifi_if from any to $my_hosts queue kontor
  $i pipe 2 config bw 70KB/s
  pass  out      on $wifi_if from any to any      queue wifi
$i pipe 3 config bw 12KB/s
 
Infot näeb käsuga
 
# pfctl -v -s queue
 
====Näide 1====
 
Daniel Hartmeier's ADSL näide - kõrgema prioriteedi andmine ACK päringutele ,et suurendada
võrgu jõudlust ebasümmeetrilisel ADSL ühendusel kus upload kanal on liiga väike ning
kipub ummistuma nii ,et ACK requestid kipuvad takerduma ja selletõttu kogu download
kiirus omakorda hakkab ikalduma.
   
   
  $i add 1 pipe 1 ip from 192.168.1.2 to any
  altq on fxp0 priq bandwidth 100Kb queue { q_pri, q_def }
$i add 2 pipe 1 ip from 192.168.1.3 to any
  queue q_pri priority 7
  $i add 3 pipe 1 ip from 192.168.1.4 to any
  queue q_def priority 1 priq(default)
  $i add 4 pipe 1 ip from 192.168.1.5 to any
   
   
  $i add allow ip from any to any
  pass out on fxp0 proto tcp from $ext_if to any flags S/SA keep state queue (q_def, q_pri)
pass in  on fxp0 proto tcp from any to $ext_if flags S/SA keep state queue (q_def, q_pri)
 
http://www.benzedrine.cx/ackpri.html


lihtne skript piirab uploadi
====Näide 2====


Liikluse piiramine vastavalt liikluse tüübile teatavate
protsentideni võimaldades vaba kanali puhul siiski laenata ribalaiust juurde.


'''pf ja altq'''
altq on $ext_if cbq bandwidth 640Kb queue { def, ftp, udp, http, ssh, icmp }
queue def bandwidth 18% cbq(default borrow red)
queue ftp bandwidth 10% cbq(borrow red)
queue udp bandwidth 30% cbq(borrow red)
queue http bandwidth 20% cbq(borrow red)
queue ssh bandwidth 20% cbq(borrow red) { ssh_interactive, ssh_bulk }
queue ssh_interactive priority 7
queue ssh_bulk priority 0
queue icmp bandwidth 2% cbq
pass log quick on $ext_if proto tcp from any to any port 22 flags S/SA keep state queue (ssh_bulk, ssh_interactive)
pass in quick on $ext_if proto tcp from any to any port 20 flags S/SA  keep state queue ftp
pass in quick on $ext_if proto tcp from any to any port 80 flags S/SA keep state queue http
pass out on $ext_if proto udp all keep state queue udp
pass out on $ext_if proto icmp all keep state queue icmp


näide pf altq traffic shapingust koos tulemüüriga
====Näide 3 ====


ext_if="fxp1"
Ebasoovitatava liiklusega tegelemine.
int_if="fxp0"


# rules
  queue q_default cbq(default)
sourcetrack="keep state"
  queue q_web (...)
#( source-track rule, max-src-nodes 30, max-src-states 28, tcp.closing 2, tcp.finwait 2 )"
set optimization aggressive
    ## kogu emaili liiklus limiteeritakse kiirusele 1Mb/sec
    queue q_mail bandwidth 1Mb { q_mail_windows }
    ## aga windowsi mail limiteeritakse kiirusele 56Kb/sec
    queue q_mail_windows bandwidth 56Kb
    pass in quick proto tcp from any os "Windows" to $ext_if port 25 keep state queue q_mail_windows
    pass in quick proto tcp from any to $ext_if port 25 label "smtp" keep state queue q_mail


# Clean up fragmented and abnormal packets, defeat NAT detection too
====Näide 4====
# max-mss is needed due to MPD's poor MSS handling
scrub in all
#scrub out all random-id max-mss 1440


# 192.168.1.0/24 download
Oletame, et meil reeglid
altq on $int_if cbq bandwidth 100Mb queue if1
queue if1 bandwidth 100% cbq(rio ecn default) { a1, a2, a3 }
queue a1 bandwidth 512Kb cbq(rio ecn) 3
queue a2 bandwidth 512Kb cbq(rio ecn) 4
queue a3 bandwidth 512Kb cbq(rio ecn) 5


# link1 uplink
nat on $ext_if from 192.168.1.1 to any -> ($ext_if)
altq on $ext_if cbq bandwidth 100Mb queue eif1
pass out quick keep state queue toru_a
queue eif1 bandwidth 100% cbq(rio ecn default) { b1, b2, b3 }
pass in quick from 192.168.1.1 to any keep state queue toru_b
queue b1 bandwidth 256Kb cbq(rio ecn) 7
queue b2 bandwidth 256Kb cbq(rio ecn) 4
queue b3 bandwidth 256Kb cbq(rio ecn) 5


# link1-nat
Õnnetuseks sellise reeglistiku juures EI TÖÖTA OUT reegel.
nat on $ext_if from 192.168.1.1 to any tag pc1 -> ($ext_if)
nat on $ext_if from 192.168.1.2 to any tag pc2 -> ($ext_if)
nat on $ext_if from 192.168.1.3 to any tag pc3 -> ($ext_if)


block log all label "blocked"
Probleem on, et kuna NAT reegel käivitub väljuva liikluse puhul esimesena siis edasised pass/block reeglid ei rakendu.
pass quick on lo0 all
Seega meie reegel nr1 lõpetab edasise paketi töötluse ja reegel jäetakse kasutamata ning väljuvat infot ei topita altq torusse


# 192.168.1.0/24 && 192.168.2.0/24 sisemiste interfacede ip'ni piiramatul kiirusel traffic
Siin suudab päästa õnneks võti "tag" ehk märkimine? Näiteks märgime OUT reegli ära.
pass quick all tagged intnat keep state
pass quick from 192.168.1.0/24 to $int_if keep state
pass quick from 192.168.0.0/24 to $int_if keep state
pass quick from $int_if to 192.168.0.0/24 keep state
pass quick from $int_if to 192.168.1.0/24 keep state


# link1-download
nat on $ext_if from 192.168.1.1 to any tag pc1 -> ($ext_if)
pass in quick from 192.168.1.1 to any $sourcetrack queue a1 label 192_168_1_1_down
pass out quick tagged pc1 keep state queue toru
pass in quick from 192.168.1.2 to any $sourcetrack queue a2 label 192_168_1_2_down
pass in quick from 192.168.1.3 to any $sourcetrack queue a3 label 192_168_1_3_down


# link1-upload
Sellisel juhul rakendub kõigepealt tagiga märgitud pass reegel ja
pass out quick tagged pc1 $sourcetrack queue b1 label 192_168_1_1_up
alles siis nat reegel.
pass out quick tagged pc2 $sourcetrack queue b2 label 192_168_1_2_up
pass out quick tagged pc3 $sourcetrack queue b3 label 192_168_1_3_up


pass in inet proto icmp all keep state
nat on $ext_if from 192.168.1.1 to any tag pc1 -> ($ext_if)
pass out inet proto icmp all keep state
pass out quick tagged pc1 keep state queue toru_a
pass in quick from 192.168.1.1 to any keep state queue toru_b
 
Näide pf altq traffic shapingust koos tulemüüriga.  Kasutusel on piiratud võimalustega väline ühendus, ruuteril on kaks võrgukaarti millest väline fxp1 ja sisemine fxp0 ning sisemisele toimib nat.
 
Piiratakse nii download kui uploadi. Iga hosti kohta saab määrata erineva uploadi ja downloadi.
 
Näites on kolm klienti
 
192.168.1.1
192.168.1.2
192.168.1.3
 
Milledel downloadi piirame 512kb peale ja uploadi 256kb/s
 
ext_if="fxp1"
int_if="fxp0"
set optimization aggressive
'''192.168.1.0/24 download'''
altq on $int_if cbq bandwidth 100Mb queue if1
queue if1 bandwidth 100% cbq(rio ecn default) { a1, a2, a3 }
queue a1 bandwidth 512Kb cbq(rio ecn) 1
queue a2 bandwidth 512Kb cbq(rio ecn) 1
queue a3 bandwidth 512Kb cbq(rio ecn) 1
'''192.168.1.0/24 upload'''
altq on $ext_if cbq bandwidth 100Mb queue eif1
queue eif1 bandwidth 100% cbq(rio ecn default) { b1, b2, b3 }
queue b1 bandwidth 256Kb cbq(rio ecn) 1
queue b2 bandwidth 256Kb cbq(rio ecn) 1
queue b3 bandwidth 256Kb cbq(rio ecn) 1
'''192.168.1.0/24-nat'''
nat on $ext_if from 192.168.1.1 to any tag pc1 -> ($ext_if)
nat on $ext_if from 192.168.1.2 to any tag pc2 -> ($ext_if)
nat on $ext_if from 192.168.1.3 to any tag pc3 -> ($ext_if)
block log all label "blocked"
pass quick on lo0 all
'''192.168.1.0/24 sisemiste interfacede ip'ni piiramatul kiirusel traffic'''
pass quick all tagged intnat keep state
pass quick from 192.168.1.0/24 to $int_if keep state
pass quick from $int_if to 192.168.1.0/24 keep state
'''download'''
pass in quick from 192.168.1.1 to any keep state queue a1 label 192_168_1_1_down
pass in quick from 192.168.1.2 to any keep state queue a2 label 192_168_1_2_down
pass in quick from 192.168.1.3 to any keep state queue a3 label 192_168_1_3_down
'''upload'''
pass out quick tagged pc1 keep state queue b1 label 192_168_1_1_up
pass out quick tagged pc2 keep state queue b2 label 192_168_1_2_up
pass out quick tagged pc3 keep state queue b3 label 192_168_1_3_up
pass in inet proto icmp all keep state
pass out inet proto icmp all keep state
 
pass in on $ext_if proto tcp from any to $ext_if port 22 keep state
pass out on $ext_if proto { tcp, udp } all keep state


Nagu näha on asi äärmiselt paindlik nii ,et saame vabalt igale
kliendile määrata erinevad teistest sõltumatud upload ja download kiirused ning isegi määrata erinevad proriteedid
erinevatele kasutajatele ja nende liiklusele


pass quick on $ext_if proto udp from $ext_if to any port 53 keep state
===Lingid===
pass quick on $int_if proto udp from $ext_if to any port 53 keep state


ALTQ nippe


# block nmap's fingerprinting attempt(FIN, URG, PSH)
http://www.sonycsl.co.jp/~kjc/software/TIPS.txt
block in quick on $ext_if inet proto tcp from any to any flags FUP/FUP


#pass in  on $int_if from $int_if:network to any keep state
Näited millest siin palas ALTQ'ga seoses juttu tehtud
#pass out on $int_if from any to $int_if:network keep state


pass in on $ext_if proto tcp from any to any port > 49151 keep state
http://www.bgnett.no/~peter/pf/en/altqintro.html


pass in on $ext_if proto tcp from any to $ext_if port 22 keep state
Ülevaatlikult ALTQ frameworkist
pass in on $ext_if proto tcp from any to $ext_if port 21 keep state
pass in on $ext_if proto tcp from any to $ext_if port 80 keep state


pass in inet proto gre all keep state
http://blogs.techrepublic.com.com/security/?p=391
pass out inet proto gre all keep state


pass quick proto ipv6 all keep state
http://blog.segment7.net/2009/07/27/bandwidth-limiting-with-pf-and-altq
pass quick on gif0 all


http://www.tummy.com/blogs/2004/12/22/state-of-the-traffic-shaping-address/ asjalikku juttu altq kohta


pass out on $ext_if proto { tcp, udp } all keep state
https://calomel.org/pf_config.html

Viimane redaktsioon: 9. aprill 2013, kell 08:52

                                         Toores. Ehk seda pala võib täiendada.

Sissejuhatus

ALTQ lühend tähendab äraseletatult "ALTernate Queueing framework for BSD UNIX". ALTQ võimaldab pakettide järjestamist ning teisi QoS-i komponente, mis on vajalikud QoS-i edukaks teostamiseks võrgus, seda kasutatakse enamasti BSD operatsioonisüsteeme kasutatavates ruuterites. ALTQ on osa FreeBSD ja NetBSD distributsioonidest ning on integreeritud Packet Filter tulemüüri.

ALTQ lihtsamalt öeldes pakub võrguliikluse kontrollvõimalusi ,et suurendada teatud teenuste töökindlust ja tähtsamale liiklusele tagada kõrgemaid prioriteete ja kanali suurust ning samas piirata mitmet laadi ebasobivat liiklust võrkudes ja vähendada selle ribalaiust.

Ametlik ALTQ koduleht http://www.sonycsl.co.jp/person/kjc/kjc/software.html Ning põhjalikku juttu ja näiteid leiab OpenBSD packet filteri lehelt http://www.openbsd.org/faq/pf/queueing.html

Pakette ALTQ's paigutatakse järjekordadesse (Queue). Järjekordadega tegeleb omakorda scheduler. Võimalik on kasutada kahte tüüpi schedulere

   * Class Based Queueing (CBQ)
   * Priority Queueing (PriQ)

A couple of downsides to this. One is that you need to have one queue for incoming and outgoing if you want to limit both ways. The other problem is that if you want to NAT and shape based on the inside IP address, because the shaper happens on the out, the NAT has already happened, so you no longer have traffic split out by the inside IP address.

CBQ

Igale järjekorrale on seadistatud tema liiklus. Järjekord saab ka laenata (borrow) endale ribalaiust lisaks enda juurjärjekorrast.

Näiteks juurjärjekord 2Mbps mis jaotatakse laiali kolme alamjärjekorra vahel

Root Queue (2Mbps) 
  Queue A (1Mbps) 
  Queue B (500Kbps) 
  Queue C (500Kbps) 

Seda hirearhiat saab laiendada veel defineerides alamjärjekordi, näiteks

Root Queue (2Mbps) 
  UserA (1Mbps) 
    ssh (50Kbps) 
    bulk (950Kbps) 
  UserB (1Mbps) 
    ssh (100Kbps) 
    ftp (900Kbps, borrow)

Veel saab igale järjekorrale seadistada tema prioriteedi taseme. Järjekorraga millel on kõrgem propriteet tegeletakse kõige esimesena

Root Queue (2Mbps) 
   UserA (1Mbps, priority 1) 
     ssh (100Kbps, priority 5) 
     ftp (900Kbps, priority 3) 
   UserB (1Mbps, priority 1)

Kui prioriteet on sama leveliga, nagu näites on userA ja userB järjekordadel siis tegeletakse järjekordadega round-robin laadselt. Muide kui tegeletakse userA järjekorraga tegeletakse ka tema alamjärjekordadega samaaegselt. Näites hetkel on ssh järjekorral kõrgem prioriteet ning saab eelised ftp üle kuid ainult antud kasutaja liikluse piires.

PRIQ

Võimaldab erinevatele järjekordadele seadistada erinevaid prioriteetide tasemeid. Järjekorraga mis on kõrgema prioriteediga tegeletakse alati esimesena ja edasi vastavalt temast madalamal olevatega.

Root Queue (2Mbps) 
  Queue A (priority 1) 
  Queue B (priority 2) 
  Queue C (priority 3)

RED Random Early Detection

Tegeleb pideva jälgimisega ,et järjekord ei saaks täis. Võimalik on kasutada ainult tcp liiklusel mitte udp või icmp

FreeBSD's ALTQ kasutamine

Kernelisse tuleb lisada ja kompileerida järgnevad võtmed

options         ALTQ
options         ALTQ_CBQ        # Class Bases Queuing (CBQ)
options         ALTQ_RED        # Random Early Detection (RED)
options         ALTQ_RIO        # RED In/Out
options         ALTQ_HFSC       # Hierarchical Packet Scheduler (HFSC)
options         ALTQ_PRIQ       # Priority Queuing (PRIQ)
options         ALTQ_NOPCC      # Required for SMP build

Kontrollida tuleks ka manualist kas võrgukaart mis asub ruuteris sobib tööks.

Viis näidet ALTQ kasutusest levinud reaalsetes olukordades

Kiire näide kuidas anda veebilehtede suunas väljuvale liiklusele kõrgem prioriteet kui on väljuval Torrentiliiklusel.

altq on $ext_if priq bandwidth 650Kbps queue { http_out_queue, torrent_out_queue }

Enables altq on the outgoing interface with 650Kbps of upstream bandwidth, and places the http out and torrent out queues on this interface.

queue http_out_queue priority 15 priq(red)

Gives traffic in the http_out_queue a priority of 15 with random early detection enabled.

queue torrent_out_queue priority 13 priq(red)

Traffic in the torrent_out_queue has a lower priority.

pass out on $ext_if inet proto tcp from $ext_if to any port 80 queue http_out_queue

Allows traffic to port 80 out on the external interface, and places this traffic in the http_out_queue.

pass out on $ext_if inet proto tcp from $ext_if to any port 6881:6999 queue torrent_out_queue

Lets traffic to the default torrent ports out on the external interface and lumps the traffic into the torrent_out_queue.

Näide

Altq võrgulahendus, kus vaja oleks limiteerida wifi klientidele jagatava võrguühenduse uploadi. Ehk siis võrgu tavakasutajad saaksid hea ja garanteeritud kiirusega üleslaadimise ning kõikvõimalikud laptopid oleksid pisut piiratult.

Loome 10 megase queue ja lõikame selle koheselt 10 ja 2 megasteks. kümnene saab top prioriteedi ja võib laenata ribalaiust teiselt järjekorralt. other järjekord saab endale ülejäänud ribalaiuse ja ta kasutab ecn'i (Explicit Congestion Notification) täitumise korral. Mis tähendab peamiselt pakettide minemaviskamist.

altq on $wifi_if cbq bandwidth 10Mb queue { kontor, wifi }

queue kontor  bandwidth 10Mb priority 1 cbq(borrow)
queue wifi bandwidth 2Mb  priority 7 cbq(default ecn)

Seejärel seome järjekorrad reeglitega

my_hosts = "192.168.1.0/24"

pass  out quick on $wifi_if from any to $my_hosts queue kontor
pass  out       on $wifi_if from any to any       queue wifi

Infot näeb käsuga

# pfctl -v -s queue

Näide 1

Daniel Hartmeier's ADSL näide - kõrgema prioriteedi andmine ACK päringutele ,et suurendada võrgu jõudlust ebasümmeetrilisel ADSL ühendusel kus upload kanal on liiga väike ning kipub ummistuma nii ,et ACK requestid kipuvad takerduma ja selletõttu kogu download kiirus omakorda hakkab ikalduma.

altq on fxp0 priq bandwidth 100Kb queue { q_pri, q_def }
queue q_pri priority 7
queue q_def priority 1 priq(default)

pass out on fxp0 proto tcp from $ext_if to any flags S/SA keep state queue (q_def, q_pri)
pass in  on fxp0 proto tcp from any to $ext_if flags S/SA keep state queue (q_def, q_pri)

http://www.benzedrine.cx/ackpri.html

Näide 2

Liikluse piiramine vastavalt liikluse tüübile teatavate protsentideni võimaldades vaba kanali puhul siiski laenata ribalaiust juurde.

altq on $ext_if cbq bandwidth 640Kb queue { def, ftp, udp, http, ssh, icmp }
queue def bandwidth 18% cbq(default borrow red)
queue ftp bandwidth 10% cbq(borrow red)
queue udp bandwidth 30% cbq(borrow red)
queue http bandwidth 20% cbq(borrow red)
queue ssh bandwidth 20% cbq(borrow red) { ssh_interactive, ssh_bulk }
queue ssh_interactive priority 7
queue ssh_bulk priority 0
queue icmp bandwidth 2% cbq

pass log quick on $ext_if proto tcp from any to any port 22 flags S/SA keep state queue (ssh_bulk, ssh_interactive)
pass in quick on $ext_if proto tcp from any to any port 20 flags S/SA  keep state queue ftp
pass in quick on $ext_if proto tcp from any to any port 80 flags S/SA keep state queue http

pass out on $ext_if proto udp all keep state queue udp
pass out on $ext_if proto icmp all keep state queue icmp

Näide 3

Ebasoovitatava liiklusega tegelemine.

  queue q_default cbq(default)
  queue q_web (...) 

   ## kogu emaili liiklus limiteeritakse kiirusele 1Mb/sec
   queue q_mail bandwidth 1Mb { q_mail_windows }
   ## aga windowsi mail limiteeritakse kiirusele 56Kb/sec
   queue q_mail_windows bandwidth 56Kb

   pass in quick proto tcp from any os "Windows" to $ext_if port 25 keep state queue q_mail_windows
   pass in quick proto tcp from any to $ext_if port 25 label "smtp" keep state queue q_mail

Näide 4

Oletame, et meil reeglid

nat on $ext_if from 192.168.1.1 to any -> ($ext_if)
pass out quick keep state queue toru_a
pass in quick from 192.168.1.1 to any keep state queue toru_b

Õnnetuseks sellise reeglistiku juures EI TÖÖTA OUT reegel.

Probleem on, et kuna NAT reegel käivitub väljuva liikluse puhul esimesena siis edasised pass/block reeglid ei rakendu. Seega meie reegel nr1 lõpetab edasise paketi töötluse ja reegel jäetakse kasutamata ning väljuvat infot ei topita altq torusse

Siin suudab päästa õnneks võti "tag" ehk märkimine? Näiteks märgime OUT reegli ära.

nat on $ext_if from 192.168.1.1 to any tag pc1 -> ($ext_if)
pass out quick tagged pc1 keep state queue toru

Sellisel juhul rakendub kõigepealt tagiga märgitud pass reegel ja alles siis nat reegel.

nat on $ext_if from 192.168.1.1 to any tag pc1 -> ($ext_if)
pass out quick tagged pc1 keep state queue toru_a
pass in quick from 192.168.1.1 to any keep state queue toru_b

Näide pf altq traffic shapingust koos tulemüüriga. Kasutusel on piiratud võimalustega väline ühendus, ruuteril on kaks võrgukaarti millest väline fxp1 ja sisemine fxp0 ning sisemisele toimib nat.

Piiratakse nii download kui uploadi. Iga hosti kohta saab määrata erineva uploadi ja downloadi.

Näites on kolm klienti

192.168.1.1
192.168.1.2
192.168.1.3

Milledel downloadi piirame 512kb peale ja uploadi 256kb/s

ext_if="fxp1"
int_if="fxp0"

set optimization aggressive

192.168.1.0/24 download
altq on $int_if cbq bandwidth 100Mb queue if1
queue if1 bandwidth 100% cbq(rio ecn default) { a1, a2, a3 }
queue a1 bandwidth 512Kb cbq(rio ecn) 1
queue a2 bandwidth 512Kb cbq(rio ecn) 1
queue a3 bandwidth 512Kb cbq(rio ecn) 1

192.168.1.0/24 upload
altq on $ext_if cbq bandwidth 100Mb queue eif1
queue eif1 bandwidth 100% cbq(rio ecn default) { b1, b2, b3 }
queue b1 bandwidth 256Kb cbq(rio ecn) 1
queue b2 bandwidth 256Kb cbq(rio ecn) 1
queue b3 bandwidth 256Kb cbq(rio ecn) 1

192.168.1.0/24-nat
nat on $ext_if from 192.168.1.1 to any tag pc1 -> ($ext_if)
nat on $ext_if from 192.168.1.2 to any tag pc2 -> ($ext_if)
nat on $ext_if from 192.168.1.3 to any tag pc3 -> ($ext_if)

block log all label "blocked"
pass quick on lo0 all

192.168.1.0/24 sisemiste interfacede ip'ni piiramatul kiirusel traffic
pass quick all tagged intnat keep state
pass quick from 192.168.1.0/24 to $int_if keep state
pass quick from $int_if to 192.168.1.0/24 keep state

download
pass in quick from 192.168.1.1 to any keep state queue a1 label 192_168_1_1_down
pass in quick from 192.168.1.2 to any keep state queue a2 label 192_168_1_2_down
pass in quick from 192.168.1.3 to any keep state queue a3 label 192_168_1_3_down

upload
pass out quick tagged pc1 keep state queue b1 label 192_168_1_1_up
pass out quick tagged pc2 keep state queue b2 label 192_168_1_2_up
pass out quick tagged pc3 keep state queue b3 label 192_168_1_3_up

pass in inet proto icmp all keep state
pass out inet proto icmp all keep state
  
pass in on $ext_if proto tcp from any to $ext_if port 22 keep state
pass out on $ext_if proto { tcp, udp } all keep state

Nagu näha on asi äärmiselt paindlik nii ,et saame vabalt igale kliendile määrata erinevad teistest sõltumatud upload ja download kiirused ning isegi määrata erinevad proriteedid erinevatele kasutajatele ja nende liiklusele

Lingid

ALTQ nippe

http://www.sonycsl.co.jp/~kjc/software/TIPS.txt

Näited millest siin palas ALTQ'ga seoses juttu tehtud

http://www.bgnett.no/~peter/pf/en/altqintro.html

Ülevaatlikult ALTQ frameworkist

http://blogs.techrepublic.com.com/security/?p=391

http://blog.segment7.net/2009/07/27/bandwidth-limiting-with-pf-and-altq

http://www.tummy.com/blogs/2004/12/22/state-of-the-traffic-shaping-address/ asjalikku juttu altq kohta

https://calomel.org/pf_config.html