iptables -m string kernelversion

usr0815

Neuer User
Mitglied seit
20 Apr 2009
Beiträge
14
Punkte für Reaktionen
0
Punkte
0
Hallo,

ich würde gerne bestimmte Packte auf UDP mit einem bestimmten String via iptables auf meiner WLAN 7050 dropen lassen, jedoch scheint es nicht so ganz zu funktionieren.

uname -a:
Linux fritz.fonwlan.box 2.6.13.1-ar7 #1 Tue Apr 24 13:57:38 CEST 2007 mips unknown

man iptables:
string
This modules matches a given string by using some pattern matching strategy. It requires a linux kernel >= 2.6.14.

Jemand ne Idee wie man string match in iptables unter der 2.6.13.1 verwenden kann? Oder wie man den Kernel updaten kann?
 
Hi. Den Kernel kannst du nicht updaten. Du müsstest dir einen Kernelpatch für 2.6.13.1 suchen der diese Funktion integriert.

MfG Oliver
 
Da ich keine Ahnung habe ob der Patch hier [Domain + URL der .bin] hilft, habe ich diesen einfach mal auf gut Glück getestet:

In make/linux/patches/2.6.13.1/10ipt_string.patch:
Code:
Index: linux-2.6.13.1/net/ipv4/netfilter/ipt_string.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.13.1/net/ipv4/netfilter/ipt_string.c	2005-08-20 18:48:57.000000000 +0200
@@ -0,0 +1,91 @@
+/* String matching match for iptables
+ * 
+ * (C) 2005 Pablo Neira Ayuso <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/skbuff.h>
+#include <linux/netfilter_ipv4/ip_tables.h>
+#include <linux/netfilter_ipv4/ipt_string.h>
+#include <linux/textsearch.h>
+
+MODULE_AUTHOR("Pablo Neira Ayuso <[email protected]>");
+MODULE_DESCRIPTION("IP tables string match module");
+MODULE_LICENSE("GPL");
+
+static int match(const struct sk_buff *skb,
+		 const struct net_device *in,
+		 const struct net_device *out,
+		 const void *matchinfo,
+		 int offset,
+		 int *hotdrop)
+{
+	struct ts_state state;
+	struct ipt_string_info *conf = (struct ipt_string_info *) matchinfo;
+
+	memset(&state, 0, sizeof(struct ts_state));
+
+	return (skb_find_text((struct sk_buff *)skb, conf->from_offset, 
+			     conf->to_offset, conf->config, &state) 
+			     != UINT_MAX) && !conf->invert;
+}
+
+#define STRING_TEXT_PRIV(m) ((struct ipt_string_info *) m)
+
+static int checkentry(const char *tablename,
+		      const struct ipt_ip *ip,
+		      void *matchinfo,
+		      unsigned int matchsize,
+		      unsigned int hook_mask)
+{
+	struct ipt_string_info *conf = matchinfo;
+	struct ts_config *ts_conf;
+
+	if (matchsize != IPT_ALIGN(sizeof(struct ipt_string_info)))
+		return 0;
+
+	/* Damn, can't handle this case properly with iptables... */
+	if (conf->from_offset > conf->to_offset)
+		return 0;
+
+	ts_conf = textsearch_prepare(conf->algo, conf->pattern, conf->patlen,
+				     GFP_KERNEL, TS_AUTOLOAD);
+	if (IS_ERR(ts_conf))
+		return 0;
+
+	conf->config = ts_conf;
+
+	return 1;
+}
+
+static void destroy(void *matchinfo, unsigned int matchsize)
+{
+	textsearch_destroy(STRING_TEXT_PRIV(matchinfo)->config);
+}
+
+static struct ipt_match string_match = {
+	.name 		= "string",
+	.match 		= match,
+	.checkentry	= checkentry,
+	.destroy 	= destroy,
+	.me 		= THIS_MODULE
+};
+
+static int __init init(void)
+{
+	return ipt_register_match(&string_match);
+}
+
+static void __exit fini(void)
+{
+	ipt_unregister_match(&string_match);
+}
+
+module_init(init);
+module_exit(fini);
Index: linux-2.6.13.1/net/ipv4/netfilter/Makefile
===================================================================
--- linux-2.6.13.1.orig/net/ipv4/netfilter/Makefile	2005-08-20 18:48:49.000000000 +0200
+++ linux-2.6.13.1/net/ipv4/netfilter/Makefile	2005-08-20 18:48:57.000000000 +0200
@@ -65,6 +65,7 @@
 obj-$(CONFIG_IP_NF_MATCH_ADDRTYPE) += ipt_addrtype.o
 obj-$(CONFIG_IP_NF_MATCH_PHYSDEV) += ipt_physdev.o
 obj-$(CONFIG_IP_NF_MATCH_COMMENT) += ipt_comment.o
+obj-$(CONFIG_IP_NF_MATCH_STRING) += ipt_string.o
 
 # targets
 obj-$(CONFIG_IP_NF_TARGET_REJECT) += ipt_REJECT.o
Index: linux-2.6.13.1/net/ipv4/netfilter/Kconfig
===================================================================
--- linux-2.6.13.1.orig/net/ipv4/netfilter/Kconfig	2005-08-20 18:48:50.000000000 +0200
+++ linux-2.6.13.1/net/ipv4/netfilter/Kconfig	2005-08-20 18:48:57.000000000 +0200
@@ -410,6 +410,18 @@
 	  destination IP' or `500pps from any given source IP'  with a single
 	  IPtables rule.
 
+config IP_NF_MATCH_STRING
+	tristate  'string match support'
+	depends on IP_NF_IPTABLES 
+	select TEXTSEARCH
+	select TEXTSEARCH_KMP
+	select TEXTSEARCH_FSM
+	help
+	  This option adds a `string' match, which allows you to look for
+	  pattern matchings in packets.
+
+	  To compile it as a module, choose M here.  If unsure, say N.
+
 # `filter', generic and specific targets
 config IP_NF_FILTER
 	tristate "Packet filtering"
Index: linux-2.6.13.1/include/linux/netfilter_ipv4/ipt_string.h
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ linux-2.6.13.1/include/linux/netfilter_ipv4/ipt_string.h	2005-08-20 18:50:14.000000000 +0200
@@ -0,0 +1,18 @@
+#ifndef _IPT_STRING_H
+#define _IPT_STRING_H
+
+#define IPT_STRING_MAX_PATTERN_SIZE 128
+#define IPT_STRING_MAX_ALGO_NAME_SIZE 16
+
+struct ipt_string_info
+{
+	u_int16_t from_offset;
+	u_int16_t to_offset;
+	char	  algo[IPT_STRING_MAX_ALGO_NAME_SIZE];
+	char 	  pattern[IPT_STRING_MAX_PATTERN_SIZE];
+	u_int8_t  patlen;
+	u_int8_t  invert;
+	struct ts_config __attribute__((aligned(8))) *config;
+};
+
+#endif /*_IPT_STRING_H*/

In make/iptables/Config.in hinzugefügt:
Code:
config FREETZ_MODULE_ipt_REJECT
[...]
config FREETZ_MODULE_ipt_string
	bool "ipt_string.ko"
	depends on FREETZ_KERNEL_VERSION_2_6_13_1
	select FREETZ_MODULE_ip_tables
	default n
	help
		Testing-Patch for string match.

config FREETZ_MODULE_ipt_state
[...]

dann ein make kernel-dirclean und ein make.

Das Image wurde erfolgreich gebaut und bei diesem kommt nach modprobe ipt_string kommt:

/var/mod/root # modprobe ip_tables
/var/mod/root # modprobe iptable_filter
/var/mod/root # modprobe ipt_string
insmod: cannot insert '/lib/modules/2.6.13.1-ar7/kernel/net/ipv4/netfilter/ipt_string.ko': unknown symbol in module
modprobe: failed to load module ipt_string: No such file or directory
/var/mod/root # ls -lah /lib/modules/2.6.13.1-ar7/kernel/net/ipv4/netfilter/
-rwxr-xr-x 1 root root 30.1k Jul 20 22:01 ip_tables.ko
-rwxr-xr-x 1 root root 20.4k Jul 20 22:01 ipt_layer7.ko
-rwxr-xr-x 1 root root 3.1k Jul 20 22:01 ipt_string.ko
-rwxr-xr-x 1 root root 5.2k Jul 20 22:01 iptable_filter.ko

Jemand ne Idee?

Edit:
Dmesg sagt:
ip_tables: (C) 2000-2002 Netfilter core team
ipt_string: Unknown symbol textsearch_destroy
ipt_string: Unknown symbol textsearch_prepare

Wie kann man das nun fixxen?
 
Code:
+config IP_NF_MATCH_STRING
+	tristate  'string match support'
+	depends on IP_NF_IPTABLES 
+	select TEXTSEARCH
+	select TEXTSEARCH_KMP
+	select TEXTSEARCH_FSM

ipt_string: Unknown symbol textsearch_destroy
ipt_string: Unknown symbol textsearch_prepare

Das Modul ipt_string aktiviert diese TEXTSEARCH Optionen. Vermutlich werden damit Module erstellt, in denen die benötigten Symbole definiert werden.
 
Das Modul ipt_string aktiviert diese TEXTSEARCH Optionen. Vermutlich werden damit Module erstellt, in denen die benötigten Symbole definiert werden.
Aber eigentlich sollte das fest in den Kernel eingebaut werden, wenn ich das richtig sehe!? Hast du denn den selbst gebauten Kernel auch geflasht?

MfG Oliver
 
Hast du denn den selbst gebauten Kernel auch geflasht?

Wenn du damit meinst, das erfolgreich erstellte Image einzuspielen, was nach dem make kernel-dirclean && make kommt: ja.

Edit:
openwrt hat auch einen string match patch. Dort sieht die textsearch.c/.h anders aus als die, die bei freetz in source/avm-gpl-04.33/base/kernel_8mb_26_build/kernel/linux-2.6.13.1/include/linux/ liegt. Zumal die von dem Kernel scheinbar garnicht die Funktion beinhaltet.
 
Zuletzt bearbeitet:
Bist du sicher, dass du die Option "replace kernel" angewählt hast?

MfG Oliver
 
Es gibt mehrere Möglichkeiten:
- TEXTSEARCH ist in einem Modul -> Dieses Modul vorher laden.
- TEXTSEARCH ist fest im Kernel -> "Replace Kernel" verwenden.
- TEXTSEARCH ist in der Kernel Version gar nicht vorhanden -> schlecht, selber portieren.

Der Patch in openwrt scheint vom Namen her für Kernels der Reihe 2.4 gedacht zu sein.
 
Also ich finde diese prepare und destroy Funktionen die angeblich fehlen im Quellcode.

MfG Oliver
 
Bist du sicher, dass du die Option "replace kernel" angewählt hast?

nein... :oops:

Code:
/var/mod/root # modprobe ip_tables
/var/mod/root # modprobe iptable_filter
/var/mod/root # modprobe ipt_string
/var/mod/root # iptables -A INPUT -m string --string "From: +4915227xxxx" --algo bm -p udp -j DROP
iptables: Invalid argument

Da string match nun scheinbar geht, muss ich mich mit dem blöden Syntax zurechtfinden.

Morgen werde ich mal versuchen nen patch zu machen, falls jemand anders auch string match braucht....

Edit:
Ohne libxt_string.so in Unstable -> Iptables shared librarys -> shared libraries (both IPv4 and IPv6) kommt:

iptables v1.4.1.1: Couldn't load match `string':File not found

Try `iptables -h' or 'iptables --help' for more information.

Ob es überhaupt zu patchen geht...?
 
Zuletzt bearbeitet:
Beispiel "state"
Code:
# iptables  -m state --help
[...]
[B]state match options:[/B]
 [!] --state [INVALID|ESTABLISHED|NEW|RELATED|UNTRACKED][,...]
                                State(s) to match

Siehst du sowas?
 
Mit solchen Vollzitaten wirst Du Dich hier bei den Moderatoren unbeliebt machen.

cuma meinte vermutlich, daß Du "iptables -m string --help" versuchen solltest, entsprechend dem Beispiel mit state.

Ansonsten geht es wohl normalerweise ab 2.6.14. Prinzipiell kann man alles auf alles portieren, es ist immer nur eine Frage des Aufwands. Wenn es Dir wichtig genug ist, kannst Du es auch mit einem 2.6.13 Kernel schaffen.
 
Genau, ich ging davon aus, dass man es am "Beispiel" erkennt
 
Ihr scheint mich falsch zu verstehen... Habe das Gefühl ich muss bei einigen Hilfestellungen (über welche ich dankbar bin) noch dazuschreiben, das ich verstanden habe wie es gemeint ist, bevor ich die Antwort gebe.

Da ich nicht auf den Kopf gefallen bin, wusste ich das er meint ich solle versuchen die Hilfe der String match aufzurufen (was ich auch schon vorher öfters getestet habe). Wieso sollte ich auch state nehmen wenn es um string geht...

Meine Antwort (3. Post von hier nach oben) beruhte auch darauf, das ich diese (die Hilfe von string match) aufrufen kann, aber dennoch nicht zu benutzten geht (wegen Manpage-Hinweiß).

Da ich noch einige andere Patches gefunden habe, werde ich mal diese versuchen anzuwenden.
 
Ich verstehe Dich nicht ganz. Einerseits hast Du etwas am Kernel geändert, andererseits zitierst Du die man-Page, die besagt, daß es mit dem unmodifizierten Kernel nicht funktioniert.
Wo ist da der Zusammenhang? Daß es mit unmodifiziertem Kernel nicht geht, haben wir doch alle schon vorher gewußt. Die Frage ist, welche Modifikationen sind notwendig, und lohnt sich der Aufwand im Vergleich zum Ergebnis.

Woher hast Du den Patch im Beitrag #3 (make/linux/patches/2.6.13.1/10ipt_string.patch)?
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.