safe_iptables.sh 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. #!/usr/bin/env bash
  2. # IPTABLES 设置防火墙规则 脚本 By 蘭雅sRGB 特别感谢 TaterLi 指导
  3. # wget -qO safe_iptables.sh https://git.io/fhUSe && bash safe_iptables.sh
  4. # 初始化安全防火墙规则预设端口; 可以个性修改脚本; 或者 指定INPUT Chain 设置删除
  5. tcp_port="80,443"
  6. udp_port="9999,8000"
  7. # 保存防火墙规则文件路径 /etc/iptables/rules.v4 禁用ipv6
  8. mkdir -p /etc/iptables
  9. # 定义文字颜色
  10. Green="\033[32m" && Red="\033[31m" && GreenBG="\033[42;37m" && RedBG="\033[41;37m" && Font="\033[0m"
  11. # 检查系统
  12. check_sys(){
  13. if [[ -f /etc/redhat-release ]]; then
  14. release="centos"
  15. elif cat /etc/issue | grep -q -E -i "debian"; then
  16. release="debian"
  17. elif cat /etc/issue | grep -q -E -i "ubuntu"; then
  18. release="ubuntu"
  19. elif cat /etc/issue | grep -q -E -i "centos|red hat|redhat"; then
  20. release="centos"
  21. elif cat /proc/version | grep -q -E -i "debian"; then
  22. release="debian"
  23. elif cat /proc/version | grep -q -E -i "ubuntu"; then
  24. release="ubuntu"
  25. elif cat /proc/version | grep -q -E -i "centos|red hat|redhat"; then
  26. release="centos"
  27. fi
  28. bit=`uname -m`
  29. }
  30. # 保存防火墙规则
  31. save_iptables(){
  32. if [[ ${release} == "centos" ]]; then
  33. service iptables save
  34. else
  35. iptables-save > /etc/iptables/rules.v4
  36. fi
  37. }
  38. # 设置防火墙规则,下次开机也生效
  39. set_iptables(){
  40. if [[ ${release} == "centos" ]]; then
  41. service iptables save
  42. chkconfig --level 2345 iptables on >/dev/null 2>&1
  43. systemctl enable iptables
  44. else
  45. iptables-save > /etc/iptables/rules.v4
  46. echo -e '#!/bin/bash\n/sbin/iptables-restore < /etc/iptables/rules.v4' > /etc/network/if-pre-up.d/iptables
  47. chmod +x /etc/network/if-pre-up.d/iptables
  48. fi
  49. }
  50. # 禁止网卡IPV6功能,简易管理
  51. disable_ipv6(){
  52. ni=$(ls /sys/class/net | awk {print} | grep -e eth. -e ens. -e venet.)
  53. echo 1 > /proc/sys/net/ipv6/conf/${ni}/disable_ipv6
  54. }
  55. # 恢复网卡IPV6功能
  56. enable_ipv6(){
  57. ni=$(ls /sys/class/net | awk {print} | grep -e eth. -e ens. -e venet.)
  58. echo 0 > /proc/sys/net/ipv6/conf/${ni}/disable_ipv6
  59. }
  60. no_use_passwd(){
  61. # 禁用密码登陆
  62. sed -i "s/PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config
  63. sed -i "s/#PasswordAuthentication.*/PasswordAuthentication no/g" /etc/ssh/sshd_config
  64. # 只能SSH2访问,这个安全性高.
  65. sed -i '/Protocol/d' /etc/ssh/sshd_config
  66. echo "Protocol 2" >> /etc/ssh/sshd_config
  67. # 重启ssh服务
  68. systemctl restart ssh
  69. }
  70. srgb18_ga_ddns(){
  71. # 下载 IPTABLES 设置防火墙规则 脚本 By 蘭雅sRGB
  72. wget -qO safe_iptables.sh https://git.io/fhUSe
  73. echo -e "${Red} 浏览器 HE.NET 动态DDNS更新IP示例: ${Font}"
  74. echo -e "${Green}https://srgb18.ga:[email protected]/nic/update?hostname=srgb18.ga&myip=35.235.96.85 ${Font}"
  75. curl -4 "srgb18.ga:[email protected]/nic/update?hostname=srgb18.ga"
  76. echo
  77. }
  78. # 隐藏的防火墙设置功能菜单 88
  79. hide_menu(){
  80. echo
  81. echo -e "${RedBG} 隐藏的高级防火墙设置功能 By 蘭雅sRGB ${Font}"
  82. echo -e "${Green}> 1. ss_kcp_speed_udp2raw 端口开放 防火墙规则"
  83. echo -e "> 2. ss brook 电报代理端口开放 防火墙规则"
  84. echo -e "> 3. frps_iptables 防火墙规则"
  85. echo -e "> 4. 使用临时${GreenBG} srgb18.ga ${Font}${Green}域名(更新脚本)"
  86. echo -e "> 5. ${RedBG} 禁止网卡IPV6功能 ${Font}"
  87. echo -e "> 6. ${GreenBG} 恢复网卡IPV6功能 ${Font}"
  88. echo -e "> 7. ${RedBG} 禁止使用密码远程SSH登陆 ${Font}"
  89. echo -e "> 8. 菜单项 1.-2.-3. 防火墙规则"
  90. echo
  91. read -p "请输入数字(1-6):" num_x
  92. case "$num_x" in
  93. 1)
  94. ss_kcp_speed_udp2raw
  95. ;;
  96. 2)
  97. ss_bk_tg
  98. ;;
  99. 3)
  100. frps_iptables
  101. ;;
  102. 4)
  103. srgb18_ga_ddns
  104. ;;
  105. 5)
  106. disable_ipv6
  107. ;;
  108. 6)
  109. enable_ipv6
  110. ;;
  111. 7)
  112. no_use_passwd
  113. ;;
  114. 8)
  115. ss_bk_tg_frps_iptables
  116. ss_kcp_speed_udp2raw
  117. ;;
  118. *)
  119. ;;
  120. esac
  121. }
  122. # udp2raw 转接端口 1999和2999 ; ss_bk_tg和frps端口
  123. raw_port="1999,2999"
  124. ss_bk_tg="2018,7731,7979"
  125. frps_port="7000,7500,8080,4443,11122,2222"
  126. # ss_kcp_speed_udp2raw 端口防火墙规则
  127. ss_kcp_speed_udp2raw(){
  128. # ss+kcp+udp2raw 和 # wg+speed+udp2raw 环路设置
  129. iptables -I INPUT -s 127.0.0.1 -p tcp --dport 40000 -j ACCEPT
  130. iptables -I INPUT -s 127.0.0.1 -p udp -m multiport --dport 4000,8888,9999 -j ACCEPT
  131. iptables -I INPUT -p tcp -m multiport --dport ${tcp_port},${raw_port} -j ACCEPT
  132. RELATED_ESTABLISHED
  133. wg-quick down wg0 >/dev/null 2>&1
  134. save_iptables
  135. # 重启 WireGuard
  136. wg-quick up wg0 >/dev/null 2>&1
  137. }
  138. # ss brook 电报代理端口开放 防火墙规则
  139. ss_bk_tg(){
  140. iptables -D INPUT -p tcp -m multiport --dport ${tcp_port} -j ACCEPT >/dev/null 2>&1
  141. iptables -I INPUT -p tcp -m multiport --dport ${tcp_port},${ss_bk_tg} -j ACCEPT
  142. RELATED_ESTABLISHED
  143. save_iptables
  144. }
  145. # frps_iptables 防火墙规则
  146. frps_iptables(){
  147. iptables -D INPUT -p tcp -m multiport --dport ${tcp_port} -j ACCEPT >/dev/null 2>&1
  148. iptables -I INPUT -p tcp -m multiport --dport ${tcp_port},${frps_port} -j ACCEPT
  149. RELATED_ESTABLISHED
  150. save_iptables
  151. }
  152. # 菜单项1-2-3全功能开放
  153. ss_bk_tg_frps_iptables(){
  154. iptables -D INPUT -p tcp -m multiport --dport ${tcp_port} -j ACCEPT >/dev/null 2>&1
  155. iptables -I INPUT -p tcp -m multiport --dport ${tcp_port},${ss_bk_tg},${frps_port} -j ACCEPT
  156. RELATED_ESTABLISHED
  157. save_iptables
  158. sed -i '/^:udp2rawDwrW.*/d' /etc/iptables/rules.v4
  159. iptables-restore < /etc/iptables/rules.v4
  160. }
  161. # 安全防火墙规则: 只能Ping和SSH
  162. safe_iptables(){
  163. iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  164. ssh_port=$(cat /etc/ssh/sshd_config | grep -e 'Port ' | awk '{print $2}')
  165. if [ ${ssh_port} != '22' ]; then
  166. iptables -A INPUT -p tcp -m tcp --dport ${ssh_port} -j ACCEPT
  167. fi
  168. iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
  169. iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
  170. iptables -A INPUT -j DROP
  171. iptables -P FORWARD DROP
  172. iptables -P OUTPUT ACCEPT
  173. }
  174. # 建立相关链接的优先
  175. RELATED_ESTABLISHED(){
  176. iptables -D INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  177. iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  178. }
  179. # 初始化安全防火墙规则
  180. init_iptables(){
  181. # 清除防火墙规则
  182. iptables -F
  183. # 添加 预置 tcp 和 udp端口
  184. iptables -I INPUT -p tcp -m multiport --dport ${tcp_port} -j ACCEPT
  185. iptables -I INPUT -p udp -m multiport --dport ${udp_port} -j ACCEPT
  186. safe_iptables
  187. set_iptables
  188. }
  189. add_tcp_chain(){
  190. echo -e "${GreenBG} 追加TCP端口段到 Chain INPUT ( multiport dports) ${Font}"
  191. read -p "请输入TCP端口段(示例: 7000,7500:7510 ): " port
  192. iptables -D INPUT -p tcp -m multiport --dport ${tcp_port} -j ACCEPT >/dev/null 2>&1
  193. iptables -I INPUT -p tcp -m multiport --dport ${tcp_port},${port} -j ACCEPT
  194. RELATED_ESTABLISHED
  195. save_iptables
  196. }
  197. add_udp_chain(){
  198. echo -e "${GreenBG} 追加UDP端口段到 Chain INPUT ( multiport dports) ${Font}"
  199. read -p "请输入UDP端口段(示例: 7000,7500:7510 ): " port
  200. iptables -D INPUT -p udp -m multiport --dport ${udp_port} -j ACCEPT >/dev/null 2>&1
  201. iptables -I INPUT -p udp -m multiport --dport ${udp_port},${port} -j ACCEPT
  202. RELATED_ESTABLISHED
  203. save_iptables
  204. }
  205. # 删除指定INPUT Chain 序号行
  206. del_chain(){
  207. iptables -nvL --line
  208. echo -e "${RedBG} 删除指定INPUT Chain 序号行 ${Font}"
  209. read -p "请检查INPUT Chain序号行,输入序号(2-X): " no_x
  210. if [[ ${no_x} -ge 2 ]] && [[ ${no_x} -le 20 ]]; then
  211. iptables -D INPUT ${no_x}
  212. else
  213. echo -e "${RedBG}:: INPUT Chain序号行选择错误,没有删除!${Font}"
  214. fi
  215. save_iptables
  216. }
  217. # 禁止ICMP,禁止Ping服务器
  218. no_ping(){
  219. iptables -D INPUT -p icmp --icmp-type echo-request -j ACCEPT
  220. }
  221. # 关闭防火墙命令 iptables -F
  222. no_iptables(){
  223. iptables -P INPUT ACCEPT
  224. iptables -P FORWARD ACCEPT
  225. iptables -F
  226. save_iptables
  227. }
  228. # 设置菜单
  229. start_menu(){
  230. echo
  231. echo -e "${GreenBG} IPTABLES 设置防火墙规则 脚本 By 蘭雅sRGB 特别感谢 TaterLi 指导 ${Font}"
  232. echo -e "${RedBG} 原则: 规则不宜超过10条,3-5条最好,每增加规则系统都忙很多。 ${Font}"
  233. echo -e "${Green}> 1. 追加 TCP 多端口到防火墙规则"
  234. echo -e "> 2. 追加 UDP 多端口到防火墙规则"
  235. echo -e "> 3. 删除指定INPUT Chain 序号行(原则: 精简规则)"
  236. echo -e "> 4. 禁止ICMP,禁止Ping服务器"
  237. echo -e "> 5. 重置初始化安全防火墙规则(首次需运行)"
  238. echo -e "> 6. 退出设置"
  239. echo "------------------------------------------------------------"
  240. echo -e "> 7. 关闭 IPTABLES 防火墙"
  241. echo -e "> 8. ${RedBG} 小白一键设置防火墙 ${Font}"
  242. echo
  243. read -p "请输入数字(1-8):" num
  244. case "$num" in
  245. 1)
  246. add_tcp_chain
  247. ;;
  248. 2)
  249. add_udp_chain
  250. ;;
  251. 3)
  252. del_chain
  253. ;;
  254. 4)
  255. no_ping
  256. ;;
  257. 5)
  258. init_iptables
  259. ;;
  260. 6)
  261. netstat -ltup
  262. exit 1
  263. ;;
  264. 7)
  265. no_iptables
  266. ;;
  267. 8)
  268. init_iptables
  269. ss_kcp_speed_udp2raw
  270. ;;
  271. 88)
  272. hide_menu
  273. ;;
  274. *)
  275. echo
  276. ;;
  277. esac
  278. iptables -nvL --line
  279. }
  280. clear
  281. check_sys
  282. start_menu