#6 Firewall: Port- und Web-Filter

closed-invalid
nobody
None
5
2009-10-30
2009-10-19
amd-65
No

Irgendwie funktioniert der Port- und Web-Filter noch nicht richtig. Ich hänge hier mal meine Version von setup_web_and_port_rules() an:

setup_web_and_port_rules()
{
echo "setup_web_and_port_rules()" >>$DEBUG_FILE
exec_cmd "iptables -N PORT_AND_WEB_FILTER"
exec_cmd "iptables -F PORT_AND_WEB_FILTER"

get_external_interface "EXT_IF"

rule_list=`nvram get fw_web_port_rules`
[ "$rule_list" = "Failed" ] && rule_list=""
OLD_IFS=$IFS
IFS=$';'
#go through each rule
for rule in $rule_list
do
ena=`echo $rule|sed -e 's/.*#.*#.*#.*#.*#\(.*\)/\1/g'`
[ "$ena" != "1" ] && continue

src_ip=`echo $rule|sed -e 's/.*#\(.*\)#.*#.*#.*#.*/\1/g'|sed -e 's/,/ || /g'`
cmd="iptables -A PORT_AND_WEB_FILTER -o $EXT_IF -s $src_ip"

type=`echo $rule|sed -e 's/.*#.*#\(.*\)#.*#.*#.*/\1/g'`
if [ "$type" = "port" ]; then
#dst_port filter rule
prot=`echo $rule|sed -e 's/.*#.*#.*#\(.*\)#.*#.*/\1/g'`
dst_port=`echo $rule|sed -e 's/.*#.*#.*#.*#\(.*\)#.*/\1/g'|sed -e 's/-/:/g'`
#new since 0.3.6
cmd_udp=$cmd
( [ "$prot" = "tcp" ] || [ "$prot" = "both" ] ) && cmd=$cmd" -p tcp -m mport --dports $dst_port -j REJECT --reject-with tcp-reset" && exec_cmd "$cmd"
( [ "$prot" = "udp" ] || [ "$prot" = "both" ] ) && cmd_udp=$cmd_udp" -p udp -m mport --dports $dst_port -j DROP" && exec_cmd "$cmd_udp"
else
#webstr filter rule
webstr_type=`echo $rule|sed -e 's/.*#.*#.*#\(.*\)#.*#.*/\1/g'`
content=`echo $rule|sed -e 's/.*#.*#.*#.*#\(.*\)#.*/\1/g'`
content=`echo "$content"|sed -e 's/,/<\&nbsp>/g'`
cmd=$cmd" -p tcp --dport 80 -m webstr --$webstr_type \"$content\" -j REJECT --reject-with tcp-reset"
exec_cmd "$cmd"
fi
done
IFS=$OLD_IFS
exec_cmd "iptables -A PORT_AND_WEB_FILTER -j RETURN"
}

Das permanente Ändern von Leerzeichen und Semikolons kann man sich auch schenken, wenn man das Listentrennzeichen einfach entsprechend setzt.

Gruß
amd-65

Discussion

  • Habe den Port-/Web-Filter nochmal komplett überarbeitet und er sollte jetzt auch funktionieren. Der content-Filter wird jetzt mit dem String-Match gemacht und beachtet zusätzlich auch den Downstream. Falls dir also Verbesserungen einfallen dann nimm nochmal die aktuelle Version als Basis her, weil die obige jetzt leider schon veraltet ist. Sorry mein Fehler, habs zu spät gesehen und hatte schon Änderungen vorgenommen.

     
    • status: open --> closed-invalid