使用iptables建置Linux 防火牆(3)(轉)
# 從 LAN 進入防火牆主機的 DHCP 封包,予以放行,只有當防火牆擔任 DHCP 時才使用
#$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT
# 從 WAN 進入防火牆主機的所有封包,檢查是否為響應封包,若是則予以放行
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
# 限制過濾規則的比對頻率為每分鐘平均流量三個封包(超過上限的封包將暫停比對),並將瞬間流量設定為一次最多處理三個封包(超過上限的封包將丟棄不予處理),這類封包通常是駭客用來進行阻斷式攻擊
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level INFO --log-prefix "IPT INPUT packet died: "
#
# 4.1.5 FORWARD chain(過濾要透過防火牆的封包)
#
#
# 透過防火牆的 TCP 封包必須先進行 bad_tcp_packets 過濾
$IPTABLES -A FORWARD -p TCP -j bad_tcp_packets
# 從 LAN 要到 WAN 的封包通通放行
$IPTABLES -A FORWARD -i $LAN_IFACE -o $INET_IFACE -j ACCEPT
# 從 WAN 要到 LAN 的封包僅放行回應封包
$IPTABLES -A FORWARD -i $INET_IFACE -o $LAN_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允許來自 WAN 的 Ping 封包,遞送到校內所有的伺服器
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP1_IP -j icmp_packets
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP2_IP -j icmp_packets
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP3_IP -j icmp_packets
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP4_IP -j icmp_packets
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP5_IP -j icmp_packets
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP6_IP -j icmp_packets
# 允許來自 WAN 的 HTTP、HTTPS 封包,遞送到校內所有的 WEB 伺服器
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP1_IP -m multiport --dport $HTTP,$HTTPS -j allowed
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP2_IP -m multiport --dport $HTTP,$HTTPS -j allowed
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP3_IP -m multiport --dport $HTTP,$HTTPS -j allowed
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP4_IP -m multiport --dport $HTTP,$HTTPS -j allowed
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP5_IP -m multiport --dport $HTTP,$HTTPS -j allowed
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_HTTP6_IP -m multiport --dport $HTTP,$HTTPS -j allowed
# 允許來自 WAN 的 FTP 封包,遞送到校內所有的 FTP 伺服器
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP1_IP -m multiport --dport $FTP,$FTP_DATA -j allowed
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP2_IP -m multiport --dport $FTP,$FTP_DATA -j allowed
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_FTP3_IP -m multiport --dport $FTP,$FTP_DATA -j allowed
# 允許來自 WAN 的 SMTP、POP3、IMAP 封包,遞送到校內所有的 MAIL 伺服器
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_MAIL1_IP -m multiport --dport $SMTP,$POP3,$IMAP -j allowed
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_MAIL2_IP -m multiport --dport $SMTP,$POP3,$IMAP -j allowed
# 允許來自 WAN 的 SSH、TELNET、WEBMIN、WAM 封包,遞送到校內所有的 LINUX 伺服器
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_WAM1_IP -m multiport --dport $SSH,$TELNET,$WEBMIN,$WAM -j allowed
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_WAM2_IP -m multiport --dport $SSH,$TELNET,$WEBMIN,$WAM -j allowed
# 允許來自 WAN 的 PCanywhere 封包,遞送到校內所有的 PCanywhere 伺服器
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW1_IP --dport $PCAW_TCP -j allowed
$IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW1_IP --dport $PCAW_UDP -j ACCEPT
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW2_IP --dport $PCAW_TCP -j allowed
$IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_PCAW2_IP --dport $PCAW_UDP -j ACCEPT
# 允許來自 WAN 的 DNS 封包,遞送到校內的 DNS 伺服器
$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $LAN_IFACE -d $LAN_DNS_IP --dport $DNS -j allowed
$IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $LAN_IFACE -d $LAN_DNS_IP --dport $DNS -j ACCEPT
# 限制過濾規則的比對頻率為每分鐘平均流量三個封包(超過上限的封包將暫停比對),並將瞬間流量設定為一次最多處理三個封包(超過上限的封包將丟棄不予處理),這類封包通常是駭客用來進行阻斷式攻擊
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet died: "
#
# 4.1.6 OUTPUT chain(過濾從防火牆送出的封包)
#
#
# 從防火牆送出的 TCP 封包必須先進行 bad_tcp_packets 過濾
$IPTABLES -A OUTPUT -p TCP -j bad_tcp_packets
# 從防火牆網路卡送出的所有封包,通通放行
$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT
# 限制過濾規則的比對頻率為每分鐘平均流量三個封包(超過上限的封包將暫停比對),並將瞬間流量設定為一次最多處理三個封包(超過上限的封包將丟棄不予處理),這類封包通常是駭客用來進行阻斷式攻擊
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet died: "
######
# 4.2 nat table
#
#
# 4.2.1 Set policies
#
#
# 4.2.2 Create user specified chains
#
#
# 4.2.3 Create content in user specified chains
#
#
# 4.2.4 PREROUTING chain(定義目的地地址轉譯)
#
# 從 WAN 要到校內伺服器的封包,在封包過濾前先轉譯目的地 IP 為 NAT IP
$IPTABLES -t nat -A PREROUTING -d $HTTP1_IP -j DNAT --to-destination $LAN_HTTP1_IP
$IPTABLES -t nat -A PREROUTING -d $HTTP2_IP -j DNAT --to-destination $LAN_HTTP2_IP
$IPTABLES -t nat -A PREROUTING -d $HTTP3_IP -j DNAT --to-destination $LAN_HTTP3_IP
$IPTABLES -t nat -A PREROUTING -d $HTTP4_IP -j DNAT --to-destination $LAN_HTTP4_IP
$IPTABLES -t nat -A PREROUTING -d $HTTP5_IP -j DNAT --to-destination $LAN_HTTP5_IP
$IPTABLES -t nat -A PREROUTING -d $HTTP6_IP -j DNAT --to-destination $LAN_HTTP6_IP
#
# 4.2.5 POSTROUTING chain(定義來源地址轉譯)
#
# 從校內伺服器要到 WAN 的封包,在送出之前先轉譯來源 IP 為 NIC IP,配合上面區塊的設定,就可以做到一對一對應
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP1_IP -j SNAT --to-source $HTTP1_IP
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP2_IP -j SNAT --to-source $HTTP2_IP
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP3_IP -j SNAT --to-source $HTTP3_IP
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP4_IP -j SNAT --to-source $HTTP4_IP
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP5_IP -j SNAT --to-source $HTTP5_IP
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -s $LAN_HTTP6_IP -j SNAT --to-source $HTTP6_IP
# 從校內一般單機要到 WAN 的封包,在送出之前先轉譯來源 IP 為預設的 NIC IP,這就是多對一對應,若指定成 IP 範圍,就變成多對多對應,例如本範例即是如此
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $IP_POOL
#
# 4.2.6 OUTPUT chain
#
######
# 4.3 mangle table
#
#
# 4.3.1 Set policies
#
#
# 4.3.2 Create user specified chains
#
#
# 4.3.3 Create content in user specified chains
#
#
# 4.3.4 PREROUTING chain
#
#
# 4.3.5 INPUT chain
#
#
# 4.3.6 FORWARD chain
#
#
# 4.3.7 OUTPUT chain
#
#
# 4.3.8 POSTROUTING chain
#
柒、Log 分析
分析 iptables 防火牆 Log 的免費軟體相當多,底下僅介紹 iptables_logger_v0.3,這個軟體提供一個 perl 程式,可以讀取系統 LOG,並將資料寫入 MySql 資料庫,然後還提供 php 程式,可以從資料庫讀取資料,整理成網頁提供瀏覽,因此要安裝此分析軟體,必須先安裝 perl、php、mysql 和 apache,有關這些套件的安裝在這裡不再介紹,請自行參考相關檔案,或參加 Linux 進階班課程。你可以從這裡取得 iptables_logger_v0.3 程式,其安裝程式如下:
安裝資料表:
這個套件解壓縮後,可以看到有一個資料夾叫做 sql,資料夾內有一個 sql 的指令稿叫做 db.sql,這個指令稿是用來建立擺放聯機紀錄所需的資料表,請利用以下指令來安裝,如果您還不熟悉 mysql 的指令,請自行閱讀 man mysql 檔案。
root@firewall sql# mysql -u root -p(以 root 身分登入 MySql 主控臺)
mysql> create database iptables;(建立一個資料庫叫做 iptables,資料庫也可以自行命名,但是要記得修改相關程式)
mysql> grant create,select,insert on iptables.* to iptables_admin@localhost identified by 'xx';(將 iptables 資料庫新建、讀取和寫入許可權授權給 iptables_admin 這個賬號,並限制只能從本機聯機,密碼為 xx,請自行修改上述指令中之賬號與密碼)
mysql> grant create,select on iptables.* to iptables_user@localhost identified by 'xx';(將 iptables 資料庫讀取許可權授權給 iptables_user 這個賬號,並限制只能從本機聯機,密碼為 xx,請自行修改上述指令中之賬號與密碼)
root@firewall sql# cat db.sql | mysql -u iptables_admin -p iptables(以 iptables_admin 身分來執行 db.sql,如果你改了資料庫的名字,請記得修改 db.sql)
修改 iptables 指令稿:
由於這支 Log 分析程式是以讀取系統 LOG 加以分析後才匯入到資料庫的方法,來處理聯機紀錄,並非使用 ULOG 直接由 iptables 將紀錄寫入 mysql 資料庫,感覺上效能比較差,但在 ULOG 機制尚未被實體化之前,這也不失為一個好的解決方案。
原則上只要在 iptables 指令稿中有產生 LOG 的動作,這些資訊就會被分析匯入到資料表(由 feed_db.pl 負責這個工作),特別要注意的是 LOG 產生時會加入一個標頭(prefix),程式是透過標頭來分析這筆 LOG 的意義,請將 LOG 標頭取名為 IPTABLES DROP 或 IPTABLES ACCEPT,以方便事後的統計。範例如下:
首先建立一個新的規則煉 LOG_DROP,這個規則煉用來將要丟棄的封包先 LOG 到系統日誌檔案,然後再丟棄。
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES DROP] : '
iptables -A LOG_DROP -j DROP
接著修改所有規則,只要是需進行 DROP 動作,都改為跳到 LOG_DROP 規則煉,例如:
$IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j DROP
改為
$IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j LOG_DROP
至於需要進行 ACCEPT 處理的規則也如法炮製,先建立 LOG_ACCEPT 規則煉:
iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG --log-tcp-options --log-ip-options --log-prefix '[IPTABLES ACCEPT] : '
iptables -A LOG_ACCEPT -j ACCEPT
接著修改所有規則,例如:
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
改為
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j LOG_ACCEPT
安裝顯示分析結果的 PHP 程式:
在解壓縮的資料夾中,找到一個叫做 web 的子資料夾,裡面就是要給人從網頁瀏覽分析結果的 PHP 程式,如果你的 Apache 已經設定好支援 php 和 php_mysql,那麼只要將此資料夾複製到 Apache 的根檔案目錄就行了。方法如下:
cp -R web /var/www/iptables
複製完成後請修改 config.php ,目的是為了讓 PHP 程式執行時,能以正確的賬號密碼連上 MySql ,以便從資料庫讀取資料,請找到底下三行:
$db_host="localhost";(一般不需修改,除非資料庫在另一臺主機上)
$db_user="iptables_user";(修改為僅具有讀取許可權的賬號,如果之前安裝資料庫有自設帳號的話)
$db_password="xxxx";(請將密碼修改為自設的密碼)
安裝 feed_db.pl:
前面已經介紹過這支程式的作用,請務必修改這支程式中有關資料庫聯機的 SQL 指令,將指令中的賬號密碼,改成你當初所設定的賬號密碼,建議最好不要用 root 身分聯機,以免影響防火牆的安全性。這支程式是放在解壓縮後資料夾內的 scripts 子資料夾,請修改下面這三行:
my $dsn = 'DBI:mysql:iptables:localhost';(請將 iptables 改成你自訂的資料庫名稱)
my $db_user_name = 'iptables_admin';(請將 iptables_admin 改成你自訂的管理賬號)
my $db_password = 'xxxx';(請將 xxxx 改成管理賬號的密碼)
程式修改好後,請將它複製到 /usr/local/bin 資料夾,接著將程式執行起來,注意:這支程式會跑一個無窮盡迴圈,持續分析系統 LOG,因此必須在背景執行,同時只能有一支程式執行,以避免造成 IO 過大的負載,執行方式如下:
tail --follow=name --retry /var/log/syslog | /usr/local/bin/feed_db.pl &
如果這些動作都作了,但程式並未執行成功,有可能是因為 perl_DBI:DBD 套件沒安裝,請自行用 rpm 補裝該套件。
檢視分析結果:
完成以上所有安裝步驟後,就可以坐下來享受一下成果,請開啟瀏覽器輸入底下網址
看到的畫面,如下圖所示(請點選放大):
安裝 LOG 分析後的安全防範:
防火牆上安裝越多套件,系統安全性也就越低,改進的方法有兩個:
1. 將 apache 和 mysql 架設在內部網路的一臺機器上,防火牆上僅安裝 mysql client,這樣可以避免 apache 和 mysql 的漏洞被駭客利用
2. 在防火牆上設定規則,僅允許來自內部的網路,進行 HTTP 和 MySql 聯機,這個方法比較簡單,本文所介紹的 iptables 範例也是採用此法,缺點是無法在校外檢視 LOG 分析結果
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-955554/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Linux設定防火牆iptablesLinux防火牆
- Linux基礎命令---iptables防火牆Linux防火牆
- iptables防火牆防火牆
- 防火牆iptables防火牆
- linux iptables安全技術與防火牆Linux防火牆
- Linux IPTables:如何新增防火牆規則Linux防火牆
- iptables配置-Linux系統安全防火牆Linux防火牆
- Iptables防火牆應用防火牆
- iptables防火牆規則防火牆
- Linux 防火牆配置(iptables和firewalld)詳細教程。Linux防火牆
- Linux系統iptables與Firewalld防火牆區別?Linux防火牆
- 基於iptables防火牆堵漏防火牆
- Linux 防火牆:關於 iptables 和 firewalld 的那些事Linux防火牆
- Linux防火牆介紹和iptables常用命令Linux防火牆
- Linux 防火牆配置使用Linux防火牆
- 20條IPTables防火牆規則用法!防火牆
- iptables防火牆如何記錄日誌防火牆
- iptables實用知識 ,一文學會配置linux防火牆Linux防火牆
- linux防火牆使用以及配置Linux防火牆
- 超級實用的 iptables 防火牆指令碼防火牆指令碼
- Linux防火牆命令Linux防火牆
- Linux配置防火牆Linux防火牆
- LINUX 防火牆 firewalldLinux防火牆
- CentOS 中 iptables 和 firewall 防火牆的相關命令CentOS防火牆
- 體驗iptables 企業級的防火牆實戰防火牆
- Linux的銅牆鐵壁iptablesLinux
- 1、iptables-基礎-包過濾防火牆-四層防火牆(只支援4層協議)防火牆協議
- linux 7 防火牆操作Linux防火牆
- Linux防火牆基礎Linux防火牆
- linux關閉防火牆命令 linux防火牆關閉和開啟命令Linux防火牆
- 防火牆入侵於檢測——————3、思科 PIX 防火牆和 ASA 防火牆產品線防火牆
- 分享:有關Linux伺服器(在防火牆iptables)開放埠的操作總結Linux伺服器防火牆
- 嵌入式Linux可用的防火牆——iptables:實現ip白名單、mac地址白名單Linux防火牆Mac
- 使用防火牆讓你的 Linux 更加強大防火牆Linux
- Linux防火牆入門教程Linux防火牆
- Linux防火牆之netfilter/ptablesLinux防火牆Filter
- Linux——防火牆、SELinux規則Linux防火牆
- Linux 7新增防火牆埠Linux防火牆
- iptables防火牆簡介,原理,規則編寫,常見案例防火牆