e-router 7.4 KB

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