contrib/package: rename config for p2pblock to freifunk_p2pblock
[project/luci.git] / contrib / package / freifunk-p2pblock / files / freifunk-p2pblock.init
1 #!/bin/sh /etc/rc.common
2
3 START=82
4 ME="freifunk-p2pblock"
5 LOCK='/var/run/p2pblock.lock'
6
7 # helper-scripts
8 ipt_add() {
9         logger -t "$ME" "set 'iptables -I $1'"
10         iptables -I $1
11         echo "iptables -D $1" >> $LOCK
12 }
13
14 start() {
15         if [ ! -s "$LOCK" ]; then
16                 logger -s -t "$ME" 'starting p2pblock...'
17                 
18                 config_load network
19                 config_get wan wan ifname
20                 config_load freifunk_p2pblock
21                 config_get layer7 p2pblock layer7
22                 config_get ipp2p p2pblock ipp2p
23                 config_get portrange p2pblock portrange
24                 config_get blocktime p2pblock blocktime
25
26                 # load modules
27                 insmod ipt_ipp2p 2>&-
28                 insmod ipt_layer7 2>&-
29                 insmod ipt_recent ip_list_tot=400 ip_pkt_list_tot=3 2>&-
30
31                 # create new p2p-chain
32                 iptables -N p2pblock
33                 # pipe all incomming FORWARD with source-/destination-port 1024-65535 throu p2p-chain 
34                 ipt_add "FORWARD -i $wan -p tcp --sport $portrange --dport $portrange -j p2pblock"
35                 ipt_add "FORWARD -i $wan -p udp --sport $portrange --dport $portrange -j p2pblock"
36
37                 # if p2p-traffic blocked 3 packages to a destination ip then block all traffic within the next 180 sec (port 1024-65535)
38                 ipt_add "p2pblock -m recent --rdest --rcheck --name P2PBLOCK --seconds $blocktime --hitcount 3 -j DROP"
39                 ipt_add "p2pblock -m recent --rdest --rcheck --name P2PBLOCK --seconds $blocktime --hitcount 3 -m limit --limit 1/minute -j LOG --log-prefix P2PBLOCK-DROP:"
40
41                 # create layer7-rules
42                 for proto in $layer7; do
43                         ipt_add "p2pblock -m layer7 --l7proto $proto -m recent --rdest --set --name P2PBLOCK"
44                         ipt_add "p2pblock -m layer7 --l7proto $proto -m limit --limit 1/minute -j LOG --log-prefix P2PBLOCK-seen-$proto:"
45                 done
46
47                 # create ipp2p-rules
48                 for proto in $ipp2p; do
49                         ipt_add "p2pblock -m ipp2p --$proto -m recent --rdest --set --name P2PBLOCK"
50                         ipt_add "p2pblock -m ipp2p --$proto -m limit --limit 1/minute -j LOG --log-prefix P2PBLOCK-seen-$proto:"
51                 done
52
53                 # insert whitelisted ips
54                 for ip in $WHITELIST; do
55                         ipt_add "p2pblock -d $ip -j RETURN"
56                 done
57
58                 logger -s -t "$ME" 'Done.'; return 0
59
60         else
61                 logger -s -t "$ME" 'WARNING! already running - Aborting!'; return 2
62
63         fi
64 }
65
66 stop() {
67         if [ -s "$LOCK" ]; then
68                 logger -s -t "$ME" 'stopping p2pblock...'
69
70                 # unset all rules in $LOCK-file
71                 cat $LOCK | sed -ne '1!G;h;$p' | while read line; do
72                         logger -t "$ME" "unset $line"
73                         while eval $line 2>&-; do :; done
74                 done; : > "$LOCK"
75
76                 # flush and delete the p2p-chain
77                 iptables -F p2pblock
78                 iptables -X p2pblock
79                 logger -s -t "$ME" 'Done.'; return 0
80
81         else
82                 logger -s -t "$ME" 'WARNING! not running - Aborting!'; return 2
83
84         fi
85 }
86
87 restart() {
88         stop; sleep 1; start
89 }