e-router 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. #!/bin/bash -x
  2. ((EUID == 0 )) || { echo "Need root"; exit 1; }
  3. set -euo pipefail
  4. confd=/etc/e-router
  5. source $confd/config
  6. _broken(){
  7. ${iptables} -N BROKENLOGDROP
  8. if $logbroken; then
  9. ${iptables} -A BROKENLOGDROP -j LOG --log-prefix "BROKENLOGDROP TCP: " --log-level 7
  10. fi
  11. ${iptables} -A BROKENLOGDROP -j ENDRESET
  12. ${iptables} -N STRANGELOG
  13. if $logstrange; then
  14. ${iptables} -A STRANGELOG -j LOG --log-prefix "STRANGELOG TCP: " --log-level 7
  15. fi
  16. ${iptables} -N FWSUSPICIOUS
  17. ${iptables} -A FWSUSPICIOUS -p tcp --sport 0:19 -j BROKENLOGDROP
  18. ${iptables} -A FWSUSPICIOUS -p tcp --dport 0:19 -j BROKENLOGDROP
  19. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL ACK -m conntrack --ctstate ESTABLISHED -j RETURN
  20. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL ACK -m conntrack --ctstate NEW,RELATED -j BROKENLOGDROP
  21. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL PSH,ACK -m conntrack --ctstate ESTABLISHED -j RETURN
  22. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL PSH,ACK -m conntrack --ctstate NEW -j RETURN
  23. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL PSH,ACK -m conntrack --ctstate RELATED -j BROKENLOGDROP
  24. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL NONE -j BROKENLOGDROP
  25. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL ALL -j BROKENLOGDROP
  26. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags SYN,FIN SYN,FIN -j BROKENLOGDROP
  27. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags SYN,RST SYN,RST -j BROKENLOGDROP
  28. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags RST,FIN RST,FIN -j BROKENLOGDROP
  29. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags SYN,URG SYN,URG -j BROKENLOGDROP
  30. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL SYN,PSH -j BROKENLOGDROP
  31. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL SYN,ACK,PSH -j BROKENLOGDROP
  32. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ACK,FIN FIN -j BROKENLOGDROP
  33. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ACK,PSH PSH -j BROKENLOGDROP
  34. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ACK,URG URG -j BROKENLOGDROP
  35. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL RST -m conntrack --ctstate ESTABLISHED -j RETURN
  36. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL RST -m conntrack --ctstate NEW,RELATED -j BROKENLOGDROP
  37. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags SYN,ACK NONE -j BROKENLOGDROP
  38. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL SYN -m conntrack --ctstate NEW -j RETURN
  39. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL SYN -m conntrack --ctstate RELATED -j RETURN
  40. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL SYN -m conntrack --ctstate ESTABLISHED -j BROKENLOGDROP
  41. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL SYN,ACK -m conntrack --ctstate ESTABLISHED -j RETURN
  42. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL SYN,ACK -m conntrack --ctstate NEW,RELATED -j BROKENLOGDROP
  43. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL FIN,ACK -m conntrack --ctstate ESTABLISHED -j RETURN
  44. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL FIN,ACK -m conntrack --ctstate NEW,RELATED -j BROKENLOGDROP
  45. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL RST,ACK -m conntrack --ctstate ESTABLISHED -j RETURN
  46. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL RST,ACK -m conntrack --ctstate NEW -j RETURN
  47. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL RST,ACK -m conntrack --ctstate RELATED -j BROKENLOGDROP
  48. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL ACK,PSH,RST -m conntrack --ctstate ESTABLISHED -j RETURN
  49. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL ACK,PSH,RST -m conntrack --ctstate NEW,RELATED -j BROKENLOGDROP
  50. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL FIN,PSH,ACK -m conntrack --ctstate ESTABLISHED -j RETURN
  51. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL FIN,PSH,ACK -m conntrack --ctstate NEW,RELATED -j BROKENLOGDROP
  52. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL RST,ACK,PSH -j STRANGELOG
  53. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL RST,ACK,URG -j STRANGELOG
  54. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL RST,ACK,PSH,URG -j STRANGELOG
  55. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL FIN,PSH,ACK,URG -j STRANGELOG
  56. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL ACK,URG -j STRANGELOG
  57. ${iptables} -A FWSUSPICIOUS -p tcp --tcp-flags ALL ACK,URG,FIN -j STRANGELOG
  58. }
  59. _droplog() {
  60. ${iptables} -N ${1}LOGDROP
  61. if $debugtcp; then
  62. ${iptables} -A ${1}LOGDROP -p tcp -j LOG --log-prefix "${1}LOGDROP TCP: " --log-level 7
  63. fi
  64. if $debugudp; then
  65. ${iptables} -A ${1}LOGDROP -p udp -j LOG --log-prefix "${1}LOGDROP UDP: " --log-level 7
  66. fi
  67. if $debugicmp; then
  68. ${iptables} -A ${1}LOGDROP -p icmp -j LOG --log-prefix "${1}LOGDROP ICMP: " --log-level 7
  69. fi
  70. }
  71. _forward() {
  72. while read -r ip public private ; do
  73. [[ "$ip" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}$ ]] || continue
  74. [[ "$public" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  75. [[ "$private" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  76. if [[ "$public" =~ ^[0-9]{1,}$ ]] ; then
  77. ${iptables} -A PREROUTING -t nat -i ${wan} -p tcp --dport ${public} -j DNAT --to ${ip}:${private}
  78. ${iptables} -A FORWARD -i ${wan} -p tcp --syn -d ${ip} --dport ${private} -m conntrack --ctstate NEW --ctproto TCP -j ACCEPT
  79. else
  80. ${iptables} -A PREROUTING -t nat -i ${wan} -p tcp --dport ${public} -j DNAT --to ${ip}
  81. ${iptables} -A FORWARD -i ${wan} -p tcp --syn -d ${ip} --dport ${public} -m conntrack --ctstate NEW --ctproto TCP -j ACCEPT
  82. fi
  83. done < $confd/FORWARD.tcp
  84. while read -r ip public private ; do
  85. [[ "$ip" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}$ ]] || continue
  86. [[ "$public" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  87. [[ "$private" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  88. if [[ "$public" =~ ^[0-9]{1,}$ ]] ; then
  89. ${iptables} -A PREROUTING -t nat -i ${wan} -p udp --dport ${public} -j DNAT --to ${ip}:${private}
  90. ${iptables} -A FORWARD -i ${wan} -p udp -d ${ip} --dport ${private} -m conntrack --ctstate NEW --ctproto UDP -j ACCEPT
  91. else
  92. ${iptables} -A PREROUTING -t nat -i ${wan} -p udp --dport ${public} -j DNAT --to ${ip}
  93. ${iptables} -A FORWARD -i ${wan} -p udp -d ${ip} --dport ${public} -m conntrack --ctstate NEW --ctproto UDP -j ACCEPT
  94. fi
  95. done < $confd/FORWARD.udp
  96. if $logforward ; then
  97. ${iptables} -A FORWARD -j FORWARDLOGDROP
  98. fi
  99. }
  100. _init(){
  101. /usr/lib/systemd/scripts/iptables-flush
  102. ${iptables} -P INPUT DROP
  103. ${iptables} -P FORWARD DROP
  104. ${iptables} -P OUTPUT ACCEPT
  105. ${iptables} -N ENDRESET
  106. ${iptables} -A ENDRESET -p tcp -j REJECT --reject-with tcp-reset
  107. ${iptables} -A ENDRESET -p udp -j REJECT --reject-with icmp-port-unreachable
  108. ${iptables} -A ENDRESET -j REJECT --reject-with icmp-proto-unreachable
  109. }
  110. _whitenets() {
  111. ipset create -! $whiteset hash:net hashsize 4096 timeout $whitettl maxelem $whitemaxelems
  112. while read -r net ; do
  113. [[ "$net" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}/[0-9]{1,}$ ]] || continue
  114. ipset -! add $whiteset $net timeout 0
  115. done < $confd/WHITE.nets
  116. }
  117. base() {
  118. _init
  119. ${iptables} -A INPUT -i lo -j ACCEPT
  120. if $logbroken; then
  121. _broken
  122. ${iptables} -A INPUT -i ${wan} -p tcp -j FWSUSPICIOUS
  123. fi
  124. ${iptables} -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  125. if $loginvalid; then
  126. _droplog "INVALID"
  127. ${iptables} -A INPUT -m conntrack --ctstate INVALID -j INVALIDLOGDROP
  128. fi
  129. ${iptables} -A INPUT -m conntrack --ctstate INVALID -j DROP
  130. }
  131. cast() {
  132. ${iptables} -N FWCAST
  133. if $logcast; then
  134. ${iptables} -A FWCAST -m pkttype --pkt-type multicast -m conntrack --ctstate NEW -j LOG --log-prefix "CASTLOG MULTI: " --log-level 7
  135. ${iptables} -A FWCAST -m pkttype --pkt-type broadcast -m conntrack --ctstate NEW -j LOG --log-prefix "CASTLOG BROAD: " --log-level 7
  136. fi
  137. ${iptables} -A FWCAST -m pkttype --pkt-type multicast -m conntrack --ctstate NEW -j ACCEPT
  138. ${iptables} -A FWCAST -m pkttype --pkt-type broadcast -m conntrack --ctstate NEW -j ACCEPT
  139. ${iptables} -A INPUT -i ${wan} -j FWCAST
  140. }
  141. lan() {
  142. if $logforward ; then
  143. _droplog "FORWARD"
  144. fi
  145. ${iptables} -A INPUT -i ${eth0} -j ACCEPT
  146. ${iptables} -t nat -A POSTROUTING -o ${wan} -s ${locnet} -j MASQUERADE
  147. ${iptables} -A FORWARD -i ${eth0} -o ${wan} -j ACCEPT
  148. if $logbroken; then
  149. ${iptables} -A FORWARD -i ${wan} -p tcp -j FWSUSPICIOUS
  150. fi
  151. ${iptables} -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  152. if $loginvalid; then
  153. _droplog "FWDINVALID"
  154. ${iptables} -A FORWARD -m conntrack --ctstate INVALID -j FWDINVALIDLOGDROP
  155. fi
  156. ${iptables} -A FORWARD -m conntrack --ctstate INVALID -j DROP
  157. _forward
  158. }
  159. badips() {
  160. ipset create -! $banset hash:ip hashsize 4096 timeout $banttl maxelem $badmaxelems
  161. ${iptables} -N FWBAD
  162. if $logbad ; then
  163. _droplog "BAD"
  164. ${iptables} -A FWBAD -i ${wan} -p udp -m set --match-set $banset src -m conntrack --ctstate NEW --ctproto UDP -j BADLOGDROP
  165. ${iptables} -A FWBAD -i ${wan} -p tcp -m set --match-set $banset src -m conntrack --ctstate NEW --ctproto TCP -j BADLOGDROP
  166. fi
  167. ${iptables} -A FWBAD -i ${wan} -p udp -m set --match-set $banset src -m conntrack --ctstate NEW --ctproto UDP -j ENDRESET
  168. ${iptables} -A FWBAD -i ${wan} -p tcp -m set --match-set $banset src -m conntrack --ctstate NEW --ctproto TCP -j ENDRESET
  169. ${iptables} -A INPUT -j FWBAD
  170. }
  171. scanips() {
  172. ipset create -! $scanset hash:ip hashsize 4096 timeout $scanttl maxelem $scanmaxelems forceadd
  173. ${iptables} -N FWSCAN
  174. ${iptables} -A FWSCAN -i ${wan} -p udp -j SET --add-set $scanset src --exist --timeout $scanttl
  175. ${iptables} -A FWSCAN -i ${wan} -p tcp -j SET --add-set $scanset src --exist --timeout $scanttl
  176. if $logscan ; then
  177. _droplog "SCAN"
  178. ${iptables} -A FWSCAN -i ${wan} -p udp -m set --match-set $scanset src -m conntrack --ctstate NEW --ctproto UDP -j SCANLOGDROP
  179. ${iptables} -A FWSCAN -i ${wan} -p tcp -m set --match-set $scanset src -m conntrack --ctstate NEW --ctproto TCP -j SCANLOGDROP
  180. fi
  181. ${iptables} -A FWSCAN -i ${wan} -p udp -m set --match-set $scanset src -m conntrack --ctstate NEW --ctproto UDP -j ENDRESET
  182. ${iptables} -A FWSCAN -i ${wan} -p tcp -m set --match-set $scanset src -m conntrack --ctstate NEW --ctproto TCP -j ENDRESET
  183. ${iptables} -A BROKENLOGDROP -j FWSCAN
  184. ${iptables} -D BROKENLOGDROP -j ENDRESET
  185. ${iptables} -A BROKENLOGDROP -j ENDRESET
  186. ${iptables} -A INPUT -j FWSCAN
  187. }
  188. white() {
  189. _whitenets
  190. ${iptables} -N FWFILTERED
  191. while read -r port ; do
  192. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  193. ${iptables} -A FWFILTERED -p udp -m conntrack --ctstate NEW --ctproto UDP --dport $port -j ACCEPT
  194. done < $confd/WHITE.udp
  195. while read -r port ; do
  196. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  197. ${iptables} -A FWFILTERED -p tcp -m conntrack --ctstate NEW --ctproto TCP --dport $port -j ACCEPT
  198. done < $confd/WHITE.tcp
  199. ${iptables} -A INPUT -i ${wan} -p udp -m set --match-set $whiteset src -m conntrack --ctstate NEW --ctproto UDP -j FWFILTERED
  200. ${iptables} -A INPUT -i ${wan} -p tcp --syn -m set --match-set $whiteset src -m conntrack --ctstate NEW --ctproto TCP -j FWFILTERED
  201. ${iptables} -A INPUT -i ${wan} -p icmp --icmp-type 8 -m set --match-set $whiteset src -m conntrack --ctstate NEW --ctproto ICMP -j ACCEPT
  202. }
  203. public() {
  204. ${iptables} -N FWPUBLIC
  205. while read -r port ; do
  206. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  207. ${iptables} -A FWPUBLIC -p udp -m conntrack --ctstate NEW --ctproto UDP --dport $port -j ACCEPT
  208. done < $confd/PUBLIC.udp
  209. while read -r port ; do
  210. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  211. ${iptables} -A FWPUBLIC -p tcp -m conntrack --ctstate NEW --ctproto TCP --dport $port -j ACCEPT
  212. done < $confd/PUBLIC.tcp
  213. ${iptables} -A INPUT -i ${wan} -p udp -m conntrack --ctstate NEW --ctproto UDP -j FWPUBLIC
  214. ${iptables} -A INPUT -i ${wan} -p tcp --syn -m conntrack --ctstate NEW --ctproto TCP -j FWPUBLIC
  215. }
  216. final(){
  217. if $loginput; then
  218. _droplog "FINAL"
  219. ${iptables} -A INPUT -j FINALLOGDROP
  220. fi
  221. ${iptables} -A INPUT -i ${wan} -j ENDRESET
  222. }
  223. main () {
  224. for hook in "${hooks[@]}" ; do
  225. $hook
  226. done
  227. }
  228. main