core_interface.sh 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. # Copyright (C) 2009-2010 OpenWrt.org
  2. fw_configure_interface() {
  3. local iface=$1
  4. local action=$2
  5. local ifname=$3
  6. local aliasnet=$4
  7. [ "$action" == "add" ] && {
  8. local status=$(uci_get_state network "$iface" up 0)
  9. [ "$status" == 1 ] || [ -n "$aliasnet" ] || return 0
  10. }
  11. [ -n "$ifname" ] || {
  12. ifname=$(uci_get_state network "$iface" ifname "$iface")
  13. ifname="${ifname%%:*}"
  14. }
  15. [ "$ifname" == "lo" ] && return 0
  16. fw_callback pre interface
  17. fw__do_rules() {
  18. local action=$1
  19. local zone=$2
  20. local chain=zone_${zone}
  21. local ifname=$3
  22. local subnet=$4
  23. local inet onet
  24. local mode=$(fw_get_family_mode x $zone i)
  25. case "$mode/$subnet" in
  26. # Zone supports v6 only or dual, need v6
  27. 6/*:*|i/*:*)
  28. inet="{ -s $subnet -d ::/0 }"
  29. onet="{ -s ::/0 -d $subnet }"
  30. mode=6
  31. ;;
  32. # Zone supports v4 only or dual, need v4
  33. 4/*.*.*.*|i/*.*.*.*)
  34. inet="{ -s $subnet -d 0.0.0.0/0 }"
  35. onet="{ -s 0.0.0.0/0 -d $subnet }"
  36. mode=4
  37. ;;
  38. # Need v6 while zone is v4
  39. */*:*) fw_log info "zone $zone does not support IPv6 address family, skipping"; return ;;
  40. # Need v4 while zone is v6
  41. */*.*) fw_log info "zone $zone does not support IPv4 address family, skipping"; return ;;
  42. esac
  43. fw $action $mode f ${chain}_ACCEPT ACCEPT ^ $onet { -o "$ifname" }
  44. fw $action $mode f ${chain}_ACCEPT ACCEPT ^ $inet { -i "$ifname" }
  45. fw $action $mode f ${chain}_DROP DROP ^ $onet { -o "$ifname" }
  46. fw $action $mode f ${chain}_DROP DROP ^ $inet { -i "$ifname" }
  47. fw $action $mode f ${chain}_REJECT reject ^ $onet { -o "$ifname" }
  48. fw $action $mode f ${chain}_REJECT reject ^ $inet { -i "$ifname" }
  49. fw $action $mode n ${chain}_nat MASQUERADE ^ $onet { -o "$ifname" }
  50. fw $action $mode f ${chain}_MSSFIX TCPMSS ^ $onet { -o "$ifname" -p tcp --tcp-flags SYN,RST SYN --clamp-mss-to-pmtu }
  51. fw $action $mode f input ${chain} $ $inet { -i "$ifname" }
  52. fw $action $mode f forward ${chain}_forward $ $inet { -i "$ifname" }
  53. fw $action $mode n PREROUTING ${chain}_prerouting ^ $inet { -i "$ifname" }
  54. fw $action $mode r PREROUTING ${chain}_notrack ^ $inet { -i "$ifname" }
  55. }
  56. local old_zones old_ifname old_subnets
  57. config_get old_zones core "${iface}_zone"
  58. [ -n "$old_zones" ] && {
  59. config_get old_ifname core "${iface}_ifname"
  60. config_get old_subnets core "${iface}_subnets"
  61. local z
  62. for z in $old_zones; do
  63. local n
  64. for n in ${old_subnets:-""}; do
  65. fw_log info "removing $iface ($old_ifname${n:+ alias $n}) from zone $z"
  66. fw__do_rules del $z $old_ifname $n
  67. done
  68. [ -n "$old_subnets" ] || ACTION=remove ZONE="$z" INTERFACE="$iface" DEVICE="$ifname" /sbin/hotplug-call firewall
  69. done
  70. local old_aliases
  71. config_get old_aliases core "${iface}_aliases"
  72. local a
  73. for a in $old_aliases; do
  74. fw_configure_interface "$a" del "$old_ifname"
  75. done
  76. uci_revert_state firewall core "${iface}_zone"
  77. uci_revert_state firewall core "${iface}_ifname"
  78. uci_revert_state firewall core "${iface}_subnets"
  79. uci_revert_state firewall core "${iface}_aliases"
  80. }
  81. [ "$action" == del ] && return
  82. local new_zones=
  83. load_zone() {
  84. fw_config_get_zone "$1"
  85. list_contains zone_network "$iface" || return
  86. fw_log info "adding $iface ($ifname${aliasnet:+ alias $aliasnet}) to zone $zone_name"
  87. fw__do_rules add ${zone_name} "$ifname" $aliasnet
  88. append new_zones $zone_name
  89. [ -n "$aliasnet" ] || ACTION=add ZONE="$zone_name" INTERFACE="$iface" DEVICE="$ifname" /sbin/hotplug-call firewall
  90. }
  91. config_foreach load_zone zone
  92. [ -z "$aliasnet" ] && {
  93. local aliases
  94. config_get aliases "$iface" aliases
  95. local a
  96. for a in $aliases; do
  97. local ipaddr netmask ip6addr
  98. config_get ipaddr "$a" ipaddr
  99. config_get netmask "$a" netmask
  100. config_get ip6addr "$a" ip6addr
  101. [ -n "$ipaddr" ] && fw_configure_interface "$a" add "" "$ipaddr${netmask:+/$netmask}"
  102. [ -n "$ip6addr" ] && fw_configure_interface "$a" add "" "$ip6addr"
  103. done
  104. fw_sysctl_interface $ifname
  105. fw_callback post interface
  106. uci_set_state firewall core "${iface}_aliases" "$aliases"
  107. } || {
  108. local subnets=
  109. config_get subnets core "${iface}_subnets"
  110. append subnets "$aliasnet"
  111. config_set core "${iface}_subnets" "$subnets"
  112. uci_set_state firewall core "${iface}_subnets" "$subnets"
  113. }
  114. uci_set_state firewall core "${iface}_zone" "$new_zones"
  115. uci_set_state firewall core "${iface}_ifname" "$ifname"
  116. }
  117. fw_sysctl_interface() {
  118. local ifname=$1
  119. {
  120. sysctl -w net.ipv4.conf.${ifname}.accept_redirects=$FW_ACCEPT_REDIRECTS
  121. sysctl -w net.ipv6.conf.${ifname}.accept_redirects=$FW_ACCEPT_REDIRECTS
  122. sysctl -w net.ipv4.conf.${ifname}.accept_source_route=$FW_ACCEPT_SRC_ROUTE
  123. sysctl -w net.ipv6.conf.${ifname}.accept_source_route=$FW_ACCEPT_SRC_ROUTE
  124. } >/dev/null 2>/dev/null
  125. }