de5fd9a0ea38a54be82c9de767236b832feeb2f6
[openwrt/svn-archive/archive.git] / package / firewall / files / lib / core_interface.sh
1 # Copyright (C) 2009-2010 OpenWrt.org
2
3 fw_configure_interface() {
4 local iface=$1
5 local action=$2
6 local ifname=$3
7
8 [ "$action" == "add" ] && {
9 local status=$(uci_get_state network "$iface" up 0)
10 [ "$status" == 1 ] || return 0
11 }
12
13 [ -n "$ifname" ] || ifname=$(uci_get_state network "$iface" ifname "$iface")
14 [ "$ifname" == "lo" ] && return 0
15
16 fw_callback pre interface
17
18 fw__do_rules() {
19 local action=$1
20 local zone=$2
21 local chain=zone_${zone}
22 local ifname=$3
23
24 local mode=$(fw_get_family_mode x $zone i)
25
26 fw $action $mode f ${chain}_ACCEPT ACCEPT ^ { -o "$ifname" }
27 fw $action $mode f ${chain}_ACCEPT ACCEPT ^ { -i "$ifname" }
28 fw $action $mode f ${chain}_DROP DROP ^ { -o "$ifname" }
29 fw $action $mode f ${chain}_DROP DROP ^ { -i "$ifname" }
30 fw $action $mode f ${chain}_REJECT reject ^ { -o "$ifname" }
31 fw $action $mode f ${chain}_REJECT reject ^ { -i "$ifname" }
32
33 fw $action $mode n ${chain}_nat MASQUERADE ^ { -o "$ifname" }
34 fw $action $mode f ${chain}_MSSFIX TCPMSS ^ { -o "$ifname" -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu }
35
36 fw $action $mode f input ${chain} $ { -i "$ifname" }
37 fw $action $mode f forward ${chain}_forward $ { -i "$ifname" }
38 fw $action $mode n PREROUTING ${chain}_prerouting ^ { -i "$ifname" }
39 fw $action $mode r PREROUTING ${chain}_notrack ^ { -i "$ifname" }
40 }
41
42 local old_zones old_ifname
43 config_get old_zones core "${iface}_zone"
44 [ -n "$old_zones" ] && {
45 config_get old_ifname core "${iface}_ifname"
46 for z in $old_zones; do
47 fw_log info "removing $iface ($old_ifname) from zone $z"
48 fw__do_rules del $z $old_ifname
49
50 ACTION=remove ZONE="$z" INTERFACE="$iface" DEVICE="$ifname" /sbin/hotplug-call firewall
51 done
52 uci_revert_state firewall core "${iface}_zone"
53 uci_revert_state firewall core "${iface}_ifname"
54 }
55 [ "$action" == del ] && return
56
57 local new_zones
58 load_zone() {
59 fw_config_get_zone "$1"
60 list_contains zone_network "$iface" || return
61
62 fw_log info "adding $iface ($ifname) to zone $zone_name"
63 fw__do_rules add ${zone_name} "$ifname"
64 append new_zones $zone_name
65
66 ACTION=add ZONE="$zone_name" INTERFACE="$iface" DEVICE="$ifname" /sbin/hotplug-call firewall
67 }
68 config_foreach load_zone zone
69
70 uci_set_state firewall core "${iface}_zone" "$new_zones"
71 uci_set_state firewall core "${iface}_ifname" "$ifname"
72
73 fw_sysctl_interface $ifname
74
75 fw_callback post interface
76 }
77
78 fw_sysctl_interface() {
79 local ifname=$1
80 {
81 sysctl -w net.ipv4.conf.${ifname}.accept_redirects=$FW_ACCEPT_REDIRECTS
82 sysctl -w net.ipv6.conf.${ifname}.accept_redirects=$FW_ACCEPT_REDIRECTS
83 sysctl -w net.ipv4.conf.${ifname}.accept_source_route=$FW_ACCEPT_SRC_ROUTE
84 sysctl -w net.ipv6.conf.${ifname}.accept_source_route=$FW_ACCEPT_SRC_ROUTE
85 } >/dev/null 2>/dev/null
86 }
87