de5fd9a0ea38a54be82c9de767236b832feeb2f6
[librecmc/librecmc.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