e-router 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  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. base() {
  7. /usr/lib/systemd/scripts/iptables-flush
  8. ${iptables} -P INPUT DROP
  9. ${iptables} -P FORWARD DROP
  10. ${iptables} -P OUTPUT ACCEPT
  11. ${iptables} -A INPUT -i lo -j ACCEPT
  12. ${iptables} -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  13. ${iptables} -A INPUT -m conntrack --ctstate INVALID -j DROP
  14. ${iptables} -N END-RESET
  15. ${iptables} -A END-RESET -p tcp -j REJECT --reject-with tcp-reset
  16. ${iptables} -A END-RESET -p udp -j REJECT --reject-with icmp-port-unreachable
  17. ${iptables} -A END-RESET -j REJECT --reject-with icmp-proto-unreachable
  18. }
  19. final(){
  20. if $loginput; then
  21. droplog "FINAL" "INPUT"
  22. fi
  23. }
  24. droplog() {
  25. ${iptables} -N ${1}-LOG-DROP
  26. if $debugtcp; then
  27. ${iptables} -A ${1}-LOG-DROP -p tcp -j LOG --log-prefix "${1}-LOG-DROP TCP: " --log-level 7
  28. fi
  29. if $debugudp; then
  30. ${iptables} -A ${1}-LOG-DROP -p udp -j LOG --log-prefix "${1}-LOG-DROP UDP: " --log-level 7
  31. fi
  32. if $debugicmp; then
  33. ${iptables} -A ${1}-LOG-DROP -p icmp -j LOG --log-prefix "${1}-LOG-DROP ICMP: " --log-level 7
  34. fi
  35. ${iptables} -A ${2} -j ${1}-LOG-DROP
  36. }
  37. forward() {
  38. while read -r ip public private ; do
  39. [[ "$ip" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}$ ]] || continue
  40. [[ "$public" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  41. [[ "$private" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  42. if [[ "$public" =~ ^[0-9]{1,}$ ]] ; then
  43. ${iptables} -A PREROUTING -t nat -i ${wan} -p tcp --dport ${public} -j DNAT --to ${ip}:${private}
  44. ${iptables} -A FORWARD -i ${wan} -p tcp --syn -d ${ip} --dport ${private} -m conntrack --ctstate NEW --ctproto TCP -j ACCEPT
  45. else
  46. ${iptables} -A PREROUTING -t nat -i ${wan} -p tcp --dport ${public} -j DNAT --to ${ip}
  47. ${iptables} -A FORWARD -i ${wan} -p tcp --syn -d ${ip} --dport ${public} -m conntrack --ctstate NEW --ctproto TCP -j ACCEPT
  48. fi
  49. done < $confd/FORWARD.tcp
  50. while read -r ip public private ; do
  51. [[ "$ip" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}$ ]] || continue
  52. [[ "$public" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  53. [[ "$private" =~ ^[0-9]{1,}|[0-9]{1,}:[0-9]{1,}$ ]] || continue
  54. if [[ "$public" =~ ^[0-9]{1,}$ ]] ; then
  55. ${iptables} -A PREROUTING -t nat -i ${wan} -p udp --dport ${public} -j DNAT --to ${ip}:${private}
  56. ${iptables} -A FORWARD -i ${wan} -p udp -d ${ip} --dport ${private} -m conntrack --ctstate NEW --ctproto UDP -j ACCEPT
  57. else
  58. ${iptables} -A PREROUTING -t nat -i ${wan} -p udp --dport ${public} -j DNAT --to ${ip}
  59. ${iptables} -A FORWARD -i ${wan} -p udp -d ${ip} --dport ${public} -m conntrack --ctstate NEW --ctproto UDP -j ACCEPT
  60. fi
  61. done < $confd/FORWARD.udp
  62. if $logforward ; then
  63. droplog "FORWARD" "FORWARD"
  64. fi
  65. ${iptables} -A FORWARD -j END-RESET
  66. }
  67. lan() {
  68. ${iptables} -A INPUT -i ${eth0} -j ACCEPT
  69. ${iptables} -t nat -A POSTROUTING -o ${wan} -s ${locnet} -j MASQUERADE
  70. ${iptables} -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  71. ${iptables} -A FORWARD -i ${eth0} -o ${wan} -j ACCEPT
  72. }
  73. whitenets() {
  74. ipset create -! $whiteset hash:net hashsize 4096 timeout $whitettl maxelem $whitemaxelems
  75. while read -r net ; do
  76. [[ "$net" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}/[0-9]{1,}$ ]] || continue
  77. ipset -! add $whiteset $net timeout 0
  78. done < $confd/WHITE.nets
  79. }
  80. badips() {
  81. ipset create -! $banset hash:ip hashsize 4096 timeout $banttl maxelem $badmaxelems
  82. if $logbad ; then
  83. droplog "BAD" "INPUT"
  84. fi
  85. ${iptables} -A INPUT -i ${wan} -p udp -m set --match-set $banset src -m conntrack --ctstate NEW --ctproto UDP -j END-RESET
  86. ${iptables} -A INPUT -i ${wan} -p tcp --syn -m set --match-set $banset src -m conntrack --ctstate NEW --ctproto TCP -j END-RESET
  87. }
  88. scanips() {
  89. ipset create -! $scanset hash:ip hashsize 4096 timeout $scanttl maxelem $scanmaxelems
  90. ${iptables} -A INPUT -i ${wan} -p udp -m conntrack --ctstate NEW --ctproto UDP -j SET --add-set $scanset src --exist --timeout $scanttl
  91. ${iptables} -A INPUT -i ${wan} -p tcp --syn -m conntrack --ctstate NEW --ctproto TCP -j SET --add-set $scanset src --exist --timeout $scanttl
  92. if $logscan ; then
  93. droplog "SCAN" "INPUT"
  94. fi
  95. ${iptables} -A INPUT -i ${wan} -p udp -m set --match-set $scanset src -m conntrack --ctstate NEW --ctproto UDP -j END-RESET
  96. ${iptables} -A INPUT -i ${wan} -p tcp --syn -m set --match-set $scanset src -m conntrack --ctstate NEW --ctproto TCP -j END-RESET
  97. }
  98. white() {
  99. ${iptables} -N FW-FILTERED
  100. while read -r port ; do
  101. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  102. ${iptables} -A FW-FILTERED -p udp -m conntrack --ctstate NEW --ctproto UDP --dport $port -j ACCEPT
  103. done < $confd/WHITE.udp
  104. while read -r port ; do
  105. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  106. ${iptables} -A FW-FILTERED -p tcp -m conntrack --ctstate NEW --ctproto TCP --dport $port -j ACCEPT
  107. done < $confd/WHITE.tcp
  108. ${iptables} -A INPUT -i ${wan} -p udp -m set --match-set $whiteset src -m conntrack --ctstate NEW --ctproto UDP -j FW-FILTERED
  109. ${iptables} -A INPUT -i ${wan} -p tcp --syn -m set --match-set $whiteset src -m conntrack --ctstate NEW --ctproto TCP -j FW-FILTERED
  110. ${iptables} -A INPUT -i ${wan} -p icmp --icmp-type 8 -m set --match-set $whiteset src -m conntrack --ctstate NEW --ctproto ICMP -j ACCEPT
  111. }
  112. public() {
  113. ${iptables} -N FW-PUBLIC
  114. while read -r port ; do
  115. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  116. ${iptables} -A FW-PUBLIC -p udp -m conntrack --ctstate NEW --ctproto UDP --dport $port -j ACCEPT
  117. done < $confd/PUBLIC.udp
  118. while read -r port ; do
  119. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  120. ${iptables} -A FW-PUBLIC -p tcp -m conntrack --ctstate NEW --ctproto TCP --dport $port -j ACCEPT
  121. done < $confd/PUBLIC.tcp
  122. ${iptables} -A INPUT -i ${wan} -p udp -m conntrack --ctstate NEW --ctproto UDP -j FW-PUBLIC
  123. ${iptables} -A INPUT -i ${wan} -p tcp --syn -m conntrack --ctstate NEW --ctproto TCP -j FW-PUBLIC
  124. }
  125. cast() {
  126. ${iptables} -N FW-CAST
  127. if $logcast; then
  128. ${iptables} -A FW-CAST -m pkttype --pkt-type multicast -m conntrack --ctstate NEW -j LOG --log-prefix "CAST-LOG MULTI: " --log-level 7
  129. ${iptables} -A FW-CAST -m pkttype --pkt-type broadcast -m conntrack --ctstate NEW -j LOG --log-prefix "CAST-LOG BROAD: " --log-level 7
  130. fi
  131. ${iptables} -A FW-CAST -m pkttype --pkt-type multicast -m conntrack --ctstate NEW -j ACCEPT
  132. ${iptables} -A FW-CAST -m pkttype --pkt-type broadcast -m conntrack --ctstate NEW -j ACCEPT
  133. ${iptables} -A INPUT -i ${wan} -j FW-CAST
  134. }
  135. main () {
  136. for hook in "${hooks[@]}" ; do
  137. $hook
  138. done
  139. }
  140. main