# zeitliches Volumen für Internetzugang festlegen [solved]

## slick

Ich tüftel schon einige Zeit an einer Lösung wie man es schafft einer IP/MAC aus dem LAN nur eine bestimmte Surfzeit zu ermöglichen. Also wie eine Kindersicherung. Und zwar nicht nach festen Zeiten, (das wäre ja viel zu einfach  :Wink:  ) sondern einem Gesamtlimit je Tag oder Woche. Also z.B. jeden Tag max. 4 Stunden Internet. Ob nun am Stück oder gestückelt sei erstmal egal. Ideal wäre natürlich stückelbar.

Die Idee die ich hatte wäre ein Cronjob der einen minütlichen Ping auf das betreffende Gerät absetzt. Ist es pingbar, wird per iptables die Verbindung freigegeben und ein Zähler läuft los. Jede weitere Minuten wird nun verglichen ob das Limit voll ist und ggf. per iptables die Verbindung wieder abgedreht. Klingt auf den ersten Blick trivial, wird aber schnell komplex wenn man das in Ruhe durchdenkt.

Hat jemand ein anderer/bessere Idee? Bin doch bestimmt nicht der Erste mit dem Bedarf dazu.  

Als Ideallösung schwebt mir was mit -m recent vor, evt. verschachtelt in mehreren Regeln.Last edited by slick on Thu Jan 10, 2013 3:58 pm; edited 1 time in total

----------

## bell

Ich würde da eher den Squid-Ansatz verfolgen, so dass die Kids nur über Proxy ins Internet dürfen. http://www.squid-cache.org/mail-archive/squid-dev/201104/0009.html Ein Zusatz-Nutzen ist dass man mit Squid dann auch bestimmte Seiten blocken kann.

----------

## slick

Wenns fürs reine Websurfen wäre ok, aber es geht auch um z.B. die Playstation. Die braucht bissl mehr als http.

----------

## papahuhn

Hi,

was hälst Du denn davon:

-A FORWARD -s 1.2.3.4 -m recent --name surf --rcheck --seconds 60 -j ACCEPT

-A FORWARD -s 1.2.3.4 -m limit --limit 240/day --limit-burst 240 -m recent --name surf --set -j ACCEPT

-A FORWARD -s 1.2.3.4 -j REJECT

Idee:

Die zweite Regel öffnet (mittels -m recent --set) bis zu 240 Zeitfenster pro Tag (mittels -m limit), in denen 60 Sekunden lang Pakete durchgelassen werden (erste Regel). Auf die Art hat man durchschnittlich bis 240*60 Sekunden = 4 Stunden Internetzugang täglich. Die erste Regel bestimmt damit die Zeitgranularität, in der die Internetnutzung abgerechnet wird.

Anmerkungen:

- Durch das limit-burst können die 4 Stunden zu Anfang in einem Stück verbraucht werden. Danach ist aber nicht unbedingt 20 Stunden Pause. Da sich der limit Bucket alle 6 Minuten um ein Token füllt, kann auch alle 6 Minuten ein 1-Minuten-Zeitfenster geöffnet werden - oder auch mehrere, wenn man länger wartet.

- Langlebige TCP Verbindungen können die REJECTs der dritten Regel überleben, wenn das REJECT-Zeitfenster nicht allzu lang ist. Mit --reject-with tcp-reset kannst Du das aber den Verbindungsschluss erzwingen.

- Unter Nutzung von hashlimit ließe sich wahrscheinlich das -s loswerden.

Grüße

----------

## slick

Gefällt mir sehr gut.  :Smile:   Allerdings habe ich noch ein paar (Verständnis-) Fragen dazu.

1) Die Regeln gehen nach meinem Verständnis davon aus die Default-Policy wäre DROP. Wie müßte man das negieren wenn die Default-Policy ACCEPT wäre?

2) Aktuell bräuchte man den Router nur kurz resetten und hätte dann wieder volle 4h. Was könnte man tun um nach dem initialen Durchlauf des Regel-Scripts erst eine gewisse Wartezeit (z.B. 12h) einzufügen bevor das erste Zeitfenster aufgemacht werden kann?

3) Ich kapiere das limit-burst leider nicht. Wenn ich jetzt z.B. 5h am Tage konfigurieren möchte macht das ein limit von  --limit 300/day. Wie ändert sich dann --limit-burst? Auch 300?

4) Um das ganze MAC basierend zu machen, könnte ich die Regeln direkt mit -m mac kombinieren oder empfielt sich besser ein eigener Regelsatz in den "umgelenkt" wird? z.B. (ungetestet):

```

-N TIMELIMIT

-A TIMELIMIT -m recent --name surf --rcheck --seconds 60 -j ACCEPT

-A TIMELIMIT -m limit --limit 240/day --limit-burst 240 -m recent --name surf --set -j ACCEPT

-A TIMELIMIT -j REJECT

-A FORWARD -m mac -mac-source 00:11:22:33:44:55 -j TIMELIMIT
```

5) Wie müßte ich obigen Regelsatz so abändern das er erstmal nur komplett geloggt wird (z.B. minütlich OK oder GESPERRT) statt wirklich zu begrenzen um zu beobachten das es auch so tut wie es soll.

----------

## papahuhn

Hi,

1) die Regeln gehen von einer ACCEPT-Policy aus, deswegen das REJECT ganz am Ende.

2-3) Unten folgt ein Beispiel ohne -m limit, mit initialer Wartezeit.

4) MAC-basierend geht zunächst mal nicht, da -m recent mit IPs arbeitet. Du müsstest vorfiltern, dass eine IP-Adresse nicht von einer "illegalen" MAC genutzt wird.

```
modprobe xt_recent ip_pkt_list_tot=255

-N setwait

-A setwait -s 1.2.3.4 -m recent --name setwait --set

-A setwait -s 1.2.3.4 -m recent --name waiting --set -j REJECT

-A FORWARD -s 1.2.3.4 -m recent --name setwait ! --rcheck -j setwait

-A FORWARD -s 1.2.3.4 -m recent --name waiting --rcheck --seconds 43200 -j REJECT

-A FORWARD -s 1.2.3.4 -m recent --name surf --rcheck --seconds 60 -j ACCEPT

-A FORWARD -s 1.2.3.4 -m recent --name surf --rcheck --hitcount 240 --seconds 86400 -j REJECT

-A FORWARD -s 1.2.3.4 -m recent --name surf --set -j ACCEPT
```

- Das modprobe ist notwendig, damit man hitcounts > 20 nutzen kann.

- Die setwait Chain, sowie die recent-Namen setwait und waiting sind für die initialen 12 Stunden Wartezeit. Das Dumme ist hier allerdings, dass das Wartefenster von dem zu regulierenden System (1.2.3.4) gestartet werden muss. Eine Kopplungsmöglichkeit an die Uptime des Routers ist mir ohne Skripting nicht bekannt. 

- Die letzten drei Regeln erlauben 240 60-Sekunden-Surffenster in den zurückliegenden 24 Stunden. Wenn Du 5 Stunden pro Tag erlauben willst, wirst Du mit dem 255 Modprobe Limit nicht auskommen (mehr geht nicht). Stattdessen musst du die Granularität runterdrehen, was ich sowieso für angebracht halte. Während ich diesen Beitrag verfasse, gibt es ja keine Internetaktivität, aber dennoch surfe ich ja im Internet. Eine Granularität von 5 oder 10 Minuten kann das besser abdecken als 60-Sekunden Fenster.

Testregeln könnten so aussehen:

```
-A setwait -s 1.2.3.4 -m recent --name setwait --set -j LOG --log-prefix "Set wait timer (1/2) "

-A setwait -s 1.2.3.4 -m recent --name waiting --set -j LOG --log-prefix "Set wait timer (2/2) "

-A setwait -s 1.2.3.4 -j ACCEPT

-A FORWARD -s 1.2.3.4 -m recent --name setwait ! --rcheck -j setwait

-A FORWARD -s 1.2.3.4 -m recent --name waiting --rcheck --seconds 43200 -j LOG --log-prefix "Reject during init wait "

-A FORWARD -s 1.2.3.4 -m recent --name waiting --rcheck --seconds 43200 -j ACCEPT

-A FORWARD -s 1.2.3.4 -m recent --name surf --rcheck --seconds 60 -m limit --limit 1/second -j LOG --log-prefix "Accepting in current timeslice "

-A FORWARD -s 1.2.3.4 -m recent --name surf --rcheck --seconds 60 -j ACCEPT

-A FORWARD -s 1.2.3.4 -m recent --name surf --rcheck --hitcount 240 --seconds 86400 -m limit --limit 1/second -j LOG --log-prefix "No timeslices left, rejecting "

-A FORWARD -s 1.2.3.4 -m recent --name surf --rcheck --hitcount 240 --seconds 86400 -j ACCEPT

-A FORWARD -s 1.2.3.4 -m recent --name surf --set -j LOG --log-prefix "Opening new timeslice "

-A FORWARD -s 1.2.3.4 -m recent --name surf --set -j ACCEPT
```

Grüße

----------

## slick

Fein fein. Nochmal Danke. Für das Sicherstellen das auf der MAC die korrekte IP verwendet wird, nutze ich folgende Regel:

```
-A FORWARD -m mac --mac-source $MAC ! -s $IP -j REJECT
```

----------

## slick

Ich habe nochmal darüber nachgedacht und evt. gibt es noch eine Verbesserungsmöglichkeit, zumindest für die Praxis, da nicht zwangsläufig 24h einen Tag bedeuten  :Wink: 

Also nach meinem Verständnis funktioniert es doch so (ggf. korrigiert mich bitte). (Ich vernachläßige jetzt die initiale Wartezeit) 

Ich beginne um sagen wir 15 Uhr online zu spielen und spiele die 4h am Stück durch (jede Minute wurde auch min. ein Paket gesendet). Nun kann ich also frühestens 24h später, also am nächsten Tag um 15 Uhr wieder beginnen online zu spielen. Korrekt?

D.h. möchte ich am nächsten Tag jedoch 14 Uhr beginnen, müßte ich entweder am Vortag auch 14 Uhr beginnen und 4h spielen oder aber 15 Uhr beginnen und darf dann aber nur 3 Stunden spielen. Korrekt?

D.h. das Kontingent von 4h auf 24h ist in der Praxis ungünstig gewählt. Besser wäre hier ein Ansatz von z.B. 4h je 16h, da der normale Mensch ca. 8h schlafen würde und ich die "abziehen" könnte. Damit wäre man in der Verschiebung des Spielbeginnzeitpunktes (je Tag) deutlich flexibler. Das würde allerdings auch bedeuten, wenn ich wirklich die 24h eines Tages voll ausnutzen würde, könnte ich theoretisch max. 2x4h innerhalb 24h, also eines Tages spielen.

Was haltet ihr davon?

----------

## papahuhn

Du kannst um Mitternacht die Regeln flushen und neu einspielen, dann hast Du harte Tagesgrenzen und einen flexiblen Spielbeginn.

----------

## Jean-Paul

Stell doch den Minutenzähler um 00:00h wieder auf Null, dann hast du immer die vollen 24h.

Dazu brauchst du eine Datei in der das Datum und der Zähler steht.

Startest du den PC zu einem beliebigen Zeitpunkt, vergleicht dein cron-script das aktuelle Datum mit dem Eintrag in der Datei. Ist das Datum von gestern, wird das neue Datum gesetzt und der Zähler auf Null gestellt. Das verhindert, dass nach einem reboot - am selben Tag - der Zähler auf Null geht und du kannst dein Kontigent beliebig stückeln.

Interessant wird es dann natürlich an der Schnittstelle. 

Du kannst von 20:00h - 24:00h dein Kontingent für heute verbrauchen und weil dein script um 00:00h den Zähler auf Null gestellt hat, bis morgens früh um 04:00h weiter spielen   :Confused: 

EDIT: ja, zu lang gebraucht zum Schreiben   :Very Happy: 

----------

## slick

 *Jean-Paul wrote:*   

> Interessant wird es dann natürlich an der Schnittstelle. 
> 
> Du kannst von 20:00h - 24:00h dein Kontingent für heute verbrauchen und weil dein script um 00:00h den Zähler auf Null gestellt hat, bis morgens früh um 04:00h weiter spielen  

 

Und es hat noch einen Nachteil... da man ja jederzeit mitten im Spiel sein könnte (z.B. 22-2 Uhr) wäre zu einem Zeitpunkt dazwischen das Rücksetzen des Counters unschön. Ich finde die 16h Lösung schicker als einen Zeitpunkt für das tägliche Rücksetzen finden zu müssen. Und es gibt eine schöne Zwangspause von min. 12h.

Wie könnte man eigentlich eine Regeln einzeln zurücksetzen ohne das gesamte iptables-Script zu reseten?

----------

## Jean-Paul

 *slick wrote:*   

> Und es gibt eine schöne Zwangspause von min. 12h.

 

Es gibt wenig Leute die so hart zu sich selbst sind.   :Very Happy: 

Zu den iptables kann ich leider nichts beitragen, da verstehe ich nichts von.

----------

## slick

 *Jean-Paul wrote:*   

> Es gibt wenig Leute die so hart zu sich selbst sind.  

 

Zum Glück ist das nicht meine Spielzeit. Ich unterstütze da nur, Stichwort Teenager.

Ich habe da noch eine Verständnisfrage zu dem recent-Modul. Wenn ich mir jetzt die Counter ansehe, sieht das wie folgt aus:

```
# cat /proc/net/xt_recent/surf 

src=192.168.1.74 ttl: 64 last_seen: 2967520 oldest_pkt: 168 4294913914, 4294931938, 4294949939, 651, 18653, 36658, 54659, 73269, 91283, 109294, 127305, 145309, 163318, 181320, 199322, 217333, 235335, 253997, 272178, 291849, 310944, 330944, 348961, 366970, 384977, 402979, 420986, 438990, 456994, 475000, 493114, 511204, 529207, 547259, 565402, 583423, 602450, 620454, 638456, 656462, 674465, 692467, 710577, 728610, 746636, 764640, 782646, 800649, 818656, 836667, 854675, 872676, 890683, 908685, 926811, 944818, 962829, 980835, 998840, 1016842, 1034845, 1052847, 1070849, 1088851, 1106858, 1124883, 1142892, 1160899, 1178901, 1196903, 1214905, 1232912, 1250920, 1268926, 1286936, 1304944, 1322947, 1341091, 1359236, 1377322, 1395989, 1413998, 1432002, 1450007, 1468011, 1486138, 1504515, 1522522, 1540527, 1558534, 1576541, 1594545, 1612550, 1630558, 1648559, 1666565, 1684568, 1703031, 1721041, 1739060, 1757096, 1775167, 1793171, 1811178, 1829185, 1847186, 1865223, 1883224, 1901225, 1919226, 1937227, 1955230, 1973239, 1991243, 2009246, 2027258, 2045262, 2063265, 2081274, 2099279, 2117287, 2135289, 2153296, 2171299, 2189357, 2207385, 2225395, 2243398, 2261403, 2279410, 2297412, 2315413, 2333446, 2351501, 2369512, 2387515, 2405524, 2423531, 2441539, 2460133, 2478160, 2496169, 2514171, 2532173, 2550180, 2568187, 2586191, 2604192, 2622198, 2640200, 2658201, 2676262, 2694266, 2712268, 2730270, 2748277, 2766282, 2784292, 2802388, 2820822, 2838832, 2859431, 2877447, 2895464, 2913481, 2931498, 2949509, 2967520
```

D.h. ich kann die aktuellen Hits sehen und deren Gesamtzahl (hier 168). Bei 60s je Hit macht das 168 Minuten. D.h. wenn dieser Wert  = 240 ist, wird gesperrt? Korrekt? Und der Counter wird mit der Zeit von allein wieder kleiner oder wie läuft das?

Hintergrund: Es ist ziemlich tricky dem Teenager zu erklären wieviel Spielzeit er noch hat, insbesondere wenn er seine Spielzeit nicht am Stück nutzt. Also würde ich auf eine Mini-Website einen Verbrauchsbalken darstellen wollen. Dafür würde ich dann diesen Wert aus proc heranziehen, da dieser (meinem Verständnis nach) die genutzte Zeit in in den letzten 16h gut wiedergibt und damit errechenbar ist wieviel aktuell noch zur Verfügung steht. Spricht da was dagegen?

Nachtrag: Das heißt, gemäß der Ausgabe oben, hätte man noch 240-168 = 72min Spielzeit aktuell (am Stück) noch zur Verfügung ungeachtet dessen wie diese 168 verbrauchten zuvor entstanden sind (am Stück oder in Teilen?)

----------

## fuchur

 *slick wrote:*   

>  *Jean-Paul wrote:*   Es gibt wenig Leute die so hart zu sich selbst sind.   
> 
> Zum Glück ist das nicht meine Spielzeit. Ich unterstütze da nur, Stichwort Teenager.
> 
> ...
> ...

 

Lol. Was ein Glück das man für Kindererziehung keine Führerschein brauch, der dann natürlich auch nicht abgenommen werden kann.

Jetzt streng dich mal ein bisschen an, damit die Erziehungsgebrechlichen auch wenigstens ein bisschen "hip" rüber kommen solltest du

automatisch in viertelstündlichen Intervallen die Restzeit auf Facebook bekannt geben.

MfG

----------

## papahuhn

Der Counter wird nicht kleiner, die Zahlen entsprechen Zeitpunken, an denen das --set durchgegangen ist. Bei deinen jetzigen Regeln würde sich die Liste füllen, bis ip_pkt_list_tot erreicht ist. Ich würde daher vor die --hitcount Regel eine --reap Regel einfügen, die die Einträge außerhalb des 16h/24h Zeitfensters herauslöscht. Dann reicht es tatsächlich, die Anzahl der Einträge in der Liste auszulesen.

----------

## slick

 *papahuhn wrote:*   

> Ich würde daher vor die --hitcount Regel eine --reap Regel einfügen, die die Einträge außerhalb des 16h/24h Zeitfensters herauslöscht. 

 

Ich konnte keine Beispiel finden, nur die (mir nicht ausreichende) Info:

 *Quote:*   

>        --reap reap
> 
>               This  option  can  only  be  used in conjunction with --seconds.
> 
>               When used, this will cause entries older then  'seconds'  to  be
> ...

 

Könntest mir bitte das zu oben passende Beispiel geben wie ich das richtig einsetze?

----------

## papahuhn

```
-A FORWARD -s 1.2.3.4 -m recent --name surf --rcheck --hitcount 240 --seconds 86400 -j REJECT
```

 austauschen durch

```
-A FORWARD -s 1.2.3.4 -m recent --name surf --rcheck --hitcount 240 --seconds 86400 --reap -j REJECT
```

.

Es kann sein, dass Du so wie ich folgenden Fehler gemeldet bekommst:

iptables v1.4.16.3: unknown option "--reap".

Sag bescheid, falls ja. Ich geh erstmal ins Bett.

----------

## Finswimmer

 *slick wrote:*   

>  *Jean-Paul wrote:*   Interessant wird es dann natürlich an der Schnittstelle. 
> 
> Du kannst von 20:00h - 24:00h dein Kontingent für heute verbrauchen und weil dein script um 00:00h den Zähler auf Null gestellt hat, bis morgens früh um 04:00h weiter spielen   
> 
> Und es hat noch einen Nachteil... da man ja jederzeit mitten im Spiel sein könnte (z.B. 22-2 Uhr) wäre zu einem Zeitpunkt dazwischen das Rücksetzen des Counters unschön. Ich finde die 16h Lösung schicker als einen Zeitpunkt für das tägliche Rücksetzen finden zu müssen. Und es gibt eine schöne Zwangspause von min. 12h.
> ...

 

Ist dafür nicht ein gleitender Zeitintervall der letzten 24 Stunden besser?

Damit wäre sichergestellt, dass er innerhalb der letzten 24 Stunden max 4 Stunden online ist, egal wie das aufgeteilt wird. Zudem ist es unabhängig vom Kalendertag.

----------

## slick

 *Finswimmer wrote:*   

> Ist dafür nicht ein gleitender Zeitintervall der letzten 24 Stunden besser?
> 
> Damit wäre sichergestellt, dass er innerhalb der letzten 24 Stunden max 4 Stunden online ist, egal wie das aufgeteilt wird. Zudem ist es unabhängig vom Kalendertag.

 

Wie ich oben erläuterte halte ich den 4h je 16h Ansatz für am praktischsten. Der Rest waren nur Verständnisfragen, für das "was wäre wenn".

----------

## slick

 *slick wrote:*   

> Also würde ich auf eine Mini-Website einen Verbrauchsbalken darstellen wollen. 

 

Vollständigkeitshalber hier das PHP-Script wie es jetzt hier auf dem Router zum Einsatz kommt. 

```
<?php

   $used=intval(exec("cat /proc/net/xt_recent/surf | grep -o 'oldest_pkt: [0-9]*' | cut -d ' ' -f 2"));

   $h=floor((240 - $used) / 60);

   $m=(240 - $used) % 60;

   $p=round(($used * 100) / 240); 

?><html>

<head>

<title></title>

<meta charset="utf-8" />

<meta http-equiv="cache-control" content="no-cache" />

<meta http-equiv="refresh" content="10; URL=." />

<style type="text/css"><!--

body { margin: 20%; background-color: #666; font-size: 1em; font-family: Arial }

.meter-wrap { position: relative; }

.meter-wrap, .meter-value, .meter-text { width: 100%; height: 2em; }

.meter-wrap, .meter-value { background: #693 top left no-repeat; }

.meter-text { position: absolute; top:0; left:0; padding-top: 0.5em; color: #fff; text-align: center; width: 100%; }

.meter-value { background-color: #900; }

--></style>

</head>

<body>

<div class="meter-wrap" style="border: 1px solid white; ">

    <div class="meter-value" style="width: <?php echo $p; ?>%;">

        <div class="meter-text">aktuell noch <?php echo $h; ?> Stunde<?php if ($h != 1) {echo 'n';} ?> und <?php echo $m; ?> Minute<?php if ($m != 1) {echo 'n';} ?></div>

    </div>

</div>

</body>

</html>
```

Last edited by slick on Wed Jan 02, 2013 9:04 pm; edited 2 times in total

----------

## slick

Könnte mir noch jemand erklären welche genaue Bedeutung die Zahlenwerte der einzelnen Hits in /proc/net/xt_recent/* haben. Also die lange Zahlenliste. Ich vermute einen Timer, aber wie und von wo aus gezählt?Last edited by slick on Wed Jan 02, 2013 8:30 pm; edited 1 time in total

----------

## papahuhn

Hat das --reap bei Dir geklappt?

Edit: Die Zahlen sind Kernel Jiffies, und hängen ab von der Kernel Tickrate. Dein System läuft mit 300Hz Tickrate, deshalb sind die Zahlenabstände bei Dir um die 18000. Beim Bootup fängt der Kernel mit einem Jiffie-Counter an, der nach 5 Minuten einen 32 bit Wraparound hat.

----------

## slick

 *papahuhn wrote:*   

> Hat das --reap bei Dir geklappt?

 

Jepp, keine Probleme. Werde ja sehen obs auch so tut wie es soll.

----------

## slick

Also das reap hat nichts bewirkt. (Der Befehl gab aber auch keinen Fehler aus, iptables v1.4.6) Der Counter ist bis 255 vollgelaufen und hat dann wieder bei 1 begonnen. Eine Ermittlung der Restzeit ist somit nicht möglich (es sei denn ich resete zu einem gewissen Zeitpunkt wie oben vorgeschlagen) Gemäß iptables -m recent -h gibt es die Option bei mir auch nicht.

----------

## papahuhn

Dann bleibt dir wohl nur die Möglichkeit manuell zu zählen. Die aktuellen jiffies sind in /proc/timer_list zu finden, deine Tickrate ist 300.

----------

## ChrisJumper

slick hier mal ein anderer Gedanke.

Was spricht denn dagegen das du zwei Tage zusammen fasst? Den Timer erst nach 48 Stunden zurücksetzt und oder noch am Montag um 0 Uhr?

das hat zwar die unbequeme Wahrheit das dein Teenie auch mal 8 Stunden am Stück, an einem Tag spielen kann. Aber dafür müsste er dann einen Tag auf das Internet verzichten. Das du dich um die Zeitgestaltung kümmern möchtest ist löblich. Aber ich würde es eiskalt so formulieren.

8 Stunden für 2 Tage fertig. Dann hast du auch das Problem nicht wenn es am Wochenende mal mehr ist. Konfliktpotential sehe ich hier nur wenn ein blöder Hintergrundprozess oder Virenscanner die wertvolle Online-Zeit verbraucht. Um das zu vermeiden würde ich vielleicht eher einen Lösung suchen, das hier eine gesonderte Verbindung aufgebaut werden muss, z.b. per VPN und andernfalls den Onlinezugang komplett deaktivieren.

Aber denke daran: Mobiltelefone können mittlerweile auch einfach als Accesspoint eingerichtet werden. Wlan benutzen ist auch nicht kompliziert.

----------

## feierabend

Finde ich eigentlich genial das sich mal jemand Gedanken darüber macht.

Würde es aber auch besser finden es pro Tag zu regeln.

Damit hat man einfach mehr Kontrolle und vermeidet auch das der Teeni den ganzen tag surft wenn er eigentlich Hausaufgaben machen sollte.

----------

## slick

Also ich habe es jetzt für mich passend gelöst. (Es soll eine Playstation limitiert werden, daher nicht nur http etc. sondern "alles") Hier nochmal alles zusammenfassend:

```
   /sbin/modprobe xt_recent ip_pkt_list_tot=255

   PS_MAC=00:11:22:33:44:55

   PS_IP=192.168.192.168

   /sbin/iptables -A FORWARD -m mac --mac-source ${PS_MAC} ! -s ${PS_IP} -j REJECT # sichergehen das nur dieses MAC-IP-Paar verwendet werden kann

   /sbin/iptables -N setwait 

   /sbin/iptables -A setwait -s ${PS_IP} -m recent --name setwait --set

   /sbin/iptables -A setwait -s ${PS_IP} -m recent --name waiting --set -j REJECT

   /sbin/iptables -A FORWARD -o ${RED_DEV} -s ${PS_IP} -m recent --name setwait ! --rcheck -j setwait 

   /sbin/iptables -A FORWARD -o ${RED_DEV} -s ${PS_IP} -m recent --name waiting --rcheck --seconds 43200 -j REJECT # Wartezeit nach "Routerreset" und darauffolgendem erstem Paket der PS ;)

   /sbin/iptables -A FORWARD -o ${RED_DEV} -s ${PS_IP} -m recent --name surf --rcheck --seconds 60 -j ACCEPT # Ticketgröße in Sekunden

   /sbin/iptables -A FORWARD -o ${RED_DEV} -s ${PS_IP} -m recent --name surf --rcheck --hitcount 240 --seconds 75600 -j REJECT # 240 Tickets (4h) in 16h zur Verfügung

   /sbin/iptables -A FORWARD -o ${RED_DEV} -s ${PS_IP} -m recent --name surf --set -j ACCEPT
```

Jeden Morgen um 6 Uhr wird per Cron der Counter wieder geleert und schwupp stehen wieder 240 Minuten zur Verfügung. 

```
0 6 * * *       echo / > /proc/net/xt_recent/surf
```

Da das WLAN hier im Schnitt Nachts von 23 bis 6 Uhr ausgeht ist das Zeitfenster fürs Spielen zusätzlich nochmal begrenzt und der Zeitpunkt 6 Uhr gut gewählt. 

Dazu ein Namebased Virtual Host der hier auf den Namen 'pst' hört (PlayStationTime) und eine index.php. Damit kann der Verbrauch komfortabel an der PS oder dem elterlichen Tablet im WLAN abgefragt werden (Webbrowser -> "http://pst") (Eintrag im lokalen DNS nicht vergessen etc)

```
<?php

        $used=intval(exec("cat /proc/net/xt_recent/surf | grep -o 'oldest_pkt: [0-9]*' | cut -d ' ' -f 2"));

        if ( $used > 240 ) { $used = 240; }

        $h=floor((240 - $used) / 60);

        $m=(240 - $used) % 60;

        $p=round(($used * 100) / 240);

?><html>

<head>

<title></title>

<meta charset="utf-8" />

<meta http-equiv="cache-control" content="no-cache" />

<meta http-equiv="refresh" content="10; URL=." />

<style type="text/css"><!--

body { margin: 20%; background-color: #444; font-size: 1em; font-family: Arial }

.meter-wrap { position: relative; }

.meter-wrap, .meter-value, .meter-text { width: 100%; height: 2em; }

.meter-wrap, .meter-value { background: #693 top left no-repeat; }

.meter-text { position: absolute; top:0; left:0; padding-top: 0.5em; color: #fff; text-align: center; width: 100%; }

.meter-value { background-color: #900; }

--></style>

</head>

<body>

<div class="meter-wrap" style="border: 1px solid white; ">

    <div class="meter-value" style="width: <?php echo $p; ?>%;">

        <div class="meter-text">aktuell noch <?php echo $h; ?> Stunde<?php if ($h != 1) {echo 'n';} ?> und <?php echo $m; ?> Minute<?php if ($m != 1) {echo 'n';} ?></div>

    </div>

</div>

</body>

</html>
```

Feedback seitens Eltern und Teenager ist grundsätzlich positiv. Teenager bemängelt zwar die grundsätzliche "wenige" Spielzeit, kann aber sich selbst über den Tag einteilen. Den Rest des Tages könnte er zwar offline spielen, aber das macht er erfahrungsgemäß nicht lange was zu einem zusätzlichem "Entwöhnungseffekt" führt.

Was man noch wissen sollte ... da die PS auch bei Offlinespielen gelegentlich "irgendwas" ins Netz senden will, führt auch Offlinespielen zu einem gewissen Verbrauch. Da so ein Request nur alle paar Minuten passiert (variiert evt. je nach Spiel) kann man grob von einem Verrbauchsfaktor von 1/3 bis 1/5 ausgehen. (z.B.  3h offline spielen verbraucht bis 1h Onlinezeit.) Für die Eltern ein netter Nebeneffekt  :Wink: 

----------

## l3u

Das soll dann der Apple-/M$-User mal nachmachen ;-)

Sehr interessant das Ganze! Ich hab zwar (noch) keine Kinder, aber die Thematik wird sicher in ein paar Jahren genauso aktuell sein, wie jetzt. Danke für die Zusammenfassung! Kann sicher der eine oder andere was damit anfangen.

----------

## SkaaliaN

Auch von mir ein herzliches Dankeschön!

Ich werde es auch bei uns testen / einsetzen. Unsere Tochter wirds zwar nicht freuen, besser ist es jedoch allemal  :Wink: 

----------

