@@ -39,6 +39,7 @@
#include <iptables.h>
#include <xtables.h>
#include <fcntl.h>
+#include <glob.h>
#include "xshared.h"
#ifndef TRUE
@@ -871,6 +874,40 @@
return iptc_delete_chain(chain, handle);
}
+static int is_forwarding_enabled(void)
+{
+ glob_t globbuf;
+ int opened_any=0,forwarding_enabled=0;
+
+ if (glob("/proc/sys/net/ipv4/conf/*/forwarding",GLOB_NOSORT,NULL,&globbuf)==0)
+ {
+ size_t n;
+ for (n=0;n<globbuf.gl_pathc;n++)
+ {
+ if (strncmp(globbuf.gl_pathv[n],"/proc/sys/net/ipv4/conf/",24)==0 && (strncmp(globbuf.gl_pathv[n]+24,"all/",4)==0 || strncmp(globbuf.gl_pathv[n]+24,"default/",8)==0))
+ continue;
+ FILE* fp=fopen(globbuf.gl_pathv[n],"r");
+ if (fp)
+ {
+ int c=fgetc(fp);
+ if (c!=EOF)
+ {
+ opened_any=1;
+ forwarding_enabled|=c-'0';
+ }
+ fclose(fp);
+ }
+ }
+
+ globfree(&globbuf);
+ }
+
+ if (opened_any==0)
+ forwarding_enabled=1;
+
+ return forwarding_enabled;
+}
+
static int
list_entries(const xt_chainlabel chain, int rulenum, int verbose, int numeric,
int expanded, int linenumbers, struct xtc_handle *handle)
@@ -899,6 +936,7 @@
this = iptc_next_chain(handle)) {
const struct ipt_entry *i;
unsigned int num;
+ int hide_forward = 0;
if (chain && strcmp(chain, this) != 0)
continue;
@@ -906,7 +944,18 @@
if (found) printf("\n");
if (!rulenum)
- print_header(format, this, handle);
+ {
+ if (!is_forwarding_enabled() && 0==strcmp("FORWARD", this))
+ hide_forward = 1;
+ if (hide_forward)
+ {
+ printf("WARNING: Hiding chain FORWARD because no interfaces have IP forwarding enabled.\n");
+ found=1;
+ continue;
+ }
+ else
+ print_header(format, this, handle);
+ }
i = iptc_first_rule(this, handle);
num = 0;