e-router 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. #!/bin/bash -x
  2. ((EUID == 0 )) || { echo "Need root"; exit 1; }
  3. set -euo pipefail
  4. confd=/etc/e-router
  5. iptables=${IPTABLESCMD:-iptables}
  6. source $confd/config
  7. set_defaults() {
  8. /usr/lib/systemd/scripts/iptables-flush
  9. ${iptables} -P FORWARD DROP
  10. ${iptables} -P OUTPUT ACCEPT
  11. ${iptables} -P INPUT DROP
  12. }
  13. setup_final(){
  14. if $loginput ; then
  15. setup_wandroplog
  16. ${iptables} -A INPUT -j WAN-LOG-DROP
  17. else
  18. ${iptables} -A INPUT -j DROP
  19. fi
  20. }
  21. setup_wandroplog() {
  22. ${iptables} -N WAN-LOG-DROP
  23. if $debugtcp; then
  24. ${iptables} -A WAN-LOG-DROP -p tcp -j LOG --log-prefix "WAN-LOG-DROP TCP: " --log-level 7
  25. ${iptables} -A WAN-LOG-DROP -p tcp -j REJECT --reject-with tcp-reset
  26. fi
  27. if $debugudp; then
  28. ${iptables} -A WAN-LOG-DROP -p udp -j LOG --log-prefix "WAN-LOG-DROP UDP: " --log-level 7
  29. ${iptables} -A WAN-LOG-DROP -p udp -j REJECT --reject-with icmp-port-unreachable
  30. fi
  31. if $debugicmp; then
  32. ${iptables} -A WAN-LOG-DROP -p icmp -j LOG --log-prefix "WAN-LOG-DROP ICMP: " --log-level 7
  33. ${iptables} -A WAN-LOG-DROP -j REJECT --reject-with icmp-proto-unreachable
  34. fi
  35. }
  36. setup_fordroplog() {
  37. ${iptables} -N FORWARD-LOG-DROP
  38. if $debugtcp; then
  39. ${iptables} -A FORWARD-LOG-DROP -p tcp -j LOG --log-prefix "FORWARD-LOG-DROP TCP: " --log-level 7
  40. ${iptables} -A FORWARD-LOG-DROP -p tcp -j REJECT --reject-with tcp-reset
  41. fi
  42. if $debugudp; then
  43. ${iptables} -A FORWARD-LOG-DROP -p udp -j LOG --log-prefix "FORWARD-LOG-DROP UDP: " --log-level 7
  44. ${iptables} -A FORWARD-LOG-DROP -p udp -j REJECT --reject-with icmp-port-unreachable
  45. fi
  46. if $debugicmp; then
  47. ${iptables} -A FORWARD-LOG-DROP -p icmp -j LOG --log-prefix "FORWARD-LOG-DROP ICMP: " --log-level 7
  48. ${iptables} -A FORWARD-LOG-DROP -j REJECT --reject-with icmp-proto-unreachable
  49. fi
  50. }
  51. setup_nat() {
  52. ${iptables} -t nat -A POSTROUTING -o ${wan} -s ${locnet} -j MASQUERADE
  53. }
  54. setup_forward() {
  55. ${iptables} -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  56. ${iptables} -A FORWARD -i ${eth0} -o ${wan} -j ACCEPT
  57. while read -r ip public private ; do
  58. [[ "$ip" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}$ ]] || continue
  59. [[ "$public" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  60. [[ "$private" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  61. if [[ "$public" =~ ^[0-9]{1,}$ ]] ; then
  62. ${iptables} -A PREROUTING -t nat -i ${wan} -p tcp --dport ${public} -j DNAT --to ${ip}:${private}
  63. ${iptables} -A FORWARD -i ${wan} -p tcp --syn -d ${ip} --dport ${private} -m conntrack --ctstate NEW --ctproto TCP -j ACCEPT
  64. else
  65. ${iptables} -A PREROUTING -t nat -i ${wan} -p tcp --dport ${public} -j DNAT --to ${ip}
  66. ${iptables} -A FORWARD -i ${wan} -p tcp --syn -d ${ip} --dport ${public} -m conntrack --ctstate NEW --ctproto TCP -j ACCEPT
  67. fi
  68. done < $confd/FORWARD.tcp
  69. while read -r ip public private ; do
  70. [[ "$ip" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}$ ]] || continue
  71. [[ "$public" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  72. [[ "$private" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  73. if [[ "$public" =~ ^[0-9]{1,}$ ]] ; then
  74. ${iptables} -A PREROUTING -t nat -i ${wan} -p udp --dport ${public} -j DNAT --to ${ip}:${private}
  75. ${iptables} -A FORWARD -i ${wan} -p udp -d ${ip} --dport ${private} -m conntrack --ctstate NEW --ctproto UDP -j ACCEPT
  76. else
  77. ${iptables} -A PREROUTING -t nat -i ${wan} -p udp --dport ${public} -j DNAT --to ${ip}
  78. ${iptables} -A FORWARD -i ${wan} -p udp -d ${ip} --dport ${public} -m conntrack --ctstate NEW --ctproto UDP -j ACCEPT
  79. fi
  80. done < $confd/FORWARD.udp
  81. if $logforward ; then
  82. setup_fordroplog
  83. ${iptables} -A FORWARD -j FORWARD-LOG-DROP
  84. else
  85. ${iptables} -A FORWARD -j DROP
  86. fi
  87. }
  88. setup_base() {
  89. ${iptables} -A INPUT -i lo -j ACCEPT
  90. ${iptables} -A INPUT -i ${eth0} -j ACCEPT
  91. ${iptables} -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  92. ${iptables} -A INPUT -m conntrack --ctstate INVALID -j DROP
  93. }
  94. setup_whitenets() {
  95. ipset create -! $whiteset hash:net hashsize 4096 timeout $whitettl maxelem $whitemaxelems
  96. while read -r net ; do
  97. [[ "$net" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}/[0-9]{1,}$ ]] || continue
  98. ipset -! add $whiteset $net timeout 0
  99. done < $confd/WHITE.nets
  100. }
  101. setup_badips() {
  102. ipset create -! $banset hash:ip hashsize 4096 timeout $banttl maxelem $badmaxelems
  103. ${iptables} -A INPUT -i ${wan} -p udp -m set --match-set $banset src -m conntrack --ctstate NEW --ctproto UDP -j REJECT --reject-with icmp-port-unreachable
  104. ${iptables} -A INPUT -i ${wan} -p tcp -m set --match-set $banset src -m conntrack --ctstate NEW --ctproto TCP -j REJECT --reject-with tcp-reset
  105. }
  106. setup_scanips() {
  107. ipset create -! $scanset hash:ip hashsize 4096 timeout $scanttl maxelem $scanmaxelems
  108. ${iptables} -A INPUT -i ${wan} -p udp -m set --match-set $scanset src -m conntrack --ctstate NEW --ctproto UDP -j REJECT --reject-with icmp-port-unreachable
  109. ${iptables} -A INPUT -i ${wan} -p tcp -m set --match-set $scanset src -m conntrack --ctstate NEW --ctproto TCP -j REJECT --reject-with tcp-reset
  110. }
  111. setup_white() {
  112. ${iptables} -N FW-FILTERED
  113. while read -r port ; do
  114. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  115. ${iptables} -A FW-FILTERED -p udp -m conntrack --ctstate NEW --ctproto UDP --dport $port -j ACCEPT
  116. done < $confd/WHITE.udp
  117. while read -r port ; do
  118. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  119. ${iptables} -A FW-FILTERED -p tcp -m conntrack --ctstate NEW --ctproto TCP --dport $port -j ACCEPT
  120. done < $confd/WHITE.tcp
  121. ${iptables} -A INPUT -i ${wan} -p udp -m set --match-set $whiteset src -m conntrack --ctstate NEW --ctproto UDP -j FW-FILTERED
  122. ${iptables} -A INPUT -i ${wan} -p tcp -m set --match-set $whiteset src -m conntrack --ctstate NEW --ctproto TCP -j FW-FILTERED
  123. ${iptables} -A INPUT -i ${wan} -p icmp --icmp-type 8 -m set --match-set $whiteset src -m conntrack --ctstate NEW --ctproto ICMP -j ACCEPT
  124. }
  125. setup_public() {
  126. ${iptables} -N FW-PUBLIC
  127. while read -r port ; do
  128. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  129. ${iptables} -A FW-PUBLIC -p udp -m conntrack --ctstate NEW --ctproto UDP --dport $port -j ACCEPT
  130. done < $confd/PUBLIC.udp
  131. while read -r port ; do
  132. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  133. ${iptables} -A FW-PUBLIC -p tcp -m conntrack --ctstate NEW --ctproto TCP --dport $port -j ACCEPT
  134. done < $confd/PUBLIC.tcp
  135. ${iptables} -A INPUT -i ${wan} -p udp -m conntrack --ctstate NEW --ctproto UDP -j FW-PUBLIC
  136. ${iptables} -A INPUT -i ${wan} -p tcp -m conntrack --ctstate NEW --ctproto TCP -j FW-PUBLIC
  137. }
  138. setup_cast() {
  139. ${iptables} -N FW-CAST
  140. ${iptables} -A FW-CAST -m pkttype --pkt-type broadcast -j ACCEPT
  141. ${iptables} -A FW-CAST -m pkttype --pkt-type multicast -j ACCEPT
  142. ${iptables} -A INPUT -i ${wan} -j FW-CAST
  143. }
  144. main () {
  145. defaultHooks="set_defaults setup_whitenets setup_nat setup_forward setup_base setup_badips setup_white setup_public setup_scanips setup_cast setup_final"
  146. hookarray=(${hooks:-$defaultHooks})
  147. for hook in "${hookarray[@]}" ; do
  148. $hook
  149. done
  150. }
  151. main