在前面的文章中我們已經學習了如何編寫一些簡單的防火牆規則了,但是這些規則只是臨時生效的,當防火牆關閉或者伺服器關機,重啟之後所有的規則將會清空。因此我需要將編寫好的防火牆規則儲存下來,以便在防火牆關閉或重新啟動系統後,防火牆規則還可以使用,而不需要再次編寫。
iptables規則的匯出、導人
防火牆規則的批量備份,還原需要用到兩個命令iptables-save、iptables-restore,分別用來儲存和恢複。
1、備份iptables規則
iptables-save命令用來大量匯出iptables防火牆規則,直接執行iptables-save時,將顯示出當前啟用的所有規則,按照raw、mangle、nat、filter表的順序依次列出;若只希望顯示出某一個表,應添加“-t表名”作為命令選項,然後結合重新導向輸入“>”將輸出內容重新導向到某個檔案中。
列如:備份所有表的規則,操作如下:
[root@localhost /]#iptables-save > /opt/iprules_all.txt
或者
[root@localhost /]#service iptables save
後者預設將所有規則儲存到“/etc/sysconfig/iptables”檔案中。
2、恢複iptables規則
iptables-retore命令用來大量匯入Linux防火牆規則,如果已經有使用iptable-save命令匯出的備份檔案,則恢複規則的過程也就是一瞬間的事。與iptables-save命令相對的,iptables-restore命令應結合重新導向輸入來指定備份檔案的位置。
列如:將上所備份的規則恢複到iptables中,操作如下:
[root@localhost /]#iptables-restore < /opt/iprules_all.txt
或者
[root@localhost /]#service iptables start
後者預設將“/etc/sysconfig/iptables”檔案中的內容載入到iptables中,也就是說,如果備份使用的是“service iptables save”那麼恢複的時候就應該使用“service iptables start”。
使用iptables服務
開啟或關閉iptables服務使用以下命令
[root@localhost /]#service iptables start //開啟iptables服務
[root@localhost /]#service iptables stop //關閉iptables服務
前者開啟iptables服務,預設載入“/etc/sysconfig/iptables”中的規則,後者關閉iptables服務,預設將會清空所有的iptables規則。
編寫防火牆指令碼
在生產環境中,我很少會一條一條的去編寫iptables規則,最普遍的做法就是,將其寫到shell指令碼,進行一次性處理。常見的防火牆指令碼中,通常包括變數定義、模組載入、/proc調整、規則設定等多個部分,某些簡單的防火牆指令碼可能只包括規則設定部分。下面我們通過一個“網路型”防火牆指令碼執行個體來瞭解如何編寫防火牆指令碼。
[root@loaclhost /]#vim /opt/myipfw.sh
#!/bin/bash
# 1.定義基本變數
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.7" //網站伺服器的內部地址
IPT="/sbin/iptables" //iptables命令的路徑
MOD="/sbin/modprobe" //modprode命令的路徑
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 //支援TFP地址轉換
$MOD ip_conntrack_ftp //支援TFP串連跟蹤
# 3.調整/porc參數
$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.設定具體的防火牆規則
# 4.1刪除自訂鏈、清空已有規則
$IPT -t filter -X //清空各表中定義的鏈
$IPT -t nat -X
$IPT -t mangel -X
$IPT -t raw -X
$IPT -t filter -F //清空各表中已有的規則
$IPT -t nat -F
$IPT -t mangel -F
$IPT -t raw -F
# 4.2定義預設規則
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCETP
# 4.3設定nat表中的各種策略
$IPT -t nat -A POSTROUTING -s $LAN_NAT -o $INET_IF -j SNAT --to-source $INET_IP
$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP
# 4.4設定filter表中的各種規則
$IPT -A INPUT -m state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp -m multiport --dport 20,21,25,80,110,143,443 -j ACCEPT
$IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -d $LAN_WWW_IP -p tcp --dport 80 -j ACCEPT
$IPT -A FORWARD -d $LAN_WWW_IP -p tcp --sport 80 -j ACCEPT
上述防火牆指令碼執行個體中,僅列出其中最基礎的一些規則。更多具體的規則設定取決於實際的應用需求,還有待大家在生產環境中慢慢去體會,逐漸融會貫通。