Changeset 35484 for trunk


Ignore:
Timestamp:
2013-02-04T15:38:33+01:00 (3 years ago)
Author:
jow
Message:

firewall: various enhancements

  • reduce mssfix related log spam (#10681)
  • separate src and dest terminal chains (#11453, #12945)
  • disable per-zone custom chains by default, they're rarely used

Additionally introduce options "device", "subnet", "extra", "extra_src" and "extra_dest"
to allow defining zones not related to uci interfaces, e.g. to match "ppp+" or any tcp
traffic to and from a specific port.

Location:
trunk/package/network/config/firewall
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/package/network/config/firewall/Makefile

    r35348 r35484  
    1010 
    1111PKG_VERSION:=2 
    12 PKG_RELEASE:=57 
     12PKG_RELEASE:=58 
    1313 
    1414include $(INCLUDE_DIR)/package.mk 
  • trunk/package/network/config/firewall/files/lib/core_forwarding.sh

    r23024 r35484  
    1818        fw_callback pre forwarding 
    1919 
    20         local chain=forward 
     20        local chain=delegate_forward 
    2121        [ -n "$forwarding_src" ] && { 
    2222                chain=zone_${forwarding_src}_forward  
     
    2525        local target=ACCEPT 
    2626        [ -n "$forwarding_dest" ] && { 
    27                 target=zone_${forwarding_dest}_ACCEPT 
     27                target=zone_${forwarding_dest}_dest_ACCEPT 
    2828        } 
    2929 
  • trunk/package/network/config/firewall/files/lib/core_init.sh

    r30694 r35484  
    116116        } 
    117117 
    118         fw add i f input 
    119         fw add i f output 
    120         fw add i f forward 
    121  
    122         fw add i f INPUT   input 
    123         fw add i f OUTPUT  output 
    124         fw add i f FORWARD forward 
     118        fw add i f delegate_input 
     119        fw add i f delegate_output 
     120        fw add i f delegate_forward 
     121 
     122        fw add i f INPUT   delegate_input 
     123        fw add i f OUTPUT  delegate_output 
     124        fw add i f FORWARD delegate_forward 
    125125 
    126126        fw add i f reject 
     
    139139                string name "$1" \ 
    140140                string network "" \ 
     141                string device "" \ 
     142                string subnet "" \ 
    141143                string input "$FW_DEFAULT_INPUT_POLICY" \ 
    142144                string output "$FW_DEFAULT_OUTPUT_POLICY" \ 
     
    145147                string masq_src "" \ 
    146148                string masq_dest "" \ 
     149                string extra "" \ 
     150                string extra_src "" \ 
     151                string extra_dest "" \ 
    147152                boolean conntrack 0 \ 
    148153                boolean mtu_fix 0 \ 
    149                 boolean custom_chains "$FW_ADD_CUSTOM_CHAINS" \ 
     154                boolean custom_chains 0 \ 
    150155                boolean log 0 \ 
    151156                string log_limit 10 \ 
     
    153158        } || return 
    154159        [ -n "$zone_name" ] || zone_name=$zone_NAME 
    155         [ -n "$zone_network" ] || zone_network=$zone_name 
     160        [ -n "$zone_extra_src" ] || zone_extra_src="$zone_extra" 
     161        [ -n "$zone_extra_dest" ] || zone_extra_dest="$zone_extra" 
     162        [ -n "$zone_network$zone_subnet$zone_device$zone_extra_src$zone_extra_dest" ] || zone_network=$zone_name 
    156163} 
    157164 
     
    193200        local chain=zone_${zone_name} 
    194201 
    195         fw add $mode f ${chain}_ACCEPT 
    196         fw add $mode f ${chain}_DROP 
    197         fw add $mode f ${chain}_REJECT 
    198  
    199         # TODO: Rename to ${chain}_input 
    200         fw add $mode f ${chain} 
    201         fw add $mode f ${chain} ${chain}_${zone_input} $ 
     202        fw add $mode f ${chain}_src_ACCEPT 
     203        fw add $mode f ${chain}_src_DROP 
     204        fw add $mode f ${chain}_src_REJECT 
     205 
     206        fw add $mode f ${chain}_dest_ACCEPT 
     207        fw add $mode f ${chain}_dest_DROP 
     208        fw add $mode f ${chain}_dest_REJECT 
     209 
     210        fw add $mode f ${chain}_input 
     211        fw add $mode f ${chain}_input ${chain}_src_${zone_input} $ 
    202212 
    203213        fw add $mode f ${chain}_forward 
    204         fw add $mode f ${chain}_forward ${chain}_${zone_forward} $ 
    205  
    206         # TODO: add ${chain}_output 
    207         fw add $mode f output ${chain}_${zone_output} $ 
     214        fw add $mode f ${chain}_forward ${chain}_dest_${zone_forward} $ 
     215 
     216        fw add $mode f ${chain}_output 
     217        fw add $mode f ${chain}_output ${chain}_dest_${zone_output} $ 
    208218 
    209219        # TODO: Rename to ${chain}_MASQUERADE 
     
    224234 
    225235                fw add $mode f input_${zone_name} 
    226                 fw add $mode f ${chain} input_${zone_name} ^ 
     236                fw add $mode f ${chain}_input input_${zone_name} ^ 
    227237 
    228238                fw add $mode f forwarding_${zone_name} 
     
    239249                local t 
    240250                for t in REJECT DROP; do 
    241                         fw add $mode f ${chain}_${t} LOG ^ \ 
    242                                 { -m limit --limit $zone_log_limit --log-prefix "$t($zone_name): " } 
     251                        local d 
     252                        for d in src dest; do 
     253                                fw add $mode f ${chain}_${d}_${t} LOG ^ \ 
     254                                        { -m limit --limit $zone_log_limit --log-prefix "$t($d $zone_name): " } 
     255                        done 
    243256                done 
    244257 
    245258                [ $zone_mtu_fix == 1 ] && \ 
    246259                        fw add $mode m ${chain}_MSSFIX LOG ^ \ 
    247                                 { -m limit --limit $zone_log_limit --log-prefix "MSSFIX($zone_name): " } 
     260                                { -p tcp --tcp-flags SYN,RST SYN -m limit --limit $zone_log_limit --log-prefix "MSSFIX($zone_name): " } 
    248261        } 
    249262 
     
    268281        fi 
    269282 
     283        local dev 
     284        for dev in ${zone_device:-""}; do 
     285                local net 
     286                for net in ${zone_subnet:-""}; do 
     287                        [ -n "$dev" ] || [ -n "$net" ] || continue 
     288                        fw_do_interface_rules add "${zone_name}" "$dev" "$net" \ 
     289                "${zone_extra_src}" "${zone_extra_dest}" 
     290                done 
     291        done 
     292 
    270293        fw_callback post zone 
    271294} 
     
    294317                        exit 1 
    295318                } 
    296                 . $path  
     319                . $path 
    297320        ) 
    298321} 
  • trunk/package/network/config/firewall/files/lib/core_interface.sh

    r35348 r35484  
    1 # Copyright (C) 2009-2012 OpenWrt.org 
     1# Copyright (C) 2009-2013 OpenWrt.org 
    22 
    33fw__uci_state_add() { 
     
    3232} 
    3333 
     34fw_do_interface_rules() { 
     35    local action=$1 
     36    local zone=$2 
     37    local chain=zone_${zone} 
     38    local ifname=$3 
     39    local subnet=$4 
     40    local extra_src="$5" 
     41    local extra_dest="$6" 
     42 
     43    local idev odev inet onet mode 
     44    fw_get_family_mode mode x $zone i 
     45 
     46    fw_get_negation idev '-i' "$ifname" 
     47    fw_get_negation odev '-o' "$ifname" 
     48 
     49    case "$mode/$subnet" in 
     50        # Zone supports v6 only or dual, need v6 
     51        G6/*:*|i/*:*) 
     52            fw_get_negation inet '-s' "$subnet" 
     53            fw_get_negation onet '-d' "$subnet" 
     54            mode=6 
     55        ;; 
     56 
     57        # Zone supports v4 only or dual, need v4 
     58        G4/*.*.*.*|i/*.*.*.*) 
     59            fw_get_negation inet '-s' "$subnet" 
     60            fw_get_negation onet '-d' "$subnet" 
     61            mode=4 
     62        ;; 
     63 
     64        # Need v6 while zone is v4 
     65        */*:*) fw_log info "zone $zone does not support IPv6 address family, skipping"; return ;; 
     66 
     67        # Need v4 while zone is v6 
     68        */*.*) fw_log info "zone $zone does not support IPv4 address family, skipping"; return ;; 
     69 
     70        # Strip prefix 
     71        *) mode="${mode#G}" ;; 
     72    esac 
     73 
     74    lock /var/run/firewall-interface.lock 
     75 
     76    fw $action $mode f ${chain}_dest_ACCEPT ACCEPT $ { $odev $onet $extra_dest } 
     77    fw $action $mode f ${chain}_src_ACCEPT  ACCEPT $ { $idev $inet $extra_src  } 
     78    fw $action $mode f ${chain}_dest_DROP   DROP   $ { $odev $onet $extra_dest } 
     79    fw $action $mode f ${chain}_src_DROP    DROP   $ { $idev $inet $extra_src  } 
     80    fw $action $mode f ${chain}_dest_REJECT reject $ { $odev $onet $extra_dest } 
     81    fw $action $mode f ${chain}_src_REJECT  reject $ { $idev $inet $extra_src  } 
     82 
     83    [ "$(uci_get_state firewall core "${zone}_tcpmss")" == 1 ] && \ 
     84        fw $action $mode m ${chain}_MSSFIX TCPMSS $ \ 
     85            { $odev -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu $onet $extra_dest } 
     86 
     87    fw $action $mode f delegate_input   ${chain}_input   $ { $idev $inet $extra_src  } 
     88    fw $action $mode f delegate_forward ${chain}_forward $ { $idev $inet $extra_src  } 
     89    fw $action $mode f delegate_output  ${chain}_output  $ { $odev $onet $extra_dest } 
     90 
     91    fw $action $mode n PREROUTING ${chain}_prerouting $ { $idev $inet $extra_src  } 
     92    fw $action $mode r PREROUTING ${chain}_notrack    $ { $idev $inet $extra_src  } 
     93    fw $action $mode n POSTROUTING ${chain}_nat       $ { $odev $onet $extra_dest } 
     94 
     95    # Flush conntrack table 
     96    echo f >/proc/net/nf_conntrack 2>/dev/null 
     97 
     98    lock -u /var/run/firewall-interface.lock 
     99} 
     100 
    34101fw_configure_interface() { 
    35102        local iface=$1 
     
    53120        fw_callback pre interface 
    54121 
    55         fw__do_rules() { 
    56                 local action=$1 
    57                 local zone=$2 
    58                 local chain=zone_${zone} 
    59                 local ifname=$3 
    60                 local subnet=$4 
    61  
    62                 local inet onet mode 
    63                 fw_get_family_mode mode x $zone i 
    64  
    65                 case "$mode/$subnet" in 
    66                         # Zone supports v6 only or dual, need v6 
    67                         G6/*:*|i/*:*) 
    68                                 inet="-s $subnet -d ::/0" 
    69                                 onet="-s ::/0 -d $subnet" 
    70                                 mode=6 
    71                         ;; 
    72  
    73                         # Zone supports v4 only or dual, need v4 
    74                         G4/*.*.*.*|i/*.*.*.*) 
    75                                 inet="-s $subnet -d 0.0.0.0/0" 
    76                                 onet="-s 0.0.0.0/0 -d $subnet" 
    77                                 mode=4 
    78                         ;; 
    79  
    80                         # Need v6 while zone is v4 
    81                         */*:*) fw_log info "zone $zone does not support IPv6 address family, skipping"; return ;; 
    82  
    83                         # Need v4 while zone is v6 
    84                         */*.*) fw_log info "zone $zone does not support IPv4 address family, skipping"; return ;; 
    85  
    86                         # Strip prefix 
    87                         *) mode="${mode#G}" ;; 
    88                 esac 
    89  
    90                 lock /var/run/firewall-interface.lock 
    91  
    92                 fw $action $mode f ${chain}_ACCEPT ACCEPT $ { -o "$ifname" $onet } 
    93                 fw $action $mode f ${chain}_ACCEPT ACCEPT $ { -i "$ifname" $inet } 
    94                 fw $action $mode f ${chain}_DROP   DROP   $ { -o "$ifname" $onet } 
    95                 fw $action $mode f ${chain}_DROP   DROP   $ { -i "$ifname" $inet } 
    96                 fw $action $mode f ${chain}_REJECT reject $ { -o "$ifname" $onet } 
    97                 fw $action $mode f ${chain}_REJECT reject $ { -i "$ifname" $inet } 
    98  
    99                 [ "$(uci_get_state firewall core "${zone}_tcpmss")" == 1 ] && \ 
    100                         fw $action $mode m ${chain}_MSSFIX TCPMSS $ \ 
    101                                 { -o "$ifname" -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu $onet } 
    102  
    103                 fw $action $mode f input   ${chain}         $ { -i "$ifname" $inet } 
    104                 fw $action $mode f forward ${chain}_forward $ { -i "$ifname" $inet } 
    105                 fw $action $mode n PREROUTING ${chain}_prerouting $ { -i "$ifname" $inet } 
    106                 fw $action $mode r PREROUTING ${chain}_notrack    $ { -i "$ifname" $inet } 
    107                 fw $action $mode n POSTROUTING ${chain}_nat       $ { -o "$ifname" $onet } 
    108  
    109                 # Flush conntrack table 
    110                 echo f >/proc/net/nf_conntrack 2>/dev/null 
    111  
    112                 lock -u /var/run/firewall-interface.lock 
    113         } 
    114  
    115122        local old_zones old_ifname old_subnets 
    116123        config_get old_zones core "${iface}_zone" 
     
    124131                        for n in ${old_subnets:-""}; do 
    125132                                fw_log info "removing $iface ($old_ifname${n:+ alias $n}) from zone $z" 
    126                                 fw__do_rules del $z $old_ifname $n 
     133                                fw_do_interface_rules del $z $old_ifname $n 
    127134                        done 
    128135 
     
    183190 
    184191                fw_log info "adding $iface ($ifname${aliasnet:+ alias $aliasnet}) to zone $zone_name" 
    185                 fw__do_rules add ${zone_name} "$ifname" "$aliasnet" 
     192                fw_do_interface_rules add ${zone_name} "$ifname" "$aliasnet" 
    186193                append new_zones $zone_name 
    187194 
     
    206213        } >/dev/null 2>/dev/null 
    207214} 
    208  
  • trunk/package/network/config/firewall/files/lib/core_redirect.sh

    r29687 r35484  
    4242                if [ -z "$redirect_dest_ip" ] || /sbin/ifconfig | grep -qE "addr:${redirect_dest_ip//./\\.}\b"; then 
    4343                        fwdopt="-m conntrack --ctstate DNAT" 
    44                         fwdchain="zone_${redirect_src}" 
     44                        fwdchain="zone_${redirect_src}_input" 
    4545                else 
    4646                        fwdchain="zone_${redirect_src}_forward" 
     
    115115                        } 
    116116 
    117                         fw add $mode f ${fwdchain:-forward} ACCEPT + \ 
     117                        fw add $mode f ${fwdchain:-delegate_forward} ACCEPT + \ 
    118118                                { $redirect_src_ip $redirect_dest_ip } { \ 
    119119                                $srcaddr $destaddr \ 
  • trunk/package/network/config/firewall/files/lib/core_rule.sh

    r28529 r35484  
    3535 
    3636        local table=f 
    37         local chain=input 
     37        local chain=delegate_output 
    3838        local target="${rule_target:-REJECT}" 
    3939        if [ "$target" == "NOTRACK" ]; then 
     
    4343                if [ -n "$rule_src" ]; then 
    4444                        if [ "$rule_src" != "*" ]; then 
    45                                 chain="zone_${rule_src}${rule_dest:+_forward}" 
     45                                if [ -n "$rule_dest" ]; then 
     46                                        chain="zone_${rule_src}_forward" 
     47                                else 
     48                                        chain="zone_${rule_src}_input" 
     49                                fi 
    4650                        else 
    47                                 chain="${rule_dest:+forward}" 
    48                                 chain="${chain:-input}" 
     51                                chain="${rule_dest:+delegate_forward}" 
     52                                chain="${chain:-delegate_input}" 
    4953                        fi 
    5054                fi 
     
    5256                if [ -n "$rule_dest" ]; then 
    5357                        if [ "$rule_dest" != "*" ]; then 
    54                                 target="zone_${rule_dest}_${target}" 
     58                                target="zone_${rule_dest}_dest_${target}" 
     59                                if [ -z "$rule_src" ]; then 
     60                                        chain="zone_${rule_dest}_output" 
     61                                fi 
    5562                        elif [ "$target" = REJECT ]; then 
    5663                                target=reject 
  • trunk/package/network/config/firewall/files/lib/fw.sh

    r30363 r35484  
    171171                                        return 1 
    172172                                fi 
    173                                 shift    
     173                                shift 
    174174                        ;; 
    175175                        *) cmdline="$cmdline $1" ;; 
Note: See TracChangeset for help on using the changeset viewer.