使用iptables建置Linux 防火牆(3)(轉)

amyz發表於2007-08-13
使用iptables建置Linux 防火牆(3)(轉)[@more@]

  # 從 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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章