X-Git-Url: http://git.archive.openwrt.org/?p=project%2Ffirewall3.git;a=blobdiff_plain;f=redirects.c;h=18666a3c7dfd5940bbf66a94b1bd8accbb2d818e;hp=bb5e1ff1c79dd967b172b091e16ed8087cd91926;hb=93aea77092b0c178fefe3ab95fc040534eda90a3;hpb=9d900a9f86ef74a33a531e31c7373ab7b9906d88 diff --git a/redirects.c b/redirects.c index bb5e1ff..18666a3 100644 --- a/redirects.c +++ b/redirects.c @@ -247,7 +247,12 @@ fw3_load_redirects(struct fw3_state *state, struct uci_package *p) valid = false; - fw3_parse_options(redir, fw3_redirect_opts, s); + if (!fw3_parse_options(redir, fw3_redirect_opts, s)) + { + warn_elem(e, "skipped due to invalid options"); + fw3_free_redirect(redir); + continue; + } if (!redir->enabled) { @@ -423,34 +428,6 @@ set_target_nat(struct fw3_ipt_rule *r, struct fw3_redirect *redir) } static void -append_chain_filter(struct fw3_ipt_rule *r, struct fw3_redirect *redir) -{ - if (redir->target == FW3_FLAG_DNAT) - { - if (redir->local) - fw3_ipt_rule_append(r, "zone_%s_input", redir->src.name); - else - fw3_ipt_rule_append(r, "zone_%s_forward", redir->src.name); - } - else - { - if (redir->src.set && !redir->src.any) - fw3_ipt_rule_append(r, "zone_%s_forward", redir->src.name); - else - fw3_ipt_rule_append(r, "delegate_forward"); - } -} - -static void -set_target_filter(struct fw3_ipt_rule *r, struct fw3_redirect *redir) -{ - if (redir->local) - fw3_ipt_rule_extra(r, "-m conntrack --ctstate DNAT"); - - fw3_ipt_rule_target(r, "ACCEPT"); -} - -static void set_comment(struct fw3_ipt_rule *r, const char *name, int num, bool ref) { if (name) @@ -505,25 +482,6 @@ print_redirect(struct fw3_ipt_handle *h, struct fw3_state *state, append_chain_nat(r, redir); break; - case FW3_TABLE_FILTER: - src = &redir->ip_src; - dst = &redir->ip_redir; - spt = &redir->port_src; - dpt = &redir->port_redir; - - r = fw3_ipt_rule_create(h, proto, NULL, NULL, src, dst); - fw3_ipt_rule_sport_dport(r, spt, dpt); - fw3_ipt_rule_mac(r, mac); - fw3_ipt_rule_ipset(r, &redir->ipset); - fw3_ipt_rule_limit(r, &redir->limit); - fw3_ipt_rule_time(r, &redir->time); - fw3_ipt_rule_mark(r, &redir->mark); - set_target_filter(r, redir); - fw3_ipt_rule_extra(r, redir->extra); - set_comment(r, redir->name, num, false); - append_chain_filter(r, redir); - break; - default: break; } @@ -546,7 +504,7 @@ print_reflection(struct fw3_ipt_handle *h, struct fw3_state *state, fw3_ipt_rule_time(r, &redir->time); set_comment(r, redir->name, num, true); set_snat_dnat(r, FW3_FLAG_DNAT, &redir->ip_redir, &redir->port_redir); - fw3_ipt_rule_append(r, "zone_%s_prerouting", redir->dest.name); + fw3_ipt_rule_replace(r, "zone_%s_prerouting", redir->dest.name); r = fw3_ipt_rule_create(h, proto, NULL, NULL, ia, &redir->ip_redir); fw3_ipt_rule_sport_dport(r, NULL, &redir->port_redir); @@ -554,17 +512,7 @@ print_reflection(struct fw3_ipt_handle *h, struct fw3_state *state, fw3_ipt_rule_time(r, &redir->time); set_comment(r, redir->name, num, true); set_snat_dnat(r, FW3_FLAG_SNAT, ra, NULL); - fw3_ipt_rule_append(r, "zone_%s_postrouting", redir->dest.name); - break; - - case FW3_TABLE_FILTER: - r = fw3_ipt_rule_create(h, proto, NULL, NULL, ia, &redir->ip_redir); - fw3_ipt_rule_sport_dport(r, NULL, &redir->port_redir); - fw3_ipt_rule_limit(r, &redir->limit); - fw3_ipt_rule_time(r, &redir->time); - set_comment(r, redir->name, num, true); - fw3_ipt_rule_target(r, "zone_%s_dest_ACCEPT", redir->dest.name); - fw3_ipt_rule_append(r, "zone_%s_forward", redir->dest.name); + fw3_ipt_rule_replace(r, "zone_%s_postrouting", redir->dest.name); break; default: @@ -653,7 +601,7 @@ expand_redirect(struct fw3_ipt_handle *handle, struct fw3_state *state, fw3_foreach(proto, &redir->proto) { - if (!proto || (proto->protocol != 6 && proto->protocol != 17)) + if (!proto) continue; if (redir->reflection_src == FW3_REFLECTION_INTERNAL)