Jump to content

6-1.iptables防火牆使用的規則firewall.sh


Jack

Recommended Posts

----------------------------------------------------
你的雲主機需要有 noVNC Console / 远程连接
----------------------------------------------------

當你限制SSH只有你的IP才能連線

你的雲主機需要有 noVNC Console / 远程连接

避免之後你的IP位址變動,你的IP再也不能連接SSH

這時候如果雲主機有 noVNC Console / 远程连接,你將能夠修改防火牆規則

cd /usr/local/bin

將你的舊IP位址修改為新的IP位址,你的IP位址才能再次SSH連線

vi firewall.sh
 

 

------------------------------------------
iptables防火牆使用的規則 firewall.sh
------------------------------------------

將以下內容複製貼上到 firewall.sh


#!/bin/sh

# 網段說明:
# (1)1.2.3.0/24的意思是:1.2.3.0所屬的網路,子網路遮罩為255.255.255.0(24/8=3),整個網段的範圍是1.2.3.0到1.2.3.255。
# (2)1.2.3.0/16的意思是:1.2.3.0所屬的網路,子網路遮罩為255.255.0.0(16/8=2),整個網段的範圍是1.2.0.0到1.2.255.255。
# (3)1.2.3.0/8的意思是:1.2.3.0所屬的網路,子網路遮罩為255.0.0.0(8/8=1),整個網段的範圍是1.0.0.0到1.255.255.255。

## -------------------------- 防火牆規則設定區段 -------------------------- ##
# 設定禁止連線的IP,可使用空白分隔多個IP,也可以使用網段的寫法
BADIPS="198.108.0.0/16"


# 設定不可能出現的內網IP
# 若您的IP為 192.168.x.x ,請刪除 192.168.0.0/16
IMPOSSIBLE_IPS="10.0.0.0/8 192.168.0.0/16 172.16.0.0/16"


# 允許對內連線的 TCP 通訊埠

# 如果你使用軍哥LNMP一鍵安裝包,防火牆只需要打開 22 888 80 443這四個
# IN_TCP_PORTALLOWED="22,你的IP地址 888,你的IP地址 80 443"

# 如果你使用寶塔面板,防火牆只需要打開 22 888 8888 80 443這五個
# IN_TCP_PORTALLOWED="22,你的IP地址 888,你的IP地址 8888,你的IP地址 80 443"

IN_TCP_PORTALLOWED="22,你的IP地址 888,你的IP地址 80 443"


IN_UDP_PORTALLOWED=""

IN_ICMP_ALLOWED="8"

echo -n "Initiating iptables..."
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t filter -F
iptables -t nat -F
iptables -t filter -X
iptables -t nat -X
echo "OK"

[ "$1" = "start" ] && skiptest="1"

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# 阻擋來源路由封包
  for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
    echo "0" > $i
  done

# 阻擋 ICMP Redirect 封包
  for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
    echo "0" > $i
  done

# 禁止送出 ICMP Redirect 封包
  for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
    echo "0" > $i
  done

# 開啟核心的逆向路徑過濾功能
  for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo "1" > $i
  done

# 使用 SYN cookies 功能防止 SYN Flood 攻擊
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# 縮短 TCP 連線的重試次數與逾時時間
echo 3 > /proc/sys/net/ipv4/tcp_retries1
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1400 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
## ---------------------- 預設阻擋所有連線的基本原則 ---------------------- ##
echo -n "Setting firewall rules......" 
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
## -------------------------- 阻擋可疑狀態的封包 -------------------------- ##
iptables -N BADPKT
iptables -A BADPKT -j DROP
iptables -A INPUT -m state --state INVALID -j BADPKT
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j BADPKT
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j BADPKT
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j BADPKT
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j BADPKT
iptables -A INPUT -p tcp --tcp-flags ALL FIN -j BADPKT

# 允許已建立連線和回應的封包通過
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

## -------------------------- 阻擋特定 IP 的連線 -------------------------- ##
# 新增一個名為 BADIP 的新鏈
iptables -N BADIP

# 丟棄所有進入 BADIP 鏈的封包
iptables -A BADIP -j DROP

# 阻擋特定 IP 的連線
for ip in $BADIPS $IMPOSSIBLE_IPS ; do
   iptables -A INPUT -s $ip -j BADIP
done
## -------------------------- 允許特定 IP 的連線 -------------------------- ##
for i in $IN_TCP_PORTALLOWED ; do
   IFS=','
   set $i
   unset IFS ipt_option

   port="$1"
   [ -n "$2" ] && ipt_option="-s `echo $2 | sed 's/^!/! /'`"

    iptables -A INPUT -p tcp $ipt_option --dport $port --syn -m state --state NEW -j ACCEPT
done

# 允許特定 UDP 埠號的對內新連線
for i in $IN_UDP_PORTALLOWED ; do
   IFS=','
   set $i
   unset IFS ipt_option

   port="$1"
   [ -n "$2" ] && ipt_option="-s `echo $2 | sed 's/^!/! /'`"

    iptables -A INPUT -p udp $ipt_option --dport $port -m state --state NEW -j ACCEPT
done

# 允許特定 ICMP 類型封包進入
for i in $IN_ICMP_ALLOWED ; do
   IFS=','
   set $i
   unset IFS ipt_option

   type="$1"
   [ -n "$2" ] && ipt_option="-s `echo $2 | sed 's/^!/! /'`"
   
    iptables -A INPUT -p icmp $ipt_option --icmp-type $type -m state --state NEW -j ACCEPT
done

# 不管制對外連線,所以開放所有對外連線
iptables -A OUTPUT -m state --state NEW -j ACCEPT
## ------------------------------- 結束訊息 ------------------------------- ##
echo "OK"
# -----------------------------------------------------------------------------
if [ "$skiptest" = "1" ]; then exit ;fi

echo -e "\n     TEST MODE"
echo -n "All chains will be cleaned after 7 sec."

i=1; while [ "$i" -le "7" ]; do
   echo -n "."
   i=`expr $i + 1`
   sleep 1
done

echo -en "\nFlushing ruleset..."
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t filter -F
iptables -t nat -F
iptables -t filter -X
iptables -t nat -X
echo "OK"
# -----------------------------------------------------------------------------
 

Edited by Jack
Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...