(WLAN-)Router mit Traffic-Shaping

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der HOWTO Sammlung.
Installationsmethoden LiveCDs Kernel & Hardware Laptops & Notebooks Portage System Netzwerke & Services X Software Anderes alphabetischer HOWTO Index


Inhaltsverzeichnis

[Bearbeiten] Kernelkonfiguration

Wird eine Einwählverbindung benötigt, so müssen unter

Linux Kernel Configuration:
Device Drivers --->
  Network device support  --->
    <M> PPP (point-to-point protocol) support 

alle PPP Einträge als Modul markiert werden.

Für kernel >= 2.6.17 gilt: Für das routing und shaping reicht es, unter

Linux Kernel Configuration:
Networking  --->
  Networking options  --->
    [*] Network packet filtering (replaces ipchains)  --->
      Core Netfilter Configuration  --->

alle Einträge als Modul zu markieren. Ebenso auf der gleichen Ebene unter

Linux Kernel Configuration:
      IP: Netfilter Configuration  --->

und eine Ebene höher unter

Linux Kernel Configuration:
    QoS and/or fair queueing  --->

Die benötigten Module lädt iptables später automatisch.

Das läßt sich sicherlich auf andere Kernelversionen übertragen, auch wenn die Pfade verschieden sind. Ansonsten konfigurieren wie unter: http://www.gentoo.org/doc/de/home-router-howto.xml und http://gentoo-wiki.com/HOWTO_Packet_Shaping beschrieben.

Anschließend den Kernel übersetzen und aktualisieren, danach den Rechner neustarten.

[Bearbeiten] Einwahlverbindung

Falls eine Einwahlverbindung benötigt wird, sei hier exemplarisch die DSL-Einwahl beschrieben: Es muß rp-pppoe installiert werden und /etc/conf.d/net angepaßt werden (bezieht sich auf baselayout >=1.12):

Datei: /etc/conf.d/net
 config_ppp0=( "ppp" )
 link_ppp0="eth0"               #Netzwerkkarte zum Modem
 plugins_ppp0=(
         "pppoe"
         )
 pppd_ppp0=(
         "updetach"             #warten bis Verbindung steht, sonst wird postup() nicht ausgefuehrt
         "defaultroute"         #Default-Route automatisch setzen
         "usepeerdns"           #vom Provider übermittelte Nameserver nutzen
         "lcp-echo-interval 15" #alle 15 Sekunden Verbindung prüfen
         "lcp-echo-failure 3"   #nach drei Fehlern Verbindung neu aufbauen
         )
 username_ppp0='Nutzer'
 password_ppp0='Paßwort'
 


Verbindung ppp0 einrichten:

# ln -s /etc/init.d/net.lo /etc/init.d/net.ppp0 #Erzeugen
# /etc/init.d/net.ppp0 start #Starten
# rc-update add net.ppp0 default #Nach jedem Neustart starten

[Bearbeiten] Accesspoint einrichten

Soll das interne Netzwerk über WLAN zugreifen, müssen die entsprechenden WLAN-Treiber installiert sein. Hier seien exemplarisch die madwifi-Treiber für Atheros-Chips beschrieben:

# emerge madwifi-ng
Datei: /etc/conf.d/wireless
 mode_ath0="master"
 essid_ath0="Tolle_SSID"
 channel_ath0="3"
 


Um die Karte beim Laden des Moduls in den "Access Point"-Modus zu setzen muß man in die /etc/modules.d/ath_pci

options ath_pci autocreate=ap

eintragen. Vorsicht: Es kann passieren, daß nach einer Neuinstallion von madwifi die Datei automatisch überschrieben wird.

WLAN-Verbindung vorbereiten:

# ln -s /etc/init.d/net.lo /etc/init.d/net.ath0 #erzeugen
# /etc/init.d/net.ath0 start #starten
# rc-update add net.ath0 default #Bei jedem Neustart starten

[Bearbeiten] hostapd konfigurieren

Benötigt man eine verschlüsselte Verbindung sollte man net-wireless/hostapd installieren:

# euse --enable madwifi
# emerge hostapd
Datei: /etc/hostapd/hostapd.conf
#WLAN-Interface
interface=ath0
#verwendeter Treiber
driver=madwifi
#Logging-Optionen
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2
debug=0
dump_file=/tmp/hostapd.dump
#Weitere Standardeinstellungen
ctrl_interface=/var/run/hostapd
ctrl_interface_group=0
#Meine WLAN-SSID
ssid=Tolle_SSID
#Filterung von MAC-Adressen - leicht zu umgehen
macaddr_acl=1
accept_mac_file=/etc/hostapd/hostapd.accept 
#Shared Key Authentifizierung
auth_algs=2
#Standardeinstellungen
eap_authenticator=0
eap_message=hello
eapol_key_index_workaround=0
own_ip_addr=127.0.0.1
#WPA und WPA2 erlauben
wpa=3
#Der Pre Shared Key
wpa_passphrase=mein Schlüssel
#Pre Shared Keys, kein EAP
wpa_key_mgmt=WPA-PSK
#CCMP/AES verwenden, kein TKIP
wpa_pairwise=CCMP 


[Bearbeiten] DNS-Proxy/DHCP

Man kann überlegen einen DNS-Proxy oder einen DHCP-Server zu installieren. Als DNS-Proxy bietet sich net-dns/dnrd an.

Datei: /etc/conf.d/dnrd
DNRD_OPTS="
       --server [nameserver 1 des Providers]
       --server [nameserver 2 des Providers]
"
 
Datei: /etc/dnrd/master
domain tolledomain
192.168.0.1 router
192.168.0.2 name1
192.168.0.3 name2
192.168.0.4 name3

Dabei kann man auch gleich unliebsame domains blockieren, z.B.:

Datei: /etc/dnrd/blacklist
google-analytics.com
www.google-analytics.com

Die Clients geben dann einfach den Router als DNS-Server an. Im Fall von DHCP muß das in der Konfiguration entsprechend angegeben werden.

[Bearbeiten] Überbrückung von LAN und WLAN

Unter Umständen müssen noch die Netzwerkkarten (ath0 und eth0) überbrückt werden. Das ist der Fall wenn es nicht ausreicht auschließlich das IP-Protokoll zu routen, also Netzwerkprotokolle wie NetBIOS oder IPX/SPX eingesetzt werden. Im allgemeinen kann man sagen, daß dies benötigt wird, wenn:

  • Rechner auch per Kabel angeschlossen sind und alle sich in der Samba-Netzwerkumgebung finden sollen oder Spiele gespielt werden, die die Teilnehmer über Netzwerkbroadcasts finden.
  • Ein Sambaserver auf dem dem Router betrieben wird, die Freigaben automatisch gefunden werden sollen und ein Zwang besteht den Sambaserver auf eth0 zu betreiben.
  • OpenVPN mit tap-interface benutzt werden soll, also Netzverkehr über das VPN laufen soll, der vor der IP-Schicht kommt (SMB-Freigaben, Netzwerkspiele)

Diese Überbrückung benötigt noch das Kernelmodul bridge und net-misc/bridge-utils. Der entsprechende Abschnitt für eth0 und ath0 in der /etc/conf.d/net würde dann in etwa so aussehen:

depend_br0() {
   need net.eth0 net.ath0
}
config_eth0=( "null" )
config_ath0=( "null" )
bridge_br0="eth0 ath0"
config_br0=( "192.168.0.1 netmask 255.255.255.0" )

eth0 und ath0 sind dann auf Ethernetebene zu einer Netzwerkkarte verschmolzen, daher kommen auch alle Netzwerkbroadcats etc. an. Später in der Firewallkonfiguration braucht auch nur diese Netzwerkkarte beachtet zu werden. Siehe dazu: OpenVPN mit überbrückten Netzwerkkarten und HOWTO setup a gentoo bridge und HOWTO Building a Wireless Access Point With Gentoo

[Bearbeiten] Firewall und Routing - Firehol

Als nächstes wird "firehol" als Firewall und Routingsoftware benötigt:

# emerge firehol

Firehol ist ein Wrapper-Script für iptables. Es läßt sich damit einfach und logisch eine iptables-Firewall aufbauen, ohne iptables zu kennen. Traffic-Shaping bedeutet, daß man den Netzverkehr in Prioritätsklassen einteilt. Dies ist für alle interessant, die eine begrenzte Hochladekapazität haben. Z.B. soll Counter-Strike auch noch mit gutem Ping laufen wenn mit Vollgas hochgeladen wird. Da die Klassifizierung des Netzverkehrs keine einfache Sache ist, und schon gar nicht über eine PPP-Verbindung, sind hier zwei Konfigurationen angeben, einmal nur das nötige Routing und einmal das volle Programm inklusive Erklärungen.

[Bearbeiten] firehol.conf

Einfach, nur das Routing:

Datei: /etc/firehol/firehol.conf
version 5

#Adreßraum des lokalen Netzes (192.168.*.*)
home_ips="192.168.0.0/16"

#Innenseite des Netzwerks
interface ath0 home src "${home_ips}"
policy reject
server all accept
client all accept

#Außenseite des Netzwerks
interface ppp0 internet src not "${home_ips} ${UNROUTABLE_IPS}"
protection full
client all accept

#Das innere Netzwerk ins Äußere routen
router home2internet inface ath0 outface ppp0
masquerade
route all accept
 


Hier ist die komplette Konfiguration einschließlich Erklärungen:

Datei: /etc/firehol/firehol.conf
version 5

#Firehol verwirft und loggt alle Pakete, die in keine Regel passen, bzw. in eine der "protection"-Regeln fallen
#iptables loggt standardmäßig nach /var/log/messages, daher kann das ziemlich zumüllen.
#Um diese Einträge später nach /var/log/firehol.log zu loggen, legen wir zur Identifizierung ein Prefix fest:
FIREHOL_LOG_PREFIX="Firehol: "

#Beim Blocken an den Proxy denken: ist ein upstream-proxy definiert, kann trotzdem auf die IPs
#zugegriffen werden.
#Vorsicht wenn Namen statt IP-Adressen angegeben werden: Firehol startet nicht, 
#wenn die Namen nicht aufgelöst werden können. Bei Einwählverbindungen also besser nicht machen.
#blacklist full "google-analytics.com www.google-analytics.com newsticker.save.tv newsticker.shortnews.de"

home_ips="192.168.0.0/16"
#home_ips="192.168.0.1 192.168.0.20 192.168.1.1 192.168.0.30 192.168.0.5"

#man kann in firehol "Dienste" konfigurieren, die dann später verwendet werden können
#der Dienst "mldonkey" hat in diesem Fall drei eingehende ports, kann nach außen hin jeden port benutzen
server_mldonkey_ports="tcp/4000 tcp/4080 tcp/4001"
client_mldonkey_ports="default"
server_p2p_ports="tcp/50060:50080 udp/50060:50080"
client_p2p_ports="default"
server_udpecho_ports="udp/echo"
client_udpecho_ports="default"
#Bestimmung der Ports die an eine interne Adresse weitergeleitet werden sollen (port-forwarding)
#Unten nicht das umgekehrte Routing für diesen Dienst nicht vergessen!
server_weiterleitung_ports="tcp/50100:50110"
client_weiterleitung_ports="tcp/50100:50110"

#Bestimmung der Zieladresse für die Portweiterleitung inklusive Zielports
nat to-destination 192.168.0.20 inface ppp0 proto tcp dport 50100:50110

#nur die MAC-Adresse 00:14:D1:00:7A:51 darf 192.168.0.20 haben
#mac 192.168.0.20 00:14:D1:00:7A:51

#Traffic-Klassifizierung:
#Für firehol (iptables?) gilt: Die erste Markierung, die ein Paket bekommt ist anscheinend die allein gültige!
#Daher werden erst die Pakete markiert, die immer Vorrang haben (also auch die von bösen Traffic-Erzeugern),
#danach werden die Prioritäten negativ absteigend verteilt
#POSTROUTING outface ppp+: Betrifft alles was den Router Richtung Internet verläßt
#OUTPUT: Betrifft alle Pakete, die lokal vom Router erzeugt werden
#FORWARD outface ppp+: Betrifft alle Pakete, die von Client-Rechnern ins Internet gerouted werden
#Dabei auch gleich den "type of service" setzen, nimm dscp, tos ist veraltet
#http://www.aarnet.edu.au/engineering/networkdesign/qos/precedence.html
#http://www.rhyshaden.com/qos.htm
#Für voip: EF: Expedited Forwarding, das beste was geht
#Für wow: AF21 (muß nicht superschnell sein, dafür sollen die pakete sicher ankommen)
#Für intaktive Sachen: AF41, für ACK nehmen wir mal AF31
#Für File-Sharing: AF13: langsam und hohe drop-Wahrscheinlichkeit, aber billig

#Bei Längenangaben beachten: Iptables sieht Paketgrößen folgendermaßen:
#udp over ethernet: ? bytes data + 8 bytes UDP header + 20 bytes IP header
#tcp over ethernet: ? bytes data + (optional 0-40bytes options) + 20 TCP header + 20 IP header
#bei tcpdump beachten: Die Angabe von "length" ist korrekt (ohne die 14 bytes MAC-header)
#bei wireshark ist die Länge aus dem "length"-Feld der IP-Schicht ablesbar

#Nützliche Tools zur Konfigurationshilfe und zum Testen:
#net-analyzer/tcpdump, net-analyzer/wireshark
#net-misc/iperf, net-misc/packETH, net-analyzer/nmap, net-analyzer/hping

#(dns-lookups, pings, ack-pakete)
#ACK-Pakete sind meist entweder 40 bytes lang oder 40 bytes + 12bytes timestamps
#Folgendes heißt: SYN,RST,URG müssen aus sein, ACK muß an sein, FIN und PSH ist egal:
mark 1 POSTROUTING proto tcp custom "--tcp-flags SYN,ACK,RST,URG ACK -m length --length 40" outface ppp0
dscp class AF32 POSTROUTING proto tcp custom "--tcp-flags SYN,ACK,RST,URG ACK -m length --length 40" outface ppp0
mark 1 POSTROUTING proto tcp custom "--tcp-flags SYN,ACK,RST,URG ACK -m length --length 52" outface ppp0
dscp class AF32 POSTROUTING proto tcp custom "--tcp-flags SYN,ACK,RST,URG ACK -m length --length 52" outface ppp0
#Verbindungsabbruch/-ablehnung
mark 1 POSTROUTING proto tcp custom "--tcp-flags ALL RST -m length --length 40" outface ppp0
mark 1 POSTROUTING proto udp dport domain custom "-m length --length :100" outface ppp0
dscp class AF31 POSTROUTING proto udp dport domain custom "-m length --length :100" outface ppp0
mark 1 POSTROUTING proto icmp custom "--icmp-type echo-request -m length --length :90" outface ppp0
mark 1 POSTROUTING proto icmp custom "--icmp-type echo-reply -m length --length :90" outface ppp0
#Zum Testen: udp-ping und tcp-ping auf dem echo-port
mark 1 POSTROUTING proto tcp sport echo custom "! --syn -m length --length 40" outface ppp0
mark 1 POSTROUTING proto tcp dport echo custom "--syn -m length --length 60" outface ppp0
mark 1 POSTROUTING proto icmp custom "--icmp-type port-unreachable -m length --length 57" outface ppp0
mark 1 POSTROUTING proto udp dport echo custom "-m state --state NEW -m length --length 29" outface ppp0

#Dann werden die bösen Traffic-Erzeuger der Klasse p2p zugeordnet
#-m owner kann nur bei OUTPUT matchen, da im POSTROUTING die Information, 
#wem das Paket gehört nicht mehr zur Verfügung steht
mark 3 OUTPUT user "p2p apache" outface ppp+
dscp class AF13 OUTPUT user "p2p apache" outface ppp+
#mark 3 FORWARD custom "-m ipp2p --ipp2p" proto tcp outface ppp+
#dscp class AF13 FORWARD custom "-m ipp2p --ipp2p" proto tcp outface ppp+
#mark 3 FORWARD custom "-m layer7 --l7proto bittorrent" proto tcp outface ppp+
#dscp class AF13 FORWARD custom "-m layer7 --l7proto bittorrent" proto tcp outface ppp+
#mark 3 FORWARD custom "-m layer7 --l7proto gnutella" outface ppp+
#dscp class AF13 FORWARD custom "-m layer7 --l7proto gnutella" outface ppp+
#mark 3 FORWARD custom "-m layer7 --l7proto edonkey" outface ppp+
#dscp class AF13 FORWARD custom "-m layer7 --l7proto edonkey" outface ppp+
#mark 3 FORWARD custom "-m layer7 --l7proto fasttrack" outface ppp+
#dscp class AF13 FORWARD custom "-m layer7 --l7proto fasttrack" outface ppp+

#nachdem die bösen Traffic-Erzeuger aussortiert worden sind, setzen wir die Klasse hohe Priorität:
#Anfragen an http, ftp, email, aber auch gesendete Kommunikation (jabber,icq,msn,world of warcraft...)
mark 2 POSTROUTING proto tcp dport "ftp http aol ircd 1863 xmpp-client 5050 blizwow smtp pop3 imaps"\
        outface ppp+
dscp class AF22 POSTROUTING proto tcp dport "ftp http aol ircd 1863 xmpp-client 5050 blizwow smtp pop3 imaps"\
        outface ppp+

#sftp und scp hat den Type of Service 16 (interaktiv) nicht gesetzt:
mark 2 POSTROUTING proto tcp dport ssh tos not 16 outface ppp+
mark 2 POSTROUTING proto tcp sport ssh tos not 16 outface ppp+

#Zum Schluß holen wir die höchste Priorität hervor:
#udp-traffic (voip,dns,online-spiele) (Klasse "Interaktiv")
#half-life:
#mark 1 FORWARD proto udp dport "27000:27030" custom "-m length --length :100" outface ppp0
#dscp class AF41 FORWARD proto udp dport "27000:27030" custom "-m length --length :100" outface ppp0
#interaktives ssh hat tos 16, sftp hat das nicht
mark 1 POSTROUTING proto tcp sport ssh tos 16 outface ppp+
dscp class AF41 POSTROUTING proto tcp sport ssh tos 16 outface ppp+
mark 1 POSTROUTING proto tcp dport ssh tos 16 outface ppp+
dscp class AF41 POSTROUTING proto tcp dport ssh tos 16 outface ppp+
#sipgate (man kann auch anhand der Länge klassifizieren, ist codec-abhängig->wireshark,nachgucken)
#mark 1 POSTROUTING proto udp dst 217.10.79.0/24 outface ppp+
#dscp class EF POSTROUTING proto udp dst 217.10.79.0/24 outface ppp+
#teamspeak-server
#mark 1 OUTPUT proto udp user teamspeak2 outface ppp+
#dscp class EF POSTROUTING proto udp user teamspeak2 outface ppp+
#mark 1 FORWARD proto udp dport "8767 10010" outface ppp+
#dscp class EF POSTROUTING proto udp dport "8767 10010" outface ppp+
#mark 1 FORWARD custom "-m layer7 --l7proto skypetoskype" outface ppp+
#dscp class AF41 FORWARD custom "-m layer7 --l7proto skypetoskype" outface ppp+

#Innenseite des Netzwerks 
interface ath0 home src "${home_ips}"
#erstmal alles ablehnen 
policy reject
#dann die erlaubten Dienste freischalten
server "samba squid http ssh icmp https mldonkey" accept
#Ins innere Netz darf der Router alles
client all accept

#Außenseite des Netzwerks
interface ppp0 internet src not "${home_ips} ${UNROUTABLE_IPS}"
#Verbindungsanfragen nicht rejecten, sondern einfach nicht drauf antworten
#strong: alle protections an, 10 Anfragen pro Sekunde zulassen, burst: 10
#protection strong 10/sec 10
protection full
server "http https ssh p2p echo udpecho ping" accept
#ident aber sofort rejecten, sonst dauert der connect zu irc-server zu lange
server ident reject with tcp-reset
#Spezialbehandlung: user wow darf nur bestimmte wow-server connecten um den Mißbrauch
#des socks-proxys für wow zu verhindern
#server "wow" drop
#client all accept user not "wow" 
#client "wow" accept user "wow" dst "eu.logon.worldofwarcraft.com 80.239.149.115"
client all accept

#Das innere Netzwerk ins Äußere routen
router home2internet inface ath0 outface ppp0
masquerade
route all accept

#Die Portweiterleitung von oben ins innere Netz routen 
router internet2home inface ppp0 outface ath0
server weiterleitung accept
client weiterleitung accept

 


Die Firewall sollte vorher getestet werden, damit man sich nicht aus Versehen selber ausperrt:

# /etc/init.d/firehol try

[Bearbeiten] Loggen

Will man die anfallenden Logeinträge nicht in /var/log/messages haben, sondern in /var/log/firehol.log sind noch Änderungen an der /etc/syslog-ng.conf nötig. Folgendes nach "source", aber vor "destination messages { file("/var/log/messages"); };" eintragen:

Datei: /etc/syslog-ng.conf
#firehol nach /var/log/firehol.log loggen:
filter firehol_filter { match("^Firehol: .*"); };
destination d_firehol {file ("/var/log/firehol.log"); };
log {
   source(src);
   #bei hardened-Profil:
   #source(kernsrc);
   filter(firehol_filter);
   destination(d_firehol);
   #Weitere Bearbeitung von diesen logs beenden (soll ja nicht in messages erscheinen)
   flags(final);
};
 
# /etc/init.d/syslog-ng restart

Damit firehol.log auch rotiert wird, sollte man /etc/logrotate.d/syslog-ng anpassen:

Datei: Änderungen an /etc/logrotate.d/syslog-ng
/var/log/messages /var/log/firehol.log { 


[Bearbeiten] Klassifizierung des Netzverkehrs

Der Befehl tc ("traffic control") ist in der Lage bestimmten Trafficarten Prioritäten zuzuordnen. Er wird die oben definierten Markierungen bearbeiten.

[Bearbeiten] tc-script

Datei: /usr/local/sbin/tc-script
#!/bin/bash
DEV=ppp0
# http://tldp.org/HOWTO/ADSL-Bandwidth-Management-HOWTO/implementation.html
# vorher testen, ob die angegebene Uploadrate überhaupt erreichbar ist (geht der Ping hoch?)
# z.B. mit: net-misc/iperf
# auschlaggebend sollte der tcp-verkehr sein, da dort der overhead am größten ist
UPRATE=840 #ca. 80% von max 
DOWNRATE=12000
#erstmal alle tc-regeln löschen
tc qdisc del dev $DEV root 2> /dev/null > /dev/null
tc qdisc del dev $DEV ingress 2> /dev/null > /dev/null
tc qdisc del dev $DEV egress 2> /dev/null > /dev/null

# das oft verwendete htb ist zu langsam für Voip und FPS-Spiele, daher hfsc
# http://klaus.geekserver.net/hfsc/hfsc.html
# root qdisc anlegen
tc qdisc add dev $DEV root handle 1:0 hfsc default 12
# Hauptklasse
tc class add dev $DEV parent 1:0 classid 1:1 hfsc sc rate ${UPRATE}kbit ul rate ${UPRATE}kbit
# Unterklasse "Interaktiv": 10/20 der Bandbreite (50%), höchste Priorität, geringste Latenz
tc class add dev $DEV parent 1:1 classid 1:10 hfsc sc umax 1500b dmax 30ms rate $[10*UPRATE/20]kbit ul rate ${UPRATE}kbit
# Unterklasse "Hohe Priorität": 6/20 der Bandbreite (30%)
tc class add dev $DEV parent 1:1 classid 1:11 hfsc sc rate $[6*${UPRATE}/20]kbit ul rate ${UPRATE}kbit
# Unterklasse "Sonstiges": 3/20 der Bandbreite (15%)
tc class add dev $DEV parent 1:1 classid 1:12 hfsc sc rate $[3*UPRATE/20]kbit ul rate $[3*UPRATE/20]kbit
# Unterklasse "File sharing" 1/20 der Bandbreite (5%)
tc class add dev $DEV parent 1:1 classid 1:13 hfsc sc rate $[1*UPRATE/20]kbit ul rate ${UPRATE}kbit

# Innerhalb der Klassen soll gleichberechtigung herrschen, da die Gleichberechtigungsfunktion auch nicht perfekt ist,
# wird die auch noch alle 10s geändert (perturb)
tc qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10
tc qdisc add dev $DEV parent 1:11 handle 11: sfq perturb 10
tc qdisc add dev $DEV parent 1:12 handle 12: sfq perturb 10
tc qdisc add dev $DEV parent 1:13 handle 13: sfq perturb 10

# Eingehender Verkehr, wird unten weiter behandelt
tc qdisc add dev $DEV handle ffff: ingress

#Jetzt kommt die Verteilung der oben markierten Pakete in die einzelnen Klassen
#erstmal alles in die "Sonstiges"-Klasse
tc filter add dev $DEV parent 1:0 prio 2 protocol ip handle 12 fw flowid 1:12
#aber mit 1 markierte Pakete in die Klasse "Interaktiv"
tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 1 fw flowid 1:10
#und mit 2 markierte Pakete in die Klasse "Hoch"
tc filter add dev $DEV parent 1:0 prio 1 protocol ip handle 2 fw flowid 1:11
#und mit 3 Markierte Pakete in die Klasse "file sharing"
tc filter add dev $DEV parent 1:0 prio 3 protocol ip handle 3 fw flowid 1:13
# Den eingehenden Verkehr drosseln (sonst wird Voip bei schnellen Downloads beeinträchtigt)
# http://www.ip-phone-forum.de/archive/index.php/t-64990.html
tc filter add dev $DEV parent ffff: protocol ip prio 50 u32 match ip src \
0.0.0.0/0 police rate ${DOWNRATE}kbit burst 13k drop flowid :1
 


# chmod +x /usr/local/sbin/tc-script
# tc-script

tc-script nach jedem Neustart der ppp-Verbindung ausführen:

Datei: Änderungen an /etc/conf.d/net
postup() {
        if [ "$IFACE" == "ppp0" ]
        then
                /usr/local/sbin/tc-script
                #dyndns-Update:
                #/usr/bin/updatedd-wrapper -y
        fi
}
 


[Bearbeiten] Ebene-7-Filter

Wer kein Filesharing betreibt bzw. dieses nur auf dem Router tut, ist jetzt fertig. Wenn die Clientrecher File-Sharing betreiben, kommt man nicht um einen Ebene-7-Filter herum. D.h. es muß in jede zustandekommende, vom Router weitergeleitete Verbindung, hineingeguckt werden und nach p2p-Eigenschaften gesucht werden. Es gibt ipp2p und l7-filter.

# emerge ipp2p

oder

# euse --enable l7filter
# emerge --oneshot iptables l7-filter

Da l7-filter ein Kernel-Patch ist, muß im kernel "Layer 7 match support" als Modul aktiviert werden. Er funktioniert auch nicht mit jedem gentoo-kernel, im Zweifel einen vanilla-kernel nehmen. Jetzt muß noch der entsprechende mark-Eintrag in der firehol.conf aktiviert werden. "make && make modules_install" und firehol neustarten nicht vergessen. ipp2p funktioniert nur mit iptables <1.3.6 und dann auch nicht richtig. l7-filter scheint dagegen recht zuverlässig zu sein:

# iptables -t mangle -L -n -v -x
Chain FORWARD (policy ACCEPT 46864 packets, 24675395 bytes)
   pkts      bytes target     prot opt in     out     source               destination         
     33     4205 mark.17    tcp  --  *      ppp+    0.0.0.0/0            0.0.0.0/0           ipp2p v0.8.2 --bit 
  22948 15736947 mark.18    tcp  --  *      ppp+    0.0.0.0/0            0.0.0.0/0           LAYER7 l7proto bittorrent 

Hinweis: Zum Testen muß die File-Sharing-Software neugestartet werden, da nur neue Verbindungen erfasst werden, nicht schon bestehende!

--Mattenklicker 09:40, 14. Sep 2006 (UTC)

'Persönliche Werkzeuge