在Linux中,iptables爲我們提供了批量備份與恢復規則的命令,防火牆腳本實際上是一個shell腳本程序,便於使用shell變量、程序控制邏輯,在需要重用、移植使用時會非常方便,只需修改下變量值就可使用
iptables的備份及還原
防火牆規則的批量備份、還原用到兩個命令,即iptables-save和iptables-restore,分別用來保存和恢復
1. iptables-save命令
用來批量導出防火牆規則,直接執行命令時,將顯示當前啓用的所有規則
[root@localhost ~]# iptables-save # Generated by iptables-save v1.4.7 on Sun Jan 7 06:07:58 2018 //註釋 *filter //所在的表 :INPUT ACCEPT [0:0] //鏈名,默認策略 :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [41:5449] -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT //規則,省略了iptables -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited COMMIT //提交前面的規則設置 # Completed on Sun Jan 7 06:07:58 2018 [root@localhost ~]# iptables-save > /opt/iptables.txt //備份所有表的規則 [root@localhost ~]# iptables-save > /etc/sysconfig/iptables //每次開機後,根據保存的規則內容進行重建
2. iptables-restore命令
用來批量導入Linux防火牆規則,如果已經使用iptables-save命令導出的備份文件,則恢復的過程一瞬間就能完成
[root@localhost ~]# iptables-restore /opt/iptables.txt //從備份文件中恢復規則
使用防火牆腳本
1. 定義基本變量
可以在防火牆規則較多時,定義以下變量,一旦網絡環境發生變化,只需改下變量值就可使用
[root@localhost ~]# vim /opt/iptables.sh //創建腳本文件 #!/bin/bash INET_IF= "eth0" //外網接口 INET_IP="218.29.30.31" //外網接口地址 LAN_IF="eth1" //內網接口 LAN_IP= "192.168.1.1" //內網接口地址 LAN_NET="192.168.1.0/24" //內網網段 LAN_WWW_IP="192.168.1.6" //網站服務器的內部地址 IPT="/sbin/iptables" //iptables命令路徑 MOD="/sbin/modprobe" //modprobe命令路徑 CTL="/sbin/sysctl" //sysctl命令路徑
2. 加載內核模塊
如果需要啓用的規則數量較多,爲了提高規則設置的效率,保持防火牆的穩定性,建議將用到的各種模塊提前加載到內核中
$MOD ip_tables //iptables基本模塊 $MOD ip_conntrack //連接跟蹤模塊 $MOD ipt_REJECT //拒絕操作模塊 $MOD ipt_LOG //日誌記錄模塊 $MOD ipt_iprange //支持IP範圍匹配 $MOD xt_tcpudp //支持TCP、UDP協議 $MOD xt_state //支持狀態匹配 $MOD xt_multiport //支持多端口匹配 $MOD xt_mac //支持MAC地址匹配 $MOD ip_nat_ftp //支持FTP匹配 $MOD ip_conntrack_ftp //支持FTP連接跟蹤
3. 調整/proc參數
在文件夾/proc/sys下存放着與系統相關的一些可控參數,可以直接用來改變內核的行爲,通常作爲Linux內核調優的實時入口,下面列出幾個常用的/proc參數
$CTL -w net.ipv4.ip_forward=1 //打開路由轉發功能 $CTL -w net.ipv4.ip_default_ttl=128 //修改ICMP響應超時 $CTL -w net.ipv4.icmp_echo_ignore_all=1 //拒絕響應ICMP請求 $CTL -w net.ipv4.icmp_echo_ignore_broadcasts //拒絕響應ICMP廣播 $CTL -w net.ipv4.tcp_syncookies=1 //啓用SYN Cookie機制 $CTL -w net.ipv4.tcp_syn_retries=3 //最大SYN請求重試次數 $CTL -w net.ipv4.tcp_synack_retries=3 //最大ACK確認重試次數 $CTL -w net.ipv4.tcp_fin_timeout=60 //TCP連接等待超時 $CTL -w net.ipv4.tcp_max_syn_backlog=3200 //SYN請求的隊列長度
4. 設置具體的iptables規則
iptables的nat表主要用在Linux網關服務器,一般的主機型防火牆很少用到nat表
iptables的filter表主要用來過濾各種數據包,無論是Linux網關還是一般的Linux服務器都可能用的。主機型的防火牆主要使用INPUT、OUTPUT鏈,而對於網絡型防火牆主要使用FORWARD鏈
$IPT -t filter -X //刪除各表中自定義的鏈 $IPT -t nat -X $IPT -t filter -F //清空各表中已有的規則 $IPT -t nat -F $IPT -P INPUT DROP //設置規則鏈的默認策略 $IPT -P FORWARD DROP $IPT -P OUTPUT ACCEPT $IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-source $INET_IP //SNAT策略,局域網共享上網 $IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP //DNAT策略,發佈內部Web服務器 $IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 80 -j ACCEPT //允許內網與Internet中DNS、FTP、Web服務通信 $IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 20:21 -j ACCEPT $IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT
5. 執行腳本
在實際應用中,不要生硬的照搬他人腳本內容,應根據情況進行鍼對型的設計,並做好整天規劃,避免產生通信故障
[root@localhost ~]# chmod +x /opt/iptables.sh //添加執行權限 [root@localhost ~]# /opt/iptables.sh //執行腳本文件 [root@localhost ~]# vim /etc/rc.local //設置爲開機自動執行 /opt/iptables.sh
對於大多數應用服務器,防火牆只針對本機進行防護,因此filter表中的INPUT、OUTPUT鏈用到的最多,特別是前者
案例:某公司的Web服務器採用RHEL6操作系統,爲了加強網絡訪問的安全性,要求管理員熟悉iptables防火牆規則的編寫,以便制定有效、可行的主機防護策略
需求描述:
(1)調整TCP相關參數,提高抵抗DoS***的能力
(2)只允許訪問本機的Web服務,禁止其他任何形式的入站訪問數據
(3)允許響應本機訪問請求的數據包
實驗步驟:
[root@localhost ~]# vim /opt/iptables_web.sh #!/bin/bash # 1. 定義基本變量 IPT="/sbin/iptables" CTL="/sbin/sysctl" # 2. 調整/proc參數 $CTL -w net.ipv4.tcp_syncookies=1 $CTL -w net.ipv4.tcp_syn_retries=3 $CTL -w net.ipv4.tcp_synack_retries=3 $CTL -w net.ipv4.tcp_fin_timeout=60 $CTL -w net.ipv4.tcp_max_syn_backlog=3200 # 3. 刪除自定義的鏈、清空已有規則 $IPT -t filter -X $IPT -t nat -X $IPT -t mangle -X $IPT -t raw -X $IPT -t filter -F $IPT -t nat -F $IPT -t mangle -F $IPT -t raw -F # 4. 定義默認策略 $IPT -P INPUT DROP $IPT -P FORWARD DROP $IPT -P OUTPUT ACCEPT # 5. 設置filter表中的規則 $IPT -A INPUT -s $LAN_NET -o $INET_IF -p tcp --dport 80 -j ACCEPT $IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT