Imported Upstream version 1.4.21 sandbox/jobol/upstream upstream/1.4.21
authorJosé Bollo <jose.bollo@open.eurogiciel.org>
Mon, 10 Nov 2014 16:03:15 +0000 (17:03 +0100)
committerJosé Bollo <jose.bollo@open.eurogiciel.org>
Mon, 10 Nov 2014 16:03:15 +0000 (17:03 +0100)
88 files changed:
INSTALL
Makefile.am
Makefile.in
config.h.in
configure
configure.ac
etc/xtables/connlabel.conf [deleted file]
extensions/GNUmakefile.in
extensions/libip6t_DNPT.c
extensions/libip6t_LOG.c
extensions/libip6t_LOG.man [deleted file]
extensions/libip6t_MASQUERADE.man [deleted file]
extensions/libip6t_REJECT.man
extensions/libip6t_SNPT.c
extensions/libip6t_mh.man
extensions/libipt_REJECT.man
extensions/libipt_ULOG.man
extensions/libxt_CLASSIFY.c
extensions/libxt_CT.c
extensions/libxt_DNAT.man [moved from extensions/libipt_DNAT.man with 85% similarity]
extensions/libxt_LED.c
extensions/libxt_LOG.man [moved from extensions/libipt_LOG.man with 85% similarity]
extensions/libxt_MASQUERADE.man [moved from extensions/libipt_MASQUERADE.man with 84% similarity]
extensions/libxt_NETMAP.man [moved from extensions/libipt_NETMAP.man with 88% similarity]
extensions/libxt_NFQUEUE.c
extensions/libxt_NFQUEUE.man
extensions/libxt_NOTRACK.man
extensions/libxt_RATEEST.c
extensions/libxt_REDIRECT.man [moved from extensions/libipt_REDIRECT.man with 68% similarity]
extensions/libxt_SNAT.man [moved from extensions/libipt_SNAT.man with 83% similarity]
extensions/libxt_SYNPROXY.c [new file with mode: 0644]
extensions/libxt_addrtype.c
extensions/libxt_cluster.man
extensions/libxt_connlabel.c
extensions/libxt_connlabel.man
extensions/libxt_conntrack.c
extensions/libxt_conntrack.man
extensions/libxt_hashlimit.man
extensions/libxt_policy.c
extensions/libxt_rateest.c
extensions/libxt_recent.c
extensions/libxt_recent.man
extensions/libxt_set.c
extensions/libxt_set.h
extensions/libxt_set.man
extensions/libxt_socket.c
extensions/libxt_socket.man
extensions/libxt_statistic.c
extensions/libxt_string.man
include/Makefile.in
include/ip6tables.h
include/iptables.h
include/linux/netfilter/ipset/ip_set.h
include/linux/netfilter/xt_CT.h
include/linux/netfilter/xt_NFQUEUE.h
include/linux/netfilter/xt_SYNPROXY.h [new file with mode: 0644]
include/linux/netfilter/xt_set.h
include/linux/netfilter/xt_socket.h
include/xtables.h
iptables/.gitignore
iptables/Makefile.am
iptables/Makefile.in
iptables/ip6tables-restore.8
iptables/ip6tables-restore.c
iptables/ip6tables-save.8
iptables/ip6tables-standalone.c
iptables/ip6tables.8 [new file with mode: 0644]
iptables/ip6tables.8.in [deleted file]
iptables/ip6tables.c
iptables/iptables-apply.8.in [moved from iptables/iptables-apply.8 with 95% similarity]
iptables/iptables-extensions.8.tmpl.in [moved from iptables/iptables-extensions.8.in with 94% similarity]
iptables/iptables-restore.8.in [moved from iptables/iptables-restore.8 with 78% similarity]
iptables/iptables-restore.c
iptables/iptables-save.8.in [moved from iptables/iptables-save.8 with 81% similarity]
iptables/iptables-standalone.c
iptables/iptables-xml.1.in [moved from iptables/iptables-xml.1 with 97% similarity]
iptables/iptables-xml.c
iptables/iptables.8.in
iptables/iptables.c
iptables/xshared.c
iptables/xshared.h
libipq/Makefile.in
libiptc/Makefile.in
libxtables/Makefile.in
libxtables/xtables.c
utils/Makefile.am
utils/Makefile.in
utils/nfsynproxy.c [new file with mode: 0644]

diff --git a/INSTALL b/INSTALL
index e17e844..d62b428 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -70,6 +70,8 @@ If you want to enable debugging, use
 (-O0 is used to turn off instruction reordering, which makes debugging
 much easier.)
 
+To show debug traces you can add -DDEBUG to CFLAGS option
+
 
 Other notes
 ===========
index cd008a1..c38d360 100644 (file)
@@ -24,9 +24,5 @@ tarball:
        tar -C /tmp -cjf ${PACKAGE_TARNAME}-${PACKAGE_VERSION}.tar.bz2 --owner=root --group=root ${PACKAGE_TARNAME}-${PACKAGE_VERSION}/;
        rm -Rf /tmp/${PACKAGE_TARNAME}-${PACKAGE_VERSION};
 
-install-data-hook:
-       @mkdir -p -m 755 $(DESTDIR)/etc/xtables/ || :
-       @test -f /etc/xtables/connlabel.conf || $(INSTALL) -m 644 etc/xtables/connlabel.conf $(DESTDIR)/etc/xtables/connlabel.conf || :
-
 config.status: extensions/GNUmakefile.in \
        include/xtables-version.h.in include/iptables/internal.h.in
index 1f5b0d6..082d8e9 100644 (file)
@@ -244,6 +244,8 @@ ksourcedir = @ksourcedir@
 libdir = @libdir@
 libexecdir = @libexecdir@
 libiptc_LDFLAGS2 = @libiptc_LDFLAGS2@
+libnetfilter_conntrack_CFLAGS = @libnetfilter_conntrack_CFLAGS@
+libnetfilter_conntrack_LIBS = @libnetfilter_conntrack_LIBS@
 libnfnetlink_CFLAGS = @libnfnetlink_CFLAGS@
 libnfnetlink_LIBS = @libnfnetlink_LIBS@
 libxtables_vage = @libxtables_vage@
@@ -724,8 +726,7 @@ info: info-recursive
 info-am:
 
 install-data-am:
-       @$(NORMAL_INSTALL)
-       $(MAKE) $(AM_MAKEFLAGS) install-data-hook
+
 install-dvi: install-dvi-recursive
 
 install-dvi-am:
@@ -773,8 +774,7 @@ ps-am:
 uninstall-am:
 
 .MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all \
-       ctags-recursive install-am install-data-am install-strip \
-       tags-recursive
+       ctags-recursive install-am install-strip tags-recursive
 
 .PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
        all all-am am--refresh check check-am clean clean-generic \
@@ -783,15 +783,14 @@ uninstall-am:
        dist-zip distcheck distclean distclean-generic distclean-hdr \
        distclean-libtool distclean-tags distcleancheck distdir \
        distuninstallcheck dvi dvi-am html html-am info info-am \
-       install install-am install-data install-data-am \
-       install-data-hook install-dvi install-dvi-am install-exec \
-       install-exec-am install-html install-html-am install-info \
-       install-info-am install-man install-pdf install-pdf-am \
-       install-ps install-ps-am install-strip installcheck \
-       installcheck-am installdirs installdirs-am maintainer-clean \
-       maintainer-clean-generic mostlyclean mostlyclean-generic \
-       mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
-       uninstall uninstall-am
+       install install-am install-data install-data-am install-dvi \
+       install-dvi-am install-exec install-exec-am install-html \
+       install-html-am install-info install-info-am install-man \
+       install-pdf install-pdf-am install-ps install-ps-am \
+       install-strip installcheck installcheck-am installdirs \
+       installdirs-am maintainer-clean maintainer-clean-generic \
+       mostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \
+       ps ps-am tags tags-recursive uninstall uninstall-am
 
 
 .PHONY: tarball
@@ -802,10 +801,6 @@ tarball:
        tar -C /tmp -cjf ${PACKAGE_TARNAME}-${PACKAGE_VERSION}.tar.bz2 --owner=root --group=root ${PACKAGE_TARNAME}-${PACKAGE_VERSION}/;
        rm -Rf /tmp/${PACKAGE_TARNAME}-${PACKAGE_VERSION};
 
-install-data-hook:
-       @mkdir -p -m 755 $(DESTDIR)/etc/xtables/ || :
-       @test -f /etc/xtables/connlabel.conf || $(INSTALL) -m 644 etc/xtables/connlabel.conf $(DESTDIR)/etc/xtables/connlabel.conf || :
-
 config.status: extensions/GNUmakefile.in \
        include/xtables-version.h.in include/iptables/internal.h.in
 
index 31d1427..b8987f2 100644 (file)
@@ -6,6 +6,9 @@
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
+/* Define to 1 if you have the `pcap' library (-lpcap). */
+#undef HAVE_LIBPCAP
+
 /* Define to 1 if you have the <linux/dccp.h> header file. */
 #undef HAVE_LINUX_DCCP_H
 
index 6562649..b45162e 100755 (executable)
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for iptables 1.4.19.1.
+# Generated by GNU Autoconf 2.69 for iptables 1.4.21.
 #
 #
 # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.
@@ -587,8 +587,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='iptables'
 PACKAGE_TARNAME='iptables'
-PACKAGE_VERSION='1.4.19.1'
-PACKAGE_STRING='iptables 1.4.19.1'
+PACKAGE_VERSION='1.4.21'
+PACKAGE_STRING='iptables 1.4.21'
 PACKAGE_BUGREPORT=''
 PACKAGE_URL=''
 
@@ -648,9 +648,8 @@ HAVE_LIBNFNETLINK_FALSE
 HAVE_LIBNFNETLINK_TRUE
 libnfnetlink_LIBS
 libnfnetlink_CFLAGS
-PKG_CONFIG_LIBDIR
-PKG_CONFIG_PATH
-PKG_CONFIG
+ENABLE_SYNCONF_FALSE
+ENABLE_SYNCONF_TRUE
 ENABLE_BPFC_FALSE
 ENABLE_BPFC_TRUE
 ENABLE_LIBIPQ_FALSE
@@ -668,6 +667,13 @@ ENABLE_SHARED_TRUE
 ENABLE_STATIC_FALSE
 ENABLE_STATIC_TRUE
 blacklist_modules
+HAVE_LIBNETFILTER_CONNTRACK_FALSE
+HAVE_LIBNETFILTER_CONNTRACK_TRUE
+libnetfilter_conntrack_LIBS
+libnetfilter_conntrack_CFLAGS
+PKG_CONFIG_LIBDIR
+PKG_CONFIG_PATH
+PKG_CONFIG
 libiptc_LDFLAGS2
 CPP
 OTOOL64
@@ -798,6 +804,7 @@ enable_largefile
 enable_devel
 enable_libipq
 enable_bpf_compiler
+enable_nfsynproxy
 with_pkgconfigdir
 '
       ac_precious_vars='build_alias
@@ -812,6 +819,8 @@ CPP
 PKG_CONFIG
 PKG_CONFIG_PATH
 PKG_CONFIG_LIBDIR
+libnetfilter_conntrack_CFLAGS
+libnetfilter_conntrack_LIBS
 libnfnetlink_CFLAGS
 libnfnetlink_LIBS'
 
@@ -1354,7 +1363,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures iptables 1.4.19.1 to adapt to many kinds of systems.
+\`configure' configures iptables 1.4.21 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1424,7 +1433,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of iptables 1.4.19.1:";;
+     short | recursive ) echo "Configuration of iptables 1.4.21:";;
    esac
   cat <<\_ACEOF
 
@@ -1445,6 +1454,7 @@ Optional Features:
   --enable-devel          Install Xtables development headers
   --enable-libipq         Build and install libipq
   --enable-bpf-compiler   Build bpf compiler
+  --enable-nfsynproxy     Build SYNPROXY configuration tool
 
 Optional Packages:
   --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]
@@ -1478,6 +1488,11 @@ Some influential environment variables:
               directories to add to pkg-config's search path
   PKG_CONFIG_LIBDIR
               path overriding pkg-config's built-in search path
+  libnetfilter_conntrack_CFLAGS
+              C compiler flags for libnetfilter_conntrack, overriding
+              pkg-config
+  libnetfilter_conntrack_LIBS
+              linker flags for libnetfilter_conntrack, overriding pkg-config
   libnfnetlink_CFLAGS
               C compiler flags for libnfnetlink, overriding pkg-config
   libnfnetlink_LIBS
@@ -1549,7 +1564,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-iptables configure 1.4.19.1
+iptables configure 1.4.21
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2097,7 +2112,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by iptables $as_me 1.4.19.1, which was
+It was created by iptables $as_me 1.4.21, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2920,7 +2935,7 @@ fi
 
 # Define the identity of the package.
  PACKAGE='iptables'
- VERSION='1.4.19.1'
+ VERSION='1.4.21'
 
 
 cat >>confdefs.h <<_ACEOF
 
 # Check whether --enable-libipq was given.
 if test "${enable_libipq+set}" = set; then :
-  enableval=$enable_libipq;
+  enableval=$enable_libipq; enable_libipq="$enableval"
+else
+  enable_libipq="no"
 fi
 
 # Check whether --enable-bpf-compiler was given.
 if test "${enable_bpf_compiler+set}" = set; then :
   enableval=$enable_bpf_compiler; enable_bpfc="yes"
+else
+  enable_bpfc="no"
+fi
+
+# Check whether --enable-nfsynproxy was given.
+if test "${enable_nfsynproxy+set}" = set; then :
+  enableval=$enable_nfsynproxy; enable_nfsynproxy="yes"
+else
+  enable_nfsynproxy="no"
 fi
 
 
@@ -11977,107 +12003,6 @@ if test "$ac_cv_header_linux_ip_vs_h" != "yes"; then
 fi;
 
 
-# The cast to long int works around a bug in the HP C Compiler
-# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
-# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
-# This bug is HP SR number 8606223364.
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of struct ip6_hdr" >&5
-$as_echo_n "checking size of struct ip6_hdr... " >&6; }
-if ${ac_cv_sizeof_struct_ip6_hdr+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct ip6_hdr))" "ac_cv_sizeof_struct_ip6_hdr"        "#include <netinet/ip6.h>
-"; then :
-
-else
-  if test "$ac_cv_type_struct_ip6_hdr" = yes; then
-     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
-$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
-as_fn_error 77 "cannot compute sizeof (struct ip6_hdr)
-See \`config.log' for more details" "$LINENO" 5; }
-   else
-     ac_cv_sizeof_struct_ip6_hdr=0
-   fi
-fi
-
-fi
-{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_struct_ip6_hdr" >&5
-$as_echo "$ac_cv_sizeof_struct_ip6_hdr" >&6; }
-
-
-
-cat >>confdefs.h <<_ACEOF
-#define SIZEOF_STRUCT_IP6_HDR $ac_cv_sizeof_struct_ip6_hdr
-_ACEOF
-
-
-
- if test "$enable_static" = "yes"; then
-  ENABLE_STATIC_TRUE=
-  ENABLE_STATIC_FALSE='#'
-else
-  ENABLE_STATIC_TRUE='#'
-  ENABLE_STATIC_FALSE=
-fi
-
- if test "$enable_shared" = "yes"; then
-  ENABLE_SHARED_TRUE=
-  ENABLE_SHARED_FALSE='#'
-else
-  ENABLE_SHARED_TRUE='#'
-  ENABLE_SHARED_FALSE=
-fi
-
- if test "$enable_ipv4" = "yes"; then
-  ENABLE_IPV4_TRUE=
-  ENABLE_IPV4_FALSE='#'
-else
-  ENABLE_IPV4_TRUE='#'
-  ENABLE_IPV4_FALSE=
-fi
-
- if test "$enable_ipv6" = "yes"; then
-  ENABLE_IPV6_TRUE=
-  ENABLE_IPV6_FALSE='#'
-else
-  ENABLE_IPV6_TRUE='#'
-  ENABLE_IPV6_FALSE=
-fi
-
- if test "$enable_largefile" = "yes"; then
-  ENABLE_LARGEFILE_TRUE=
-  ENABLE_LARGEFILE_FALSE='#'
-else
-  ENABLE_LARGEFILE_TRUE='#'
-  ENABLE_LARGEFILE_FALSE=
-fi
-
- if test "$enable_devel" = "yes"; then
-  ENABLE_DEVEL_TRUE=
-  ENABLE_DEVEL_FALSE='#'
-else
-  ENABLE_DEVEL_TRUE='#'
-  ENABLE_DEVEL_FALSE=
-fi
-
- if test "$enable_libipq" = "yes"; then
-  ENABLE_LIBIPQ_TRUE=
-  ENABLE_LIBIPQ_FALSE='#'
-else
-  ENABLE_LIBIPQ_TRUE='#'
-  ENABLE_LIBIPQ_FALSE=
-fi
-
- if test "$enable_bpfc" = "yes"; then
-  ENABLE_BPFC_TRUE=
-  ENABLE_BPFC_FALSE='#'
-else
-  ENABLE_BPFC_TRUE='#'
-  ENABLE_BPFC_FALSE=
-fi
-
-
-
 
 
 
@@ -12199,6 +12124,250 @@ $as_echo "no" >&6; }
 fi
 
 pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for libnetfilter_conntrack" >&5
+$as_echo_n "checking for libnetfilter_conntrack... " >&6; }
+
+if test -n "$libnetfilter_conntrack_CFLAGS"; then
+    pkg_cv_libnetfilter_conntrack_CFLAGS="$libnetfilter_conntrack_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnetfilter_conntrack >= 1.0.4\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libnetfilter_conntrack >= 1.0.4") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_libnetfilter_conntrack_CFLAGS=`$PKG_CONFIG --cflags "libnetfilter_conntrack >= 1.0.4" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+if test -n "$libnetfilter_conntrack_LIBS"; then
+    pkg_cv_libnetfilter_conntrack_LIBS="$libnetfilter_conntrack_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+    if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libnetfilter_conntrack >= 1.0.4\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libnetfilter_conntrack >= 1.0.4") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_libnetfilter_conntrack_LIBS=`$PKG_CONFIG --libs "libnetfilter_conntrack >= 1.0.4" 2>/dev/null`
+                     test "x$?" != "x0" && pkg_failed=yes
+else
+  pkg_failed=yes
+fi
+ else
+    pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+               libnetfilter_conntrack_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libnetfilter_conntrack >= 1.0.4" 2>&1`
+        else
+               libnetfilter_conntrack_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libnetfilter_conntrack >= 1.0.4" 2>&1`
+        fi
+       # Put the nasty error message in config.log where it belongs
+       echo "$libnetfilter_conntrack_PKG_ERRORS" >&5
+
+       nfconntrack=0
+elif test $pkg_failed = untried; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+       nfconntrack=0
+else
+       libnetfilter_conntrack_CFLAGS=$pkg_cv_libnetfilter_conntrack_CFLAGS
+       libnetfilter_conntrack_LIBS=$pkg_cv_libnetfilter_conntrack_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+       nfconntrack=1
+fi
+ if test "$nfconntrack" = 1; then
+  HAVE_LIBNETFILTER_CONNTRACK_TRUE=
+  HAVE_LIBNETFILTER_CONNTRACK_FALSE='#'
+else
+  HAVE_LIBNETFILTER_CONNTRACK_TRUE='#'
+  HAVE_LIBNETFILTER_CONNTRACK_FALSE=
+fi
+
+
+if test "$nfconntrack" -ne 1; then
+       blacklist_modules="$blacklist_modules connlabel";
+       echo "WARNING: libnetfilter_conntrack not found, connlabel match will not be built";
+fi;
+
+
+# The cast to long int works around a bug in the HP C Compiler
+# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
+# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.
+# This bug is HP SR number 8606223364.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of struct ip6_hdr" >&5
+$as_echo_n "checking size of struct ip6_hdr... " >&6; }
+if ${ac_cv_sizeof_struct_ip6_hdr+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (struct ip6_hdr))" "ac_cv_sizeof_struct_ip6_hdr"        "#include <netinet/ip6.h>
+"; then :
+
+else
+  if test "$ac_cv_type_struct_ip6_hdr" = yes; then
+     { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error 77 "cannot compute sizeof (struct ip6_hdr)
+See \`config.log' for more details" "$LINENO" 5; }
+   else
+     ac_cv_sizeof_struct_ip6_hdr=0
+   fi
+fi
+
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_struct_ip6_hdr" >&5
+$as_echo "$ac_cv_sizeof_struct_ip6_hdr" >&6; }
+
+
+
+cat >>confdefs.h <<_ACEOF
+#define SIZEOF_STRUCT_IP6_HDR $ac_cv_sizeof_struct_ip6_hdr
+_ACEOF
+
+
+
+ if test "$enable_static" = "yes"; then
+  ENABLE_STATIC_TRUE=
+  ENABLE_STATIC_FALSE='#'
+else
+  ENABLE_STATIC_TRUE='#'
+  ENABLE_STATIC_FALSE=
+fi
+
+ if test "$enable_shared" = "yes"; then
+  ENABLE_SHARED_TRUE=
+  ENABLE_SHARED_FALSE='#'
+else
+  ENABLE_SHARED_TRUE='#'
+  ENABLE_SHARED_FALSE=
+fi
+
+ if test "$enable_ipv4" = "yes"; then
+  ENABLE_IPV4_TRUE=
+  ENABLE_IPV4_FALSE='#'
+else
+  ENABLE_IPV4_TRUE='#'
+  ENABLE_IPV4_FALSE=
+fi
+
+ if test "$enable_ipv6" = "yes"; then
+  ENABLE_IPV6_TRUE=
+  ENABLE_IPV6_FALSE='#'
+else
+  ENABLE_IPV6_TRUE='#'
+  ENABLE_IPV6_FALSE=
+fi
+
+ if test "$enable_largefile" = "yes"; then
+  ENABLE_LARGEFILE_TRUE=
+  ENABLE_LARGEFILE_FALSE='#'
+else
+  ENABLE_LARGEFILE_TRUE='#'
+  ENABLE_LARGEFILE_FALSE=
+fi
+
+ if test "$enable_devel" = "yes"; then
+  ENABLE_DEVEL_TRUE=
+  ENABLE_DEVEL_FALSE='#'
+else
+  ENABLE_DEVEL_TRUE='#'
+  ENABLE_DEVEL_FALSE=
+fi
+
+ if test "$enable_libipq" = "yes"; then
+  ENABLE_LIBIPQ_TRUE=
+  ENABLE_LIBIPQ_FALSE='#'
+else
+  ENABLE_LIBIPQ_TRUE='#'
+  ENABLE_LIBIPQ_FALSE=
+fi
+
+ if test "$enable_bpfc" = "yes"; then
+  ENABLE_BPFC_TRUE=
+  ENABLE_BPFC_FALSE='#'
+else
+  ENABLE_BPFC_TRUE='#'
+  ENABLE_BPFC_FALSE=
+fi
+
+ if test "$enable_nfsynproxy" = "yes"; then
+  ENABLE_SYNCONF_TRUE=
+  ENABLE_SYNCONF_FALSE='#'
+else
+  ENABLE_SYNCONF_TRUE='#'
+  ENABLE_SYNCONF_FALSE=
+fi
+
+
+if test "x$enable_bpfc" = "xyes" || test "x$enable_nfsynproxy" = "xyes"; then
+       { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcap_compile in -lpcap" >&5
+$as_echo_n "checking for pcap_compile in -lpcap... " >&6; }
+if ${ac_cv_lib_pcap_pcap_compile+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpcap  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char pcap_compile ();
+int
+main ()
+{
+return pcap_compile ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_pcap_pcap_compile=yes
+else
+  ac_cv_lib_pcap_pcap_compile=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcap_pcap_compile" >&5
+$as_echo "$ac_cv_lib_pcap_pcap_compile" >&6; }
+if test "x$ac_cv_lib_pcap_pcap_compile" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_LIBPCAP 1
+_ACEOF
+
+  LIBS="-lpcap $LIBS"
+
+else
+  as_fn_error $? "missing libpcap library required by bpf compiler or nfsynproxy tool" "$LINENO" 5
+fi
+
+fi
+
+
+pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libnfnetlink" >&5
 $as_echo_n "checking for libnfnetlink... " >&6; }
 
@@ -12284,10 +12453,10 @@ regular_CPPFLAGS="${largefile_cppflags} -D_REENTRANT \
        -DXTABLES_LIBDIR=\\\"\${xtlibdir}\\\" -DXTABLES_INTERNAL";
 kinclude_CPPFLAGS="";
 if [ -n "$kbuilddir" ]; then
-       kinclude_CPPFLAGS="$kinclude_CPPFLAGS -I$kbuilddir/include";
+       kinclude_CPPFLAGS="$kinclude_CPPFLAGS -I$kbuilddir/include/uapi -I$kbuilddir/include";
 fi;
 if [ -n "$ksourcedir" ]; then
-       kinclude_CPPFLAGS="$kinclude_CPPFLAGS -I$ksourcedir/include";
+       kinclude_CPPFLAGS="$kinclude_CPPFLAGS -I$ksourcedir/include/uapi -I$ksourcedir/include";
 fi;
 pkgdatadir='${datadir}/xtables';
 
@@ -12302,10 +12471,11 @@ pkgdatadir='${datadir}/xtables';
 
 
 
+
 libxtables_vmajor=$(($libxtables_vcurrent - $libxtables_vage));
 
 
-ac_config_files="$ac_config_files Makefile extensions/GNUmakefile include/Makefile iptables/Makefile iptables/xtables.pc libipq/Makefile libipq/libipq.pc libiptc/Makefile libiptc/libiptc.pc libiptc/libip4tc.pc libiptc/libip6tc.pc libxtables/Makefile utils/Makefile include/xtables-version.h include/iptables/internal.h"
+ac_config_files="$ac_config_files Makefile extensions/GNUmakefile include/Makefile iptables/Makefile iptables/xtables.pc iptables/iptables.8 iptables/iptables-extensions.8.tmpl iptables/iptables-save.8 iptables/iptables-restore.8 iptables/iptables-apply.8 iptables/iptables-xml.1 libipq/Makefile libipq/libipq.pc libiptc/Makefile libiptc/libiptc.pc libiptc/libip4tc.pc libiptc/libip6tc.pc libxtables/Makefile utils/Makefile include/xtables-version.h include/iptables/internal.h"
 
 cat >confcache <<\_ACEOF
 # This file is a shell script that caches the results of configure
@@ -12432,6 +12602,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
   as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${HAVE_LIBNETFILTER_CONNTRACK_TRUE}" && test -z "${HAVE_LIBNETFILTER_CONNTRACK_FALSE}"; then
+  as_fn_error $? "conditional \"HAVE_LIBNETFILTER_CONNTRACK\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${ENABLE_STATIC_TRUE}" && test -z "${ENABLE_STATIC_FALSE}"; then
   as_fn_error $? "conditional \"ENABLE_STATIC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -12464,6 +12638,10 @@ if test -z "${ENABLE_BPFC_TRUE}" && test -z "${ENABLE_BPFC_FALSE}"; then
   as_fn_error $? "conditional \"ENABLE_BPFC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${ENABLE_SYNCONF_TRUE}" && test -z "${ENABLE_SYNCONF_FALSE}"; then
+  as_fn_error $? "conditional \"ENABLE_SYNCONF\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${HAVE_LIBNFNETLINK_TRUE}" && test -z "${HAVE_LIBNFNETLINK_FALSE}"; then
   as_fn_error $? "conditional \"HAVE_LIBNFNETLINK\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -12865,7 +13043,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by iptables $as_me 1.4.19.1, which was
+This file was extended by iptables $as_me 1.4.21, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -12931,7 +13109,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-iptables config.status 1.4.19.1
+iptables config.status 1.4.21
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
     "include/Makefile") CONFIG_FILES="$CONFIG_FILES include/Makefile" ;;
     "iptables/Makefile") CONFIG_FILES="$CONFIG_FILES iptables/Makefile" ;;
     "iptables/xtables.pc") CONFIG_FILES="$CONFIG_FILES iptables/xtables.pc" ;;
+    "iptables/iptables.8") CONFIG_FILES="$CONFIG_FILES iptables/iptables.8" ;;
+    "iptables/iptables-extensions.8.tmpl") CONFIG_FILES="$CONFIG_FILES iptables/iptables-extensions.8.tmpl" ;;
+    "iptables/iptables-save.8") CONFIG_FILES="$CONFIG_FILES iptables/iptables-save.8" ;;
+    "iptables/iptables-restore.8") CONFIG_FILES="$CONFIG_FILES iptables/iptables-restore.8" ;;
+    "iptables/iptables-apply.8") CONFIG_FILES="$CONFIG_FILES iptables/iptables-apply.8" ;;
+    "iptables/iptables-xml.1") CONFIG_FILES="$CONFIG_FILES iptables/iptables-xml.1" ;;
     "libipq/Makefile") CONFIG_FILES="$CONFIG_FILES libipq/Makefile" ;;
     "libipq/libipq.pc") CONFIG_FILES="$CONFIG_FILES libipq/libipq.pc" ;;
     "libiptc/Makefile") CONFIG_FILES="$CONFIG_FILES libiptc/Makefile" ;;
@@ -14713,3 +14897,59 @@ if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then
 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
+
+
+e_xtlibdir=$xtlibdir
+if test $prefix = 'NONE'; then
+       prefix="/usr/local"
+fi
+while true; do
+  case "$e_xtlibdir" in
+    *\$* ) eval "e_xtlibdir=$e_xtlibdir" ;;
+    *) break ;;
+  esac
+done
+eval "e_xtlibdir=$e_xtlibdir"
+
+e_pkgconfigdir=$pkgconfigdir
+if test $prefix = 'NONE'; then
+       prefix="/usr/local"
+fi
+while true; do
+  case "$e_pkgconfigdir" in
+    *\$* ) eval "e_pkgconfigdir=$e_pkgconfigdir" ;;
+    *) break ;;
+  esac
+done
+eval "e_pkgconfigdir=$e_pkgconfigdir"
+
+
+echo "
+Iptables Configuration:
+  IPv4 support:                                ${enable_ipv4}
+  IPv6 support:                                ${enable_ipv6}
+  Devel support:                       ${enable_devel}
+  IPQ support:                         ${enable_libipq}
+  Large file support:                  ${enable_largefile}
+  BPF utils support:                   ${enable_bpfc}
+  nfsynproxy util support:             ${enable_nfsynproxy}
+
+Build parameters:
+  Put plugins into executable (static):        ${enable_static}
+  Support plugins via dlopen (shared): ${enable_shared}
+  Installation prefix (--prefix):      ${prefix}
+  Xtables extension directory:         ${e_xtlibdir}
+  Pkg-config directory:                        ${e_pkgconfigdir}"
+
+if [ -n "$ksourcedir" ]; then
+       echo "  Kernel source directory:                ${ksourcedir}"
+fi;
+if [ -n "$kbuilddir" ]; then
+       echo "  Kernel build directory:         ${kbuilddir}"
+fi;
+
+echo "  Host:                                  ${host}
+  GCC binary:                          ${CC}"
+
+test x"$blacklist_modules" = "x" || echo "
+Iptables modules that will not be built: $blacklist_modules"
index d165d52..e83304c 100644 (file)
@@ -1,5 +1,5 @@
 
-AC_INIT([iptables], [1.4.19.1])
+AC_INIT([iptables], [1.4.21])
 
 # See libtool.info "Libtool's versioning system"
 libxtables_vcurrent=10
@@ -49,10 +49,14 @@ AC_ARG_ENABLE([devel],
        [Install Xtables development headers]),
        [enable_devel="$enableval"], [enable_devel="yes"])
 AC_ARG_ENABLE([libipq],
-       AS_HELP_STRING([--enable-libipq], [Build and install libipq]))
+       AS_HELP_STRING([--enable-libipq], [Build and install libipq]),
+       [enable_libipq="$enableval"], [enable_libipq="no"])
 AC_ARG_ENABLE([bpf-compiler],
        AS_HELP_STRING([--enable-bpf-compiler], [Build bpf compiler]),
-       [enable_bpfc="yes"])
+       [enable_bpfc="yes"], [enable_bpfc="no"])
+AC_ARG_ENABLE([nfsynproxy],
+       AS_HELP_STRING([--enable-nfsynproxy], [Build SYNPROXY configuration tool]),
+       [enable_nfsynproxy="yes"], [enable_nfsynproxy="no"])
 AC_ARG_WITH([pkgconfigdir], AS_HELP_STRING([--with-pkgconfigdir=PATH],
        [Path to the pkgconfig directory [[LIBDIR/pkgconfig]]]),
        [pkgconfigdir="$withval"], [pkgconfigdir='${libdir}/pkgconfig'])
@@ -81,6 +85,15 @@ if test "$ac_cv_header_linux_ip_vs_h" != "yes"; then
        blacklist_modules="$blacklist_modules ipvs";
 fi;
 
+PKG_CHECK_MODULES([libnetfilter_conntrack], [libnetfilter_conntrack >= 1.0.4],
+       [nfconntrack=1], [nfconntrack=0])
+AM_CONDITIONAL([HAVE_LIBNETFILTER_CONNTRACK], [test "$nfconntrack" = 1])
+
+if test "$nfconntrack" -ne 1; then
+       blacklist_modules="$blacklist_modules connlabel";
+       echo "WARNING: libnetfilter_conntrack not found, connlabel match will not be built";
+fi;
+
 AC_SUBST([blacklist_modules])
 AC_CHECK_SIZEOF([struct ip6_hdr], [], [#include <netinet/ip6.h>])
 
@@ -92,6 +105,11 @@ AM_CONDITIONAL([ENABLE_LARGEFILE], [test "$enable_largefile" = "yes"])
 AM_CONDITIONAL([ENABLE_DEVEL], [test "$enable_devel" = "yes"])
 AM_CONDITIONAL([ENABLE_LIBIPQ], [test "$enable_libipq" = "yes"])
 AM_CONDITIONAL([ENABLE_BPFC], [test "$enable_bpfc" = "yes"])
+AM_CONDITIONAL([ENABLE_SYNCONF], [test "$enable_nfsynproxy" = "yes"])
+
+if test "x$enable_bpfc" = "xyes" || test "x$enable_nfsynproxy" = "xyes"; then
+       AC_CHECK_LIB(pcap, pcap_compile,, AC_MSG_ERROR(missing libpcap library required by bpf compiler or nfsynproxy tool))
+fi
 
 PKG_CHECK_MODULES([libnfnetlink], [libnfnetlink >= 1.0],
        [nfnetlink=1], [nfnetlink=0])
@@ -104,13 +122,27 @@ regular_CPPFLAGS="${largefile_cppflags} -D_REENTRANT \
        -DXTABLES_LIBDIR=\\\"\${xtlibdir}\\\" -DXTABLES_INTERNAL";
 kinclude_CPPFLAGS="";
 if [[ -n "$kbuilddir" ]]; then
-       kinclude_CPPFLAGS="$kinclude_CPPFLAGS -I$kbuilddir/include";
+       kinclude_CPPFLAGS="$kinclude_CPPFLAGS -I$kbuilddir/include/uapi -I$kbuilddir/include";
 fi;
 if [[ -n "$ksourcedir" ]]; then
-       kinclude_CPPFLAGS="$kinclude_CPPFLAGS -I$ksourcedir/include";
+       kinclude_CPPFLAGS="$kinclude_CPPFLAGS -I$ksourcedir/include/uapi -I$ksourcedir/include";
 fi;
 pkgdatadir='${datadir}/xtables';
 
+define([EXPAND_VARIABLE],
+[$2=[$]$1
+if test $prefix = 'NONE'; then
+       prefix="/usr/local"
+fi
+while true; do
+  case "[$]$2" in
+    *\[$]* ) eval "$2=[$]$2" ;;
+    *) break ;;
+  esac
+done
+eval "$2=[$]$2"
+])dnl EXPAND_VARIABLE
+
 AC_SUBST([regular_CFLAGS])
 AC_SUBST([regular_CPPFLAGS])
 AC_SUBST([noundef_LDFLAGS])
@@ -127,9 +159,46 @@ AC_SUBST([libxtables_vmajor])
 
 AC_CONFIG_FILES([Makefile extensions/GNUmakefile include/Makefile
        iptables/Makefile iptables/xtables.pc
+       iptables/iptables.8 iptables/iptables-extensions.8.tmpl
+       iptables/iptables-save.8 iptables/iptables-restore.8
+       iptables/iptables-apply.8 iptables/iptables-xml.1
        libipq/Makefile libipq/libipq.pc
        libiptc/Makefile libiptc/libiptc.pc
        libiptc/libip4tc.pc libiptc/libip6tc.pc
        libxtables/Makefile utils/Makefile
        include/xtables-version.h include/iptables/internal.h])
 AC_OUTPUT
+
+
+EXPAND_VARIABLE(xtlibdir, e_xtlibdir)
+EXPAND_VARIABLE(pkgconfigdir, e_pkgconfigdir)
+
+echo "
+Iptables Configuration:
+  IPv4 support:                                ${enable_ipv4}
+  IPv6 support:                                ${enable_ipv6}
+  Devel support:                       ${enable_devel}
+  IPQ support:                         ${enable_libipq}
+  Large file support:                  ${enable_largefile}
+  BPF utils support:                   ${enable_bpfc}
+  nfsynproxy util support:             ${enable_nfsynproxy}
+
+Build parameters:
+  Put plugins into executable (static):        ${enable_static}
+  Support plugins via dlopen (shared): ${enable_shared}
+  Installation prefix (--prefix):      ${prefix}
+  Xtables extension directory:         ${e_xtlibdir}
+  Pkg-config directory:                        ${e_pkgconfigdir}"
+
+if [[ -n "$ksourcedir" ]]; then
+       echo "  Kernel source directory:                ${ksourcedir}"
+fi;
+if [[ -n "$kbuilddir" ]]; then
+       echo "  Kernel build directory:         ${kbuilddir}"
+fi;
+
+echo "  Host:                                  ${host}
+  GCC binary:                          ${CC}"
+
+test x"$blacklist_modules" = "x" || echo "
+Iptables modules that will not be built: $blacklist_modules"
diff --git a/etc/xtables/connlabel.conf b/etc/xtables/connlabel.conf
deleted file mode 100644 (file)
index 9167029..0000000
+++ /dev/null
@@ -1,8 +0,0 @@
-# example connlabel.conf mapping file.
-# used by the "connlabel" match to translate names to their bit-value.
-0      eth0-in
-1      eth0-out
-2      ppp-in
-3      ppp-out
-4      bulk-traffic
-5      interactive
index 1ae7f74..c5d8844 100644 (file)
@@ -21,7 +21,7 @@ regular_CPPFLAGS   = @regular_CPPFLAGS@
 kinclude_CPPFLAGS  = @kinclude_CPPFLAGS@
 
 AM_CFLAGS       = ${regular_CFLAGS}
-AM_CPPFLAGS     = ${regular_CPPFLAGS} -I${top_builddir}/include -I${top_builddir} -I${top_srcdir}/include ${kinclude_CPPFLAGS}
+AM_CPPFLAGS     = ${regular_CPPFLAGS} -I${top_builddir}/include -I${top_builddir} -I${top_srcdir}/include ${kinclude_CPPFLAGS} ${CPPFLAGS}
 AM_DEPFLAGS     = -Wp,-MMD,$(@D)/.$(@F).d,-MT,$@
 AM_LDFLAGS      = @noundef_LDFLAGS@
 
@@ -93,7 +93,7 @@ lib%.so: lib%.oo
        ${AM_VERBOSE_CCLD} ${CCLD} ${AM_LDFLAGS} -shared ${LDFLAGS} -o $@ $< -L../libxtables/.libs -lxtables ${$*_LIBADD};
 
 lib%.oo: ${srcdir}/lib%.c
-       ${AM_VERBOSE_CC} ${CC} ${AM_CPPFLAGS} ${AM_DEPFLAGS} ${AM_CFLAGS} -D_INIT=lib$*_init -DPIC -fPIC ${CFLAGS} -o $@ -c $<;
+       ${AM_VERBOSE_CC} ${CC} ${AM_CPPFLAGS} ${AM_DEPFLAGS} ${AM_CFLAGS} -D_INIT=lib$*_init -DPIC -fPIC ${CFLAGS} ${$*_CFLAGADD} -o $@ -c $<;
 
 libxt_NOTRACK.so: libxt_CT.so
        ln -fs $< $@
@@ -103,6 +103,9 @@ libxt_state.so: libxt_conntrack.so
 # Need the LIBADDs in iptables/Makefile.am too for libxtables_la_LIBADD
 xt_RATEEST_LIBADD   = -lm
 xt_statistic_LIBADD = -lm
+@HAVE_LIBNETFILTER_CONNTRACK_TRUE@xt_connlabel_LIBADD = @libnetfilter_conntrack_LIBS@
+
+@HAVE_LIBNETFILTER_CONNTRACK_TRUE@xt_connlabel_CFLAGADD = @libnetfilter_conntrack_CFLAGS@
 
 #
 #      Static bits
index 703adf6..a442de6 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2012-2013 Patrick McHardy <kaber@trash.net>
+ */
+
 #include <stdio.h>
 #include <string.h>
 #include <xtables.h>
index 2b1ae28..4639268 100644 (file)
@@ -146,8 +146,10 @@ static void LOG_save(const void *ip, const struct xt_entry_target *target)
        const struct ip6t_log_info *loginfo
                = (const struct ip6t_log_info *)target->data;
 
-       if (strcmp(loginfo->prefix, "") != 0)
-               printf(" --log-prefix \"%s\"", loginfo->prefix);
+       if (strcmp(loginfo->prefix, "") != 0) {
+               printf(" --log-prefix");
+               xtables_save_string(loginfo->prefix);
+       }
 
        if (loginfo->level != LOG_DEFAULT_LEVEL)
                printf(" --log-level %d", loginfo->level);
diff --git a/extensions/libip6t_LOG.man b/extensions/libip6t_LOG.man
deleted file mode 100644 (file)
index 0a48640..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-Turn on kernel logging of matching packets.  When this option is set
-for a rule, the Linux kernel will print some information on all
-matching packets (like most IPv6 IPv6-header fields) via the kernel log
-(where it can be read with
-.I dmesg
-or 
-.IR syslogd (8)).
-This is a "non-terminating target", i.e. rule traversal continues at
-the next rule.  So if you want to LOG the packets you refuse, use two
-separate rules with the same matching criteria, first using target LOG
-then DROP (or REJECT).
-.TP
-\fB\-\-log\-level\fP \fIlevel\fP
-Level of logging, which can be (system-specific) numeric or a mnemonic.
-Possible values are (in decreasing order of priority): \fBemerg\fP,
-\fBalert\fP, \fBcrit\fP, \fBerror\fP, \fBwarning\fP, \fBnotice\fP, \fBinfo\fP
-or \fBdebug\fP.
-.TP
-\fB\-\-log\-prefix\fP \fIprefix\fP
-Prefix log messages with the specified prefix; up to 29 letters long,
-and useful for distinguishing messages in the logs.
-.TP
-\fB\-\-log\-tcp\-sequence\fP
-Log TCP sequence numbers. This is a security risk if the log is
-readable by users.
-.TP
-\fB\-\-log\-tcp\-options\fP
-Log options from the TCP packet header.
-.TP
-\fB\-\-log\-ip\-options\fP
-Log options from the IPv6 packet header.
-.TP
-\fB\-\-log\-uid\fP
-Log the userid of the process which generated the packet.
diff --git a/extensions/libip6t_MASQUERADE.man b/extensions/libip6t_MASQUERADE.man
deleted file mode 100644 (file)
index c63d826..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-This target is only valid in the
-.B nat
-table, in the
-.B POSTROUTING
-chain.  It should only be used with dynamically assigned IPv6 (dialup)
-connections: if you have a static IP address, you should use the SNAT
-target.  Masquerading is equivalent to specifying a mapping to the IP
-address of the interface the packet is going out, but also has the
-effect that connections are
-.I forgotten
-when the interface goes down.  This is the correct behavior when the
-next dialup is unlikely to have the same interface address (and hence
-any established connections are lost anyway).
-.TP
-\fB\-\-to\-ports\fP \fIport\fP[\fB\-\fP\fIport\fP]
-This specifies a range of source ports to use, overriding the default
-.B SNAT
-source port-selection heuristics (see above).  This is only valid
-if the rule also specifies
-\fB\-p tcp\fP
-or
-\fB\-p udp\fP.
-.TP
-\fB\-\-random\fP
-Randomize source port mapping
-If option
-\fB\-\-random\fP
-is used then port mapping will be randomized.
-.RS
-.PP
index 2d09e05..0030a51 100644 (file)
@@ -18,10 +18,9 @@ The type given can be
 \fBicmp6\-adm\-prohibited\fP,
 \fBadm\-prohibited\fP,
 \fBicmp6\-addr\-unreachable\fP,
-\fBaddr\-unreach\fP,
-\fBicmp6\-port\-unreachable\fP or
-\fBport\-unreach\fP
-which return the appropriate ICMPv6 error message (\fBport\-unreach\fP is
+\fBaddr\-unreach\fP, or
+\fBicmp6\-port\-unreachable\fP,
+which return the appropriate ICMPv6 error message (\fBicmp6\-port\-unreachable\fP is
 the default). Finally, the option
 \fBtcp\-reset\fP
 can be used on rules which only match the TCP protocol: this causes a
index 7ed80b2..4f10de0 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2012-2013 Patrick McHardy <kaber@trash.net>
+ */
+
 #include <stdio.h>
 #include <string.h>
 #include <xtables.h>
index 4559e78..8ec08c6 100644 (file)
@@ -8,5 +8,5 @@ a numeric MH
 .IR type
 or one of the MH type names shown by the command
 .nf
- ip6tables \-p ipv6\-mh \-h
+ ip6tables \-p mh \-h
 .fi
index c419a85..926da03 100644 (file)
@@ -18,9 +18,9 @@ The type given can be
 \fBicmp\-port\-unreachable\fP,
 \fBicmp\-proto\-unreachable\fP,
 \fBicmp\-net\-prohibited\fP,
-\fBicmp\-host\-prohibited\fP or
-\fBicmp\-admin\-prohibited\fP (*)
-which return the appropriate ICMP error message (\fBport\-unreachable\fP is
+\fBicmp\-host\-prohibited\fP, or
+\fBicmp\-admin\-prohibited\fP (*),
+which return the appropriate ICMP error message (\fBicmp\-port\-unreachable\fP is
 the default).  The option
 \fBtcp\-reset\fP
 can be used on rules which only match the TCP protocol: this causes a
index 649b6e3..c91f776 100644 (file)
@@ -1,4 +1,5 @@
-This target provides userspace logging of matching packets.  When this
+This is the deprecated ipv4-only predecessor of the NFLOG target.
+It provides userspace logging of matching packets.  When this
 target is set for a rule, the Linux kernel will multicast this packet
 through a
 .IR netlink 
index ee0f9e1..e04657a 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2003-2013 Patrick McHardy <kaber@trash.net>
+ */
+
 #include <stdio.h>
 #include <xtables.h>
 #include <linux/netfilter/xt_CLASSIFY.h>
index a576a95..6b28fe1 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2010-2013 Patrick McHardy <kaber@trash.net>
+ */
+
 #include <stdio.h>
 #include <string.h>
 #include <xtables.h>
@@ -191,6 +195,10 @@ ct_print_v1(const void *ip, const struct xt_entry_target *target, int numeric)
        const struct xt_ct_target_info_v1 *info =
                (const struct xt_ct_target_info_v1 *)target->data;
 
+       if (info->flags & XT_CT_NOTRACK_ALIAS) {
+               printf (" NOTRACK");
+               return;
+       }
        printf(" CT");
        if (info->flags & XT_CT_NOTRACK)
                printf(" notrack");
@@ -213,6 +221,8 @@ static void ct_save(const void *ip, const struct xt_entry_target *target)
        const struct xt_ct_target_info *info =
                (const struct xt_ct_target_info *)target->data;
 
+       if (info->flags & XT_CT_NOTRACK_ALIAS)
+               return;
        if (info->flags & XT_CT_NOTRACK)
                printf(" --notrack");
        if (info->helper[0])
@@ -232,6 +242,8 @@ static void ct_save_v1(const void *ip, const struct xt_entry_target *target)
        const struct xt_ct_target_info_v1 *info =
                (const struct xt_ct_target_info_v1 *)target->data;
 
+       if (info->flags & XT_CT_NOTRACK_ALIAS)
+               return;
        if (info->flags & XT_CT_NOTRACK)
                printf(" --notrack");
        if (info->helper[0])
@@ -248,6 +260,14 @@ static void ct_save_v1(const void *ip, const struct xt_entry_target *target)
                printf(" --zone %u", info->zone);
 }
 
+static const char *
+ct_print_name_alias(const struct xt_entry_target *target)
+{
+       struct xt_ct_target_info *info = (void *)target->data;
+
+       return info->flags & XT_CT_NOTRACK_ALIAS ? "NOTRACK" : "CT";
+}
+
 static void notrack_ct0_tg_init(struct xt_entry_target *target)
 {
        struct xt_ct_target_info *info = (void *)target->data;
@@ -262,6 +282,13 @@ static void notrack_ct1_tg_init(struct xt_entry_target *target)
        info->flags = XT_CT_NOTRACK;
 }
 
+static void notrack_ct2_tg_init(struct xt_entry_target *target)
+{
+       struct xt_ct_target_info_v1 *info = (void *)target->data;
+
+       info->flags = XT_CT_NOTRACK | XT_CT_NOTRACK_ALIAS;
+}
+
 static struct xtables_target ct_target_reg[] = {
        {
                .family         = NFPROTO_UNSPEC,
@@ -289,6 +316,20 @@ static struct xtables_target ct_target_reg[] = {
                .x6_options     = ct_opts_v1,
        },
        {
+               .family         = NFPROTO_UNSPEC,
+               .name           = "CT",
+               .revision       = 2,
+               .version        = XTABLES_VERSION,
+               .size           = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
+               .userspacesize  = offsetof(struct xt_ct_target_info_v1, ct),
+               .help           = ct_help_v1,
+               .print          = ct_print_v1,
+               .save           = ct_save_v1,
+               .alias          = ct_print_name_alias,
+               .x6_parse       = ct_parse_v1,
+               .x6_options     = ct_opts_v1,
+       },
+       {
                .family        = NFPROTO_UNSPEC,
                .name          = "NOTRACK",
                .real_name     = "CT",
@@ -311,6 +352,17 @@ static struct xtables_target ct_target_reg[] = {
        {
                .family        = NFPROTO_UNSPEC,
                .name          = "NOTRACK",
+               .real_name     = "CT",
+               .revision      = 2,
+               .ext_flags     = XTABLES_EXT_ALIAS,
+               .version       = XTABLES_VERSION,
+               .size          = XT_ALIGN(sizeof(struct xt_ct_target_info_v1)),
+               .userspacesize = offsetof(struct xt_ct_target_info_v1, ct),
+               .init          = notrack_ct2_tg_init,
+       },
+       {
+               .family        = NFPROTO_UNSPEC,
+               .name          = "NOTRACK",
                .revision      = 0,
                .version       = XTABLES_VERSION,
        },
similarity index 85%
rename from extensions/libipt_DNAT.man
rename to extensions/libxt_DNAT.man
index d5ded35..225274f 100644 (file)
@@ -7,20 +7,17 @@ and
 chains, and user-defined chains which are only called from those
 chains.  It specifies that the destination address of the packet
 should be modified (and all future packets in this connection will
-also be mangled), and rules should cease being examined.  It takes one
-type of option:
+also be mangled), and rules should cease being examined.  It takes the
+following options:
 .TP
 \fB\-\-to\-destination\fP [\fIipaddr\fP[\fB\-\fP\fIipaddr\fP]][\fB:\fP\fIport\fP[\fB\-\fP\fIport\fP]]
 which can specify a single new destination IP address, an inclusive
-range of IP addresses, and optionally, a port range (which is only
-valid if the rule also specifies
-\fB\-p tcp\fP
-or
-\fB\-p udp\fP).
+range of IP addresses. Optionally a port range,
+if the rule also specifies one of the following protocols:
+\fBtcp\fP, \fBudp\fP, \fBdccp\fP or \fBsctp\fP.
 If no port range is specified, then the destination port will never be
 modified. If no IP address is specified then only the destination port
 will be modified.
-
 In Kernels up to 2.6.10 you can add several \-\-to\-destination options. For
 those kernels, if you specify more than one destination address, either via an
 address range or multiple \-\-to\-destination options, a simple round-robin (one
@@ -37,3 +34,5 @@ is used then port mapping will be randomized (kernel >= 2.6.22).
 Gives a client the same source-/destination-address for each connection.
 This supersedes the SAME target. Support for persistent mappings is available
 from 2.6.29-rc2.
+.TP
+IPv6 support available since Linux kernels >= 3.7.
index e6cf849..8622c37 100644 (file)
@@ -49,7 +49,6 @@ static void LED_help(void)
 static void LED_parse(struct xt_option_call *cb)
 {
        struct xt_led_info *led = cb->data;
-       unsigned int delay;
 
        xtables_option_parse(cb);
        switch (cb->entry->id) {
@@ -60,7 +59,7 @@ static void LED_parse(struct xt_option_call *cb)
        case O_LED_DELAY:
                if (strncasecmp(cb->arg, "inf", 3) == 0)
                        led->delay = -1;
-               else if (!xtables_strtoui(cb->arg, NULL, &delay, 0, UINT32_MAX))
+               else if (!xtables_strtoui(cb->arg, NULL, &led->delay, 0, UINT32_MAX))
                        xtables_error(PARAMETER_PROBLEM,
                                "Delay value must be within range 0..%u",
                                UINT32_MAX);
similarity index 85%
rename from extensions/libipt_LOG.man
rename to extensions/libxt_LOG.man
index f2574f8..354edf4 100644 (file)
@@ -1,10 +1,8 @@
 Turn on kernel logging of matching packets.  When this option is set
 for a rule, the Linux kernel will print some information on all
-matching packets (like most IP header fields) via the kernel log
-(where it can be read with
-.I dmesg
-or 
-.IR syslogd (8)).
+matching packets (like most IP/IPv6 header fields) via the kernel log
+(where it can be read with \fIdmesg(1)\fP or read in the syslog).
+.PP
 This is a "non-terminating target", i.e. rule traversal continues at
 the next rule.  So if you want to LOG the packets you refuse, use two
 separate rules with the same matching criteria, first using target LOG
@@ -28,7 +26,7 @@ readable by users.
 Log options from the TCP packet header.
 .TP
 \fB\-\-log\-ip\-options\fP
-Log options from the IP packet header.
+Log options from the IP/IPv6 packet header.
 .TP
 \fB\-\-log\-uid\fP
 Log the userid of the process which generated the packet.
similarity index 84%
rename from extensions/libipt_MASQUERADE.man
rename to extensions/libxt_MASQUERADE.man
index 2dae964..c9e3950 100644 (file)
@@ -16,15 +16,13 @@ any established connections are lost anyway).
 This specifies a range of source ports to use, overriding the default
 .B SNAT
 source port-selection heuristics (see above).  This is only valid
-if the rule also specifies
-\fB\-p tcp\fP
-or
-\fB\-p udp\fP.
+if the rule also specifies one of the following protocols:
+\fBtcp\fP, \fBudp\fP, \fBdccp\fP or \fBsctp\fP.
 .TP
 \fB\-\-random\fP
 Randomize source port mapping
 If option
 \fB\-\-random\fP
 is used then port mapping will be randomized (kernel >= 2.6.21).
-.RS
-.PP
+.TP
+IPv6 support available since Linux kernels >= 3.7.
similarity index 88%
rename from extensions/libipt_NETMAP.man
rename to extensions/libxt_NETMAP.man
index a7e90b8..06507db 100644 (file)
@@ -7,3 +7,5 @@ table.
 Network address to map to.  The resulting address will be constructed in the
 following way: All 'one' bits in the mask are filled in from the new `address'.
 All bits that are zero in the mask are filled in from the original address.
+.TP
+IPv6 support available since Linux kernels >= 3.7.
index 8c2f699..0c86918 100644 (file)
@@ -13,8 +13,10 @@ enum {
        O_QUEUE_NUM = 0,
        O_QUEUE_BALANCE,
        O_QUEUE_BYPASS,
+       O_QUEUE_CPU_FANOUT,
        F_QUEUE_NUM     = 1 << O_QUEUE_NUM,
        F_QUEUE_BALANCE = 1 << O_QUEUE_BALANCE,
+       F_QUEUE_CPU_FANOUT = 1 << O_QUEUE_CPU_FANOUT,
 };
 
 static void NFQUEUE_help(void)
@@ -37,7 +39,15 @@ static void NFQUEUE_help_v2(void)
 {
        NFQUEUE_help_v1();
        printf(
-"  --queue-bypass              Bypass Queueing if no queue instance exists.\n");
+"  --queue-bypass              Bypass Queueing if no queue instance exists.\n"
+"  --queue-cpu-fanout  Use current CPU (no hashing)\n");
+}
+
+static void NFQUEUE_help_v3(void)
+{
+       NFQUEUE_help_v2();
+       printf(
+"  --queue-cpu-fanout  Use current CPU (no hashing)\n");
 }
 
 #define s struct xt_NFQ_info
@@ -48,6 +58,8 @@ static const struct xt_option_entry NFQUEUE_opts[] = {
        {.name = "queue-balance", .id = O_QUEUE_BALANCE,
         .type = XTTYPE_UINT16RC, .excl = F_QUEUE_NUM},
        {.name = "queue-bypass", .id = O_QUEUE_BYPASS, .type = XTTYPE_NONE},
+       {.name = "queue-cpu-fanout", .id = O_QUEUE_CPU_FANOUT,
+        .type = XTTYPE_NONE, .also = F_QUEUE_BALANCE},
        XTOPT_TABLEEND,
 };
 #undef s
@@ -92,6 +104,18 @@ static void NFQUEUE_parse_v2(struct xt_option_call *cb)
        }
 }
 
+static void NFQUEUE_parse_v3(struct xt_option_call *cb)
+{
+       struct xt_NFQ_info_v3 *info = cb->data;
+
+       NFQUEUE_parse_v2(cb);
+       switch (cb->entry->id) {
+       case O_QUEUE_CPU_FANOUT:
+               info->flags |= NFQ_FLAG_CPU_FANOUT;
+               break;
+       }
+}
+
 static void NFQUEUE_print(const void *ip,
                           const struct xt_entry_target *target, int numeric)
 {
@@ -120,10 +144,20 @@ static void NFQUEUE_print_v2(const void *ip,
        const struct xt_NFQ_info_v2 *info = (void *) target->data;
 
        NFQUEUE_print_v1(ip, target, numeric);
-       if (info->bypass)
+       if (info->bypass & NFQ_FLAG_BYPASS)
                printf(" bypass");
 }
 
+static void NFQUEUE_print_v3(const void *ip,
+                             const struct xt_entry_target *target, int numeric)
+{
+       const struct xt_NFQ_info_v3 *info = (void *)target->data;
+
+       NFQUEUE_print_v2(ip, target, numeric);
+       if (info->flags & NFQ_FLAG_CPU_FANOUT)
+               printf(" cpu-fanout");
+}
+
 static void NFQUEUE_save(const void *ip, const struct xt_entry_target *target)
 {
        const struct xt_NFQ_info *tinfo =
@@ -151,10 +185,20 @@ static void NFQUEUE_save_v2(const void *ip, const struct xt_entry_target *target
 
        NFQUEUE_save_v1(ip, target);
 
-       if (info->bypass)
+       if (info->bypass & NFQ_FLAG_BYPASS)
                printf(" --queue-bypass");
 }
 
+static void NFQUEUE_save_v3(const void *ip,
+                           const struct xt_entry_target *target)
+{
+       const struct xt_NFQ_info_v3 *info = (void *)target->data;
+
+       NFQUEUE_save_v2(ip, target);
+       if (info->flags & NFQ_FLAG_CPU_FANOUT)
+               printf(" --queue-cpu-fanout");
+}
+
 static void NFQUEUE_init_v1(struct xt_entry_target *t)
 {
        struct xt_NFQ_info_v1 *tinfo = (void *)t->data;
@@ -199,6 +243,19 @@ static struct xtables_target nfqueue_targets[] = {
        .save           = NFQUEUE_save_v2,
        .x6_parse       = NFQUEUE_parse_v2,
        .x6_options     = NFQUEUE_opts,
+},{
+       .family         = NFPROTO_UNSPEC,
+       .revision       = 3,
+       .name           = "NFQUEUE",
+       .version        = XTABLES_VERSION,
+       .size           = XT_ALIGN(sizeof(struct xt_NFQ_info_v3)),
+       .userspacesize  = XT_ALIGN(sizeof(struct xt_NFQ_info_v3)),
+       .help           = NFQUEUE_help_v3,
+       .init           = NFQUEUE_init_v1,
+       .print          = NFQUEUE_print_v3,
+       .save           = NFQUEUE_save_v3,
+       .x6_parse       = NFQUEUE_parse_v3,
+       .x6_options     = NFQUEUE_opts,
 }
 };
 
index f11e0c8..1bfb7b8 100644 (file)
@@ -1,11 +1,12 @@
-This target is an extension of the QUEUE target. As opposed to QUEUE, it allows
-you to put a packet into any specific queue, identified by its 16-bit queue
-number.
-It can only be used with Kernel versions 2.6.14 or later, since it requires
-the
+This target passes the packet to userspace using the
+\fBnfnetlink_queue\fP handler.  The packet is put into the queue
+identified by its 16-bit queue number.  Userspace can inspect
+and modify the packet if desired. Userspace must then drop or
+reinject the packet into the kernel.  Please see libnetfilter_queue
+for details.
 .B
 nfnetlink_queue
-kernel support. The \fBqueue-balance\fP option was added in Linux 2.6.31,
+was added in Linux 2.6.14. The \fBqueue-balance\fP option was added in Linux 2.6.31,
 \fBqueue-bypass\fP in 2.6.39.
 .TP
 \fB\-\-queue\-num\fP \fIvalue\fP
@@ -23,3 +24,10 @@ Packets belonging to the same connection are put into the same nfqueue.
 By default, if no userspace program is listening on an NFQUEUE, then all packets that are to be queued
 are dropped.  When this option is used, the NFQUEUE rule behaves like ACCEPT instead, and the packet
 will move on to the next table.
+.PP
+.TP
+\fB\-\-queue\-cpu-fanout\fP
+Available starting Linux kernel 3.10. When used together with
+\fB--queue-balance\fP this will use the CPU ID as an index to map packets to
+the queues. The idea is that you can improve performance if there's a queue
+per CPU. This requires \fB--queue-balance\fP to be specified.
index 633b965..4302b93 100644 (file)
@@ -1,3 +1,3 @@
-This target disables connection tracking for all packets matching that rule.
-It is obsoleted by \-j CT \-\-notrack. Like CT, NOTRACK can only be used in
+This extension disables connection tracking for all packets matching that rule.
+It is equivalent with \-j CT \-\-notrack. Like CT, NOTRACK can only be used in
 the \fBraw\fP table.
index acdefb9..449ceab 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2008-2013 Patrick McHardy <kaber@trash.net>
+ */
+
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
similarity index 68%
rename from extensions/libipt_REDIRECT.man
rename to extensions/libxt_REDIRECT.man
index 90ab19d..3400a6d 100644 (file)
@@ -7,19 +7,18 @@ and
 chains, and user-defined chains which are only called from those
 chains.  It redirects the packet to the machine itself by changing the
 destination IP to the primary address of the incoming interface
-(locally-generated packets are mapped to the 127.0.0.1 address).
+(locally-generated packets are mapped to the localhost address,
+127.0.0.1 for IPv4 and ::1 for IPv6).
 .TP
 \fB\-\-to\-ports\fP \fIport\fP[\fB\-\fP\fIport\fP]
 This specifies a destination port or range of ports to use: without
 this, the destination port is never altered.  This is only valid
-if the rule also specifies
-\fB\-p tcp\fP
-or
-\fB\-p udp\fP.
+if the rule also specifies one of the following protocols:
+\fBtcp\fP, \fBudp\fP, \fBdccp\fP or \fBsctp\fP.
 .TP
 \fB\-\-random\fP
 If option
 \fB\-\-random\fP
 is used then port mapping will be randomized (kernel >= 2.6.22).
-.RS
-.PP
+.TP
+IPv6 support available starting Linux kernels >= 3.7.
similarity index 83%
rename from extensions/libipt_SNAT.man
rename to extensions/libxt_SNAT.man
index 093b09c..f0620a2 100644 (file)
@@ -7,21 +7,18 @@ and
 chains, and user-defined chains which are only called from those
 chains.  It specifies that the source address of the packet should be
 modified (and all future packets in this connection will also be
-mangled), and rules should cease being examined.  It takes one type
-of option:
+mangled), and rules should cease being examined.  It takes the
+following options:
 .TP
 \fB\-\-to\-source\fP [\fIipaddr\fP[\fB\-\fP\fIipaddr\fP]][\fB:\fP\fIport\fP[\fB\-\fP\fIport\fP]]
 which can specify a single new source IP address, an inclusive range
-of IP addresses, and optionally, a port range (which is only valid if
-the rule also specifies
-\fB\-p tcp\fP
-or
-\fB\-p udp\fP).
+of IP addresses. Optionally a port range,
+if the rule also specifies one of the following protocols:
+\fBtcp\fP, \fBudp\fP, \fBdccp\fP or \fBsctp\fP.
 If no port range is specified, then source ports below 512 will be
 mapped to other ports below 512: those between 512 and 1023 inclusive
 will be mapped to ports below 1024, and other ports will be mapped to
 1024 or above. Where possible, no port alteration will occur.
-
 In Kernels up to 2.6.10, you can add several \-\-to\-source options. For those
 kernels, if you specify more than one source address, either via an address
 range or multiple \-\-to\-source options, a simple round-robin (one after another
@@ -44,3 +41,5 @@ Kernels prior to 2.6.36-rc1 don't have the ability to
 in the
 .B INPUT
 chain.
+.TP
+IPv6 support available since Linux kernels >= 3.7.
diff --git a/extensions/libxt_SYNPROXY.c b/extensions/libxt_SYNPROXY.c
new file mode 100644 (file)
index 0000000..475590e
--- /dev/null
@@ -0,0 +1,127 @@
+
+/*
+ * Copyright (c) 2013 Patrick McHardy <kaber@trash.net>
+ *
+ * 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 <stdbool.h>
+#include <stdio.h>
+#include <xtables.h>
+#include <linux/netfilter/xt_SYNPROXY.h>
+
+enum {
+       O_SACK_PERM = 0,
+       O_TIMESTAMP,
+       O_WSCALE,
+       O_MSS,
+       O_ECN,
+};
+
+static void SYNPROXY_help(void)
+{
+       printf(
+"SYNPROXY target options:\n"
+"  --sack-perm                        Set SACK_PERM\n"
+"  --timestamp                        Set TIMESTAMP\n"
+"  --wscale value                     Set window scaling factor\n"
+"  --mss value                        Set MSS value\n"
+"  --ecn                              Set ECN\n");
+}
+
+static const struct xt_option_entry SYNPROXY_opts[] = {
+       {.name = "sack-perm", .id = O_SACK_PERM, .type = XTTYPE_NONE, },
+       {.name = "timestamp", .id = O_TIMESTAMP, .type = XTTYPE_NONE, },
+       {.name = "wscale",    .id = O_WSCALE,    .type = XTTYPE_UINT32, },
+       {.name = "mss",       .id = O_MSS,       .type = XTTYPE_UINT32, },
+       {.name = "ecn",       .id = O_ECN,       .type = XTTYPE_NONE, },
+       XTOPT_TABLEEND,
+};
+
+static void SYNPROXY_parse(struct xt_option_call *cb)
+{
+       struct xt_synproxy_info *info = cb->data;
+
+       xtables_option_parse(cb);
+       switch (cb->entry->id) {
+       case O_SACK_PERM:
+               info->options |= XT_SYNPROXY_OPT_SACK_PERM;
+               break;
+       case O_TIMESTAMP:
+               info->options |= XT_SYNPROXY_OPT_TIMESTAMP;
+               break;
+       case O_WSCALE:
+               info->options |= XT_SYNPROXY_OPT_WSCALE;
+               info->wscale = cb->val.u32;
+               break;
+       case O_MSS:
+               info->options |= XT_SYNPROXY_OPT_MSS;
+               info->mss = cb->val.u32;
+               break;
+       case O_ECN:
+               info->options |= XT_SYNPROXY_OPT_ECN;
+               break;
+       }
+}
+
+static void SYNPROXY_check(struct xt_fcheck_call *cb)
+{
+}
+
+static void SYNPROXY_print(const void *ip, const struct xt_entry_target *target,
+                           int numeric)
+{
+       const struct xt_synproxy_info *info =
+               (const struct xt_synproxy_info *)target->data;
+
+       printf(" SYNPROXY ");
+       if (info->options & XT_SYNPROXY_OPT_SACK_PERM)
+               printf("sack-perm ");
+       if (info->options & XT_SYNPROXY_OPT_TIMESTAMP)
+               printf("timestamp ");
+       if (info->options & XT_SYNPROXY_OPT_WSCALE)
+               printf("wscale %u ", info->wscale);
+       if (info->options & XT_SYNPROXY_OPT_MSS)
+               printf("mss %u ", info->mss);
+       if (info->options & XT_SYNPROXY_OPT_ECN)
+               printf("ecn ");
+}
+
+static void SYNPROXY_save(const void *ip, const struct xt_entry_target *target)
+{
+       const struct xt_synproxy_info *info =
+               (const struct xt_synproxy_info *)target->data;
+
+       if (info->options & XT_SYNPROXY_OPT_SACK_PERM)
+               printf(" --sack-perm");
+       if (info->options & XT_SYNPROXY_OPT_TIMESTAMP)
+               printf(" --timestamp");
+       if (info->options & XT_SYNPROXY_OPT_WSCALE)
+               printf(" --wscale %u", info->wscale);
+       if (info->options & XT_SYNPROXY_OPT_MSS)
+               printf(" --mss %u", info->mss);
+       if (info->options & XT_SYNPROXY_OPT_ECN)
+               printf(" --ecn");
+}
+
+static struct xtables_target synproxy_tg_reg = {
+       .family        = NFPROTO_UNSPEC,
+       .name          = "SYNPROXY",
+       .version       = XTABLES_VERSION,
+       .revision      = 0,
+       .size          = XT_ALIGN(sizeof(struct xt_synproxy_info)),
+       .userspacesize = XT_ALIGN(sizeof(struct xt_synproxy_info)),
+       .help          = SYNPROXY_help,
+       .print         = SYNPROXY_print,
+       .save          = SYNPROXY_save,
+       .x6_parse      = SYNPROXY_parse,
+       .x6_fcheck     = SYNPROXY_check,
+       .x6_options    = SYNPROXY_opts,
+};
+
+void _init(void)
+{
+       xtables_register_target(&synproxy_tg_reg);
+}
index e8a8545..e5d3033 100644 (file)
@@ -1,4 +1,6 @@
 /* Shared library add-on to iptables to add addrtype matching support 
+ *
+ * Copyright (c) 2003-2013 Patrick McHardy <kaber@trash.net>
  * 
  * This program is released under the terms of GNU GPL */
 #include <stdio.h>
index 62ad71c..94b4b20 100644 (file)
@@ -55,6 +55,11 @@ arptables \-A INPUT \-i eth2 \-\-h\-length 6
 \-\-destination\-mac 01:00:5e:00:01:02
 \-j mangle \-\-mangle\-mac\-d 00:zz:yy:xx:5a:27
 .PP
+\fBNOTE\fP: the arptables commands above use mainstream syntax. If you
+are using arptables-jf included in some RedHat, CentOS and Fedora
+versions, you will hit syntax errors. Therefore, you'll have to adapt
+these to the arptables-jf syntax to get them working.
+.PP
 In the case of TCP connections, pickup facility has to be disabled
 to avoid marking TCP ACK packets coming in the reply direction as
 valid.
index ae52901..c84a167 100644 (file)
@@ -5,13 +5,14 @@
 #include <stdint.h>
 #include <xtables.h>
 #include <linux/netfilter/xt_connlabel.h>
+#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
 
 enum {
        O_LABEL = 0,
        O_SET = 1,
 };
 
-#define CONNLABEL_CFG "/etc/xtables/connlabel.conf"
+static struct nfct_labelmap *map;
 
 static void connlabel_mt_help(void)
 {
@@ -28,107 +29,6 @@ static const struct xt_option_entry connlabel_mt_opts[] = {
        XTOPT_TABLEEND,
 };
 
-static int
-xtables_parse_connlabel_numerical(const char *s, char **end)
-{
-       uintmax_t value;
-
-       if (!xtables_strtoul(s, end, &value, 0, XT_CONNLABEL_MAXBIT))
-               return -1;
-       return value;
-}
-
-static bool is_space_posix(int c)
-{
-       return c == ' ' || c == '\f' || c == '\r' || c == '\t' || c == '\v';
-}
-
-static char * trim_label(char *label)
-{
-       char *end;
-
-       while (is_space_posix(*label))
-               label++;
-       end = strchr(label, '\n');
-       if (end)
-               *end = 0;
-       else
-               end = strchr(label, '\0');
-       end--;
-
-       while (is_space_posix(*end) && end > label) {
-               *end = 0;
-               end--;
-       }
-
-       return *label ? label : NULL;
-}
-
-static void
-xtables_get_connlabel(uint16_t bit, char *buf, size_t len)
-{
-       FILE *fp = fopen(CONNLABEL_CFG, "r");
-       char label[1024];
-       char *end;
-
-       if (!fp)
-               goto error;
-
-       while (fgets(label, sizeof(label), fp)) {
-               int tmp;
-
-               if (label[0] == '#')
-                       continue;
-               tmp = xtables_parse_connlabel_numerical(label, &end);
-               if (tmp < 0 || tmp < (int) bit)
-                       continue;
-               if (tmp > (int) bit)
-                       break;
-
-               end = trim_label(end);
-               if (!end)
-                       continue;
-               snprintf(buf, len, "%s", end);
-               fclose(fp);
-               return;
-       }
-       fclose(fp);
- error:
-       snprintf(buf, len, "%u", (unsigned int) bit);
-}
-
-
-static uint16_t xtables_parse_connlabel(const char *s)
-{
-       FILE *fp = fopen(CONNLABEL_CFG, "r");
-       char label[1024];
-       char *end;
-       int bit;
-
-       if (!fp)
-               xtables_error(PARAMETER_PROBLEM, "label '%s': could not open '%s': %s",
-                                               s, CONNLABEL_CFG, strerror(errno));
-
-       while (fgets(label, sizeof(label), fp)) {
-               if (label[0] == '#' || !strstr(label, s))
-                       continue;
-               bit = xtables_parse_connlabel_numerical(label, &end);
-               if (bit < 0)
-                       continue;
-
-               end = trim_label(end);
-               if (!end)
-                       continue;
-               if (strcmp(end, s) == 0) {
-                       fclose(fp);
-                       return bit;
-               }
-       }
-       fclose(fp);
-       xtables_error(PARAMETER_PROBLEM, "label '%s' not found in config file %s",
-                                       s, CONNLABEL_CFG);
-}
-
 static void connlabel_mt_parse(struct xt_option_call *cb)
 {
        struct xt_connlabel_mtinfo *info = cb->data;
@@ -138,9 +38,10 @@ static void connlabel_mt_parse(struct xt_option_call *cb)
 
        switch (cb->entry->id) {
        case O_LABEL:
-               tmp = xtables_parse_connlabel_numerical(cb->arg, NULL);
-               info->bit = tmp < 0 ? xtables_parse_connlabel(cb->arg) : tmp;
-
+               tmp = nfct_labelmap_get_bit(map, cb->arg);
+               if (tmp < 0)
+                       xtables_error(PARAMETER_PROBLEM, "label '%s' not found", cb->arg);
+               info->bit = tmp;
                if (cb->invert)
                        info->options |= XT_CONNLABEL_OP_INVERT;
                break;
@@ -151,6 +52,14 @@ static void connlabel_mt_parse(struct xt_option_call *cb)
 
 }
 
+static const char *connlabel_get_name(int b)
+{
+       const char *name = nfct_labelmap_get_name(map, b);
+       if (name && strcmp(name, ""))
+               return name;
+       return NULL;
+}
+
 static void
 connlabel_mt_print_op(const struct xt_connlabel_mtinfo *info, const char *prefix)
 {
@@ -162,16 +71,15 @@ static void
 connlabel_mt_print(const void *ip, const struct xt_entry_match *match, int numeric)
 {
        const struct xt_connlabel_mtinfo *info = (const void *)match->data;
-       char buf[1024];
+       const char *name = connlabel_get_name(info->bit);
 
        printf(" connlabel");
        if (info->options & XT_CONNLABEL_OP_INVERT)
                printf(" !");
-       if (numeric) {
+       if (numeric || name == NULL) {
                printf(" %u", info->bit);
        } else {
-               xtables_get_connlabel(info->bit, buf, sizeof(buf));
-               printf(" '%s'", buf);
+               printf(" '%s'", name);
        }
        connlabel_mt_print_op(info, "");
 }
@@ -180,14 +88,14 @@ static void
 connlabel_mt_save(const void *ip, const struct xt_entry_match *match)
 {
        const struct xt_connlabel_mtinfo *info = (const void *)match->data;
-       char buf[1024];
+       const char *name = connlabel_get_name(info->bit);
 
        if (info->options & XT_CONNLABEL_OP_INVERT)
                printf(" !");
-
-       xtables_get_connlabel(info->bit, buf, sizeof(buf));
-       printf(" --label \"%s\"", buf);
-
+       if (name)
+               printf(" --label \"%s\"", name);
+       else
+               printf(" --label \"%u\"", info->bit);
        connlabel_mt_print_op(info, "--");
 }
 
@@ -206,5 +114,11 @@ static struct xtables_match connlabel_mt_reg = {
 
 void _init(void)
 {
+       map = nfct_labelmap_new(NULL);
+       if (!map) {
+               fprintf(stderr, "cannot open connlabel.conf, not registering '%s' match: %s\n",
+                       connlabel_mt_reg.name, strerror(errno));
+               return;
+       }
        xtables_register_match(&connlabel_mt_reg);
 }
index 9fd2043..bdaa51e 100644 (file)
@@ -17,6 +17,7 @@ the time the connection is created.
 In this case, the match will fail (or succeed, in case \fB\-\-label\fP
 option was negated).
 .PP
+This match depends on libnetfilter_conntrack 1.0.4 or later.
 Label translation is done via the \fB/etc/xtables/connlabel.conf\fP configuration file.
 .PP
 Example:
index 9f7b5db..128bbd2 100644 (file)
@@ -1272,6 +1272,8 @@ static struct xtables_match conntrack_mt_reg[] = {
                .size          = XT_ALIGN(sizeof(struct xt_conntrack_mtinfo1)),
                .userspacesize = XT_ALIGN(sizeof(struct xt_conntrack_mtinfo1)),
                .help          = state_help,
+               .print         = state_print,
+               .save          = state_save,
                .x6_parse      = state_ct1_parse,
                .x6_options    = state_opts,
        },
@@ -1285,6 +1287,8 @@ static struct xtables_match conntrack_mt_reg[] = {
                .size          = XT_ALIGN(sizeof(struct xt_conntrack_mtinfo2)),
                .userspacesize = XT_ALIGN(sizeof(struct xt_conntrack_mtinfo2)),
                .help          = state_help,
+               .print         = state_print,
+               .save          = state_save,
                .x6_parse      = state_ct23_parse,
                .x6_options    = state_opts,
        },
@@ -1298,6 +1302,8 @@ static struct xtables_match conntrack_mt_reg[] = {
                .size          = XT_ALIGN(sizeof(struct xt_conntrack_mtinfo3)),
                .userspacesize = XT_ALIGN(sizeof(struct xt_conntrack_mtinfo3)),
                .help          = state_help,
+               .print         = state_print,
+               .save          = state_save,
                .x6_parse      = state_ct23_parse,
                .x6_options    = state_opts,
        },
index 15fd1dd..4b13f0f 100644 (file)
@@ -45,7 +45,7 @@ States for \fB\-\-ctstate\fP:
 The packet is associated with no known connection.
 .TP
 \fBNEW\fP
-The packet has started a new connection, or otherwise associated
+The packet has started a new connection or otherwise associated
 with a connection which has not seen packets in both directions.
 .TP
 \fBESTABLISHED\fP
@@ -54,7 +54,7 @@ in both directions.
 .TP
 \fBRELATED\fP
 The packet is starting a new connection, but is associated with an
-existing connection, such as an FTP data transfer, or an ICMP error.
+existing connection, such as an FTP data transfer or an ICMP error.
 .TP
 \fBUNTRACKED\fP
 The packet is not tracked at all, which happens if you explicitly untrack it
index 17cb2b0..6aac3f2 100644 (file)
@@ -65,7 +65,7 @@ matching on source port
 matching on subnet
 "10000 packets per minute for every /28 subnet (groups of 8 addresses)
 in 10.0.0.0/8" =>
-\-s 10.0.0.8 \-\-hashlimit\-mask 28 \-\-hashlimit\-upto 10000/min
+\-s 10.0.0.0/8 \-\-hashlimit\-mask 28 \-\-hashlimit\-upto 10000/min
 .TP
 matching bytes per second
 "flows exceeding 512kbyte/s" =>
index 54ec229..0a64a80 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2005-2013 Patrick McHardy <kaber@trash.net>
+ */
+
 #include <stdbool.h>
 #include <stdint.h>
 #include <stdio.h>
index 185a813..fb24412 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2008-2013 Patrick McHardy <kaber@trash.net>
+ */
+
 #include <stdbool.h>
 #include <stdio.h>
 #include <string.h>
index f4ebe6a..e1801f1 100644 (file)
@@ -62,7 +62,9 @@ static const struct xt_option_entry recent_opts_v1[] = {
        {.name = "remove", .id = O_REMOVE, .type = XTTYPE_NONE,
         .excl = F_ANY_OP, .flags = XTOPT_INVERT},
        {.name = "seconds", .id = O_SECONDS, .type = XTTYPE_UINT32,
-        .flags = XTOPT_PUT, XTOPT_POINTER(s, seconds)},
+        .flags = XTOPT_PUT, XTOPT_POINTER(s, seconds), .min = 1},
+       {.name = "reap", .id = O_REAP, .type = XTTYPE_NONE,
+        .also = F_SECONDS },
        {.name = "hitcount", .id = O_HITCOUNT, .type = XTTYPE_UINT32,
         .flags = XTOPT_PUT, XTOPT_POINTER(s, hit_count)},
        {.name = "rttl", .id = O_RTTL, .type = XTTYPE_NONE,
@@ -102,7 +104,7 @@ static void recent_help(void)
 "    --rsource                   Match/Save the source address of each packet in the recent list table (default).\n"
 "    --rdest                     Match/Save the destination address of each packet in the recent list table.\n"
 "    --mask netmask              Netmask that will be applied to this recent list.\n"
-"xt_recent by: Stephen Frost <sfrost@snowman.net>.  http://snowman.net/projects/ipt_recent/\n");
+"xt_recent by: Stephen Frost <sfrost@snowman.net>.\n");
 }
 
 enum {
index d9bd5d2..419be25 100644 (file)
@@ -73,9 +73,6 @@ iptables \-A FORWARD \-m recent \-\-name badguy \-\-rcheck \-\-seconds 60 \-j DR
 .IP
 iptables \-A FORWARD \-p tcp \-i eth0 \-\-dport 139 \-m recent \-\-name badguy \-\-set \-j DROP
 .PP
-Steve's ipt_recent website (http://snowman.net/projects/ipt_recent/) also has
-some examples of usage.
-.PP
 \fB/proc/net/xt_recent/*\fP are the current lists of addresses and information
 about each entry of each list.
 .PP
index e011156..2cb9e78 100644 (file)
@@ -289,6 +289,214 @@ set_save_v2(const void *ip, const struct xt_entry_match *match)
                printf(" --return-nomatch");
 }
 
+/* Revision 3 */
+static void
+set_help_v3(void)
+{
+       printf("set match options:\n"
+              " [!] --match-set name flags [--return-nomatch]\n"
+              "   [! --update-counters] [! --update-subcounters]\n"
+              "   [[!] --packets-eq value | --packets-lt value | --packets-gt value\n"
+              "   [[!] --bytes-eq value | --bytes-lt value | --bytes-gt value\n"
+              "                 'name' is the set name from to match,\n" 
+              "                 'flags' are the comma separated list of\n"
+              "                 'src' and 'dst' specifications.\n");
+}
+
+static const struct option set_opts_v3[] = {
+       {.name = "match-set",           .has_arg = true,        .val = '1'},
+       {.name = "set",                 .has_arg = true,        .val = '2'},
+       {.name = "return-nomatch",      .has_arg = false,       .val = '3'},
+       {.name = "update-counters",     .has_arg = false,       .val = '4'},
+       {.name = "packets-eq",          .has_arg = true,        .val = '5'},
+       {.name = "packets-lt",          .has_arg = true,        .val = '6'},
+       {.name = "packets-gt",          .has_arg = true,        .val = '7'},
+       {.name = "bytes-eq",            .has_arg = true,        .val = '8'},
+       {.name = "bytes-lt",            .has_arg = true,        .val = '9'},
+       {.name = "bytes-gt",            .has_arg = true,        .val = '0'},
+       {.name = "update-subcounters",  .has_arg = false,       .val = 'a'},
+       XT_GETOPT_TABLEEND,
+};
+
+static uint64_t
+parse_counter(const char *opt)
+{
+       uintmax_t value;
+
+       if (!xtables_strtoul(opt, NULL, &value, 0, UINT64_MAX))
+               xtables_error(PARAMETER_PROBLEM,
+                             "Cannot parse %s as a counter value\n",
+                             opt);
+       return (uint64_t)value;
+}
+
+static int
+set_parse_v3(int c, char **argv, int invert, unsigned int *flags,
+            const void *entry, struct xt_entry_match **match)
+{
+       struct xt_set_info_match_v3 *info = 
+               (struct xt_set_info_match_v3 *) (*match)->data;
+
+       switch (c) {
+       case 'a':
+               if (invert)
+                       info->flags |= IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE;
+               break;
+       case '0':
+               if (info->bytes.op != IPSET_COUNTER_NONE)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "only one of the --bytes-[eq|lt|gt]"
+                                     " is allowed\n");
+               if (invert)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "--bytes-gt option cannot be inverted\n");
+               info->bytes.op = IPSET_COUNTER_GT;
+               info->bytes.value = parse_counter(optarg);
+               break;
+       case '9':
+               if (info->bytes.op != IPSET_COUNTER_NONE)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "only one of the --bytes-[eq|lt|gt]"
+                                     " is allowed\n");
+               if (invert)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "--bytes-lt option cannot be inverted\n");
+               info->bytes.op = IPSET_COUNTER_LT;
+               info->bytes.value = parse_counter(optarg);
+               break;
+       case '8':
+               if (info->bytes.op != IPSET_COUNTER_NONE)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "only one of the --bytes-[eq|lt|gt]"
+                                     " is allowed\n");
+               info->bytes.op = invert ? IPSET_COUNTER_NE : IPSET_COUNTER_EQ;
+               info->bytes.value = parse_counter(optarg);
+               break;
+       case '7':
+               if (info->packets.op != IPSET_COUNTER_NONE)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "only one of the --packets-[eq|lt|gt]"
+                                     " is allowed\n");
+               if (invert)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "--packets-gt option cannot be inverted\n");
+               info->packets.op = IPSET_COUNTER_GT;
+               info->packets.value = parse_counter(optarg);
+               break;
+       case '6':
+               if (info->packets.op != IPSET_COUNTER_NONE)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "only one of the --packets-[eq|lt|gt]"
+                                     " is allowed\n");
+               if (invert)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "--packets-lt option cannot be inverted\n");
+               info->packets.op = IPSET_COUNTER_LT;
+               info->packets.value = parse_counter(optarg);
+               break;
+       case '5':
+               if (info->packets.op != IPSET_COUNTER_NONE)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "only one of the --packets-[eq|lt|gt]"
+                                     " is allowed\n");
+               info->packets.op = invert ? IPSET_COUNTER_NE : IPSET_COUNTER_EQ;
+               info->packets.value = parse_counter(optarg);
+               break;
+       case '4':
+               if (invert)
+                       info->flags |= IPSET_FLAG_SKIP_COUNTER_UPDATE;
+               break;
+       case '3':
+               if (invert)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "--return-nomatch flag cannot be inverted\n");
+               info->flags |= IPSET_FLAG_RETURN_NOMATCH;
+               break;
+       case '2':
+               fprintf(stderr,
+                       "--set option deprecated, please use --match-set\n");
+       case '1':               /* --match-set <set> <flag>[,<flag> */
+               if (info->match_set.dim)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "--match-set can be specified only once");
+               if (invert)
+                       info->match_set.flags |= IPSET_INV_MATCH;
+
+               if (!argv[optind]
+                   || argv[optind][0] == '-'
+                   || argv[optind][0] == '!')
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "--match-set requires two args.");
+
+               if (strlen(optarg) > IPSET_MAXNAMELEN - 1)
+                       xtables_error(PARAMETER_PROBLEM,
+                                     "setname `%s' too long, max %d characters.",
+                                     optarg, IPSET_MAXNAMELEN - 1);
+
+               get_set_byname(optarg, &info->match_set);
+               parse_dirs(argv[optind], &info->match_set);
+               DEBUGP("parse: set index %u\n", info->match_set.index);
+               optind++;
+               
+               *flags = 1;
+               break;
+       }
+
+       return 1;
+}
+
+static void
+set_printv3_counter(const struct ip_set_counter_match *c, const char *name,
+                   const char *sep)
+{
+       switch (c->op) {
+       case IPSET_COUNTER_EQ:
+               printf(" %s%s-eq %llu", sep, name, c->value);
+               break;
+       case IPSET_COUNTER_NE:
+               printf(" ! %s%s-eq %llu", sep, name, c->value);
+               break;
+       case IPSET_COUNTER_LT:
+               printf(" %s%s-lt %llu", sep, name, c->value);
+               break;
+       case IPSET_COUNTER_GT:
+               printf(" %s%s-gt %llu", sep, name, c->value);
+               break;
+       }
+}
+
+static void
+set_print_v3_matchinfo(const struct xt_set_info_match_v3 *info,
+                      const char *opt, const char *sep)
+{
+       print_match(opt, &info->match_set);
+       if (info->flags & IPSET_FLAG_RETURN_NOMATCH)
+               printf(" %sreturn-nomatch", sep);
+       if ((info->flags & IPSET_FLAG_SKIP_COUNTER_UPDATE))
+               printf(" ! %supdate-counters", sep);
+       if ((info->flags & IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE))
+               printf(" ! %supdate-subcounters", sep);
+       set_printv3_counter(&info->packets, "packets", sep);
+       set_printv3_counter(&info->bytes, "bytes", sep);
+}
+
+/* Prints out the matchinfo. */
+static void
+set_print_v3(const void *ip, const struct xt_entry_match *match, int numeric)
+{
+       const struct xt_set_info_match_v3 *info = (const void *)match->data;
+
+       set_print_v3_matchinfo(info, "match-set", "");
+}
+
+static void
+set_save_v3(const void *ip, const struct xt_entry_match *match)
+{
+       const struct xt_set_info_match_v3 *info = (const void *)match->data;
+
+       set_print_v3_matchinfo(info, "--match-set", "--");
+}
+
 static struct xtables_match set_mt_reg[] = {
        {
                .name           = "set",
@@ -332,6 +540,20 @@ static struct xtables_match set_mt_reg[] = {
                .save           = set_save_v2,
                .extra_opts     = set_opts_v2,
        },
+       {
+               .name           = "set",
+               .revision       = 3,
+               .version        = XTABLES_VERSION,
+               .family         = NFPROTO_UNSPEC,
+               .size           = XT_ALIGN(sizeof(struct xt_set_info_match_v3)),
+               .userspacesize  = XT_ALIGN(sizeof(struct xt_set_info_match_v3)),
+               .help           = set_help_v3,
+               .parse          = set_parse_v3,
+               .final_check    = set_check_v0,
+               .print          = set_print_v3,
+               .save           = set_save_v3,
+               .extra_opts     = set_opts_v3,
+       },
 };
 
 void _init(void)
index 47c3f5b..5a1bdcf 100644 (file)
@@ -6,6 +6,7 @@
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <errno.h>
+#include "../iptables/xshared.h"
 
 #ifdef DEBUG
 #define DEBUGP(x, args...) fprintf(stderr, x , ## args)
@@ -71,13 +72,13 @@ get_set_byid(char *setname, ip_set_id_t idx)
 }
 
 static void
-get_set_byname(const char *setname, struct xt_set_info *info)
+get_set_byname_only(const char *setname, struct xt_set_info *info,
+                   int sockfd, unsigned int version)
 {
-       struct ip_set_req_get_set req;
+       struct ip_set_req_get_set req = { .version = version };
        socklen_t size = sizeof(struct ip_set_req_get_set);
-       int res, sockfd;
+       int res;
 
-       sockfd = get_version(&req.version);
        req.op = IP_SET_OP_GET_BYNAME;
        strncpy(req.set.name, setname, IPSET_MAXNAMELEN);
        req.set.name[IPSET_MAXNAMELEN - 1] = '\0';
@@ -101,6 +102,49 @@ get_set_byname(const char *setname, struct xt_set_info *info)
 }
 
 static void
+get_set_byname(const char *setname, struct xt_set_info *info)
+{
+       struct ip_set_req_get_set_family req;
+       socklen_t size = sizeof(struct ip_set_req_get_set_family);
+       int res, sockfd, version;
+
+       sockfd = get_version(&req.version);
+       version = req.version;
+       req.op = IP_SET_OP_GET_FNAME;
+       strncpy(req.set.name, setname, IPSET_MAXNAMELEN);
+       req.set.name[IPSET_MAXNAMELEN - 1] = '\0';
+       res = getsockopt(sockfd, SOL_IP, SO_IP_SET, &req, &size);
+
+       if (res != 0 && errno == EBADMSG)
+               /* Backward compatibility */
+               return get_set_byname_only(setname, info, sockfd, version);
+
+       close(sockfd);
+       if (res != 0)
+               xtables_error(OTHER_PROBLEM,
+                       "Problem when communicating with ipset, errno=%d.\n",
+                       errno);
+       if (size != sizeof(struct ip_set_req_get_set_family))
+               xtables_error(OTHER_PROBLEM,
+                       "Incorrect return size from kernel during ipset lookup, "
+                       "(want %zu, got %zu)\n",
+                       sizeof(struct ip_set_req_get_set_family),
+                       (size_t)size);
+       if (req.set.index == IPSET_INVALID_ID)
+               xtables_error(PARAMETER_PROBLEM,
+                             "Set %s doesn't exist.\n", setname);
+       if (!(req.family == afinfo->family ||
+             req.family == NFPROTO_UNSPEC))
+               xtables_error(PARAMETER_PROBLEM,
+                             "The protocol family of set %s is %s, "
+                             "which is not applicable.\n",
+                             setname,
+                             req.family == NFPROTO_IPV4 ? "IPv4" : "IPv6");
+
+       info->index = req.set.index;
+}
+
+static void
 parse_dirs_v0(const char *opt_arg, struct xt_set_info_v0 *info)
 {
        char *saved = strdup(opt_arg);
index ac60f14..7012ef2 100644 (file)
@@ -15,11 +15,48 @@ the set type of the specified set is single dimension (for example ipmap),
 then the command will match packets for which the source address can be
 found in the specified set. 
 .TP
-\fB\-\-return\-\-nomatch\fP
-If the \fB\-\-return\-\-nomatch\fP option is specified and the set type
+\fB\-\-return\-nomatch\fP
+If the \fB\-\-return\-nomatch\fP option is specified and the set type
 supports the \fBnomatch\fP flag, then the matching is reversed: a match
 with an element flagged with \fBnomatch\fP returns \fBtrue\fP, while a
 match with a plain element returns \fBfalse\fP.
+.TP
+\fB!\fP \fB\-\-update\-counters\fP
+If the \fB\-\-update\-counters\fP flag is negated, then the packet and
+byte counters of the matching element in the set won't be updated. Default
+the packet and byte counters are updated.
+.TP
+\fB!\fP \fB\-\-update\-subcounters\fP
+If the \fB\-\-update\-subcounters\fP flag is negated, then the packet and
+byte counters of the matching element in the member set of a list type of
+set won't be updated. Default the packet and byte counters are updated.
+.TP
+[\fB!\fP] \fB\-\-packets\-eq\fP \fIvalue\fP
+If the packet is matched an element in the set, match only if the
+packet counter of the element matches the given value too.
+.TP
+\fB\-\-packets\-lt\fP \fIvalue\fP
+If the packet is matched an element in the set, match only if the
+packet counter of the element is less than the given value as well.
+.TP
+\fB\-\-packets\-gt\fP \fIvalue\fP
+If the packet is matched an element in the set, match only if the
+packet counter of the element is greater than the given value as well.
+.TP
+[\fB!\fP] \fB\-bytes\-eq\fP \fIvalue\fP
+If the packet is matched an element in the set, match only if the
+byte counter of the element matches the given value too.
+.TP
+\fB\-\-bytes\-lt\fP \fIvalue\fP
+If the packet is matched an element in the set, match only if the
+byte counter of the element is less than the given value as well.
+.TP
+\fB\-\-bytes\-gt\fP \fIvalue\fP
+If the packet is matched an element in the set, match only if the
+byte counter of the element is greater than the given value as well.
+.PP
+The packet and byte counters related options and flags are ignored
+when the set was defined without counter support.
 .PP
 The option \fB\-\-match\-set\fP can be replaced by \fB\-\-set\fP if that does 
 not clash with an option of other extensions.
index 3901649..f19c280 100644 (file)
@@ -9,6 +9,7 @@
 
 enum {
        O_TRANSPARENT = 0,
+       O_NOWILDCARD = 1,
 };
 
 static const struct xt_option_entry socket_mt_opts[] = {
@@ -16,6 +17,12 @@ static const struct xt_option_entry socket_mt_opts[] = {
        XTOPT_TABLEEND,
 };
 
+static const struct xt_option_entry socket_mt_opts_v2[] = {
+       {.name = "transparent", .id = O_TRANSPARENT, .type = XTTYPE_NONE},
+       {.name = "nowildcard", .id = O_NOWILDCARD, .type = XTTYPE_NONE},
+       XTOPT_TABLEEND,
+};
+
 static void socket_mt_help(void)
 {
        printf(
@@ -23,6 +30,14 @@ static void socket_mt_help(void)
                "  --transparent    Ignore non-transparent sockets\n\n");
 }
 
+static void socket_mt_help_v2(void)
+{
+       printf(
+               "socket match options:\n"
+               "  --nowildcard     Do not ignore LISTEN sockets bound on INADDR_ANY\n"
+               "  --transparent    Ignore non-transparent sockets\n\n");
+}
+
 static void socket_mt_parse(struct xt_option_call *cb)
 {
        struct xt_socket_mtinfo1 *info = cb->data;
@@ -35,6 +50,21 @@ static void socket_mt_parse(struct xt_option_call *cb)
        }
 }
 
+static void socket_mt_parse_v2(struct xt_option_call *cb)
+{
+       struct xt_socket_mtinfo2 *info = cb->data;
+
+       xtables_option_parse(cb);
+       switch (cb->entry->id) {
+       case O_TRANSPARENT:
+               info->flags |= XT_SOCKET_TRANSPARENT;
+               break;
+       case O_NOWILDCARD:
+               info->flags |= XT_SOCKET_NOWILDCARD;
+               break;
+       }
+}
+
 static void
 socket_mt_save(const void *ip, const struct xt_entry_match *match)
 {
@@ -52,6 +82,25 @@ socket_mt_print(const void *ip, const struct xt_entry_match *match,
        socket_mt_save(ip, match);
 }
 
+static void
+socket_mt_save_v2(const void *ip, const struct xt_entry_match *match)
+{
+       const struct xt_socket_mtinfo2 *info = (const void *)match->data;
+
+       if (info->flags & XT_SOCKET_TRANSPARENT)
+               printf(" --transparent");
+       if (info->flags & XT_SOCKET_NOWILDCARD)
+               printf(" --nowildcard");
+}
+
+static void
+socket_mt_print_v2(const void *ip, const struct xt_entry_match *match,
+                  int numeric)
+{
+       printf(" socket");
+       socket_mt_save_v2(ip, match);
+}
+
 static struct xtables_match socket_mt_reg[] = {
        {
                .name          = "socket",
@@ -74,6 +123,19 @@ static struct xtables_match socket_mt_reg[] = {
                .x6_parse      = socket_mt_parse,
                .x6_options    = socket_mt_opts,
        },
+       {
+               .name          = "socket",
+               .revision      = 2,
+               .family        = NFPROTO_UNSPEC,
+               .version       = XTABLES_VERSION,
+               .size          = XT_ALIGN(sizeof(struct xt_socket_mtinfo2)),
+               .userspacesize = XT_ALIGN(sizeof(struct xt_socket_mtinfo2)),
+               .help          = socket_mt_help_v2,
+               .print         = socket_mt_print_v2,
+               .save          = socket_mt_save_v2,
+               .x6_parse      = socket_mt_parse_v2,
+               .x6_options    = socket_mt_opts_v2,
+       },
 };
 
 void _init(void)
index 41e8d67..2ef32ce 100644 (file)
@@ -1,5 +1,22 @@
-This matches if an open socket can be found by doing a socket lookup on the
-packet.
+This matches if an open TCP/UDP socket can be found by doing a socket lookup on the
+packet. It matches if there is an established or non\-zero bound listening
+socket (possibly with a non\-local address). The lookup is performed using
+the \fBpacket\fP tuple of TCP/UDP packets, or the original TCP/UDP header
+\fBembedded\fP in an ICMP/ICPMv6 error packet.
 .TP
 \fB\-\-transparent\fP
 Ignore non-transparent sockets.
+.TP
+\fB\-\-nowildcard\fP
+Do not ignore sockets bound to 'any' address.
+The socket match won't accept zero\-bound listeners by default, since
+then local services could intercept traffic that would otherwise be forwarded.
+This option therefore has security implications when used to match traffic being
+forwarded to redirect such packets to local machine with policy routing.
+When using the socket match to implement fully transparent
+proxies bound to non\-local addresses it is recommended to use the \-\-transparent
+option instead.
+.PP
+Example (assuming packets with mark 1 are delivered locally):
+.IP
+\-t mangle \-A PREROUTING \-m socket \-\-transparent \-j MARK \-\-set\-mark 1
index c23805f..b6ae5f5 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright (c) 2006-2013 Patrick McHardy <kaber@trash.net>
+ */
+
 #include <math.h>
 #include <stdio.h>
 #include <string.h>
index b6b271d..adc9c18 100644 (file)
@@ -16,3 +16,13 @@ Matches the given pattern.
 .TP
 [\fB!\fP] \fB\-\-hex\-string\fP \fIpattern\fP
 Matches the given pattern in hex notation.
+.TP
+Examples:
+.IP
+# The string pattern can be used for simple text characters.
+.br
+iptables \-A INPUT \-p tcp \-\-dport 80 \-m string \-\-algo bm \-\-string 'GET /index.html' \-j LOG
+.IP
+# The hex string pattern can be used for non-printable characters, like |0D 0A| or |0D0A|.
+.br
+iptables \-p udp \-\-dport 53 \-m string \-\-algo bm \-\-from 40 \-\-to 57 \-\-hex\-string '|03|www|09|netfilter|03|org|00|'
index 5f39d74..4fbc313 100644 (file)
@@ -213,6 +213,8 @@ ksourcedir = @ksourcedir@
 libdir = @libdir@
 libexecdir = @libexecdir@
 libiptc_LDFLAGS2 = @libiptc_LDFLAGS2@
+libnetfilter_conntrack_CFLAGS = @libnetfilter_conntrack_CFLAGS@
+libnetfilter_conntrack_LIBS = @libnetfilter_conntrack_LIBS@
 libnfnetlink_CFLAGS = @libnfnetlink_CFLAGS@
 libnfnetlink_LIBS = @libnfnetlink_LIBS@
 libxtables_vage = @libxtables_vage@
index 37d2e0a..5f1c5b6 100644 (file)
@@ -8,7 +8,7 @@
 
 /* Your shared library should call one of these. */
 extern int do_command6(int argc, char *argv[], char **table,
-                      struct xtc_handle **handle);
+                      struct xtc_handle **handle, bool restore);
 
 extern int for_each_chain6(int (*fn)(const xt_chainlabel, int, struct xtc_handle *), int verbose, int builtinstoo, struct xtc_handle *handle);
 extern int flush_entries6(const xt_chainlabel chain, int verbose, struct xtc_handle *handle);
index c42613c..ac9dc0e 100644 (file)
@@ -8,7 +8,7 @@
 
 /* Your shared library should call one of these. */
 extern int do_command4(int argc, char *argv[], char **table,
-                     struct xtc_handle **handle);
+                     struct xtc_handle **handle, bool restore);
 extern int delete_chain4(const xt_chainlabel chain, int verbose,
                        struct xtc_handle *handle);
 extern int flush_entries4(const xt_chainlabel chain, int verbose, 
index fff191d..0dcf5dd 100644 (file)
@@ -1,6 +1,3 @@
-#ifndef _IP_SET_H
-#define _IP_SET_H
-
 /* Copyright (C) 2000-2002 Joakim Axelsson <gozem@linux.nu>
  *                         Patrick Schaaf <bof@bof.de>
  *                         Martin Josefsson <gandalf@wlug.westbo.se>
@@ -10,6 +7,9 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+#ifndef _UAPI_IP_SET_H
+#define _UAPI_IP_SET_H
+
 
 #include <linux/types.h>
 
@@ -108,6 +108,8 @@ enum {
        IPSET_ATTR_CIDR2,
        IPSET_ATTR_IP2_TO,
        IPSET_ATTR_IFACE,
+       IPSET_ATTR_BYTES,
+       IPSET_ATTR_PACKETS,
        __IPSET_ATTR_ADT_MAX,
 };
 #define IPSET_ATTR_ADT_MAX     (__IPSET_ATTR_ADT_MAX - 1)
@@ -137,12 +139,13 @@ enum ipset_errno {
        IPSET_ERR_REFERENCED,
        IPSET_ERR_IPADDR_IPV4,
        IPSET_ERR_IPADDR_IPV6,
+       IPSET_ERR_COUNTER,
 
        /* Type specific error codes */
        IPSET_ERR_TYPE_SPECIFIC = 4352,
 };
 
-/* Flags at command level */
+/* Flags at command level or match/target flags, lower half of cmdattrs */
 enum ipset_cmd_flags {
        IPSET_FLAG_BIT_EXIST    = 0,
        IPSET_FLAG_EXIST        = (1 << IPSET_FLAG_BIT_EXIST),
@@ -150,14 +153,30 @@ enum ipset_cmd_flags {
        IPSET_FLAG_LIST_SETNAME = (1 << IPSET_FLAG_BIT_LIST_SETNAME),
        IPSET_FLAG_BIT_LIST_HEADER = 2,
        IPSET_FLAG_LIST_HEADER  = (1 << IPSET_FLAG_BIT_LIST_HEADER),
+       IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE = 3,
+       IPSET_FLAG_SKIP_COUNTER_UPDATE =
+               (1 << IPSET_FLAG_BIT_SKIP_COUNTER_UPDATE),
+       IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE = 4,
+       IPSET_FLAG_SKIP_SUBCOUNTER_UPDATE =
+               (1 << IPSET_FLAG_BIT_SKIP_SUBCOUNTER_UPDATE),
+       IPSET_FLAG_BIT_MATCH_COUNTERS = 5,
+       IPSET_FLAG_MATCH_COUNTERS = (1 << IPSET_FLAG_BIT_MATCH_COUNTERS),
+       IPSET_FLAG_BIT_RETURN_NOMATCH = 7,
+       IPSET_FLAG_RETURN_NOMATCH = (1 << IPSET_FLAG_BIT_RETURN_NOMATCH),
+       IPSET_FLAG_CMD_MAX = 15,
 };
 
-/* Flags at CADT attribute level */
+/* Flags at CADT attribute level, upper half of cmdattrs */
 enum ipset_cadt_flags {
        IPSET_FLAG_BIT_BEFORE   = 0,
        IPSET_FLAG_BEFORE       = (1 << IPSET_FLAG_BIT_BEFORE),
        IPSET_FLAG_BIT_PHYSDEV  = 1,
        IPSET_FLAG_PHYSDEV      = (1 << IPSET_FLAG_BIT_PHYSDEV),
+       IPSET_FLAG_BIT_NOMATCH  = 2,
+       IPSET_FLAG_NOMATCH      = (1 << IPSET_FLAG_BIT_NOMATCH),
+       IPSET_FLAG_BIT_WITH_COUNTERS = 3,
+       IPSET_FLAG_WITH_COUNTERS = (1 << IPSET_FLAG_BIT_WITH_COUNTERS),
+       IPSET_FLAG_CADT_MAX     = 15,
 };
 
 /* Commands with settype-specific attributes */
@@ -186,6 +205,7 @@ enum ip_set_dim {
         * If changed, new revision of iptables match/target is required.
         */
        IPSET_DIM_MAX = 6,
+       /* Backward compatibility: set match revision 2 */
        IPSET_BIT_RETURN_NOMATCH = 7,
 };
 
@@ -198,6 +218,18 @@ enum ip_set_kopt {
        IPSET_RETURN_NOMATCH = (1 << IPSET_BIT_RETURN_NOMATCH),
 };
 
+enum {
+       IPSET_COUNTER_NONE = 0,
+       IPSET_COUNTER_EQ,
+       IPSET_COUNTER_NE,
+       IPSET_COUNTER_LT,
+       IPSET_COUNTER_GT,
+};
+
+struct ip_set_counter_match {
+       __u8 op;
+       __u64 value;
+};
 
 /* Interface to iptables/ip6tables */
 
@@ -210,18 +242,27 @@ union ip_set_name_index {
 
 #define IP_SET_OP_GET_BYNAME   0x00000006      /* Get set index by name */
 struct ip_set_req_get_set {
-       unsigned op;
-       unsigned version;
+       unsigned int op;
+       unsigned int version;
        union ip_set_name_index set;
 };
 
 #define IP_SET_OP_GET_BYINDEX  0x00000007      /* Get set name by index */
 /* Uses ip_set_req_get_set */
 
+#define IP_SET_OP_GET_FNAME    0x00000008      /* Get set index and family */
+struct ip_set_req_get_set_family {
+       unsigned int op;
+       unsigned int version;
+       unsigned int family;
+       union ip_set_name_index set;
+};
+
+
 #define IP_SET_OP_VERSION      0x00000100      /* Ask kernel version */
 struct ip_set_req_version {
-       unsigned op;
-       unsigned version;
+       unsigned int op;
+       unsigned int version;
 };
 
-#endif /*_IP_SET_H */
+#endif /* _UAPI_IP_SET_H */
index a064b8a..54528fd 100644 (file)
@@ -3,7 +3,10 @@
 
 #include <linux/types.h>
 
-#define XT_CT_NOTRACK  0x1
+enum {
+       XT_CT_NOTRACK           = 1 << 0,
+       XT_CT_NOTRACK_ALIAS     = 1 << 1,
+};
 
 struct xt_ct_target_info {
        __u16 flags;
index 9eafdbb..8bb5fe6 100644 (file)
@@ -26,4 +26,13 @@ struct xt_NFQ_info_v2 {
        __u16 bypass;
 };
 
+struct xt_NFQ_info_v3 {
+       __u16 queuenum;
+       __u16 queues_total;
+       __u16 flags;
+#define NFQ_FLAG_BYPASS                0x01 /* for compatibility with v2 */
+#define NFQ_FLAG_CPU_FANOUT    0x02 /* use current CPU (no hashing) */
+#define NFQ_FLAG_MASK          0x03
+};
+
 #endif /* _XT_NFQ_TARGET_H */
diff --git a/include/linux/netfilter/xt_SYNPROXY.h b/include/linux/netfilter/xt_SYNPROXY.h
new file mode 100644 (file)
index 0000000..2d59fba
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef _XT_SYNPROXY_H
+#define _XT_SYNPROXY_H
+
+#define XT_SYNPROXY_OPT_MSS            0x01
+#define XT_SYNPROXY_OPT_WSCALE         0x02
+#define XT_SYNPROXY_OPT_SACK_PERM      0x04
+#define XT_SYNPROXY_OPT_TIMESTAMP      0x08
+#define XT_SYNPROXY_OPT_ECN            0x10
+
+struct xt_synproxy_info {
+       __u8    options;
+       __u8    wscale;
+       __u16   mss;
+};
+
+#endif /* _XT_SYNPROXY_H */
index e3a9978..964d3d4 100644 (file)
@@ -62,4 +62,13 @@ struct xt_set_info_target_v2 {
        __u32 timeout;
 };
 
+/* Revision 3 match */
+
+struct xt_set_info_match_v3 {
+       struct xt_set_info match_set;
+       struct ip_set_counter_match packets;
+       struct ip_set_counter_match bytes;
+       __u32 flags;
+};
+
 #endif /*_XT_SET_H*/
index 26d7217..6315e2a 100644 (file)
@@ -5,10 +5,17 @@
 
 enum {
        XT_SOCKET_TRANSPARENT = 1 << 0,
+       XT_SOCKET_NOWILDCARD = 1 << 1,
 };
 
 struct xt_socket_mtinfo1 {
        __u8 flags;
 };
+#define XT_SOCKET_FLAGS_V1 XT_SOCKET_TRANSPARENT
+
+struct xt_socket_mtinfo2 {
+       __u8 flags;
+};
+#define XT_SOCKET_FLAGS_V2 (XT_SOCKET_TRANSPARENT | XT_SOCKET_NOWILDCARD)
 
 #endif /* _XT_SOCKET_H */
index c35a6e6..0217267 100644 (file)
@@ -230,7 +230,7 @@ struct xtables_match
        /* Size of match data. */
        size_t size;
 
-       /* Size of match data relevent for userspace comparison purposes */
+       /* Size of match data relevant for userspace comparison purposes */
        size_t userspacesize;
 
        /* Function which prints out usage message. */
@@ -308,7 +308,7 @@ struct xtables_target
        /* Size of target data. */
        size_t size;
 
-       /* Size of target data relevent for userspace comparison purposes */
+       /* Size of target data relevant for userspace comparison purposes */
        size_t userspacesize;
 
        /* Function which prints out usage message. */
index 4fc63aa..31baf7d 100644 (file)
@@ -1,11 +1,11 @@
 /ip6tables
-/ip6tables.8
 /ip6tables-save
 /ip6tables-restore
 /ip6tables-static
 /iptables
 /iptables.8
 /iptables-extensions.8
+/iptables-extensions.8.tmpl
 /iptables-save
 /iptables-restore
 /iptables-static
index 61e78db..a4246eb 100644 (file)
@@ -28,7 +28,7 @@ sbin_PROGRAMS    = xtables-multi
 man_MANS         = iptables.8 iptables-restore.8 iptables-save.8 \
                    iptables-xml.1 ip6tables.8 ip6tables-restore.8 \
                    ip6tables-save.8 iptables-extensions.8
-CLEANFILES       = iptables.8 ip6tables.8
+CLEANFILES       = iptables.8
 
 vx_bin_links   = iptables-xml
 if ENABLE_IPV4
@@ -38,15 +38,8 @@ if ENABLE_IPV6
 v6_sbin_links  = ip6tables ip6tables-restore ip6tables-save
 endif
 
-iptables.8: ${srcdir}/iptables.8.in
-       ${AM_VERBOSE_GEN} sed -e 's/@PACKAGE_AND_VERSION@/${PACKAGE} ${PACKAGE_VERSION}/g' $< >$@;
-
-ip6tables.8: ${srcdir}/ip6tables.8.in
-       ${AM_VERBOSE_GEN} sed -e 's/@PACKAGE_AND_VERSION@/${PACKAGE} ${PACKAGE_VERSION}/g' $< >$@;
-
-iptables-extensions.8: ${srcdir}/iptables-extensions.8.in ../extensions/matches.man ../extensions/targets.man
-       ${AM_VERBOSE_GEN} sed -e \
-               's/@PACKAGE_AND_VERSION@/${PACKAGE} ${PACKAGE_VERSION}/g' \
+iptables-extensions.8: iptables-extensions.8.tmpl ../extensions/matches.man ../extensions/targets.man
+       ${AM_VERBOSE_GEN} sed \
                -e '/@MATCH@/ r ../extensions/matches.man' \
                -e '/@TARGET@/ r ../extensions/targets.man' $< >$@;
 
index 55eb9de..94f5bef 100644 (file)
@@ -67,6 +67,10 @@ host_triplet = @host@
 sbin_PROGRAMS = xtables-multi$(EXEEXT)
 subdir = iptables
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
+       $(srcdir)/iptables-apply.8.in \
+       $(srcdir)/iptables-extensions.8.tmpl.in \
+       $(srcdir)/iptables-restore.8.in $(srcdir)/iptables-save.8.in \
+       $(srcdir)/iptables-xml.1.in $(srcdir)/iptables.8.in \
        $(srcdir)/xtables.pc.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_linker_flags.m4 \
@@ -77,7 +81,9 @@ am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
        $(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
-CONFIG_CLEAN_FILES = xtables.pc
+CONFIG_CLEAN_FILES = xtables.pc iptables.8 iptables-extensions.8.tmpl \
+       iptables-save.8 iptables-restore.8 iptables-apply.8 \
+       iptables-xml.1
 CONFIG_CLEAN_VPATH_FILES =
 am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(man1dir)" \
        "$(DESTDIR)$(man8dir)" "$(DESTDIR)$(pkgconfigdir)"
@@ -265,6 +271,8 @@ ksourcedir = @ksourcedir@
 libdir = @libdir@
 libexecdir = @libexecdir@
 libiptc_LDFLAGS2 = @libiptc_LDFLAGS2@
+libnetfilter_conntrack_CFLAGS = @libnetfilter_conntrack_CFLAGS@
+libnetfilter_conntrack_LIBS = @libnetfilter_conntrack_LIBS@
 libnfnetlink_CFLAGS = @libnfnetlink_CFLAGS@
 libnfnetlink_LIBS = @libnfnetlink_LIBS@
 libxtables_vage = @libxtables_vage@
@@ -304,7 +312,7 @@ man_MANS = iptables.8 iptables-restore.8 iptables-save.8 \
                    iptables-xml.1 ip6tables.8 ip6tables-restore.8 \
                    ip6tables-save.8 iptables-extensions.8
 
-CLEANFILES = iptables.8 ip6tables.8
+CLEANFILES = iptables.8
 vx_bin_links = iptables-xml
 @ENABLE_IPV4_TRUE@v4_sbin_links = iptables iptables-restore iptables-save
 @ENABLE_IPV6_TRUE@v6_sbin_links = ip6tables ip6tables-restore ip6tables-save
@@ -345,6 +353,18 @@ $(ACLOCAL_M4):  $(am__aclocal_m4_deps)
 $(am__aclocal_m4_deps):
 xtables.pc: $(top_builddir)/config.status $(srcdir)/xtables.pc.in
        cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+iptables.8: $(top_builddir)/config.status $(srcdir)/iptables.8.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+iptables-extensions.8.tmpl: $(top_builddir)/config.status $(srcdir)/iptables-extensions.8.tmpl.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+iptables-save.8: $(top_builddir)/config.status $(srcdir)/iptables-save.8.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+iptables-restore.8: $(top_builddir)/config.status $(srcdir)/iptables-restore.8.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+iptables-apply.8: $(top_builddir)/config.status $(srcdir)/iptables-apply.8.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+iptables-xml.1: $(top_builddir)/config.status $(srcdir)/iptables-xml.1.in
+       cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 install-sbinPROGRAMS: $(sbin_PROGRAMS)
        @$(NORMAL_INSTALL)
        @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \
@@ -928,15 +948,8 @@ uninstall-man: uninstall-man1 uninstall-man8
        uninstall-man8 uninstall-pkgconfigDATA uninstall-sbinPROGRAMS
 
 
-iptables.8: ${srcdir}/iptables.8.in
-       ${AM_VERBOSE_GEN} sed -e 's/@PACKAGE_AND_VERSION@/${PACKAGE} ${PACKAGE_VERSION}/g' $< >$@;
-
-ip6tables.8: ${srcdir}/ip6tables.8.in
-       ${AM_VERBOSE_GEN} sed -e 's/@PACKAGE_AND_VERSION@/${PACKAGE} ${PACKAGE_VERSION}/g' $< >$@;
-
-iptables-extensions.8: ${srcdir}/iptables-extensions.8.in ../extensions/matches.man ../extensions/targets.man
-       ${AM_VERBOSE_GEN} sed -e \
-               's/@PACKAGE_AND_VERSION@/${PACKAGE} ${PACKAGE_VERSION}/g' \
+iptables-extensions.8: iptables-extensions.8.tmpl ../extensions/matches.man ../extensions/targets.man
+       ${AM_VERBOSE_GEN} sed \
                -e '/@MATCH@/ r ../extensions/matches.man' \
                -e '/@TARGET@/ r ../extensions/targets.man' $< >$@;
 
index dbe19da..cf4ea3e 100644 (file)
@@ -1,68 +1 @@
-.TH IP6TABLES-RESTORE 8 "Jan 30, 2002" "" ""
-.\"
-.\" Man page written by Harald Welte <laforge@gnumonks.org>
-.\" It is based on the iptables man page.
-.\"
-.\"    This program is free software; you can redistribute it and/or modify
-.\"    it under the terms of the GNU General Public License as published by
-.\"    the Free Software Foundation; either version 2 of the License, or
-.\"    (at your option) any later version.
-.\"
-.\"    This program is distributed in the hope that it will be useful,
-.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
-.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-.\"    GNU General Public License for more details.
-.\"
-.\"    You should have received a copy of the GNU General Public License
-.\"    along with this program; if not, write to the Free Software
-.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-.\"
-.\"
-.SH NAME
-ip6tables-restore \(em Restore IPv6 Tables
-.SH SYNOPSIS
-\fBip6tables\-restore\fP [\fB\-chntv\fP] [\fB\-M\fP \fImodprobe\fP]
-[\fB\-T\fP \fIname\fP]
-.SH DESCRIPTION
-.PP
-.B ip6tables-restore
-is used to restore IPv6 Tables from data specified on STDIN. Use 
-I/O redirection provided by your shell to read from a file
-.TP
-\fB\-c\fR, \fB\-\-counters\fR
-restore the values of all packet and byte counters
-.TP
-\fB\-h\fP, \fB\-\-help\fP
-Print a short option summary.
-.TP
-\fB\-n\fR, \fB\-\-noflush\fR 
-don't flush the previous contents of the table. If not specified,
-\fBip6tables-restore\fP flushes (deletes) all previous contents of the
-respective table.
-.TP
-\fB\-t\fP, \fB\-\-test\fP
-Only parse and construct the ruleset, but do not commit it.
-.TP
-\fB\-v\fP, \fB\-\-verbose\fP
-Print additional debug info during ruleset processing.
-.TP
-\fB\-M\fP, \fB\-\-modprobe\fP \fImodprobe_program\fP
-Specify the path to the modprobe program. By default, ip6tables-restore will
-inspect /proc/sys/kernel/modprobe to determine the executable's path.
-.TP
-\fB\-T\fP, \fB\-\-table\fP \fIname\fP
-Restore only the named table even if the input stream contains other ones.
-.B ip6tables-restore
-flushes (deletes) all previous contents of the respective IPv6 Table.
-.SH BUGS
-None known as of iptables-1.2.1 release
-.SH AUTHORS
-Harald Welte <laforge@gnumonks.org>
-.br
-Andras Kis-Szabo <kisza@sch.bme.hu>
-.SH SEE ALSO
-\fBip6tables\-save\fP(8), \fBip6tables\fP(8)
-.PP
-The iptables-HOWTO, which details more iptables usage, the NAT-HOWTO,
-which details NAT, and the netfilter-hacking-HOWTO which details the
-internals.
+.so man8/iptables-restore.8
index 0e8252f..b8b9e0d 100644 (file)
@@ -438,7 +438,7 @@ int ip6tables_restore_main(int argc, char *argv[])
                                DEBUGP("argv[%u]: %s\n", a, newargv[a]);
 
                        ret = do_command6(newargc, newargv,
-                                        &newargv[2], &handle);
+                                        &newargv[2], &handle, true);
 
                        free_argv();
                        fflush(stdout);
index 457be82..182f55c 100644 (file)
@@ -1,53 +1 @@
-.TH IP6TABLES-SAVE 8 "Jan 30, 2002" "" ""
-.\"
-.\" Man page written by Harald Welte <laforge@gnumonks.org>
-.\" It is based on the iptables man page.
-.\"
-.\"    This program is free software; you can redistribute it and/or modify
-.\"    it under the terms of the GNU General Public License as published by
-.\"    the Free Software Foundation; either version 2 of the License, or
-.\"    (at your option) any later version.
-.\"
-.\"    This program is distributed in the hope that it will be useful,
-.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
-.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-.\"    GNU General Public License for more details.
-.\"
-.\"    You should have received a copy of the GNU General Public License
-.\"    along with this program; if not, write to the Free Software
-.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-.\"
-.\"
-.SH NAME
-ip6tables-save \(em dump iptables rules to stdout
-.SH SYNOPSIS
-\fBip6tables\-save\fP [\fB\-M\fP \fImodprobe\fP] [\fB\-c\fP]
-[\fB\-t\fP \fItable\fP
-.SH DESCRIPTION
-.PP
-.B ip6tables-save
-is used to dump the contents of an IPv6 Table in easily parseable format
-to STDOUT. Use I/O-redirection provided by your shell to write to a file.
-.TP
-\fB\-M\fP \fImodprobe_program\fP
-Specify the path to the modprobe program. By default, iptables-save will
-inspect /proc/sys/kernel/modprobe to determine the executable's path.
-.TP
-\fB\-c\fR, \fB\-\-counters\fR
-include the current values of all packet and byte counters in the output
-.TP
-\fB\-t\fR, \fB\-\-table\fR \fItablename\fP
-restrict output to only one table. If not specified, output includes all
-available tables.
-.SH BUGS
-None known as of iptables-1.2.1 release
-.SH AUTHORS
-Harald Welte <laforge@gnumonks.org>
-.br
-Andras Kis-Szabo <kisza@sch.bme.hu>
-.SH SEE ALSO
-\fBip6tables\-restore\fP(8), \fBip6tables\fP(8)
-.PP
-The iptables-HOWTO, which details more iptables usage, the NAT-HOWTO,
-which details NAT, and the netfilter-hacking-HOWTO which details the
-internals.
+.so man8/iptables-save.8
index 21b5811..35d2d9a 100644 (file)
@@ -58,7 +58,7 @@ ip6tables_main(int argc, char *argv[])
        init_extensions6();
 #endif
 
-       ret = do_command6(argc, argv, &table, &handle);
+       ret = do_command6(argc, argv, &table, &handle, false);
        if (ret) {
                ret = ip6tc_commit(handle);
                ip6tc_free(handle);
@@ -73,6 +73,8 @@ ip6tables_main(int argc, char *argv[])
                        fprintf(stderr, "ip6tables: %s.\n",
                                ip6tc_strerror(errno));
                }
+               if (errno == EAGAIN)
+                       exit(RESOURCE_PROBLEM);
        }
 
        exit(!ret);
diff --git a/iptables/ip6tables.8 b/iptables/ip6tables.8
new file mode 100644 (file)
index 0000000..0dee41a
--- /dev/null
@@ -0,0 +1 @@
+.so man8/iptables.8
diff --git a/iptables/ip6tables.8.in b/iptables/ip6tables.8.in
deleted file mode 100644 (file)
index 8634854..0000000
+++ /dev/null
@@ -1,456 +0,0 @@
-.TH IP6TABLES 8 "" "@PACKAGE_AND_VERSION@" "@PACKAGE_AND_VERSION@"
-.\"
-.\" Man page written by Andras Kis-Szabo <kisza@sch.bme.hu>
-.\" It is based on iptables man page.
-.\"
-.\" iptables page by Herve Eychenne <rv@wallfire.org>
-.\" It is based on ipchains man page.
-.\"
-.\" ipchains page by Paul ``Rusty'' Russell March 1997
-.\" Based on the original ipfwadm man page by Jos Vos <jos@xos.nl>
-.\"
-.\"    This program is free software; you can redistribute it and/or modify
-.\"    it under the terms of the GNU General Public License as published by
-.\"    the Free Software Foundation; either version 2 of the License, or
-.\"    (at your option) any later version.
-.\"
-.\"    This program is distributed in the hope that it will be useful,
-.\"    but WITHOUT ANY WARRANTY; without even the implied warranty of
-.\"    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-.\"    GNU General Public License for more details.
-.\"
-.\"    You should have received a copy of the GNU General Public License
-.\"    along with this program; if not, write to the Free Software
-.\"    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-.\"
-.\"
-.SH NAME
-ip6tables \(em IPv6 packet filter administration
-.SH SYNOPSIS
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] {\fB\-A\fP|\fB\-C\fP|\fB\-D\fP}
-\fIchain rule-specification\fP [\fIoptions...\fP]
-.PP
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] \fB\-I\fP \fIchain\fP [\fIrulenum\fP]
-\fIrule-specification\fP [\fIoptions...\fP]
-.PP
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] \fB\-R\fP \fIchain rulenum
-rule-specification\fP [\fIoptions...\fP]
-.PP
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] \fB\-D\fP \fIchain rulenum\fP
-[\fIoptions...\fP]
-.PP
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] \fB\-S\fP [\fIchain\fP [\fIrulenum\fP]]
-.PP
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] {\fB\-F\fP|\fB\-L\fP|\fB\-Z\fP}
-[\fIchain\fP [\fIrulenum\fP]] [\fIoptions...\fP]
-.PP
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] \fB\-N\fP \fIchain\fP
-.PP
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] \fB\-X\fP [\fIchain\fP]
-.PP
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] \fB\-P\fP \fIchain target\fP
-[\fIoptions...\fP]
-.PP
-\fBip6tables\fP [\fB\-t\fP \fItable\fP] \fB\-E\fP \fIold-chain-name new-chain-name\fP
-.SH DESCRIPTION
-\fBIp6tables\fP is used to set up, maintain, and inspect the
-tables of IPv6 packet
-filter rules in the Linux kernel.  Several different tables
-may be defined.  Each table contains a number of built-in
-chains and may also contain user-defined chains.
-.PP
-Each chain is a list of rules which can match a set of packets.  Each
-rule specifies what to do with a packet that matches.  This is called
-a `target', which may be a jump to a user-defined chain in the same
-table.
-.SH TARGETS
-A firewall rule specifies criteria for a packet and a target.  If the
-packet does not match, the next rule in the chain is the examined; if
-it does match, then the next rule is specified by the value of the
-target, which can be the name of a user-defined chain or one of the
-special values \fBACCEPT\fP, \fBDROP\fP, \fBQUEUE\fP or \fBRETURN\fP.
-.PP
-\fBACCEPT\fP means to let the packet through.
-\fBDROP\fP means to drop the packet on the floor.
-\fBQUEUE\fP means to pass the packet to userspace.
-(How the packet can be received
-by a userspace process differs by the particular queue handler.  2.4.x
-and 2.6.x kernels up to 2.6.13 include the \fBip_queue\fP
-queue handler.  Kernels 2.6.14 and later additionally include the
-\fBnfnetlink_queue\fP queue handler.  Packets with a target of QUEUE will be
-sent to queue number '0' in this case. Please also see the \fBNFQUEUE\fP
-target as described later in this man page.)
-\fBRETURN\fP means stop traversing this chain and resume at the next
-rule in the
-previous (calling) chain.  If the end of a built-in chain is reached
-or a rule in a built-in chain with target \fBRETURN\fP
-is matched, the target specified by the chain policy determines the
-fate of the packet.
-.SH TABLES
-There are currently five independent tables (which tables are present
-at any time depends on the kernel configuration options and which
-modules are present).
-.TP
-\fB\-t\fP, \fB\-\-table\fP \fItable\fP
-This option specifies the packet matching table which the command
-should operate on.  If the kernel is configured with automatic module
-loading, an attempt will be made to load the appropriate module for
-that table if it is not already there.
-
-The tables are as follows:
-.RS
-.TP .4i
-\fBfilter\fP:
-This is the default table (if no \-t option is passed). It contains
-the built-in chains \fBINPUT\fP (for packets destined to local sockets),
-\fBFORWARD\fP (for packets being routed through the box), and
-\fBOUTPUT\fP (for locally-generated packets).
-.TP
-\fBnat\fP:
-This table is consulted when a packet that creates a new
-connection is encountered.  It consists of three built-ins: \fBPREROUTING\fP
-(for altering packets as soon as they come in), \fBOUTPUT\fP
-(for altering locally-generated packets before routing), and \fBPOSTROUTING\fP
-(for altering packets as they are about to go out). Available since kernel 3.7.
-.TP
-\fBmangle\fP:
-This table is used for specialized packet alteration.  Until kernel
-2.4.17 it had two built-in chains: \fBPREROUTING\fP
-(for altering incoming packets before routing) and \fBOUTPUT\fP
-(for altering locally-generated packets before routing).
-Since kernel 2.4.18, three other built-in chains are also supported:
-\fBINPUT\fP (for packets coming into the box itself), \fBFORWARD\fP
-(for altering packets being routed through the box), and \fBPOSTROUTING\fP
-(for altering packets as they are about to go out).
-.TP
-\fBraw\fP:
-This table is used mainly for configuring exemptions from connection
-tracking in combination with the NOTRACK target.  It registers at the netfilter
-hooks with higher priority and is thus called before ip_conntrack, or any other
-IP tables.  It provides the following built-in chains: \fBPREROUTING\fP
-(for packets arriving via any network interface) \fBOUTPUT\fP
-(for packets generated by local processes)
-.TP
-\fBsecurity\fP:
-This table is used for Mandatory Access Control (MAC) networking rules, such
-as those enabled by the \fBSECMARK\fP and \fBCONNSECMARK\fP targets.
-Mandatory Access Control is implemented by Linux Security Modules such as
-SELinux.  The security table is called after the filter table, allowing any
-Discretionary Access Control (DAC) rules in the filter table to take effect
-before MAC rules.  This table provides the following built-in chains:
-\fBINPUT\fP (for packets coming into the box itself),
-\fBOUTPUT\fP (for altering locally-generated packets before routing), and
-\fBFORWARD\fP (for altering packets being routed through the box).
-.RE
-.SH OPTIONS
-The options that are recognized by
-\fBip6tables\fP can be divided into several different groups.
-.SS COMMANDS
-These options specify the specific action to perform.  Only one of them
-can be specified on the command line unless otherwise specified
-below.  For all the long versions of the command and option names, you
-need to use only enough letters to ensure that
-\fBip6tables\fP can differentiate it from all other options.
-.TP
-\fB\-A\fP, \fB\-\-append\fP \fIchain rule-specification\fP
-Append one or more rules to the end of the selected chain.
-When the source and/or destination names resolve to more than one
-address, a rule will be added for each possible address combination.
-.TP
-\fB\-C\fP, \fB\-\-check\fP \fIchain rule-specification\fP
-Check whether a rule matching the specification does exist in the
-selected chain. This command uses the same logic as \fB\-D\fP to
-find a matching entry, but does not alter the existing iptables
-configuration and uses its exit code to indicate success or failure.
-.TP
-\fB\-D\fP, \fB\-\-delete\fP \fIchain rule-specification\fP
-.ns
-.TP
-\fB\-D\fP, \fB\-\-delete\fP \fIchain rulenum\fP
-Delete one or more rules from the selected chain.  There are two
-versions of this command: the rule can be specified as a number in the
-chain (starting at 1 for the first rule) or a rule to match.
-.TP
-\fB\-I\fP, \fB\-\-insert\fP \fIchain\fP [\fIrulenum\fP] \fIrule-specification\fP
-Insert one or more rules in the selected chain as the given rule
-number.  So, if the rule number is 1, the rule or rules are inserted
-at the head of the chain.  This is also the default if no rule number
-is specified.
-.TP
-\fB\-R\fP, \fB\-\-replace\fP \fIchain rulenum rule-specification\fP
-Replace a rule in the selected chain.  If the source and/or
-destination names resolve to multiple addresses, the command will
-fail.  Rules are numbered starting at 1.
-.TP
-\fB\-L\fP, \fB\-\-list\fP [\fIchain\fP]
-List all rules in the selected chain.  If no chain is selected, all
-chains are listed. Like every other ip6tables command, it applies to the
-specified table (filter is the default).
-.IP ""
-Please note that it is often used with the \fB\-n\fP
-option, in order to avoid long reverse DNS lookups.
-It is legal to specify the \fB\-Z\fP
-(zero) option as well, in which case the chain(s) will be atomically
-listed and zeroed.  The exact output is affected by the other
-arguments given. The exact rules are suppressed until you use
-.nf
- ip6tables \-L \-v
-.fi
-.TP
-\fB\-S\fP, \fB\-\-list\-rules\fP [\fIchain\fP]
-Print all rules in the selected chain.  If no chain is selected, all
-chains are printed like ip6tables-save. Like every other ip6tables command,
-it applies to the specified table (filter is the default).
-.TP
-\fB\-F\fP, \fB\-\-flush\fP [\fIchain\fP]
-Flush the selected chain (all the chains in the table if none is given).
-This is equivalent to deleting all the rules one by one.
-.TP
-\fB\-Z\fP, \fB\-\-zero\fP [\fIchain\fP [\fIrulenum\fP]]
-Zero the packet and byte counters in all chains, or only the given chain,
-or only the given rule in a chain. It is legal to
-specify the
-\fB\-L\fP, \fB\-\-list\fP
-(list) option as well, to see the counters immediately before they are
-cleared. (See above.)
-.TP
-\fB\-N\fP, \fB\-\-new\-chain\fP \fIchain\fP
-Create a new user-defined chain by the given name.  There must be no
-target of that name already.
-.TP
-\fB\-X\fP, \fB\-\-delete\-chain\fP [\fIchain\fP]
-Delete the optional user-defined chain specified.  There must be no references
-to the chain.  If there are, you must delete or replace the referring rules
-before the chain can be deleted.  The chain must be empty, i.e. not contain
-any rules.  If no argument is given, it will attempt to delete every
-non-builtin chain in the table.
-.TP
-\fB\-P\fP, \fB\-\-policy\fP \fIchain target\fP
-Set the policy for the chain to the given target.  See the section \fBTARGETS\fP
-for the legal targets.  Only built-in (non-user-defined) chains can have
-policies, and neither built-in nor user-defined chains can be policy
-targets.
-.TP
-\fB\-E\fP, \fB\-\-rename\-chain\fP \fIold\-chain new\-chain\fP
-Rename the user specified chain to the user supplied name.  This is
-cosmetic, and has no effect on the structure of the table.
-.TP
-\fB\-A\fP, \fB\-\-append\fP \fIchain rule-specification\fP
-Append one or more rules to the end of the selected chain.
-When the source and/or destination names resolve to more than one
-address, a rule will be added for each possible address combination.
-.TP
-\fB\-h\fP
-Help.
-Give a (currently very brief) description of the command syntax.
-.SS PARAMETERS
-The following parameters make up a rule specification (as used in the
-add, delete, insert, replace and append commands).
-.TP
-\fB\-4\fP, \fB\-\-ipv4\fP
-If a rule using the \fB\-4\fP option is inserted with (and only with)
-ip6tables-restore, it will be silently ignored. Any other uses will throw an
-error. This option allows to put both IPv4 and IPv6 rules in a single rule file
-for use with both iptables-restore and ip6tables-restore.
-.TP
-\fB\-6\fP, \fB\-\-ipv6\fP
-This option has no effect in ip6tables and ip6tables-restore.
-.TP
-[\fB!\fP] \fB\-p\fP, \fB\-\-protocol\fP \fIprotocol\fP
-The protocol of the rule or of the packet to check.
-The specified protocol can be one of \fBtcp\fP, \fBudp\fP, \fBudplite\fP,
-\fBicmpv6\fP, \fBesp\fP, \fBmh\fP or the special keyword "\fBall\fP",
-or it can be a numeric value, representing one of these protocols or a
-different one. A protocol name from /etc/protocols is also allowed.
-But IPv6 extension headers except \fBesp\fP are not allowed.
-\fBesp\fP and \fBipv6\-nonext\fP
-can be used with Kernel version 2.6.11 or later.
-A "!" argument before the protocol inverts the
-test.  The number zero is equivalent to \fBall\fP, which means that you cannot
-test the protocol field for the value 0 directly. To match on a HBH header,
-even if it were the last, you cannot use \fB\-p 0\fP, but always need
-\fB\-m hbh\fP.
-"\fBall\fP"
-will match with all protocols and is taken as default when this
-option is omitted.
-.TP
-[\fB!\fP] \fB\-s\fP, \fB\-\-source\fP \fIaddress\fP[\fB/\fP\fImask\fP]
-Source specification.
-\fIAddress\fP can be either be a hostname,
-a network IP address (with \fB/\fP\fImask\fP), or a plain IP address.
-Names will be resolved once only, before the rule is submitted to the kernel.
-Please note that specifying any name to be resolved with a remote query such as
-DNS is a really bad idea.
-(Resolving network names is not supported at this time.)
-The \fImask\fP is a plain number,
-specifying the number of 1's at the left side of the network mask.
-A "!" argument before the address specification inverts the sense of
-the address. The flag \fB\-\-src\fP
-is an alias for this option.
-Multiple addresses can be specified, but this will \fBexpand to multiple
-rules\fP (when adding with \-A), or will cause multiple rules to be
-deleted (with \-D).
-.TP
-[\fB!\fP] \fB\-d\fP, \fB\-\-destination\fP \fIaddress\fP[\fB/\fP\fImask\fP]
-Destination specification. 
-See the description of the \fB\-s\fP
-(source) flag for a detailed description of the syntax.  The flag
-\fB\-\-dst\fP is an alias for this option.
-.TP
-\fB\-m\fP, \fB\-\-match\fP \fImatch\fP
-Specifies a match to use, that is, an extension module that tests for a
-specific property. The set of matches make up the condition under which a
-target is invoked. Matches are evaluated first to last as specified on the
-command line and work in short-circuit fashion, i.e. if one extension yields
-false, evaluation will stop.
-.TP
-\fB\-j\fP, \fB\-\-jump\fP \fItarget\fP
-This specifies the target of the rule; i.e., what to do if the packet
-matches it.  The target can be a user-defined chain (other than the
-one this rule is in), one of the special builtin targets which decide
-the fate of the packet immediately, or an extension (see \fBEXTENSIONS\fP
-below).  If this
-option is omitted in a rule (and \fB\-g\fP
-is not used), then matching the rule will have no
-effect on the packet's fate, but the counters on the rule will be
-incremented.
-.TP
-\fB\-g\fP, \fB\-\-goto\fP \fIchain\fP
-This specifies that the processing should continue in a user
-specified chain. Unlike the \-\-jump option return will not continue
-processing in this chain but instead in the chain that called us via
-\-\-jump.
-.TP
-[\fB!\fP] \fB\-i\fP, \fB\-\-in\-interface\fP \fIname\fP
-Name of an interface via which a packet was received (only for
-packets entering the \fBINPUT\fP, \fBFORWARD\fP and \fBPREROUTING\fP
-chains).  When the "!" argument is used before the interface name, the
-sense is inverted.  If the interface name ends in a "+", then any
-interface which begins with this name will match.  If this option is
-omitted, any interface name will match.
-.TP
-[\fB!\fP] \fB\-o\fP, \fB\-\-out\-interface\fP \fIname\fP
-Name of an interface via which a packet is going to be sent (for packets
-entering the \fBFORWARD\fP, \fBOUTPUT\fP and \fBPOSTROUTING\fP
-chains).  When the "!" argument is used before the interface name, the
-sense is inverted.  If the interface name ends in a "+", then any
-interface which begins with this name will match.  If this option is
-omitted, any interface name will match.
-.\" Currently not supported (header-based)
-.\" .TP
-.\" [\fB!\fP] \fB\-f\fP, \fB\-\-fragment\fP
-.\" This means that the rule only refers to second and further fragments
-.\" of fragmented packets.  Since there is no way to tell the source or
-.\" destination ports of such a packet (or ICMP type), such a packet will
-.\" not match any rules which specify them.  When the "!" argument
-.\" precedes the "\-f" flag, the rule will only match head fragments, or
-.\" unfragmented packets.
-.TP
-\fB\-c\fP, \fB\-\-set\-counters\fP \fIpackets bytes\fP
-This enables the administrator to initialize the packet and byte
-counters of a rule (during \fBINSERT\fP, \fBAPPEND\fP, \fBREPLACE\fP
-operations).
-.SS "OTHER OPTIONS"
-The following additional options can be specified:
-.TP
-\fB\-v\fP, \fB\-\-verbose\fP
-Verbose output.  This option makes the list command show the interface
-name, the rule options (if any), and the TOS masks.  The packet and
-byte counters are also listed, with the suffix 'K', 'M' or 'G' for
-1000, 1,000,000 and 1,000,000,000 multipliers respectively (but see
-the \fB\-x\fP flag to change this).
-For appending, insertion, deletion and replacement, this causes
-detailed information on the rule or rules to be printed. \fB\-v\fP may be
-specified multiple times to possibly emit more detailed debug statements.
-.TP
-\fB\-n\fP, \fB\-\-numeric\fP
-Numeric output.
-IP addresses and port numbers will be printed in numeric format.
-By default, the program will try to display them as host names,
-network names, or services (whenever applicable).
-.TP
-\fB\-x\fP, \fB\-\-exact\fP
-Expand numbers.
-Display the exact value of the packet and byte counters,
-instead of only the rounded number in K's (multiples of 1000)
-M's (multiples of 1000K) or G's (multiples of 1000M).  This option is
-only relevant for the \fB\-L\fP command.
-.TP
-\fB\-\-line\-numbers\fP
-When listing rules, add line numbers to the beginning of each rule,
-corresponding to that rule's position in the chain.
-.TP
-\fB\-\-modprobe=\fP\fIcommand\fP
-When adding or inserting rules into a chain, use \fIcommand\fP
-to load any necessary modules (targets, match extensions, etc).
-.SH MATCH EXTENSIONS
-.PP
-iptables can use extended packet matching and target modules.
-A list of these is available in the \fBiptables\-extensions\fP(8) manpage.
-.SH DIAGNOSTICS
-Various error messages are printed to standard error.  The exit code
-is 0 for correct functioning.  Errors which appear to be caused by
-invalid or abused command line parameters cause an exit code of 2, and
-other errors cause an exit code of 1.
-.SH BUGS
-Bugs?  What's this? ;-)
-Well... the counters are not reliable on sparc64.
-.SH COMPATIBILITY WITH IPCHAINS
-This \fBip6tables\fP
-is very similar to ipchains by Rusty Russell.  The main difference is
-that the chains \fBINPUT\fP and \fBOUTPUT\fP
-are only traversed for packets coming into the local host and
-originating from the local host respectively.  Hence every packet only
-passes through one of the three chains (except loopback traffic, which
-involves both INPUT and OUTPUT chains); previously a forwarded packet
-would pass through all three.
-.PP
-The other main difference is that \fB\-i\fP refers to the input interface;
-\fB\-o\fP refers to the output interface, and both are available for packets
-entering the \fBFORWARD\fP chain.
-There are several other changes in ip6tables.
-.SH SEE ALSO
-\fBip6tables\-save\fP(8),
-\fBip6tables\-restore\fP(8),
-\fBiptables\fP(8),
-\fBiptables\-apply\fP(8),
-\fBiptables\-extensions\fP(8),
-\fBiptables\-save\fP(8),
-\fBiptables\-restore\fP(8),
-\fBlibipq\fP(3).
-.PP
-The packet-filtering-HOWTO details iptables usage for
-packet filtering,
-the netfilter-extensions-HOWTO details the extensions that are
-not in the standard distribution,
-and the netfilter-hacking-HOWTO details the netfilter internals.
-.br
-See
-.BR "http://www.netfilter.org/" .
-.SH AUTHORS
-Rusty Russell wrote iptables, in early consultation with Michael
-Neuling.
-.PP
-Marc Boucher made Rusty abandon ipnatctl by lobbying for a generic packet
-selection framework in iptables, then wrote the mangle table, the owner match,
-the mark stuff, and ran around doing cool stuff everywhere.
-.PP
-James Morris wrote the TOS target, and tos match.
-.PP
-Jozsef Kadlecsik wrote the REJECT target.
-.PP
-Harald Welte wrote the ULOG and NFQUEUE target, the new libiptc, as well as TTL match+target and libipulog.
-.PP
-The Netfilter Core Team is: Marc Boucher, Martin Josefsson, Yasuyuki Kozakai,
-Jozsef Kadlecsik, Patrick McHardy, James Morris, Pablo Neira Ayuso,
-Harald Welte and Rusty Russell.
-.PP
-ip6tables man page created by Andras Kis-Szabo, based on
-iptables man page written by Herve Eychenne <rv@wallfire.org>.
-.\" .. and did I mention that we are incredibly cool people?
-.\" .. sexy, too ..
-.\" .. witty, charming, powerful ..
-.\" .. and most of all, modest ..
-.SH VERSION
-.PP
-This manual page applies to ip6tables @PACKAGE_VERSION@.
index c8d34e2..a5199d5 100644 (file)
@@ -102,6 +102,7 @@ static struct option original_opts[] = {
        {.name = "numeric",       .has_arg = 0, .val = 'n'},
        {.name = "out-interface", .has_arg = 1, .val = 'o'},
        {.name = "verbose",       .has_arg = 0, .val = 'v'},
+       {.name = "wait",          .has_arg = 0, .val = 'w'},
        {.name = "exact",         .has_arg = 0, .val = 'x'},
        {.name = "version",       .has_arg = 0, .val = 'V'},
        {.name = "help",          .has_arg = 2, .val = 'h'},
@@ -143,12 +144,12 @@ static const char commands_v_options[NUMBER_OF_CMD][NUMBER_OF_OPT] =
 /*LIST*/      {' ','x','x','x','x',' ',' ','x','x',' ','x'},
 /*FLUSH*/     {'x','x','x','x','x',' ','x','x','x','x','x'},
 /*ZERO*/      {'x','x','x','x','x',' ','x','x','x','x','x'},
-/*ZERO_NUM*/  {'x','x','x','x','x',' ','x','x','x','x','x'},
 /*NEW_CHAIN*/ {'x','x','x','x','x',' ','x','x','x','x','x'},
 /*DEL_CHAIN*/ {'x','x','x','x','x',' ','x','x','x','x','x'},
 /*SET_POLICY*/{'x','x','x','x','x',' ','x','x','x','x',' '},
 /*RENAME*/    {'x','x','x','x','x',' ','x','x','x','x','x'},
 /*LIST_RULES*/{'x','x','x','x','x',' ','x','x','x','x','x'},
+/*ZERO_NUM*/  {'x','x','x','x','x',' ','x','x','x','x','x'},
 /*CHECK*/     {'x',' ',' ',' ',' ',' ','x',' ',' ','x','x'},
 };
 
@@ -257,6 +258,7 @@ exit_printhelp(const struct xtables_rule_match *matches)
 "                              network interface name ([+] for wildcard)\n"
 "  --table     -t table        table to manipulate (default: `filter')\n"
 "  --verbose   -v              verbose mode\n"
+"  --wait      -w              wait for the xtables lock\n"
 "  --line-numbers              print line numbers when listing\n"
 "  --exact     -x              expand numbers (display exact values)\n"
 /*"[!] --fragment      -f              match second or further fragments only\n"*/
@@ -385,6 +387,32 @@ parse_rulenumber(const char *rule)
        return rulenum;
 }
 
+static void
+parse_chain(const char *chainname)
+{
+       const char *ptr;
+
+       if (strlen(chainname) >= XT_EXTENSION_MAXNAMELEN)
+               xtables_error(PARAMETER_PROBLEM,
+                          "chain name `%s' too long (must be under %u chars)",
+                          chainname, XT_EXTENSION_MAXNAMELEN);
+
+       if (*chainname == '-' || *chainname == '!')
+               xtables_error(PARAMETER_PROBLEM,
+                          "chain name not allowed to start "
+                          "with `%c'\n", *chainname);
+
+       if (xtables_find_target(chainname, XTF_TRY_LOAD))
+               xtables_error(PARAMETER_PROBLEM,
+                          "chain name may not clash "
+                          "with target name\n");
+
+       for (ptr = chainname; *ptr; ptr++)
+               if (isspace(*ptr))
+                       xtables_error(PARAMETER_PROBLEM,
+                                  "Invalid chain name `%s'", chainname);
+}
+
 static const char *
 parse_target(const char *targetname)
 {
@@ -1284,7 +1312,8 @@ static void command_match(struct iptables_command_state *cs)
                                             m->extra_opts, &m->option_offset);
 }
 
-int do_command6(int argc, char *argv[], char **table, struct xtc_handle **handle)
+int do_command6(int argc, char *argv[], char **table,
+               struct xtc_handle **handle, bool restore)
 {
        struct iptables_command_state cs;
        struct ip6t_entry *e = NULL;
@@ -1293,6 +1322,7 @@ int do_command6(int argc, char *argv[], char **table, struct xtc_handle **handle
        struct in6_addr *smasks = NULL, *dmasks = NULL;
 
        int verbose = 0;
+       bool wait = false;
        const char *chain = NULL;
        const char *shostnetworkmask = NULL, *dhostnetworkmask = NULL;
        const char *policy = NULL, *newname = NULL;
@@ -1328,7 +1358,7 @@ int do_command6(int argc, char *argv[], char **table, struct xtc_handle **handle
 
        opts = xt_params->orig_opts;
        while ((cs.c = getopt_long(argc, argv,
-          "-:A:C:D:R:I:L::S::M:F::Z::N:X::E:P:Vh::o:p:s:d:j:i:bvnt:m:xc:g:46",
+          "-:A:C:D:R:I:L::S::M:F::Z::N:X::E:P:Vh::o:p:s:d:j:i:bvwnt:m:xc:g:46",
                                           opts, NULL)) != -1) {
                switch (cs.c) {
                        /*
@@ -1428,14 +1458,7 @@ int do_command6(int argc, char *argv[], char **table, struct xtc_handle **handle
                        break;
 
                case 'N':
-                       if (optarg && (*optarg == '-' || *optarg == '!'))
-                               xtables_error(PARAMETER_PROBLEM,
-                                          "chain name not allowed to start "
-                                          "with `%c'\n", *optarg);
-                       if (xtables_find_target(optarg, XTF_TRY_LOAD))
-                               xtables_error(PARAMETER_PROBLEM,
-                                          "chain name may not clash "
-                                          "with target name\n");
+                       parse_chain(optarg);
                        add_command(&command, CMD_NEW_CHAIN, CMD_NONE,
                                    cs.invert);
                        chain = optarg;
@@ -1573,6 +1596,15 @@ int do_command6(int argc, char *argv[], char **table, struct xtc_handle **handle
                        verbose++;
                        break;
 
+               case 'w':
+                       if (restore) {
+                               xtables_error(PARAMETER_PROBLEM,
+                                             "You cannot use `-w' from "
+                                             "ip6tables-restore");
+                       }
+                       wait = true;
+                       break;
+
                case 'm':
                        command_match(&cs);
                        break;
@@ -1719,10 +1751,13 @@ int do_command6(int argc, char *argv[], char **table, struct xtc_handle **handle
 
        generic_opt_check(command, cs.options);
 
-       if (chain != NULL && strlen(chain) >= XT_EXTENSION_MAXNAMELEN)
-               xtables_error(PARAMETER_PROBLEM,
-                          "chain name `%s' too long (must be under %u chars)",
-                          chain, XT_EXTENSION_MAXNAMELEN);
+       /* Attempt to acquire the xtables lock */
+       if (!restore && !xtables_lock(wait)) {
+               fprintf(stderr, "Another app is currently holding the xtables lock. "
+                       "Perhaps you want to use the -w option?\n");
+               xtables_free_opts(1);
+               exit(RESOURCE_PROBLEM);
+       }
 
        /* only allocate handle if we weren't called with a handle */
        if (!*handle)
similarity index 95%
rename from iptables/iptables-apply.8
rename to iptables/iptables-apply.8.in
index 66eaf57..cdc9c44 100644 (file)
@@ -2,7 +2,7 @@
 .\"    Author: Martin F. Krafft
 .\"      Date: Jun 04, 2006
 .\"
-.TH iptables\-apply 8 2006-06-04
+.TH IPTABLES\-APPLY 8 "" "@PACKAGE_STRING@" "@PACKAGE_STRING@"
 .\" disable hyphenation
 .nh
 .SH NAME
similarity index 94%
rename from iptables/iptables-extensions.8.in
rename to iptables/iptables-extensions.8.tmpl.in
index 9ec3fb0..99d89a1 100644 (file)
@@ -1,4 +1,4 @@
-.TH iptables-extensions 8 "" "@PACKAGE_AND_VERSION@" "@PACKAGE_AND_VERSION@"
+.TH iptables-extensions 8 "" "@PACKAGE_STRING@" "@PACKAGE_STRING@"
 .SH NAME
 iptables-extensions \(em list of extensions in the standard iptables distribution
 .SH SYNOPSIS
similarity index 78%
rename from iptables/iptables-restore.8
rename to iptables/iptables-restore.8.in
index 2b1d102..feb57ef 100644 (file)
@@ -1,4 +1,4 @@
-.TH IPTABLES-RESTORE 8 "Jan 04, 2001" "" ""
+.TH IPTABLES-RESTORE 8 "" "@PACKAGE_STRING@" "@PACKAGE_STRING@"
 .\"
 .\" Man page written by Harald Welte <laforge@gnumonks.org>
 .\" It is based on the iptables man page.
 .\"
 .SH NAME
 iptables-restore \(em Restore IP Tables
+.P
+ip6tables-restore \(em Restore IPv6 Tables
 .SH SYNOPSIS
 \fBiptables\-restore\fP [\fB\-chntv\fP] [\fB\-M\fP \fImodprobe\fP]
+.P
+\fBip6tables\-restore\fP [\fB\-chntv\fP] [\fB\-M\fP \fImodprobe\fP]
 [\fB\-T\fP \fIname\fP]
 .SH DESCRIPTION
 .PP
 .B iptables-restore
-is used to restore IP Tables from data specified on STDIN. Use 
+and
+.B ip6tables-restore
+are used to restore IP and IPv6 Tables from data specified on STDIN. Use
 I/O redirection provided by your shell to read from a file
 .TP
 \fB\-c\fR, \fB\-\-counters\fR
@@ -35,10 +41,9 @@ restore the values of all packet and byte counters
 \fB\-h\fP, \fB\-\-help\fP
 Print a short option summary.
 .TP
-\fB\-n\fR, \fB\-\-noflush\fR 
-don't flush the previous contents of the table. If not specified, 
-.B iptables-restore
-flushes (deletes) all previous contents of the respective table.
+\fB\-n\fR, \fB\-\-noflush\fR
+don't flush the previous contents of the table. If not specified,
+both commands flush (delete) all previous contents of the respective table.
 .TP
 \fB\-t\fP, \fB\-\-test\fP
 Only parse and construct the ruleset, but do not commit it.
@@ -54,8 +59,11 @@ inspect /proc/sys/kernel/modprobe to determine the executable's path.
 Restore only the named table even if the input stream contains other ones.
 .SH BUGS
 None known as of iptables-1.2.1 release
-.SH AUTHOR
-Harald Welte <laforge@gnumonks.org>
+.SH AUTHORS
+Harald Welte <laforge@gnumonks.org> wrote iptables-restore based on code
+from Rusty Russell.
+.br
+Andras Kis-Szabo <kisza@sch.bme.hu> contributed ip6tables-restore.
 .SH SEE ALSO
 \fBiptables\-save\fP(8), \fBiptables\fP(8)
 .PP
index 0822513..8c942ff 100644 (file)
@@ -438,7 +438,7 @@ iptables_restore_main(int argc, char *argv[])
                                DEBUGP("argv[%u]: %s\n", a, newargv[a]);
 
                        ret = do_command4(newargc, newargv,
-                                        &newargv[2], &handle);
+                                        &newargv[2], &handle, true);
 
                        free_argv();
                        fflush(stdout);
similarity index 81%
rename from iptables/iptables-save.8
rename to iptables/iptables-save.8.in
index c2e0a94..5e939b1 100644 (file)
@@ -1,4 +1,4 @@
-.TH IPTABLES-SAVE 8 "Jan 04, 2001" "" ""
+.TH IPTABLES-SAVE 8 "" "@PACKAGE_STRING@" "@PACKAGE_STRING@"
 .\"
 .\" Man page written by Harald Welte <laforge@gnumonks.org>
 .\" It is based on the iptables man page.
 .\"
 .SH NAME
 iptables-save \(em dump iptables rules to stdout
+.P
+ip6tables-save \(em dump iptables rules to stdout
 .SH SYNOPSIS
 \fBiptables\-save\fP [\fB\-M\fP \fImodprobe\fP] [\fB\-c\fP]
 [\fB\-t\fP \fItable\fP]
+.P
+\fBip6tables\-save\fP [\fB\-M\fP \fImodprobe\fP] [\fB\-c\fP]
+[\fB\-t\fP \fItable\fP
 .SH DESCRIPTION
 .PP
 .B iptables-save
-is used to dump the contents of an IP Table in easily parseable format
+and
+.B ip6tables-save
+are used to dump the contents of IP or IPv6 Table in easily parseable format
 to STDOUT. Use I/O-redirection provided by your shell to write to a file.
 .TP
 \fB\-M\fP \fImodprobe_program\fP
@@ -41,8 +48,12 @@ restrict output to only one table. If not specified, output includes all
 available tables.
 .SH BUGS
 None known as of iptables-1.2.1 release
-.SH AUTHOR
+.SH AUTHORS
 Harald Welte <laforge@gnumonks.org>
+.br
+Rusty Russell <rusty@rustcorp.com.au>
+.br
+Andras Kis-Szabo <kisza@sch.bme.hu> contributed ip6tables-save.
 .SH SEE ALSO
 \fBiptables\-restore\fP(8), \fBiptables\fP(8)
 .PP
index 683a44a..4da1d7f 100644 (file)
@@ -58,7 +58,7 @@ iptables_main(int argc, char *argv[])
        init_extensions4();
 #endif
 
-       ret = do_command4(argc, argv, &table, &handle);
+       ret = do_command4(argc, argv, &table, &handle, false);
        if (ret) {
                ret = iptc_commit(handle);
                iptc_free(handle);
similarity index 97%
rename from iptables/iptables-xml.1
rename to iptables/iptables-xml.1.in
index 048c2cb..7b7878f 100644 (file)
@@ -1,4 +1,4 @@
-.TH IPTABLES-XML 8 "Jul 16, 2007" "" ""
+.TH IPTABLES-XML 1 "" "@PACKAGE_STRING@" "@PACKAGE_STRING@"
 .\"
 .\" Man page written by Sam Liddicott <azez@ufomechanic.net>
 .\" It is based on the iptables-save man page.
index 4b12bd4..9628447 100644 (file)
@@ -367,7 +367,8 @@ static void
 do_rule_part(char *leveltag1, char *leveltag2, int part, int argc,
             char *argv[], int argvattr[])
 {
-       int arg = 1;            // ignore leading -A
+       int i;
+       int arg = 2;            // ignore leading -A <chain>
        char invert_next = 0;
        char *spacer = "";      // space when needed to assemble arguments
        char *level1 = NULL;
@@ -399,11 +400,17 @@ do_rule_part(char *leveltag1, char *leveltag2, int part, int argc,
                        arg++;
        }
 
-       /* Before we start, if the first arg is -[^-] and not -m or -j or -g 
-          then start a dummy <match> tag for old style built-in matches.  
-          We would do this in any case, but no need if it would be empty */
-       if (arg < argc && argv[arg][0] == '-' && !isTarget(argv[arg])
-           && strcmp(argv[arg], "-m") != 0) {
+       /* Before we start, if the first arg is -[^-] and not -m or -j or -g
+        * then start a dummy <match> tag for old style built-in matches.
+        * We would do this in any case, but no need if it would be empty.
+        * In the case of negation, we need to look at arg+1
+        */
+       if (arg < argc && strcmp(argv[arg], "!") == 0)
+               i = arg + 1;
+       else
+               i = arg;
+       if (i < argc && argv[i][0] == '-' && !isTarget(argv[i])
+           && strcmp(argv[i], "-m") != 0) {
                OPEN_LEVEL(1, "match");
                printf(">\n");
        }
@@ -733,6 +740,7 @@ iptables_xml_main(int argc, char *argv[])
                        /* the parser */
                        char *param_start, *curchar;
                        int quote_open, quoted;
+                       char param_buffer[1024];
 
                        /* reset the newargv */
                        newargc = 0;
@@ -792,7 +800,6 @@ iptables_xml_main(int argc, char *argv[])
                                }
                                if (*curchar == ' '
                                    || *curchar == '\t' || *curchar == '\n') {
-                                       char param_buffer[1024];
                                        int param_len = curchar - param_start;
 
                                        if (quote_open)
index 9643705..155c97e 100644 (file)
@@ -1,4 +1,4 @@
-.TH IPTABLES 8 "" "@PACKAGE_AND_VERSION@" "@PACKAGE_AND_VERSION@"
+.TH IPTABLES 8 "" "@PACKAGE_STRING@" "@PACKAGE_STRING@"
 .\"
 .\" Man page written by Herve Eychenne <rv@wallfire.org> (May 1999)
 .\" It is based on ipchains page.
 .\"
 .\"
 .SH NAME
-iptables \(em administration tool for IPv4 packet filtering and NAT
+iptables/ip6tables \(em administration tool for IPv4/IPv6 packet filtering and NAT
 .SH SYNOPSIS
 \fBiptables\fP [\fB\-t\fP \fItable\fP] {\fB\-A\fP|\fB\-C\fP|\fB\-D\fP}
 \fIchain\fP \fIrule-specification\fP
+.P
+\fBip6tables\fP [\fB\-t\fP \fItable\fP] {\fB\-A\fP|\fB\-C\fP|\fB\-D\fP}
+\fIchain rule-specification\fP
 .PP
 \fBiptables\fP [\fB\-t\fP \fItable\fP] \fB\-I\fP \fIchain\fP [\fIrulenum\fP] \fIrule-specification\fP
 .PP
@@ -52,8 +55,8 @@ match = \fB\-m\fP \fImatchname\fP [\fIper-match-options\fP]
 .PP
 target = \fB\-j\fP \fItargetname\fP [\fIper\-target\-options\fP]
 .SH DESCRIPTION
-\fBIptables\fP is used to set up, maintain, and inspect the
-tables of IPv4 packet
+\fBIptables\fP and \fBip6tables\fP are used to set up, maintain, and inspect the
+tables of IPv4 and IPv6 packet
 filter rules in the Linux kernel.  Several different tables
 may be defined.  Each table contains a number of built-in
 chains and may also contain user-defined chains.
@@ -64,21 +67,14 @@ a `target', which may be a jump to a user-defined chain in the same
 table.
 .SH TARGETS
 A firewall rule specifies criteria for a packet and a target.  If the
-packet does not match, the next rule in the chain is the examined; if
+packet does not match, the next rule in the chain is examined; if
 it does match, then the next rule is specified by the value of the
-target, which can be the name of a user-defined chain or one of the
-special values \fBACCEPT\fP, \fBDROP\fP, \fBQUEUE\fP or \fBRETURN\fP.
+target, which can be the name of a user-defined chain, one of the targets
+described in \fBiptables\-extensions\fP(8), or one of the
+special values \fBACCEPT\fP, \fBDROP\fP or \fBRETURN\fP.
 .PP
 \fBACCEPT\fP means to let the packet through.
 \fBDROP\fP means to drop the packet on the floor.
-\fBQUEUE\fP means to pass the packet to userspace.
-(How the packet can be received
-by a userspace process differs by the particular queue handler.  2.4.x
-and 2.6.x kernels up to 2.6.13 include the \fBip_queue\fP
-queue handler.  Kernels 2.6.14 and later additionally include the
-\fBnfnetlink_queue\fP queue handler.  Packets with a target of QUEUE will be
-sent to queue number '0' in this case. Please also see the \fBNFQUEUE\fP
-target as described later in this man page.)
 \fBRETURN\fP means stop traversing this chain and resume at the next
 rule in the
 previous (calling) chain.  If the end of a built-in chain is reached
@@ -111,6 +107,7 @@ connection is encountered.  It consists of three built-ins: \fBPREROUTING\fP
 (for altering packets as soon as they come in), \fBOUTPUT\fP
 (for altering locally-generated packets before routing), and \fBPOSTROUTING\fP
 (for altering packets as they are about to go out).
+IPv6 NAT support is available since kernel 3.7.
 .TP
 \fBmangle\fP:
 This table is used for specialized packet alteration.  Until kernel
@@ -143,7 +140,7 @@ before MAC rules.  This table provides the following built-in chains:
 .RE
 .SH OPTIONS
 The options that are recognized by
-\fBiptables\fP can be divided into several different groups.
+\fBiptables\fP and \fBip6tables\fP can be divided into several different groups.
 .SS COMMANDS
 These options specify the desired action to perform. Only one of them
 can be specified on the command line unless otherwise stated
@@ -245,23 +242,35 @@ add, delete, insert, replace and append commands).
 .TP
 \fB\-4\fP, \fB\-\-ipv4\fP
 This option has no effect in iptables and iptables-restore.
+If a rule using the \fB\-4\fP option is inserted with (and only with)
+ip6tables-restore, it will be silently ignored. Any other uses will throw an
+error. This option allows to put both IPv4 and IPv6 rules in a single rule file
+for use with both iptables-restore and ip6tables-restore.
 .TP
 \fB\-6\fP, \fB\-\-ipv6\fP
 If a rule using the \fB\-6\fP option is inserted with (and only with)
 iptables-restore, it will be silently ignored. Any other uses will throw an
 error. This option allows to put both IPv4 and IPv6 rules in a single rule file
 for use with both iptables-restore and ip6tables-restore.
+This option has no effect in ip6tables and ip6tables-restore.
 .TP
 [\fB!\fP] \fB\-p\fP, \fB\-\-protocol\fP \fIprotocol\fP
 The protocol of the rule or of the packet to check.
 The specified protocol can be one of \fBtcp\fP, \fBudp\fP, \fBudplite\fP,
-\fBicmp\fP, \fBesp\fP, \fBah\fP, \fBsctp\fP or the special keyword "\fBall\fP",
+\fBicmp\fP, \fBicmpv6\fP,\fBesp\fP, \fBah\fP, \fBsctp\fP, \fBmh\fP or the special keyword "\fBall\fP",
 or it can be a numeric value, representing one of these protocols or a
 different one.  A protocol name from /etc/protocols is also allowed.
 A "!" argument before the protocol inverts the
 test.  The number zero is equivalent to \fBall\fP. "\fBall\fP"
 will match with all protocols and is taken as default when this
 option is omitted.
+Note that, in ip6tables, IPv6 extension headers except \fBesp\fP are not allowed.
+\fBesp\fP and \fBipv6\-nonext\fP
+can be used with Kernel version 2.6.11 or later.
+The number zero is equivalent to \fBall\fP, which means that you cannot
+test the protocol field for the value 0 directly. To match on a HBH header,
+even if it were the last, you cannot use \fB\-p 0\fP, but always need
+\fB\-m hbh\fP.
 .TP
 [\fB!\fP] \fB\-s\fP, \fB\-\-source\fP \fIaddress\fP[\fB/\fP\fImask\fP][\fB,\fP\fI...\fP]
 Source specification. \fIAddress\fP
@@ -271,9 +280,9 @@ be resolved once only, before the rule is submitted to the kernel.
 Please note that specifying any name to be resolved with a remote query such as
 DNS is a really bad idea.
 The \fImask\fP
-can be either a network mask or a plain number,
+can be either an ipv4 network mask (for iptables) or a plain number,
 specifying the number of 1's at the left side of the network mask.
-Thus, a mask of \fI24\fP is equivalent to \fI255.255.255.0\fP.
+Thus, an iptables mask of \fI24\fP is equivalent to \fI255.255.255.0\fP.
 A "!" argument before the address specification inverts the sense of
 the address. The flag \fB\-\-src\fP is an alias for this option.
 Multiple addresses can be specified, but this will \fBexpand to multiple
@@ -327,12 +336,13 @@ interface which begins with this name will match.  If this option is
 omitted, any interface name will match.
 .TP
 [\fB!\fP] \fB\-f\fP, \fB\-\-fragment\fP
-This means that the rule only refers to second and further fragments
+This means that the rule only refers to second and further IPv4 fragments
 of fragmented packets.  Since there is no way to tell the source or
 destination ports of such a packet (or ICMP type), such a packet will
 not match any rules which specify them.  When the "!" argument
 precedes the "\-f" flag, the rule will only match head fragments, or
-unfragmented packets.
+unfragmented packets. This option is IPv4 specific, it is not available
+in ip6tables.
 .TP
 \fB\-c\fP, \fB\-\-set\-counters\fP \fIpackets bytes\fP
 This enables the administrator to initialize the packet and byte
@@ -351,6 +361,13 @@ For appending, insertion, deletion and replacement, this causes
 detailed information on the rule or rules to be printed. \fB\-v\fP may be
 specified multiple times to possibly emit more detailed debug statements.
 .TP
+\fB\-w\fP, \fB\-\-wait\fP
+Wait for the xtables lock.
+To prevent multiple instances of the program from running concurrently,
+an attempt will be made to obtain an exclusive lock at launch.  By default,
+the program will exit if the lock cannot be obtained.  This option will
+make the program wait until the exclusive lock can be obtained.
+.TP
 \fB\-n\fP, \fB\-\-numeric\fP
 Numeric output.
 IP addresses and port numbers will be printed in numeric format.
@@ -413,10 +430,6 @@ There are several other changes in iptables.
 \fBiptables\-save\fP(8),
 \fBiptables\-restore\fP(8),
 \fBiptables\-extensions\fP(8),
-\fBip6tables\fP(8),
-\fBip6tables\-save\fP(8),
-\fBip6tables\-restore\fP(8),
-\fBlibipq\fP(3).
 .PP
 The packet-filtering-HOWTO details iptables usage for
 packet filtering, the NAT-HOWTO details NAT,
@@ -451,4 +464,4 @@ Man page originally written by Herve Eychenne <rv@wallfire.org>.
 .\" .. and most of all, modest ..
 .SH VERSION
 .PP
-This manual page applies to iptables @PACKAGE_VERSION@.
+This manual page applies to iptables/ip6tables @PACKAGE_AND_VERSION@.
index 79fa37b..5cd2596 100644 (file)
@@ -99,6 +99,7 @@ static struct option original_opts[] = {
        {.name = "numeric",       .has_arg = 0, .val = 'n'},
        {.name = "out-interface", .has_arg = 1, .val = 'o'},
        {.name = "verbose",       .has_arg = 0, .val = 'v'},
+       {.name = "wait",          .has_arg = 0, .val = 'w'},
        {.name = "exact",         .has_arg = 0, .val = 'x'},
        {.name = "fragments",     .has_arg = 0, .val = 'f'},
        {.name = "version",       .has_arg = 0, .val = 'V'},
@@ -142,12 +143,12 @@ static const char commands_v_options[NUMBER_OF_CMD][NUMBER_OF_OPT] =
 /*LIST*/      {' ','x','x','x','x',' ',' ','x','x',' ','x','x'},
 /*FLUSH*/     {'x','x','x','x','x',' ','x','x','x','x','x','x'},
 /*ZERO*/      {'x','x','x','x','x',' ','x','x','x','x','x','x'},
-/*ZERO_NUM*/  {'x','x','x','x','x',' ','x','x','x','x','x','x'},
 /*NEW_CHAIN*/ {'x','x','x','x','x',' ','x','x','x','x','x','x'},
 /*DEL_CHAIN*/ {'x','x','x','x','x',' ','x','x','x','x','x','x'},
 /*SET_POLICY*/{'x','x','x','x','x',' ','x','x','x','x',' ','x'},
 /*RENAME*/    {'x','x','x','x','x',' ','x','x','x','x','x','x'},
 /*LIST_RULES*/{'x','x','x','x','x',' ','x','x','x','x','x','x'},
+/*ZERO_NUM*/  {'x','x','x','x','x',' ','x','x','x','x','x','x'},
 /*CHECK*/     {'x',' ',' ',' ',' ',' ','x',' ',' ','x','x',' '},
 };
 
@@ -251,6 +252,7 @@ exit_printhelp(const struct xtables_rule_match *matches)
 "                              network interface name ([+] for wildcard)\n"
 "  --table     -t table        table to manipulate (default: `filter')\n"
 "  --verbose   -v              verbose mode\n"
+"  --wait      -w              wait for the xtables lock\n"
 "  --line-numbers              print line numbers when listing\n"
 "  --exact     -x              expand numbers (display exact values)\n"
 "[!] --fragment        -f              match second or further fragments only\n"
@@ -371,6 +373,32 @@ parse_rulenumber(const char *rule)
        return rulenum;
 }
 
+static void
+parse_chain(const char *chainname)
+{
+       const char *ptr;
+
+       if (strlen(chainname) >= XT_EXTENSION_MAXNAMELEN)
+               xtables_error(PARAMETER_PROBLEM,
+                          "chain name `%s' too long (must be under %u chars)",
+                          chainname, XT_EXTENSION_MAXNAMELEN);
+
+       if (*chainname == '-' || *chainname == '!')
+               xtables_error(PARAMETER_PROBLEM,
+                          "chain name not allowed to start "
+                          "with `%c'\n", *chainname);
+
+       if (xtables_find_target(chainname, XTF_TRY_LOAD))
+               xtables_error(PARAMETER_PROBLEM,
+                          "chain name may not clash "
+                          "with target name\n");
+
+       for (ptr = chainname; *ptr; ptr++)
+               if (isspace(*ptr))
+                       xtables_error(PARAMETER_PROBLEM,
+                                  "Invalid chain name `%s'", chainname);
+}
+
 static const char *
 parse_target(const char *targetname)
 {
@@ -1280,7 +1308,8 @@ static void command_match(struct iptables_command_state *cs)
                xtables_error(OTHER_PROBLEM, "can't alloc memory!");
 }
 
-int do_command4(int argc, char *argv[], char **table, struct xtc_handle **handle)
+int do_command4(int argc, char *argv[], char **table,
+               struct xtc_handle **handle, bool restore)
 {
        struct iptables_command_state cs;
        struct ipt_entry *e = NULL;
@@ -1289,6 +1318,7 @@ int do_command4(int argc, char *argv[], char **table, struct xtc_handle **handle
        struct in_addr *daddrs = NULL, *dmasks = NULL;
 
        int verbose = 0;
+       bool wait = false;
        const char *chain = NULL;
        const char *shostnetworkmask = NULL, *dhostnetworkmask = NULL;
        const char *policy = NULL, *newname = NULL;
@@ -1324,7 +1354,7 @@ int do_command4(int argc, char *argv[], char **table, struct xtc_handle **handle
 
        opts = xt_params->orig_opts;
        while ((cs.c = getopt_long(argc, argv,
-          "-:A:C:D:R:I:L::S::M:F::Z::N:X::E:P:Vh::o:p:s:d:j:i:fbvnt:m:xc:g:46",
+          "-:A:C:D:R:I:L::S::M:F::Z::N:X::E:P:Vh::o:p:s:d:j:i:fbvwnt:m:xc:g:46",
                                           opts, NULL)) != -1) {
                switch (cs.c) {
                        /*
@@ -1424,14 +1454,7 @@ int do_command4(int argc, char *argv[], char **table, struct xtc_handle **handle
                        break;
 
                case 'N':
-                       if (optarg && (*optarg == '-' || *optarg == '!'))
-                               xtables_error(PARAMETER_PROBLEM,
-                                          "chain name not allowed to start "
-                                          "with `%c'\n", *optarg);
-                       if (xtables_find_target(optarg, XTF_TRY_LOAD))
-                               xtables_error(PARAMETER_PROBLEM,
-                                          "chain name may not clash "
-                                          "with target name\n");
+                       parse_chain(optarg);
                        add_command(&command, CMD_NEW_CHAIN, CMD_NONE,
                                    cs.invert);
                        chain = optarg;
@@ -1567,6 +1590,15 @@ int do_command4(int argc, char *argv[], char **table, struct xtc_handle **handle
                        verbose++;
                        break;
 
+               case 'w':
+                       if (restore) {
+                               xtables_error(PARAMETER_PROBLEM,
+                                             "You cannot use `-w' from "
+                                             "iptables-restore");
+                       }
+                       wait = true;
+                       break;
+
                case 'm':
                        command_match(&cs);
                        break;
@@ -1716,10 +1748,13 @@ int do_command4(int argc, char *argv[], char **table, struct xtc_handle **handle
 
        generic_opt_check(command, cs.options);
 
-       if (chain != NULL && strlen(chain) >= XT_EXTENSION_MAXNAMELEN)
-               xtables_error(PARAMETER_PROBLEM,
-                          "chain name `%s' too long (must be under %u chars)",
-                          chain, XT_EXTENSION_MAXNAMELEN);
+       /* Attempt to acquire the xtables lock */
+       if (!restore && !xtables_lock(wait)) {
+               fprintf(stderr, "Another app is currently holding the xtables lock. "
+                       "Perhaps you want to use the -w option?\n");
+               xtables_free_opts(1);
+               exit(RESOURCE_PROBLEM);
+       }
 
        /* only allocate handle if we weren't called with a handle */
        if (!*handle)
index e61c28c..6c9992e 100644 (file)
@@ -6,9 +6,15 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <unistd.h>
 #include <xtables.h>
 #include "xshared.h"
 
+#define XT_SOCKET_NAME "xtables"
+#define XT_SOCKET_LEN 8
+
 /*
  * Print out any special helps. A user might like to be able to add a --help
  * to the commandline, and see expected results. So we call help for all
@@ -236,3 +242,30 @@ void xs_init_match(struct xtables_match *match)
        if (match->init != NULL)
                match->init(match->m);
 }
+
+bool xtables_lock(bool wait)
+{
+       int i = 0, ret, xt_socket;
+       struct sockaddr_un xt_addr;
+
+       memset(&xt_addr, 0, sizeof(xt_addr));
+       xt_addr.sun_family = AF_UNIX;
+       strcpy(xt_addr.sun_path+1, XT_SOCKET_NAME);
+       xt_socket = socket(AF_UNIX, SOCK_STREAM, 0);
+       /* If we can't even create a socket, fall back to prior (lockless) behavior */
+       if (xt_socket < 0)
+               return true;
+
+       while (1) {
+               ret = bind(xt_socket, (struct sockaddr*)&xt_addr,
+                          offsetof(struct sockaddr_un, sun_path)+XT_SOCKET_LEN);
+               if (ret == 0)
+                       return true;
+               else if (wait == false)
+                       return false;
+               if (++i % 2 == 0)
+                       fprintf(stderr, "Another app is currently holding the xtables lock; "
+                               "waiting for it to exit...\n");
+               sleep(1);
+       }
+}
index b804aaf..1e2b9b8 100644 (file)
@@ -2,6 +2,7 @@
 #define IPTABLES_XSHARED_H 1
 
 #include <limits.h>
+#include <stdbool.h>
 #include <stdint.h>
 #include <netinet/in.h>
 #include <net/if.h>
@@ -83,6 +84,7 @@ extern struct xtables_match *load_proto(struct iptables_command_state *);
 extern int subcmd_main(int, char **, const struct subcommand *);
 extern void xs_init_target(struct xtables_target *);
 extern void xs_init_match(struct xtables_match *);
+extern bool xtables_lock(bool wait);
 
 extern const struct xtables_afinfo *afinfo;
 
index 935f071..1438416 100644 (file)
@@ -232,6 +232,8 @@ ksourcedir = @ksourcedir@
 libdir = @libdir@
 libexecdir = @libexecdir@
 libiptc_LDFLAGS2 = @libiptc_LDFLAGS2@
+libnetfilter_conntrack_CFLAGS = @libnetfilter_conntrack_CFLAGS@
+libnetfilter_conntrack_LIBS = @libnetfilter_conntrack_LIBS@
 libnfnetlink_CFLAGS = @libnfnetlink_CFLAGS@
 libnfnetlink_LIBS = @libnfnetlink_LIBS@
 libxtables_vage = @libxtables_vage@
index d1ffd44..219d574 100644 (file)
@@ -246,6 +246,8 @@ ksourcedir = @ksourcedir@
 libdir = @libdir@
 libexecdir = @libexecdir@
 libiptc_LDFLAGS2 = @libiptc_LDFLAGS2@
+libnetfilter_conntrack_CFLAGS = @libnetfilter_conntrack_CFLAGS@
+libnetfilter_conntrack_LIBS = @libnetfilter_conntrack_LIBS@
 libnfnetlink_CFLAGS = @libnfnetlink_CFLAGS@
 libnfnetlink_LIBS = @libnfnetlink_LIBS@
 libxtables_vage = @libxtables_vage@
index 59525ca..533e071 100644 (file)
@@ -235,6 +235,8 @@ ksourcedir = @ksourcedir@
 libdir = @libdir@
 libexecdir = @libexecdir@
 libiptc_LDFLAGS2 = @libiptc_LDFLAGS2@
+libnetfilter_conntrack_CFLAGS = @libnetfilter_conntrack_CFLAGS@
+libnetfilter_conntrack_LIBS = @libnetfilter_conntrack_LIBS@
 libnfnetlink_CFLAGS = @libnfnetlink_CFLAGS@
 libnfnetlink_LIBS = @libnfnetlink_LIBS@
 libxtables_vage = @libxtables_vage@
index 009ab91..fb60c01 100644 (file)
@@ -305,8 +305,8 @@ static char *get_modprobe(void)
 {
        int procfile;
        char *ret;
+       int count;
 
-#define PROCFILE_BUFSIZ        1024
        procfile = open(PROC_SYS_MODPROBE, O_RDONLY);
        if (procfile < 0)
                return NULL;
@@ -316,19 +316,19 @@ static char *get_modprobe(void)
                exit(1);
        }
 
-       ret = malloc(PROCFILE_BUFSIZ);
+       ret = malloc(PATH_MAX);
        if (ret) {
-               memset(ret, 0, PROCFILE_BUFSIZ);
-               switch (read(procfile, ret, PROCFILE_BUFSIZ)) {
-               case -1: goto fail;
-               case PROCFILE_BUFSIZ: goto fail; /* Partial read.  Wierd */
+               count = read(procfile, ret, PATH_MAX);
+               if (count > 0 && count < PATH_MAX)
+               {
+                       if (ret[count - 1] == '\n')
+                               ret[count - 1] = '\0';
+                       else
+                               ret[count] = '\0';
+                       close(procfile);
+                       return ret;
                }
-               if (ret[strlen(ret)-1]=='\n') 
-                       ret[strlen(ret)-1]=0;
-               close(procfile);
-               return ret;
        }
- fail:
        free(ret);
        close(procfile);
        return NULL;
@@ -578,8 +578,6 @@ static void *load_extension(const char *search_path, const char *af_prefix,
                        if (ptr != NULL)
                                return ptr;
 
-                       fprintf(stderr, "%s: no \"%s\" extension found for "
-                               "this protocol\n", path, name);
                        errno = ENOENT;
                        return NULL;
                }
@@ -1243,7 +1241,7 @@ const char *xtables_ipmask_to_numeric(const struct in_addr *mask)
        uint32_t cidr;
 
        cidr = xtables_ipmask_to_cidr(mask);
-       if (cidr < 0) {
+       if (cidr == (unsigned int)-1) {
                /* mask was not a decent combination of 1's and 0's */
                sprintf(buf, "/%s", xtables_ipaddr_to_numeric(mask));
                return buf;
@@ -1597,7 +1595,11 @@ const char *xtables_ip6mask_to_numeric(const struct in6_addr *addrp)
                strcat(buf, xtables_ip6addr_to_numeric(addrp));
                return buf;
        }
-       sprintf(buf, "/%d", l);
+       /* we don't want to see "/128" */
+       if (l == 128)
+               return "";
+       else
+               sprintf(buf, "/%d", l);
        return buf;
 }
 
index c26aa64..c4192a9 100644 (file)
@@ -18,3 +18,8 @@ if ENABLE_BPFC
 sbin_PROGRAMS += nfbpf_compile
 nfbpf_compile_LDADD = -lpcap
 endif
+
+if ENABLE_SYNCONF
+sbin_PROGRAMS += nfsynproxy
+nfsynproxy_LDADD = -lpcap
+endif
index 0cd9a49..285d863 100644 (file)
@@ -53,10 +53,11 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-sbin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2)
+sbin_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) $(am__EXEEXT_3)
 @HAVE_LIBNFNETLINK_TRUE@am__append_1 = nfnl_osf
 @HAVE_LIBNFNETLINK_TRUE@am__append_2 = pf.os
 @ENABLE_BPFC_TRUE@am__append_3 = nfbpf_compile
+@ENABLE_SYNCONF_TRUE@am__append_4 = nfsynproxy
 subdir = utils
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -72,6 +73,7 @@ CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
 @HAVE_LIBNFNETLINK_TRUE@am__EXEEXT_1 = nfnl_osf$(EXEEXT)
 @ENABLE_BPFC_TRUE@am__EXEEXT_2 = nfbpf_compile$(EXEEXT)
+@ENABLE_SYNCONF_TRUE@am__EXEEXT_3 = nfsynproxy$(EXEEXT)
 am__installdirs = "$(DESTDIR)$(sbindir)" "$(DESTDIR)$(pkgdatadir)"
 PROGRAMS = $(sbin_PROGRAMS)
 nfbpf_compile_SOURCES = nfbpf_compile.c
@@ -81,6 +83,9 @@ nfnl_osf_SOURCES = nfnl_osf.c
 nfnl_osf_OBJECTS = nfnl_osf.$(OBJEXT)
 am__DEPENDENCIES_1 =
 @HAVE_LIBNFNETLINK_TRUE@nfnl_osf_DEPENDENCIES = $(am__DEPENDENCIES_1)
+nfsynproxy_SOURCES = nfsynproxy.c
+nfsynproxy_OBJECTS = nfsynproxy.$(OBJEXT)
+nfsynproxy_DEPENDENCIES =
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
 am__depfiles_maybe = depfiles
@@ -94,8 +99,8 @@ CCLD = $(CC)
 LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
        --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
        $(LDFLAGS) -o $@
-SOURCES = nfbpf_compile.c nfnl_osf.c
-DIST_SOURCES = nfbpf_compile.c nfnl_osf.c
+SOURCES = nfbpf_compile.c nfnl_osf.c nfsynproxy.c
+DIST_SOURCES = nfbpf_compile.c nfnl_osf.c nfsynproxy.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -237,6 +242,8 @@ ksourcedir = @ksourcedir@
 libdir = @libdir@
 libexecdir = @libexecdir@
 libiptc_LDFLAGS2 = @libiptc_LDFLAGS2@
+libnetfilter_conntrack_CFLAGS = @libnetfilter_conntrack_CFLAGS@
+libnetfilter_conntrack_LIBS = @libnetfilter_conntrack_LIBS@
 libnfnetlink_CFLAGS = @libnfnetlink_CFLAGS@
 libnfnetlink_LIBS = @libnfnetlink_LIBS@
 libxtables_vage = @libxtables_vage@
@@ -271,6 +278,7 @@ AM_CPPFLAGS = ${regular_CPPFLAGS} -I${top_builddir}/include \
 pkgdata_DATA = $(am__append_2)
 @HAVE_LIBNFNETLINK_TRUE@nfnl_osf_LDADD = ${libnfnetlink_LIBS}
 @ENABLE_BPFC_TRUE@nfbpf_compile_LDADD = -lpcap
+@ENABLE_SYNCONF_TRUE@nfsynproxy_LDADD = -lpcap
 all: all-am
 
 .SUFFIXES:
@@ -357,6 +365,9 @@ nfbpf_compile$(EXEEXT): $(nfbpf_compile_OBJECTS) $(nfbpf_compile_DEPENDENCIES) $
 nfnl_osf$(EXEEXT): $(nfnl_osf_OBJECTS) $(nfnl_osf_DEPENDENCIES) $(EXTRA_nfnl_osf_DEPENDENCIES) 
        @rm -f nfnl_osf$(EXEEXT)
        $(LINK) $(nfnl_osf_OBJECTS) $(nfnl_osf_LDADD) $(LIBS)
+nfsynproxy$(EXEEXT): $(nfsynproxy_OBJECTS) $(nfsynproxy_DEPENDENCIES) $(EXTRA_nfsynproxy_DEPENDENCIES) 
+       @rm -f nfsynproxy$(EXEEXT)
+       $(LINK) $(nfsynproxy_OBJECTS) $(nfsynproxy_LDADD) $(LIBS)
 
 mostlyclean-compile:
        -rm -f *.$(OBJEXT)
@@ -366,6 +377,7 @@ distclean-compile:
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nfbpf_compile.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nfnl_osf.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nfsynproxy.Po@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
diff --git a/utils/nfsynproxy.c b/utils/nfsynproxy.c
new file mode 100644 (file)
index 0000000..baedc92
--- /dev/null
@@ -0,0 +1,228 @@
+/*
+ * Copyright (c) 2013 Patrick McHardy <kaber@trash.net>
+ *
+ * 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 <stdlib.h>
+#include <stdbool.h>
+#include <unistd.h>
+#include <string.h>
+#include <errno.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <pcap/pcap.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+
+static const char *iface = "lo";
+static uint16_t port;
+static const char *chain = "SYNPROXY";
+
+static int parse_packet(const char *host, const uint8_t *data)
+{
+       const struct iphdr *iph = (void *)data + 14;
+       const struct tcphdr *th = (void *)iph + iph->ihl * 4;
+       int length;
+       uint8_t *ptr;
+
+       if (!th->syn || !th->ack)
+               return 0;
+
+       printf("-A %s -d %s -p tcp --dport %u "
+              "-m state --state UNTRACKED,INVALID "
+              "-j SYNPROXY ", chain, host, port);
+
+       /* ECE && !CWR */
+       if (th->res2 == 0x1)
+               printf("--ecn ");
+
+       length = th->doff * 4 - sizeof(*th);
+       ptr = (uint8_t *)(th + 1);
+       while (length > 0) {
+               int opcode = *ptr++;
+               int opsize;
+
+               switch (opcode) {
+               case TCPOPT_EOL:
+                       return 1;
+               case TCPOPT_NOP:
+                       length--;
+                       continue;
+               default:
+                       opsize = *ptr++;
+                       if (opsize < 2)
+                               return 1;
+                       if (opsize > length)
+                               return 1;
+
+                       switch (opcode) {
+                       case TCPOPT_MAXSEG:
+                               if (opsize == TCPOLEN_MAXSEG)
+                                       printf("--mss %u ", ntohs(*(uint16_t *)ptr));
+                               break;
+                       case TCPOPT_WINDOW:
+                               if (opsize == TCPOLEN_WINDOW)
+                                       printf("--wscale %u ", *ptr);
+                               break;
+                       case TCPOPT_TIMESTAMP:
+                               if (opsize == TCPOLEN_TIMESTAMP)
+                                       printf("--timestamp ");
+                               break;
+                       case TCPOPT_SACK_PERMITTED:
+                               if (opsize == TCPOLEN_SACK_PERMITTED)
+                                       printf("--sack-perm ");
+                               break;
+                       }
+
+                       ptr += opsize - 2;
+                       length -= opsize;
+               }
+       }
+       printf("\n");
+       return 1;
+}
+
+static void probe_host(const char *host)
+{
+       struct sockaddr_in sin;
+       char pcap_errbuf[PCAP_ERRBUF_SIZE];
+       struct pcap_pkthdr pkthdr;
+       const uint8_t *data;
+       struct bpf_program fp;
+       pcap_t *ph;
+       int fd;
+
+       ph = pcap_create(iface, pcap_errbuf);
+       if (ph == NULL) {
+               perror("pcap_create");
+               goto err1;
+       }
+
+       if (pcap_setnonblock(ph, 1, pcap_errbuf) == -1) {
+               perror("pcap_setnonblock");
+               goto err2;
+       }
+
+       if (pcap_setfilter(ph, &fp) == -1) {
+               pcap_perror(ph, "pcap_setfilter");
+               goto err2;
+       }
+
+       if (pcap_activate(ph) != 0) {
+               pcap_perror(ph, "pcap_activate");
+               goto err2;
+       }
+
+       if (pcap_compile(ph, &fp, "src host 127.0.0.1 and tcp and src port 80",
+                        1, PCAP_NETMASK_UNKNOWN) == -1) {
+               pcap_perror(ph, "pcap_compile");
+               goto err2;
+       }
+
+       fd = socket(AF_INET, SOCK_STREAM, 0);
+       if (fd < 0) {
+               perror("socket");
+               goto err3;
+       }
+
+       memset(&sin, 0, sizeof(sin));
+       sin.sin_family          = AF_INET;
+       sin.sin_port            = htons(port);
+       sin.sin_addr.s_addr     = inet_addr(host);
+
+       if (connect(fd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {
+               perror("connect");
+               goto err4;
+       }
+
+       for (;;) {
+               data = pcap_next(ph, &pkthdr);
+               if (data == NULL)
+                       break;
+               if (parse_packet(host, data))
+                       break;
+       }
+
+       close(fd);
+
+err4:
+       close(fd);
+err3:
+       pcap_freecode(&fp);
+err2:
+       pcap_close(ph);
+err1:
+       return;
+}
+
+enum {
+       OPT_HELP        = 'h',
+       OPT_IFACE       = 'i',
+       OPT_PORT        = 'p',
+       OPT_CHAIN       = 'c',
+};
+
+static const struct option options[] = {
+       { .name = "help",  .has_arg = false, .val = OPT_HELP },
+       { .name = "iface", .has_arg = true,  .val = OPT_IFACE },
+       { .name = "port" , .has_arg = true,  .val = OPT_PORT },
+       { .name = "chain", .has_arg = true,  .val = OPT_CHAIN },
+       { }
+};
+
+static void print_help(const char *name)
+{
+       printf("%s [ options ] address...\n"
+              "\n"
+              "Options:\n"
+              " -i/--iface        Outbound interface\n"
+              " -p/--port         Port number to probe\n"
+              " -c/--chain        Chain name to use for rules\n"
+              " -h/--help         Show this help\n",
+              name);
+}
+
+int main(int argc, char **argv)
+{
+       int optidx = 0, c;
+
+       for (;;) {
+               c = getopt_long(argc, argv, "hi:p:c:", options, &optidx);
+               if (c == -1)
+                       break;
+
+               switch (c) {
+               case OPT_IFACE:
+                       iface = optarg;
+                       break;
+               case OPT_PORT:
+                       port = atoi(optarg);
+                       break;
+               case OPT_CHAIN:
+                       chain = optarg;
+                       break;
+               case OPT_HELP:
+                       print_help(argv[0]);
+                       exit(0);
+               case '?':
+                       print_help(argv[0]);
+                       exit(1);
+               }
+       }
+
+       argc -= optind;
+       argv += optind;
+
+       while (argc > 0) {
+               probe_host(*argv);
+               argc--;
+               argv++;
+       }
+       return 0;
+}