Changeset 34472


Ignore:
Timestamp:
2012-12-04T16:24:21+01:00 (5 years ago)
Author:
jow
Message:

firewall: extend nat reflection support

  • use comment match to keep track of per-network rules
  • setup reflection for any interface which is part of a masqueraded zone, not just "wan"
  • delete per-network reflection rules if network is brought down
Location:
trunk/package/network/config/firewall
Files:
2 edited

Legend:

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

    r32652 r34472  
    1010 
    1111PKG_VERSION:=2 
    12 PKG_RELEASE:=53 
     12PKG_RELEASE:=54 
    1313 
    1414include $(INCLUDE_DIR)/package.mk 
  • trunk/package/network/config/firewall/files/reflection.hotplug

    r32652 r34472  
    44. /lib/functions/network.sh 
    55 
    6 if [ "$ACTION" = "add" ] && [ "$INTERFACE" = "wan" ]; then 
    7         local wanip 
    8         network_get_ipaddr wanip wan || return 
     6if [ "$ACTION" = "remove" ]; then 
    97 
    10         iptables -t nat -F nat_reflection_in 2>/dev/null || { 
    11                 iptables -t nat -N nat_reflection_in 
    12                 iptables -t nat -A prerouting_rule -j nat_reflection_in 
     8        delete_rules_by_comment() { 
     9                local table="$1" 
     10                local chain="$2" 
     11                local comment="$3" 
     12 
     13                iptables -t "$table" --line-numbers -nL "$chain" 2>/dev/null | \ 
     14                        sed -e ' 
     15                                1d; 
     16                                1! { 
     17                                        \#^[0-9]\+ .* /\* '"$comment"' \*/.*$# { 
     18                                                s/ .*$//; 
     19                                                G; h; 
     20                                        } 
     21                                }; 
     22                                $!d; 
     23                        ' | xargs -n1 iptables -t "$table" -D "$chain" 2>/dev/null 
    1324        } 
    1425 
    15         iptables -t nat -F nat_reflection_out 2>/dev/null || { 
    16                 iptables -t nat -N nat_reflection_out 
    17                 iptables -t nat -A postrouting_rule -j nat_reflection_out 
    18         } 
     26        delete_rules_by_comment nat    nat_reflection_in  "$INTERFACE" 
     27        delete_rules_by_comment nat    nat_reflection_out "$INTERFACE" 
     28        delete_rules_by_comment filter nat_reflection_fwd "$INTERFACE" 
    1929 
    20         iptables -t filter -F nat_reflection_fwd 2>/dev/null || { 
    21                 iptables -t filter -N nat_reflection_fwd 
    22                 iptables -t filter -A forwarding_rule -j nat_reflection_fwd 
     30elif [ "$ACTION" = "add" ]; then 
     31 
     32        prepare_chains() { 
     33                iptables -t nat -N nat_reflection_in 2>/dev/null && { 
     34                        iptables -t nat -A prerouting_rule -j nat_reflection_in 
     35                } 
     36 
     37                iptables -t nat -N nat_reflection_out 2>/dev/null && { 
     38                        iptables -t nat -A postrouting_rule -j nat_reflection_out 
     39                } 
     40 
     41                iptables -t filter -N nat_reflection_fwd 2>/dev/null && { 
     42                        iptables -t filter -A forwarding_rule -j nat_reflection_fwd 
     43                } 
    2344        } 
    2445 
     
    2748                        local cfg="$1" 
    2849                        local zone="$2" 
     50                        local need_masq="${3:-0}" 
    2951 
    3052                        local name 
    3153                        config_get name "$cfg" name 
    3254 
    33                         [ "$name" = "$zone" ] && { 
     55                        local masq 
     56                        config_get_bool masq "$cfg" masq 0 
     57 
     58                        [ "$name" = "$zone" ] && [ "$masq" -ge "$need_masq" ] && { 
    3459                                local network 
    3560                                config_get network "$cfg" network 
     
    5277                local src 
    5378                config_get src "$cfg" src 
     79                [ "$src" == "$ZONE" ] || return 
     80 
     81                local dest 
     82                config_get dest "$cfg" dest 
     83                [ "$dest" != "*" ] || return 
    5484 
    5585                local target 
    5686                config_get target "$cfg" target DNAT 
     87                [ "$target" = DNAT ] || return 
    5788 
    58                 [ "$src" = wan ] && [ "$target" = DNAT ] && { 
    59                         local dest 
    60                         config_get dest "$cfg" dest "lan" 
    61                         [ "$dest" != "*" ] || return 
     89                prepare_chains 
    6290 
    63                         local net 
    64                         for net in $(find_networks "$dest"); do 
    65                                 local lannet 
    66                                 network_get_subnet lannet "$net" || return 
     91                local net 
     92                for net in $(find_networks "$dest" 0); do 
     93                        local intnet 
     94                        network_get_subnet intnet "$net" || continue 
    6795 
    68                                 local proto 
    69                                 config_get proto "$cfg" proto 
     96                        local proto 
     97                        config_get proto "$cfg" proto 
    7098 
    71                                 local epmin epmax extport 
    72                                 config_get extport "$cfg" src_dport "1-65535" 
    73                                 [ -n "$extport" ] || return 
     99                        local epmin epmax extport 
     100                        config_get extport "$cfg" src_dport "1-65535" 
     101                        [ -n "$extport" ] || return 
    74102 
    75                                 epmin="${extport%[-:]*}"; epmax="${extport#*[-:]}" 
    76                                 [ "${epmin#!}" != "$epmax" ] || epmax="" 
     103                        epmin="${extport%[-:]*}"; epmax="${extport#*[-:]}" 
     104                        [ "${epmin#!}" != "$epmax" ] || epmax="" 
    77105 
    78                                 local ipmin ipmax intport 
    79                                 config_get intport "$cfg" dest_port "$extport" 
     106                        local ipmin ipmax intport 
     107                        config_get intport "$cfg" dest_port "$extport" 
    80108 
    81                                 ipmin="${intport%[-:]*}"; ipmax="${intport#*[-:]}" 
    82                                 [ "${ipmin#!}" != "$ipmax" ] || ipmax="" 
     109                        ipmin="${intport%[-:]*}"; ipmax="${intport#*[-:]}" 
     110                        [ "${ipmin#!}" != "$ipmax" ] || ipmax="" 
    83111 
    84                                 local exthost 
    85                                 config_get exthost "$cfg" src_dip "$wanip" 
     112                        local exthost 
     113                        config_get exthost "$cfg" src_dip "$extip" 
    86114 
    87                                 local inthost 
    88                                 config_get inthost "$cfg" dest_ip 
    89                                 [ -n "$inthost" ] || return 
     115                        local inthost 
     116                        config_get inthost "$cfg" dest_ip 
     117                        [ -n "$inthost" ] || return 
    90118 
    91                                 [ "$proto" = all    ] && proto="tcp udp" 
    92                                 [ "$proto" = tcpudp ] && proto="tcp udp" 
     119                        [ "$proto" = all    ] && proto="tcp udp" 
     120                        [ "$proto" = tcpudp ] && proto="tcp udp" 
    93121 
    94                                 [ "${inthost#!}" = "$inthost" ] || return 0 
    95                                 [ "${exthost#!}" = "$exthost" ] || return 0 
     122                        [ "${inthost#!}" = "$inthost" ] || return 0 
     123                        [ "${exthost#!}" = "$exthost" ] || return 0 
    96124 
    97                                 [ "${epmin#!}" != "$epmin" ] && \ 
    98                                         extport="! --dport ${epmin#!}${epmax:+:$epmax}" || \ 
    99                                         extport="--dport $epmin${epmax:+:$epmax}" 
     125                        [ "${epmin#!}" != "$epmin" ] && \ 
     126                                extport="! --dport ${epmin#!}${epmax:+:$epmax}" || \ 
     127                                extport="--dport $epmin${epmax:+:$epmax}" 
    100128 
    101                                 [ "${ipmin#!}" != "$ipmin" ] && \ 
    102                                         intport="! --dport ${ipmin#!}${ipmax:+:$ipmax}" || \ 
    103                                         intport="--dport $ipmin${ipmax:+:$ipmax}" 
     129                        [ "${ipmin#!}" != "$ipmin" ] && \ 
     130                                intport="! --dport ${ipmin#!}${ipmax:+:$ipmax}" || \ 
     131                                intport="--dport $ipmin${ipmax:+:$ipmax}" 
    104132 
    105                                 local p 
    106                                 for p in ${proto:-tcp udp}; do 
    107                                         case "$p" in 
    108                                                 tcp|udp|6|17) 
    109                                                         iptables -t nat -A nat_reflection_in \ 
    110                                                                 -s $lannet -d $exthost \ 
    111                                                                 -p $p $extport \ 
    112                                                                 -j DNAT --to $inthost:${ipmin#!}${ipmax:+-$ipmax} 
     133                        local p 
     134                        for p in ${proto:-tcp udp}; do 
     135                                case "$p" in 
     136                                        tcp|udp|6|17) 
     137                                                iptables -t nat -A nat_reflection_in \ 
     138                                                        -s $intnet -d $exthost \ 
     139                                                        -p $p $extport \ 
     140                                                        -m comment --comment "$INTERFACE" \ 
     141                                                        -j DNAT --to $inthost:${ipmin#!}${ipmax:+-$ipmax} 
    113142 
    114                                                         iptables -t nat -A nat_reflection_out \ 
    115                                                                 -s $lannet -d $inthost \ 
    116                                                                 -p $p $intport \ 
    117                                                                 -j SNAT --to-source ${lannet%%/*} 
     143                                                iptables -t nat -A nat_reflection_out \ 
     144                                                        -s $intnet -d $inthost \ 
     145                                                        -p $p $intport \ 
     146                                                        -m comment --comment "$INTERFACE" \ 
     147                                                        -j SNAT --to-source ${intnet%%/*} 
    118148 
    119                                                         iptables -t filter -A nat_reflection_fwd \ 
    120                                                                 -s $lannet -d $inthost \ 
    121                                                                 -p $p $intport \ 
    122                                                                 -j ACCEPT 
    123                                                 ;; 
    124                                         esac 
    125                                 done 
     149                                                iptables -t filter -A nat_reflection_fwd \ 
     150                                                        -s $intnet -d $inthost \ 
     151                                                        -p $p $intport \ 
     152                                                        -m comment --comment "$INTERFACE" \ 
     153                                                        -j ACCEPT 
     154                                        ;; 
     155                                esac 
    126156                        done 
    127                 } 
     157                done 
    128158        } 
    129159 
    130160        config_load firewall 
     161 
     162        local is_masq_zone="$(find_networks "$ZONE" 1)" 
     163        [ -n "$is_masq_zone" ] || exit 0 
     164 
     165        local extip 
     166        network_get_ipaddr extip "$INTERFACE" || exit 0 
     167 
    131168        config_foreach setup_fwd redirect 
    132169fi 
Note: See TracChangeset for help on using the changeset viewer.