Bilgiler
Merhaba, Ziyaretçi. Lütfen giriş yapın veya üye olun.
Aktivasyon mailiniz gelmediyse buraya tıklayın.
25 Temmuz 2008
Saat: 22:57:31

Kullanıcı adınızı, parolanızı ve aktif kalma süresini giriniz
  Arama
  Istatistikler
40447 Mesaj 6914 Konu Gönderen: 513 Üye
Son üye: kamemel
  Kimler Online
  Siteler
  Linux Dünyasından
Lapis Wiki

Lapis Wiki


Lapis Wiki - Son değişiklikler [Tr]

Yapılan en son değişiklikleri bu sayfadan izleyin.

Son Mesajlar

Son Mesajlar
[DNS (Nameserver)] Dns hakkında kaynak :((( Gönderen: huseyin Bugün 19:36:43
[Debian / Knoppix ] Elimdeki Imajı Herhangi Bir Makineye Gönderen: LinuxDebian Bugün 17:06:25
[Debian / Knoppix ] Woody Sources.List Gönderen: LinuxDebian Bugün 17:05:39
[Debian / Knoppix ] İnternet'e bağlanmak için yapılması gerekenler Gönderen: LinuxDebian Bugün 15:02:21
[Debian / Knoppix ] Harici Harddiski Tanıtmak Gönderen: LinuxDebian Bugün 15:01:14
[Debian / Knoppix ] Film Partlarını Birleştirme Gönderen: heartsmagic Bugün 13:43:48
[Havadan Sudan] YellowPages.com.tr Gönderen: kamemel Bugün 10:01:42
[Ağ Genel] BRAS server Gönderen: e-diablo 24 Temmuz 2008
Saat: 22:43:45
Rastgele Ekran Görüntüsü
+  Lapis Forum
|-+  Linux Güvenlik
| |-+  Genel Güvenlik
| | |-+  Dos atak onleyici bir script yazacagim
0 Üye ve 5 Ziyaretçi konuyu incelemekte. « önceki sonraki »
Sayfa: [1] 2   Aşağı git Yazdır
Gönderen Konu: Dos atak onleyici bir script yazacagim  (Okunma Sayısı 13496 defa)
Orcunyucel
Ziyaretçi
« : 31 Aralık 2005
Saat: 17:04:11 »

merhaba arkadaslar,
su komutu iceren bir script ile her ip adresinden kac baglanti yapildigini bulabiliyorum:
Kod:
netstat -ntu|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -n
yalniz benim yapmak istedigim script bu komutu kullanarak belli bir degerin uzerinde baglanti kuranlari iptables'a drop olarak eklemek. once bir dosyaya banlanacak ip'leri yazdiracagim. daha sonra bunlari belli bir sureligine banlamak icin iptables'a aktaracagim. boyle bisey shell scripting ile mumkun mu acaba?
Logged
Dropby23
Ziyaretçi
« Yanıtla #1 : 31 Aralık 2005
Saat: 17:27:56 »

netstat -an | grep :80 | sort | awk '{print $5}'
bunu kullanabilirsin daha geliştirip tabi ben buna benzer bir scripti perl le yazdım perl le yazmanıda tavsiye ederim bilgin varsa
Logged
erkaN kaplaN
Administrator
*GURU* Penguen
*****

Toplam Puanım: +153/-1
Offline Offline

Mesaj Sayısı: 4614



« Yanıtla #2 : 31 Aralık 2005
Saat: 17:48:18 »

merhaba arkadaslar,
su komutu iceren bir script ile her ip adresinden kac baglanti yapildigini bulabiliyorum:
Kod:
netstat -ntu|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -n
yalniz benim yapmak istedigim script bu komutu kullanarak belli bir degerin uzerinde baglanti kuranlari iptables'a drop olarak eklemek. once bir dosyaya banlanacak ip'leri yazdiracagim. daha sonra bunlari belli bir sureligine banlamak icin iptables'a aktaracagim. boyle bisey shell scripting ile mumkun mu acaba?

Gerek yok...

Al sana Rusty Russell  ustanin Packet Filtering HOWTO'sundan  birkac örnek:

#------------------------------------------------------#
# LOG Syn-flood Denial of Service attempts - 10 per hour
 iptables -A FORWARD -p tcp --syn -m limit --limit 10/h \
   -j LOG --log-prefix 'Syn-flood attack??? '

# Syn-flood protection
 iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

#------------------------------------------------------#
# LOG Furtive Port Scanner attempts - 10 per hour
 iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST \
   -m limit --limit 10/h -j LOG --log-prefix 'Port Scanner attack??? '

# Port Scanner protection
 iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST \
   -m limit --limit 1/s -j ACCEPT

#------------------------------------------------------#
# LOG Ping of Death Denial of Service attempts - 10 per hour
 iptables -A FORWARD -p icmp --icmp-type echo-request \
   -m limit --limit 10/h -j LOG --log-prefix 'Ping of Death attack??? '

# Ping of Death protection
 iptables -A FORWARD -p icmp --icmp-type echo-request \
   -m limit --limit 1/s -j ACCEPT

#------------------------------------------------------#


Logged

Bugün Lapis Wikiye göz attınız mı?
Lapis Tanıtım Filmi

Orcunyucel
Ziyaretçi
« Yanıtla #3 : 31 Aralık 2005
Saat: 18:05:06 »

erkan verdiklerini zaten iptables'a girmistim. yalniz sanirim bunlar ip basina engelleme yapmiyor. yani o andaki baglantilari kontrol ediyor ve sadece bir ip'den gelenleri degil toplam ip'ye gore engelliyor. bir ip tum baglantilari doldurursa yine digerlerine baglanabilecek token kalmiyor. benim istedigim her ip icin olacak. yani her bir ip icin limit getirmek istiyorum.

dropby23 malesef perl bilmiyorum.
Logged
Dropby23
Ziyaretçi
« Yanıtla #4 : 31 Aralık 2005
Saat: 18:08:32 »

çoğu server yöneticisi icmp yi zaten en başta yasaklıyor ayrıca bunlar syn blood a karşı etkili olabilicek şeyler kaldıki her restart ta gidicek şeyler limit getirmek yerine limiti aşana ban atmka kesin çözüm olacaktır ve burdaki komutların http seline karşı hiç bir etkisi olmayacaktır 
Logged
Orcunyucel
Ziyaretçi
« Yanıtla #5 : 31 Aralık 2005
Saat: 18:30:00 »

frozentux'taki iptables tutorial'i da iyice hazmettikten sonra. ne yazikki ip bazinda engelleme bulamadim. bu yuzden boyle bir script yazmak istiyorum. hem elimde de atak yapanlarin ip'si de bulunur.
Logged
erkaN kaplaN
Administrator
*GURU* Penguen
*****

Toplam Puanım: +153/-1
Offline Offline

Mesaj Sayısı: 4614



« Yanıtla #6 : 31 Aralık 2005
Saat: 18:34:10 »

Peki yazalim :-)


Kisaca ne yapmak istedigini soyle oazman ve iptables ile nasil kullanmak istiyon. Daha dogrusu atiyorum, mesela  123.123.123.123  ip sini bulduk diyelim. Bu IP adresi 10 taneden fazla baglanti yaptigini da farz edelim.-. Bunu nasil BANLAMAK istiyorsun..Kisaca aciklarsan, skriptin 2 satirlik bir komut :-)


Logged

Bugün Lapis Wikiye göz attınız mı?
Lapis Tanıtım Filmi

Dropby23
Ziyaretçi
« Yanıtla #7 : 31 Aralık 2005
Saat: 18:38:09 »

netstat çıktısına bakıcak o ip herhangi bir yolla atıyorum 50 bağlantı açtıysa o ip yi bir dosyaya yazıcak ve o dosyadaki ipler banlanıcak sadece yada direkd e banlayabilir 6 saat boyunca ama pek hoş bir script olmaz
Logged
erkaN kaplaN
Administrator
*GURU* Penguen
*****

Toplam Puanım: +153/-1
Offline Offline

Mesaj Sayısı: 4614



« Yanıtla #8 : 31 Aralık 2005
Saat: 18:42:47 »

netstat çıktısına bakıcak o ip herhangi bir yolla atıyorum 50 bağlantı açtıysa o ip yi bir dosyaya yazıcak ve o dosyadaki ipler banlanıcak sadece yada direkd e banlayabilir 6 saat boyunca ama pek hoş bir script olmaz

hmmm..peki bir IP yi 6 saat boyunca banlamak icin hangi komutu veriyorsunuz?
Bir ornek verirsen skript sorun degil.
Logged

Bugün Lapis Wikiye göz attınız mı?
Lapis Tanıtım Filmi

Orcunyucel
Ziyaretçi
« Yanıtla #9 : 31 Aralık 2005
Saat: 18:48:43 »

ayri dosya kullanmamiz gerekebilir. ornegin o ip'yi bir dosyaya atariz altina da dosyaya eklendigi tarih ve saati. ondan sonra script dosyaya ip'yi attiktan sonra ayni anda iptables'a da xx satirina drop kuralini girecegiz. script belli araliklarda calisip ban suresinin dolup dolmadigini da analiz ederek o ip'yi iptables'dan kaldiracak. boyle birsey olmali.
Logged
Orcunyucel
Ziyaretçi
« Yanıtla #10 : 31 Aralık 2005
Saat: 18:53:46 »

hatta daha onceden shell scripting kullanarak shell arayuzu tasarladim kendimce ve yonergelere gore port iptables'a girilebiliyor veya silinebiliyordu. bunun icin tail ve head komutlarini kullanarak iptables dosyasini belli bir satirdan kesip baska dosyaya aktariyor ve sonra girilecek kuralla birlestiriyordum. ama onemli olan en yukarida verdigim komuttan baglanti sayisini ve ip'yi cekmek
Logged
erkaN kaplaN
Administrator
*GURU* Penguen
*****

Toplam Puanım: +153/-1
Offline Offline

Mesaj Sayısı: 4614



« Yanıtla #11 : 31 Aralık 2005
Saat: 18:54:04 »

bir IP yi belirli bir süre (mesala  6 saat)  banlamak icin bir komut olacakti fakat simdi hatirlamiyorum.

Hatirlayan birisi postalarsa skript yazmak 2 dk is....
Logged

Bugün Lapis Wikiye göz attınız mı?
Lapis Tanıtım Filmi

Orcunyucel
Ziyaretçi
« Yanıtla #12 : 31 Aralık 2005
Saat: 18:58:54 »

http://nwn.stratics.com/content/toolset/server/linux/documents/readme.linuxserver.txt

burada banip diye bir komuttan bahsediyor. ancak sanirim belirtilen programi kurmak gerekli.
Logged
erkaN kaplaN
Administrator
*GURU* Penguen
*****

Toplam Puanım: +153/-1
Offline Offline

Mesaj Sayısı: 4614



« Yanıtla #13 : 31 Aralık 2005
Saat: 19:44:53 »

hatta daha onceden shell scripting kullanarak shell arayuzu tasarladim kendimce ve yonergelere gore port iptables'a girilebiliyor veya silinebiliyordu. bunun icin tail ve head komutlarini kullanarak iptables dosyasini belli bir satirdan kesip baska dosyaya aktariyor ve sonra girilecek kuralla birlestiriyordum. ama onemli olan en yukarida verdigim komuttan baglanti sayisini ve ip'yi cekmek


10 baglantisi ve 10dan buyuk baglanti sayisi olan IP adreslerini gosterir:

$ netstat -ntu|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -n|grep -v 127.0.0.1|awk '{if ($1 > 9)  print  $2;}'

xxx.120.166.251
217.xxx.176.4
83.xxx.25.11


Time-ban meselesini henuz bulamadim...Bulursam guzel bir skript cikabilir belki ortaya.

Logged

Bugün Lapis Wikiye göz attınız mı?
Lapis Tanıtım Filmi

Orcunyucel
Ziyaretçi
« Yanıtla #14 : 31 Aralık 2005
Saat: 22:48:46 »

erkan senin komut setiyle asagidaki linkteki ipdrop scriptini kullansak olur mu? ayrica scripti hackleyip on oldugu zaman 1 saat sonraya crontabla off yapabilir miyiz?

http://www-128.ibm.com/developerworks/linux/library/l-fw/index.html?dwzone=linux
Logged
Dropby23
Ziyaretçi
« Yanıtla #15 : 01 Ocak 2006
Saat: 02:45:15 »

kesinlikle ayrıca bir dosyaya ihtiyacınız var yoksa işin içinden çıkamazsınız şöle bieşy yapabilrisiniz
fonksiyon=`mktemp /tmp/banliipler.XXXX`

echo "iptables -D INPUT -s $line -j DROP" >> $fonksiyon

echo "rm -f $fonksiyon" >> $fonksiyon kaldırma olayınıda bu ekil yapıcaksınız tabi bunlar için sleep time ı belirlemelisiniz

unban olayı için dediğim dosyaya tarihi ile birlikte yazmalısınız bu olay apf ile çok daha rahat yapılabilir
Logged
erkaN kaplaN
Administrator
*GURU* Penguen
*****

Toplam Puanım: +153/-1
Offline Offline

Mesaj Sayısı: 4614



« Yanıtla #16 : 01 Ocak 2006
Saat: 05:34:11 »

erkan senin komut setiyle asagidaki linkteki ipdrop scriptini kullansak olur mu? ayrica scripti hackleyip on oldugu zaman 1 saat sonraya crontabla off yapabilir miyiz?

http://www-128.ibm.com/developerworks/linux/library/l-fw/index.html?dwzone=linux

Saat sabahin 3 u. Bu saatte incelemek zor fakat aklima su geldi:

Teori:
1.) Bir IP den 10 dan fazla olan baglanti kuranlarin listesi bir dosyaya yazdirilir.
2) Dosya satir satir okutulur ve iptables ile drop edilir.


Pratik:  (3 satirlik skript)
================
#!/bin/bash

netstat -ntu|awk '{print $5}'|cut -d: -f1|sort|uniq -c|sort -n|grep -v 127.0.0.1|awk '{if ($1 > 9)  print  $2;}' > /tmp/IPLER

while read ipler; do iptables  -A INPUT -s $ipler  -j DROP ; done < /tmp/IPLER
==============================


Test etmedim ama teori olarak dogru.
10 dan fazla olan IP leri bir dosyaya yazar. Sonrada bu dosyayi satir satir okuyarak iptables yardimi ile banlar.

Logged

Bugün Lapis Wikiye göz attınız mı?
Lapis Tanıtım Filmi

erkaN kaplaN
Administrator
*GURU* Penguen
*****

Toplam Puanım: +153/-1
Offline Offline

Mesaj Sayısı: 4614



« Yanıtla #17 : 01 Ocak 2006
Saat: 19:00:48 »

Asagidaki ornekler default kernelde calismiyor. POM  (patch o matic) ile iptables i yamalamaniz gerekli:


1. Örnek  recent ile:

iptables -I INPUT -p tcp -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp -i eth0 -m state --state NEW -m recent --update --seconds 600 --hitcount 10 -j DROP



600 saniye icinde sadece 10 baglantiya izin veriyor. Fazlalarini drop ediyor.


2 Örnek  iplimit ile:


#netmask = 32 ve o oaraliktan sadece 10 baglantiya izin veriyor. Netmask C aglarindan alinirsan, yani 32 yerine 24 yaparsan bu sefet 254 tane IP araligindan sadece 10 baglantiya izin verir
iptables -A INPUT -p tcp -m tcp --dport 80 -m iplimit --iplimit-above 10 --iplimit-mask 32 -j REJECT --reject-with icmp-port-unreachable

#Bu ornekde de Port tanimli degil, o halde butun portlari koruyor.
iptables -A INPUT -p tcp  -m iplimit --iplimit-above 15 --iplimit-mask 32 -j REJECT


3. Ornek connlimit  ile:

# Buda 25 portuna netsmask 24 olarak (254 IP )
iptables  -A INPUT -p tcp --syn --dport 25 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP

# Tam emin olmamak ile birlikte butun portlari kontrol etmesi gerekli.
iptables  -A INPUT -p tcp --syn  -m connlimit --connlimit-above 2 --connlimit-mask 24 -j DROP



Bu bilgileri isiginda istedigin gibi gelistirebilirsin.

(danke rail baba)
Logged

Bugün Lapis Wikiye göz attınız mı?
Lapis Tanıtım Filmi

Orcunyucel
Ziyaretçi
« Yanıtla #18 : 01 Ocak 2006
Saat: 23:39:17 »

eline saglik erkan abi. ben de detayli bir google taramasindan sonra netfiltere modul ekleyerek ip connection limit yapilabilmesini saglayan bir modul buldum:

Kod:
------------------ cut here ----------------------
diff -urN netfilter-20001129/userspace/extensions/.iplimit-test netfilter/userspace/extensions/.iplimit-test
--- netfilter-20001129/userspace/extensions/.iplimit-test Thu Jan  1 01:00:00 1970
+++ netfilter/userspace/extensions/.iplimit-test Wed Nov 29 15:48:49 2000
@@ -0,0 +1,2 @@
+#! /bin/sh
+[ -f $KERNEL_DIR/include/linux/netfilter_ipv4/ipt_iplimit.h ] && echo iplimit
diff -urN netfilter-20001129/userspace/extensions/libipt_iplimit.c netfilter/userspace/extensions/libipt_iplimit.c
--- netfilter-20001129/userspace/extensions/libipt_iplimit.c Thu Jan  1 01:00:00 1970
+++ netfilter/userspace/extensions/libipt_iplimit.c Wed Nov 29 14:04:19 2000
@@ -0,0 +1,133 @@
+/* Shared library add-on to iptables to add state tracking support. */
+#include <stdio.h>
+#include <netdb.h>
+#include <string.h>
+#include <stdlib.h>
+#include <getopt.h>
+#include <iptables.h>
+#include <linux/netfilter_ipv4/ip_conntrack.h>
+#include <linux/netfilter_ipv4/ipt_iplimit.h>
+
+/* Function which prints out usage message. */
+static void
+help(void)
+{
+ printf(
+"iplimit v%s options:\n"
+"[!] --iplimit-above n match if the number of existing tcp connections is (not) above n\n"
+" --iplimit-mask n group hosts using mask\n"
+"\n", NETFILTER_VERSION);
+}
+
+static struct option opts[] = {
+ { "iplimit-above", 1, 0, '1' },
+ { "iplimit-mask",  1, 0, '2' },
+ {0}
+};
+
+/* Initialize the match. */
+static void
+init(struct ipt_entry_match *m, unsigned int *nfcache)
+{
+ /* Can't cache this */
+ *nfcache |= NFC_UNKNOWN;
+}
+
+/* Function which parses command options; returns true if it
+   ate an option */
+static int
+parse(int c, char **argv, int invert, unsigned int *flags,
+      const struct ipt_entry *entry,
+      unsigned int *nfcache,
+      struct ipt_entry_match **match)
+{
+ struct ipt_iplimit_info *info = (struct ipt_iplimit_info*)(*match)->data;
+
+ if (0 == (*flags & 2)) {
+ /* set default mask unless we've already seen a mask option */
+ info->mask = htonl(0xFFFFFFFF);
+ }
+
+ switch (c) {
+ case '1':
+ if (check_inverse(optarg, &invert))
+ optind++;
+ info->limit = atoi(argv[optind-1]);
+ info->inverse = invert;
+ *flags |= 1;
+ break;
+
+ case '2':
+ info->mask = htonl(0xFFFFFFFF << (32 - atoi(argv[optind-1])));
+ *flags |= 2;
+ break;
+
+ default:
+ return 0;
+ }
+
+ return 1;
+}
+
+/* Final check */
+static void final_check(unsigned int flags)
+{
+ if (!flags & 1)
+ exit_error(PARAMETER_PROBLEM, "You must specify `--iplimit-above'");
+}
+
+static int
+count_bits(u_int32_t mask)
+{
+ int i, bits;
+
+ for (bits = 0, i = 31; i >= 0; i--) {
+ if (mask & htonl((u_int32_t)1 << i)) {
+ bits++;
+ continue;
+ }
+ break;
+ }
+ return bits;
+}
+
+/* Prints out the matchinfo. */
+static void
+print(const struct ipt_ip *ip,
+      const struct ipt_entry_match *match,
+      int numeric)
+{
+ struct ipt_iplimit_info *info = (struct ipt_iplimit_info*)match->data;
+
+ printf("#conn/%d %s %d", count_bits(info->mask),
+        info->inverse ? "<" : ">", info->limit);
+}
+
+/* Saves the matchinfo in parsable form to stdout. */
+static void save(const struct ipt_ip *ip, const struct ipt_entry_match *match)
+{
+ struct ipt_iplimit_info *info = (struct ipt_iplimit_info*)match->data;
+
+ printf("%s--iplimit-above %d",info->inverse ? "! " : "",info->limit);
+ printf(" --iplimit-mask %d",count_bits(info->mask));
+}
+
+struct iptables_match iplimit
+= { NULL,
+    "iplimit",
+    NETFILTER_VERSION,
+    IPT_ALIGN(sizeof(struct ipt_iplimit_info)),
+    IPT_ALIGN(sizeof(struct ipt_iplimit_info)),
+    &help,
+    &init,
+    &parse,
+    &final_check,
+    &print,
+    &save,
+    opts
+};
+
+void _init(void)
+{
+ register_match(&iplimit);
+}
diff -urN netfilter-20001129/userspace/patch-o-matic/iplimit.patch netfilter/userspace/patch-o-matic/iplimit.patch
--- netfilter-20001129/userspace/patch-o-matic/iplimit.patch Thu Jan  1 01:00:00 1970
+++ netfilter/userspace/patch-o-matic/iplimit.patch Wed Nov 29 15:57:23 2000
@@ -0,0 +1,256 @@
+diff -urN -x *~ -x [Cc]onfig.* -x Makefile vanilla-2.4.0-test8/include/linux/netfilter_ipv4/ipt_iplimit.h linux-2.4.0-test8/include/linux/netfilter_ipv4/ipt_iplimit.h
+--- vanilla-2.4.0-test8/include/linux/netfilter_ipv4/ipt_iplimit.h Thu Jan  1 01:00:00 1970
++++ linux-2.4.0-test8/include/linux/netfilter_ipv4/ipt_iplimit.h Wed Nov 29 09:57:33 2000
+@@ -0,0 +1,12 @@
++#ifndef _IPT_IPLIMIT_H
++#define _IPT_IPLIMIT_H
++
++struct ipt_iplimit_data;
++
++struct ipt_iplimit_info {
++ int limit;
++ int inverse;
++ u_int32_t mask;
++ struct ipt_iplimit_data *data;
++};
++#endif /* _IPT_IPLIMIT_H */
+diff -urN -x *~ -x [Cc]onfig.* -x Makefile vanilla-2.4.0-test8/net/ipv4/netfilter/ip_conntrack_standalone.c linux-2.4.0-test8/net/ipv4/netfilter/ip_conntrack_standalone.c
+--- vanilla-2.4.0-test8/net/ipv4/netfilter/ip_conntrack_standalone.c Thu Aug 10 21:35:15 2000
++++ linux-2.4.0-test8/net/ipv4/netfilter/ip_conntrack_standalone.c Mon Nov 27 15:41:33 2000
+@@ -343,5 +343,6 @@
+ EXPORT_SYMBOL(ip_ct_selective_cleanup);
+ EXPORT_SYMBOL(ip_ct_refresh);
+ EXPORT_SYMBOL(ip_conntrack_expect_related);
++EXPORT_SYMBOL(ip_conntrack_find_get);
+ EXPORT_SYMBOL(ip_conntrack_tuple_taken);
+ EXPORT_SYMBOL(ip_ct_gather_frags);
+diff -urN -x *~ -x [Cc]onfig.* -x Makefile vanilla-2.4.0-test8/net/ipv4/netfilter/ipt_iplimit.c linux-2.4.0-test8/net/ipv4/netfilter/ipt_iplimit.c
+--- vanilla-2.4.0-test8/net/ipv4/netfilter/ipt_iplimit.c Thu Jan  1 01:00:00 1970
++++ linux-2.4.0-test8/net/ipv4/netfilter/ipt_iplimit.c Wed Nov 29 15:37:40 2000
+@@ -0,0 +1,226 @@
++/*
++ * netfilter module to limit the number of parallel tcp
++ * connections per IP address.
++ *   (c) 2000 Gerd Knorr <kraxel@bytesex.org>
++ *
++ * based on ...
++ *
++ * Kernel module to match connection tracking information.
++ * GPL (C) 1999  Rusty Russell (rusty@rustcorp.com.au).
++ */
++#include <linux/module.h>
++#include <linux/skbuff.h>
++#include <linux/list.h>
++#include <linux/netfilter_ipv4/ip_conntrack.h>
++#include <linux/netfilter_ipv4/ip_conntrack_core.h>
++#include <linux/netfilter_ipv4/ip_conntrack_tcp.h>
++#include <linux/netfilter_ipv4/ip_tables.h>
++#include <linux/netfilter_ipv4/ipt_iplimit.h>
++
++#define DEBUG 0
++
++/* we'll save the tuples of all connections we care about */
++struct ipt_iplimit_conn
++{
++        struct list_head list;
++ struct ip_conntrack_tuple tuple;
++};
++
++struct ipt_iplimit_data {
++ spinlock_t lock;
++ struct list_head iphash[256];
++};
++
++static int ipt_iphash(u_int32_t addr)
++{
++ int hash;
++
++ hash  =  addr        & 0xff;
++ hash ^= (addr >>  8) & 0xff;
++ hash ^= (addr >> 16) & 0xff;
++ hash ^= (addr >> 24) & 0xff;
++ return hash;
++}
++
++static int count_them(struct ipt_iplimit_data *data,
++       u_int32_t addr, u_int32_t mask,
++       struct ip_conntrack *ct)
++{
++#if DEBUG
++ const static char *tcp[] = { "none", "established", "syn_sent", "syn_recv",
++      "fin_wait", "time_wait", "close", "close_wait",
++      "last_ack", "listen" };
++#endif
++ int addit = 1, matches = 0;
++ struct ip_conntrack_tuple tuple;
++ struct ip_conntrack_tuple_hash *found;
++ struct ipt_iplimit_conn *conn;
++ struct list_head *hash,*lh;
++
++ spin_lock(&data->lock);
++ tuple = ct->tuplehash[0].tuple;
++ hash = &data->iphash[ipt_iphash(addr & mask)];
++
++ /* check the saved connections */
++ for (lh = hash->next; lh != hash; lh = lh->next) {
++ conn = list_entry(lh,struct ipt_iplimit_conn,list);
++ if (0 == memcmp(&conn->tuple,&tuple,sizeof(tuple))) {
++ /* Just to be sure we have it only once in the list.
++    We should'nt see tuples twice unless someone hooks this
++    into a table without "-p tcp --syn" */
++ addit = 0;
++ }
++ found = ip_conntrack_find_get(&conn->tuple,ct);
++#if DEBUG
++ printk("ipt_iplimit [%d]: src=%u.%u.%u.%u:%d dst=%u.%u.%u.%u:%d %s\n",
++        ipt_iphash(addr & mask),
++        NIPQUAD(conn->tuple.src.ip), ntohs(conn->tuple.src.u.tcp.port),
++        NIPQUAD(conn->tuple.dst.ip), ntohs(conn->tuple.dst.u.tcp.port),
++        (NULL != found) ? tcp[found->ctrack->proto.tcp.state] : "gone");
++#endif
++ if (NULL == found) {
++ /* this one is gone */
++ lh = lh->prev;
++ list_del(lh->next);
++ kfree(conn);
++ continue;
++ }
++ if (found->ctrack->proto.tcp.state == TCP_CONNTRACK_TIME_WAIT) {
++ /* we don't care about connections which are
++    closed already -> ditch it */
++ lh = lh->prev;
++ list_del(lh->next);
++ kfree(conn);
++ nf_conntrack_put(&found->ctrack->infos[0]);
++ continue;
++ }
++ if ((addr & mask) == (conn->tuple.src.ip & mask)) {
++ /* same source IP address -> be counted! */
++