“guest” or “salon”?
> On Apr 3, 2018, at 8:51 AM, Alin Nastac <alin.nas...@gmail.com> wrote: > > From: Alin Nastac <alin.nas...@gmail.com> > > Reproduction scenario: > - use 3 interfaces with 3 different zones - lan, wan and guest > - configure firewall to allow forwarding from lan to wan > - add DROP rule to prevent forwarding from lan to guest > - although packets are forwarded from lan to wan, "DROP(dest guest)" > traces are generated by zone_guest_dest_DROP chain > > Signed-off-by: Alin Nastac <alin.nas...@gmail.com> > --- > zones.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----------- > 1 file changed, 60 insertions(+), 12 deletions(-) > > diff --git a/zones.c b/zones.c > index e00d527..9f00aca 100644 > --- a/zones.c > +++ b/zones.c > @@ -20,6 +20,8 @@ > #include "ubus.h" > #include "helpers.h" > > +#define filter_target(t) \ > + ((t == FW3_FLAG_REJECT) ? "reject" : fw3_flag_names[t]) > > #define C(f, tbl, tgt, fmt) \ > { FW3_FAMILY_##f, FW3_TABLE_##tbl, FW3_FLAG_##tgt, fmt } > @@ -401,6 +403,19 @@ print_zone_chain(struct fw3_ipt_handle *handle, struct > fw3_state *state, > set(zone->flags, handle->family, handle->table); > } > > +static const char* > +jump_target(enum fw3_flag t, bool src, struct fw3_zone *zone, char *buf, > size_t size) > +{ > + if ((zone->log & FW3_ZONE_LOG_FILTER) && t > FW3_FLAG_ACCEPT) > + { > + snprintf(buf, size, "%s_%s_%s", fw3_flag_names[t], > + src ? "src" : "dest", zone->name); > + return buf; > + } > + > + return filter_target(t); > +} > + > static void > print_interface_rule(struct fw3_ipt_handle *handle, struct fw3_state *state, > bool reload, struct fw3_zone *zone, > @@ -420,9 +435,6 @@ print_interface_rule(struct fw3_ipt_handle *handle, > struct fw3_state *state, > "forward", "FORWARD", > }; > > -#define jump_target(t) \ > - ((t == FW3_FLAG_REJECT) ? "reject" : fw3_flag_names[t]) > - > if (handle->table == FW3_TABLE_FILTER) > { > for (t = FW3_FLAG_ACCEPT; t <= FW3_FLAG_DROP; t++) > @@ -430,7 +442,7 @@ print_interface_rule(struct fw3_ipt_handle *handle, > struct fw3_state *state, > if (has(zone->flags, handle->family, > fw3_to_src_target(t))) > { > r = fw3_ipt_rule_create(handle, NULL, dev, > NULL, sub, NULL); > - fw3_ipt_rule_target(r, jump_target(t)); > + fw3_ipt_rule_target(r, jump_target(t, true, > zone, buf, sizeof(buf))); > fw3_ipt_rule_extra(r, zone->extra_src); > > if (t == FW3_FLAG_ACCEPT && > !state->defaults.drop_invalid) > @@ -455,7 +467,7 @@ print_interface_rule(struct fw3_ipt_handle *handle, > struct fw3_state *state, > } > > r = fw3_ipt_rule_create(handle, NULL, NULL, > dev, NULL, sub); > - fw3_ipt_rule_target(r, jump_target(t)); > + fw3_ipt_rule_target(r, jump_target(t, false, > zone, buf, sizeof(buf))); > fw3_ipt_rule_extra(r, zone->extra_dest); > fw3_ipt_rule_replace(r, "zone_%s_dest_%s", > zone->name, > fw3_flag_names[t]); > @@ -503,7 +515,7 @@ print_interface_rule(struct fw3_ipt_handle *handle, > struct fw3_state *state, > { > if (zone->log & FW3_ZONE_LOG_MANGLE) > { > - snprintf(buf, sizeof(buf) - 1, "MSSFIX(%s): ", > zone->name); > + snprintf(buf, sizeof(buf), "MSSFIX(%s): ", > zone->name); > > r = fw3_ipt_rule_create(handle, &tcp, NULL, > dev, NULL, sub); > fw3_ipt_rule_addarg(r, false, "--tcp-flags", > "SYN,RST"); > @@ -640,30 +652,46 @@ print_zone_rule(struct fw3_ipt_handle *handle, struct > fw3_state *state, > { > if (has(zone->flags, handle->family, > fw3_to_src_target(t))) > { > + fw3_ipt_create_chain(handle, > "%s_src_%s", > + fw3_flag_names[t], > zone->name); > + > r = fw3_ipt_rule_new(handle); > > - snprintf(buf, sizeof(buf) - 1, "%s(src > %s)", > + snprintf(buf, sizeof(buf), "%s(src %s)", > fw3_flag_names[t], zone->name); > > fw3_ipt_rule_limit(r, &zone->log_limit); > fw3_ipt_rule_target(r, "LOG"); > fw3_ipt_rule_addarg(r, false, > "--log-prefix", buf); > - fw3_ipt_rule_append(r, "zone_%s_src_%s", > - zone->name, > fw3_flag_names[t]); > + fw3_ipt_rule_append(r, "%s_src_%s", > + fw3_flag_names[t], > zone->name); > + > + r = fw3_ipt_rule_new(handle); > + fw3_ipt_rule_target(r, > filter_target(t)); > + fw3_ipt_rule_append(r, "%s_src_%s", > + fw3_flag_names[t], > zone->name); > } > > if (has(zone->flags, handle->family, t)) > { > + fw3_ipt_create_chain(handle, > "%s_dest_%s", > + fw3_flag_names[t], > zone->name); > + > r = fw3_ipt_rule_new(handle); > > - snprintf(buf, sizeof(buf) - 1, "%s(dest > %s)", > + snprintf(buf, sizeof(buf), "%s(dest > %s)", > fw3_flag_names[t], zone->name); > > fw3_ipt_rule_limit(r, &zone->log_limit); > fw3_ipt_rule_target(r, "LOG"); > fw3_ipt_rule_addarg(r, false, > "--log-prefix", buf); > - fw3_ipt_rule_append(r, > "zone_%s_dest_%s", > - zone->name, > fw3_flag_names[t]); > + fw3_ipt_rule_append(r, "%s_dest_%s", > + fw3_flag_names[t], > zone->name); > + > + r = fw3_ipt_rule_new(handle); > + fw3_ipt_rule_target(r, > filter_target(t)); > + fw3_ipt_rule_append(r, "%s_dest_%s", > + fw3_flag_names[t], > zone->name); > } > } > } > @@ -758,6 +786,7 @@ fw3_flush_zones(struct fw3_ipt_handle *handle, struct > fw3_state *state, > struct fw3_zone *z, *tmp; > const struct fw3_chain_spec *c; > char chain[32]; > + enum fw3_flag t; > > list_for_each_entry_safe(z, tmp, &state->zones, list) > { > @@ -790,6 +819,25 @@ fw3_flush_zones(struct fw3_ipt_handle *handle, struct > fw3_state *state, > fw3_ipt_delete_chain(handle, chain); > } > > + /* flush (DROP|REJECT)_{src|dest)_(zone name) chains */ > + for (t = FW3_FLAG_REJECT; t <= FW3_FLAG_DROP; t++) > + { > + if (has(z->flags, handle->family, fw3_to_src_target(t))) > + { > + snprintf(chain, sizeof(chain), "%s_src_%s", > + fw3_flag_names[t], z->name); > + fw3_ipt_flush_chain(handle, chain); > + fw3_ipt_delete_chain(handle, chain); > + } > + if (has(z->flags, handle->family, t)) > + { > + snprintf(chain, sizeof(chain), "%s_dest_%s", > + fw3_flag_names[t], z->name); > + fw3_ipt_flush_chain(handle, chain); > + fw3_ipt_delete_chain(handle, chain); > + } > + } > + > del(z->flags, handle->family, handle->table); > } > } > -- > 2.7.4 > > > _______________________________________________ > Lede-dev mailing list > Lede-dev@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/lede-dev _______________________________________________ Lede-dev mailing list Lede-dev@lists.infradead.org http://lists.infradead.org/mailman/listinfo/lede-dev