e-router 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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 -P FORWARD DROP
  9. iptables -P OUTPUT ACCEPT
  10. iptables -P INPUT DROP
  11. }
  12. setup_final(){
  13. if $debug ; then
  14. setup_wandroplog
  15. iptables -A INPUT -j WAN-LOG-DROP
  16. else
  17. iptables -A INPUT -j DROP
  18. fi
  19. }
  20. setup_wandroplog() {
  21. iptables -N WAN-LOG-DROP
  22. iptables -A WAN-LOG-DROP -p tcp -j LOG --log-prefix "WAN-LOG-DROP TCP: " --log-level 7
  23. iptables -A WAN-LOG-DROP -p tcp -j REJECT --reject-with tcp-reset
  24. iptables -A WAN-LOG-DROP -p udp -j LOG --log-prefix "WAN-LOG-DROP UDP: " --log-level 7
  25. iptables -A WAN-LOG-DROP -p udp -j REJECT --reject-with icmp-port-unreachable
  26. iptables -A WAN-LOG-DROP -p icmp -j LOG --log-prefix "WAN-LOG-DROP ICMP: " --log-level 7
  27. iptables -A WAN-LOG-DROP -j REJECT --reject-with icmp-proto-unreachable
  28. }
  29. setup_fordroplog() {
  30. iptables -N FORWARD-LOG-DROP
  31. iptables -A FORWARD-LOG-DROP -p tcp -j LOG --log-prefix "FORWARD-LOG-DROP TCP: " --log-level 7
  32. iptables -A FORWARD-LOG-DROP -p tcp -j REJECT --reject-with tcp-reset
  33. iptables -A FORWARD-LOG-DROP -p udp -j LOG --log-prefix "FORWARD-LOG-DROP UDP: " --log-level 7
  34. iptables -A FORWARD-LOG-DROP -p udp -j REJECT --reject-with icmp-port-unreachable
  35. iptables -A FORWARD-LOG-DROP -p icmp -j LOG --log-prefix "FORWARD-LOG-DROP ICMP: " --log-level 7
  36. iptables -A FORWARD-LOG-DROP -j REJECT --reject-with icmp-proto-unreachable
  37. }
  38. setup_nat() {
  39. iptables -t nat -A POSTROUTING -o ${wan} -s ${locnet} -j MASQUERADE
  40. }
  41. setup_forward() {
  42. iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  43. iptables -A FORWARD -i ${eth0} -o ${wan} -j ACCEPT
  44. if $debug ; then
  45. setup_fordroplog
  46. iptables -A FORWARD -j FORWARD-LOG-DROP
  47. else
  48. iptables -A FORWARD -j DROP
  49. fi
  50. }
  51. setup_base() {
  52. iptables -A INPUT -i lo -j ACCEPT
  53. iptables -A INPUT -i ${eth0} -j ACCEPT
  54. iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
  55. iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
  56. }
  57. setup_whitenets() {
  58. ipset create -! $whiteset hash:net hashsize 4096
  59. while read -r net ; do
  60. [[ "$net" =~ ^[0-9]{1,}.[0-9]{1,}.[0-9]{1,}.[0-9]{1,}/[0-9]{1,}$ ]] || continue
  61. ipset -! add $whiteset $net
  62. done < $CONFD/WHITE.nets
  63. }
  64. setup_badips() {
  65. ipset create -! $banset hash:ip hashsize 4096 timeout $bantime
  66. iptables -A INPUT -i ${wan} -m set --match-set $banset src -p udp -j REJECT --reject-with icmp-port-unreachable
  67. iptables -A INPUT -i ${wan} -m set --match-set $banset src -p tcp -j REJECT --reject-with tcp-reset
  68. }
  69. setup_white() {
  70. iptables -N FW-FILTERED
  71. while read -r port ; do
  72. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  73. iptables -A FW-FILTERED -m udp -p udp --dport $port -j ACCEPT
  74. done < $CONFD/WHITE.udp
  75. while read -r port ; do
  76. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  77. iptables -A FW-FILTERED -m tcp -p tcp --dport $port -j ACCEPT
  78. done < $CONFD/WHITE.tcp
  79. iptables -A INPUT -p udp -i ${wan} -m set --match-set $whiteset src -m conntrack --ctstate NEW -j FW-FILTERED
  80. iptables -A INPUT -p tcp --syn -i ${wan} -m set --match-set $whiteset src -m conntrack --ctstate NEW -j FW-FILTERED
  81. iptables -A INPUT -i ${wan} -p icmp --icmp-type 8 -m conntrack --ctstate NEW -m set --match-set $whiteset src -j ACCEPT
  82. }
  83. setup_open() {
  84. iptables -N FW-OPEN
  85. while read -r port ; do
  86. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  87. iptables -A FW-OPEN -m udp -p udp --dport $port -j ACCEPT
  88. done < $CONFD/ACCEPT.udp
  89. while read -r port ; do
  90. [[ "$port" =~ ^[0-9]{1,}$ ]] || continue
  91. iptables -A FW-OPEN -m tcp -p tcp --dport $port -j ACCEPT
  92. done < $CONFD/ACCEPT.tcp
  93. iptables -A INPUT -p udp -i ${wan} -m conntrack --ctstate NEW -j FW-OPEN
  94. iptables -A INPUT -p tcp --syn -i ${wan} -m conntrack --ctstate NEW -j FW-OPEN
  95. }
  96. setup_cast() {
  97. iptables -N FW-CAST
  98. iptables -A FW-CAST -m pkttype --pkt-type broadcast -j ACCEPT
  99. iptables -A FW-CAST -m pkttype --pkt-type multicast -j ACCEPT
  100. iptables -A INPUT -i ${wan} -j FW-CAST
  101. }
  102. main () {
  103. set_defaults
  104. setup_whitenets
  105. setup_nat
  106. setup_forward
  107. setup_base
  108. setup_badips
  109. setup_white
  110. setup_open
  111. setup_cast
  112. setup_final
  113. }
  114. main