├── fnetfilter
│ ├── Makefile
│ └── main.c
main.c
#include "../include/common.h"
#define MAXBUF 4098
#define MAXARGS 16
static char *args[MAXARGS] = {
0};
static int argcnt = 0;
int arg_quiet = 0;
static char *default_filter =
"*filter\n"
":INPUT DROP [0:0]\n"
":FORWARD DROP [0:0]\n"
":OUTPUT ACCEPT [0:0]\n"
"-A INPUT -i lo -j ACCEPT\n"
"-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT\n"
"# echo replay is handled by -m state RELATED/ESTABLISHED above\n"
"#-A INPUT -p icmp --icmp-type echo-reply -j ACCEPT\n"
"-A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT\n"
"-A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT\n"
"-A INPUT -p icmp --icmp-type echo-request -j ACCEPT \n"
"# disable STUN\n"
"-A OUTPUT -p udp --dport 3478 -j DROP\n"
"-A OUTPUT -p udp --dport 3479 -j DROP\n"
"-A OUTPUT -p tcp --dport 3478 -j DROP\n"
"-A OUTPUT -p tcp --dport 3479 -j DROP\n"
"COMMIT\n";
static void usage(void) {
printf("Usage:\n");
printf("\tfnetfilter netfilter-command destination-file\n");
}
static void err_exit_cannot_open_file(const char *fname) {
fprintf(stderr, "Error fnetfilter: cannot open %s\n", fname);
exit(1);
}
static void copy(const char *src, const char *dest) {
FILE *fp1 = fopen(src, "r");
if (!fp1)
err_exit_cannot_open_file(src);
FILE *fp2 = fopen(dest, "w");
if (!fp2)
err_exit_cannot_open_file(dest);
char buf[MAXBUF];
while (fgets(buf, MAXBUF, fp1))
fprintf(fp2, "%s", buf);
fclose(fp1);
fclose(fp2);
}
static void process_template(char *src, const char *dest) {
char *arg_start = strchr(src, ',');
assert(arg_start);
*arg_start = '\0';
arg_start++;
if (*arg_start == '\0') {
fprintf(stderr, "Error fnetfilter: you need to provide at least one argument\n");
exit(1);
}
char *token = strtok(arg_start, ",");
while (token) {
if (argcnt == MAXARGS) {
fprintf(stderr, "Error fnetfilter: only up to %u arguments are supported\n", (unsigned) MAXARGS);
exit(1);
}
int len = strlen(token);
if (strcspn(token, "\\&!?\"'<>%^(){};,*[]") != (size_t)len) {
fprintf(stderr, "Error fnetfilter: invalid argument in netfilter command\n");
exit(1);
}
args[argcnt] = token;
argcnt++;
token = strtok(NULL, ",");
}
#if 0
{
printf("argcnt %d\n", argcnt);
int i;
for (i = 0; i < argcnt; i++)
printf("%s\n", args[i])