core.sh 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. # Copyright (C) 2009-2010 OpenWrt.org
  2. FW_LIBDIR=${FW_LIBDIR:-/lib/firewall}
  3. . $FW_LIBDIR/fw.sh
  4. include /lib/network
  5. fw_start() {
  6. fw_init
  7. FW_DEFAULTS_APPLIED=
  8. fw_is_loaded && {
  9. echo "firewall already loaded" >&2
  10. exit 1
  11. }
  12. uci_set_state firewall core "" firewall_state
  13. fw_clear DROP
  14. fw_callback pre core
  15. echo "Loading defaults"
  16. fw_config_once fw_load_defaults defaults
  17. echo "Loading zones"
  18. config_foreach fw_load_zone zone
  19. echo "Loading forwardings"
  20. config_foreach fw_load_forwarding forwarding
  21. echo "Loading rules"
  22. config_foreach fw_load_rule rule
  23. echo "Loading redirects"
  24. config_foreach fw_load_redirect redirect
  25. echo "Loading includes"
  26. config_foreach fw_load_include include
  27. [ -z "$FW_NOTRACK_DISABLED" ] && {
  28. echo "Optimizing conntrack"
  29. config_foreach fw_load_notrack_zone zone
  30. }
  31. echo "Loading interfaces"
  32. config_foreach fw_configure_interface interface add
  33. fw_callback post core
  34. uci_set_state firewall core zones "$FW_ZONES"
  35. uci_set_state firewall core loaded 1
  36. }
  37. fw_stop() {
  38. fw_init
  39. fw_callback pre stop
  40. local z n i
  41. config_get z core zones
  42. for z in $z; do
  43. config_get n core "${z}_networks"
  44. for n in $n; do
  45. config_get i core "${n}_ifname"
  46. [ -n "$i" ] && env -i ACTION=remove ZONE="$z" \
  47. INTERFACE="$n" DEVICE="$i" /sbin/hotplug-call firewall
  48. done
  49. config_get i core "${z}_tcpmss"
  50. [ "$i" == 1 ] && {
  51. fw del i m FORWARD zone_${z}_MSSFIX
  52. fw del i m zone_${z}_MSSFIX
  53. }
  54. done
  55. fw_clear ACCEPT
  56. fw_callback post stop
  57. uci_revert_state firewall
  58. config_clear
  59. local h
  60. for h in $FW_HOOKS; do unset $h; done
  61. unset FW_HOOKS
  62. unset FW_INITIALIZED
  63. }
  64. fw_restart() {
  65. fw_stop
  66. fw_start
  67. }
  68. fw_reload() {
  69. fw_restart
  70. }
  71. fw_is_loaded() {
  72. local bool=$(uci_get_state firewall.core.loaded)
  73. return $((! ${bool:-0}))
  74. }
  75. fw_die() {
  76. echo "Error:" "$@" >&2
  77. fw_log error "$@"
  78. fw_stop
  79. exit 1
  80. }
  81. fw_log() {
  82. local level="$1"
  83. [ -n "$2" ] && shift || level=notice
  84. [ "$level" != error ] || echo "Error: $@" >&2
  85. logger -t firewall -p user.$level "$@"
  86. }
  87. fw_init() {
  88. [ -z "$FW_INITIALIZED" ] || return 0
  89. . $FW_LIBDIR/config.sh
  90. scan_interfaces
  91. fw_config_append firewall
  92. local hooks="core stop defaults zone notrack synflood"
  93. local file lib hk pp
  94. for file in $FW_LIBDIR/core_*.sh; do
  95. . $file
  96. hk=$(basename $file .sh)
  97. hk=${hk#core_}
  98. append hooks $hk
  99. done
  100. for file in $FW_LIBDIR/*.sh; do
  101. lib=$(basename $file .sh)
  102. lib=${lib##[0-9][0-9]_}
  103. case $lib in
  104. core*|fw|config|uci_firewall) continue ;;
  105. esac
  106. . $file
  107. for hk in $hooks; do
  108. for pp in pre post; do
  109. type ${lib}_${pp}_${hk}_cb >/dev/null && {
  110. append FW_CB_${pp}_${hk} ${lib}
  111. append FW_HOOKS FW_CB_${pp}_${hk}
  112. }
  113. done
  114. done
  115. done
  116. fw_callback post init
  117. FW_INITIALIZED=1
  118. return 0
  119. }