iptables基礎和應用(3)(轉)
#
# 4.1.1 Set policies
# 定義安全政策為正面表列
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
#
# 4.1.2 Create userspecified chains
#
#
# 新增使用者自訂規則煉 bad_tcp_packets、 allowed 和 icmp_packets
$IPTABLES -N bad_tcp_packets
$IPTABLES -N allowed
$IPTABLES -N icmp_packets
#
# 4.1.3 Create content in userspecified chains
#
#
# bad_tcp_packets chain
# bad_tcp_packets 規則煉的功能是:將要求重導向的聯機記錄起來,然後將封包丟棄(防止聯機被綁架,但會檔掉需要三方交談的服務,例如:M$ Media Server)
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG --log-level INFO --log-prefix "New not syn:"
$IPTABLES -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j DROP
# allowed chain
# allowed 規則煉的功能是:允許要求聯機封包或響應封包進入,將其餘封包丟棄
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A allowed -p TCP -j DROP
#
# ICMP rules
# icmp_packets 規則煉的功能是:允許 ping 封包進入,將其餘封包丟棄
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT
#
# 4.1.4 INPUT chain(過濾要到達防火牆的封包)
#
#
# 進入防火牆主機的 TCP 封包必須先進行 bad_tcp_packets 過濾
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
# 從 WAN 進入防火牆主機的 ICMP 封包必須先進行 icmp_packets 過濾,這是為了避免駭客傳送不完整的 IP 封包,系統會響應 ICMP 封包通知對方,導致主機位置被偵測出來
$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
# 從 LAN 進入防火牆主機的全部 unicast 和 broadcast 封包,通通放行;額外檢查目的地 IP 可以將 multicast 封包濾除
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BROADCAST_ADDRESS -j ACCEPT
# 從 Loopback 介面進入防火牆主機的所有封包,檢查是否來自本機,若是則放行;此規則去檢查來源 IP ,似乎有些畫蛇添足,因為只有來自本機的封包才有機會進入 Loopback 介面
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT
# 從 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 檔案。
sql# mysql -u root -p(以 root 身分登入 MySql 主控臺)
mysql> create database iptables;(建立一個資料庫叫做 iptables,資料庫也可以自行命名,但是要記得修改相關程式)
mysql> grant create,select,insert on iptables.* to identified by 'xx';(將 iptables 資料庫新建、讀取和寫入許可權授權給 iptables_admin 這個賬號,並限制只能從本機聯機,密碼為 xx,請自行修改上述指令中之賬號與密碼)
mysql> grant create,select on iptables.* to identified by 'xx';(將 iptables 資料庫讀取許可權授權給 iptables_user 這個賬號,並限制只能從本機聯機,密碼為 xx,請自行修改上述指令中之賬號與密碼)
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-955505/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- iptables基礎和應用(2)(轉)
- iptables基礎原理和使用簡介
- iptables應用
- Iptables防火牆應用防火牆
- scrapy框架簡介和基礎應用框架
- shell基礎應用
- Sentinel基礎應用
- echarts基礎應用Echarts
- flash基礎應用
- Linux基礎命令---iptables-saveLinux
- Linux基礎命令---iptables防火牆Linux防火牆
- ZooKeeper 基礎知識、部署和應用程式
- 用iptables實現NAT(轉)
- nginx應用總結(1)-- 基礎知識和應用配置梳理Nginx
- iptables應用之動態DNS(轉)DNS
- Windows應用程式基礎Windows
- Ubuntu Server 基礎應用UbuntuServer
- python基礎應用Python
- 用AJAX開發智慧Web應用程式之基礎篇(轉)Web
- iptables深入解析:filter應用篇Filter
- iptables在網路中的兩個經典應用(轉)
- C#反射基礎知識和實戰應用C#反射
- BEA推出應用安全基礎架構解決方案(轉)架構
- 應用基礎框架全面解析框架
- nginx的基礎應用(續)Nginx
- Linux應用——程序基礎Linux
- 使用iptables建置Linux 防火牆(3)(轉)Linux防火牆
- HTTPS基礎原理和配置-3HTTP
- 主機安全(2)iptables的filter應用Filter
- iptables深入解析:應用層外掛篇
- Linux下Nginx基礎應用LinuxNginx
- Mac基礎設定—應用程式Mac
- React 應用實踐(基礎篇)React
- Python Web 應用:WSGI基礎PythonWeb
- Android應用基礎知識Android
- .NET基礎之母版頁應用
- 6. Oracle開發和應用——6.1. 基礎知識Oracle
- 關鍵應用和超融合基礎架構:時機已到架構