利用簡單的 iptables 規則,配合 TCP_Wrappers 來進行防火牆建置呢!
[root@test
root]# lsmod
# 若有發現 ipchains 的字樣,表示系統不小心載入了 ipchains 了,請使用: [root@test root]# rmmod ipchains # 這樣就能夠移除 ipchains 了!然後載入 iptables 吧! [root@test root]# modprobe ip_tables |
[root@test
root]# iptables [-t tables] [-L] [-n]
參數說明: -t:後面接 iptables 的 table ,例如 nat 或 filter ,如果沒有 -t table 的話,那麼預設就是 -t filter 這個 table 喔! -L:列出目前的 table 的規則 -n:不進行 IP 與 HOSTNAME 的轉換,螢幕顯示訊息的速度會快很多! 範例: [root@test root]# iptables -L -n Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 仔細看到上面,因為沒有加上 -t 的參數,所以預設就是 filter 這個表格, # 在這個表格當中有三條鏈,分別是 INPUT, OUTPUT 與 FORWARD ,而且因為 # 沒有規則,所以規則裡面都是空的!同時注意一下,在每個 chain 的後面 () # 裡面,會發現有 policy 對吧!那就是『預設動作(政策)』咯!以上面來看, # 雖然我們啟動了 iptables ,但是我們沒有設定規則,然後政策又是 ACCEPT, # 所以『任何封包都會接受』的意思喔! [root@test root]# iptables -t nat -L -n Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain POSTROUTING
(policy ACCEPT)
Chain OUTPUT
(policy ACCEPT)
|
[root@test
root]# /sbin/iptables [-t tables] [-FXZ]
參數說明: -F :清除所有的已訂定的規則; -X :殺掉所有使用者建立的 chain (應該說的是 tables )囉; -Z :將所有的 chain 的計數與流量統計都歸零 範例: [root@test root]# /sbin/iptables -F [root@test root]# /sbin/iptables -X [root@test root]# /sbin/iptables -Z [root@test root]# /sbin/iptables -t nat -F # 請注意,如果在遠端連線的時候,『這三個指令必須要用 scripts 來連續執行』, # 不然肯定『會讓您自己被主機擋在門外!』 |
[root@test
root]# /sbin/iptables [-t tables] [-P] [INPUT,OUTPUT,FORWARD|
PREROUTING,OUTPUT,POSTROUTING] [ACCEPT,DROP]
參數說明: -P :定義政策( Policy )。注意,這個 P 為大寫啊! INPUT :封包為輸入主機的方向; OUTPUT :封包為輸出主機的方向; FORWARD:封包為不進入主機而向外再傳輸出去的方向; PREROUTING :在進入路由之前進行的工作; OUTPUT :封包為輸出主機的方向; POSTROUTING:在進入路由之後進行的工作。 範例: [root@test root]# /sbin/iptables -P INPUT DROP [root@test root]# /sbin/iptables -P OUTPUT ACCEPT [root@test root]# /sbin/iptables -P FORWARD ACCEPT [root@test root]# /sbin/iptables -t nat -P PREROUTING ACCEPT [root@test root]# /sbin/iptables -t nat -P OUTPUT ACCEPT [root@test root]# /sbin/iptables -t nat -P POSTROUTING ACCEPT # 除了 INPUT 之外,其他都給他設定為接受囉!在上面的設定之後, # 我們的主機發出的封包可以出去,但是任何封包都無法進入, # 包括回應給我們送出封包的回應封包(ACK)也無法進入喔! ^_^ |
[root@test
root]# iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD]
\
> [-io interface] [-p tcp,udp,icmp,all] [-s IP/network] [--sport ports] \ > [-d IP/network] [--dport ports] -j [ACCEPT,DROP] 參數說明: -A :新增加一條規則,該規則增加在最後面,例如原本已經有四條規則, 使用 -A 就可以加上第五條規則! -I :插入一條規則,如果沒有設定規則順序,預設是插入變成第一條規則, 例如原本有四條規則,使用 -I 則該規則變成第一條,而原本四條變成 2~5 INPUT :規則設定為 filter table 的 INPUT 鏈 OUTPUT :規則設定為 filter table 的 OUTPUT 鏈 FORWARD:規則設定為 filter table 的 FORWARD 鏈 -i :設定『封包進入』的網路卡介面 -o :設定『封包流出』的網路卡介面 interface :網路卡介面,例如 ppp0, eth0, eth1.... -p :請注意,這是小寫呦!封包的協定啦! tcp :封包為 TCP 協定的封包; upd :封包為 UDP 協定的封包; icmp:封包為 ICMP 協定、 all :表示為所有的封包! -s :來源封包的 IP 或者是 Network ( 網域 ); --sport:來源封包的 port 號碼,也可以使用 port1:port2 如 21:23 同時通過 21,22,23 的意思 -d :目標主機的 IP 或者是 Network ( 網域 ); --dport:目標主機的 port 號碼; -j :動作,可以接底下的動作; ACCEPT :接受該封包 DROP :丟棄封包 LOG :將該封包的資訊記錄下來 (預設記錄到 /var/log/messages 檔案) 範例: 範例一:所有的來自 lo 這個介面的封包,都予以接受 [root@test root]# iptables -A INPUT -i lo -j ACCEPT # 注意一下,因為 -d, --dport, -s, --sport 等等參數都沒有設定,這表示: # 不論封包來自何處或去到哪裡,只要是來自 lo 這個介面,就予以接受! # 這個觀念挺重要的,就是『沒有設定的規定,則表示該規定完全接受』的意思! # 例如這個案例當中,關於 -s, -d...等等的參數沒有規定時! 範例二:來自 192.168.0.1 這個 IP 的封包都予以接受: [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.1 -j ACCEPT # 新增一條規則,只要是來自於 192.168.0.1 的封包,不論他要去哪裡, # 使用的是那個協定 (port) 主機都會予以接受的意思~ 範例三:來自 192.168.1.0 這個 C Class 的網域的任何一部電腦,就予以接受! [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -j ACCEPT # 這個是網域的寫法喔!稍微注意一下的是,在範例二當中我們僅針對一個 IP , # 至於這個範例當中,則是針對整個網域來開放吶!而網域的寫法可以是: # 192.168.1.0/24 也可以是 192.168.1.0/255.255.255.0 都能夠接受喔! 範例四:來自 192.168.1.25 的封包都給他丟棄去! [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.25 -j DROP 範例五:只要是想進入本機的 port 21 的封包就給他丟棄 [root@test root]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP 範例六:來自 192.168.0.24 這個 IP 的封包,想要到我的 137,138,139 埠口時,都接受 [root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.24 \ > --dport 137:139 -j ACCEPT 範例七:只要是接觸到我主機的 port 25 就將該封包記錄 (LOG) 下來 [root@test root]# iptables -A INPUT -p tcp --dport 25 -j LOG # 還是請特別注意到『規則的順序排列』的問題喔! |
iptables 的其他相關參數說明:
[!] --syn :這個設定僅能用於 -p tcp 的規則中,因為 TCP 封包有 syn 的旗標存 在啊!當 TCP 封包存有 syn 旗標,表示這個連線是對方『主動』連過來的! 若於 --syn 之前加上 ! 表示該封包不帶有 syn 的意思~(剛好相反之意!) 範例一:將來自 192.168.100.200 的主動連線封包丟棄: [root@test root]# iptables -A INPUT -p tcp -i eth0 -s 192.168.1.235 \ > --syn -j DROP --icmp-type:可以管制 ICMP 封包的某些類型!還記得我們在 網路基礎 裡面 談到的 ICMP 的某些類型吧!對啦!如果您不想要讓對方 ping 到您的機器, 就是利用這個項目啦! 範例二:別的主機 ping 我們主機時,我們主機不予以回應 [root@test root]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP # 當您下達這樣的指令後,就表示未來別人對您使用 ping 的時候, # 我們的主機將不會回應,所以對方主機就會顯示我們主機『無法連接』的狀態! -m :表示封包的狀態,狀態有底下數種: -m mac --mac-source aa:bb:cc:dd:ee:ff 這個就是我們上面提到的可以控制『網路卡卡號, MAC』的設定方法囉! 那個 aa:bb:cc:dd:ee:ff 就是網路卡的 MAC ! -m state --state <狀態> 有數種狀態,狀態有: INVALID:無效的封包,例如資料破損的封包狀態 ESTABLISHED:已經連線成功的連線狀態; NEW:想要新建立連線的封包狀態; RELATED:這個最常用!表示這個封包是與我們主機發送出去的封包有關, 可能是回應封包或者是連線成功之後的傳送封包!這個狀態很常被設定, 因為設定了他之後,只要未來由本機發送出去的封包,即使我們沒有設定 封包的 INPUT 規則,該有關的封包還是可以進入我們主機喔! 可以簡化相當多的設定規則啦! 範例三:讓 bb:cc:dd:aa:ee:ff 網路卡無法使用我們主機的資源 [root@test root]# iptables -A INPUT -p all -m mac --mac-source \ > 01:01:01:01:02:01 -j DROP # 這種方式可以用來管制網路卡卡號喔!就不怕別人使用 IP 搞怪了! 範例四:讓已經建立或者是與我們主機有關的回應封包通過,但是讓不合法的, 以及想要嘗試新建立的封包被抵擋在外! [root@test root]# iptables -A INPUT -p tcp -m state \ > --state ESTABLISHED,RELATED -j ACCEPT [root@test root]# iptables -A INPUT -p tcp -m state \ > --state INVALID,NEW -j DROP # 需要設定兩條喔!至於封包狀態則可以使用逗號隔開!逗號兩邊不要有空格 -j <動作>:除了比較常見的 ACCEPT 與 DROP 之外,還有哪些動作? REDIRECT --to-ports <port number> 這個也挺常見的,基本上,就是進行本機上面 port 的轉換就是了! 不過,特別留意的是,這個動作僅能夠在 nat table 的 PREROUTING 以及 OUTPUT 鏈上面實行而已喔!(關於連線流程,請參考圖八) MASQUERADE:封包偽裝 這個就是 NAT 主機最重要的一個機制啦!進行封包的偽裝! 範例五:將要求與 80 連線的封包轉遞到 8080 這個 port [root@test root]# iptables -t nat -A PREROUTING -p tcp --dport 80 \ > -j REDIRECT --to-ports 8080 # 這玩意最容易在您使用了非正規的 port 來進行某些 well known 的協定, # 例如使用 8080 這個 port 來啟動 WWW ,但是別人都以 port 80 來連線, # 所以,您就可以使用上面的方式來將對方對您主機的連線傳遞到 8080 囉! 範例六:進行封包的偽裝,將來自 192.168.0.0/24 的封包的來源 IP 偽裝成為 本機的 ppp0 那個介面的 IP [root@test root]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \ > -o ppp0 -j MASQUERADE |
[root@test
root]# iptables-save > filename
# 將目前的防火牆機制儲存成 filename 那個檔案!該檔案為 ASCII 格式, # 您可以進入查閱一下喔! [root@test root]# iptables-restore < filename # 將 filename 那個防火牆檔案 (注意!並不是 shell scripts 的格式) 的規則 # 讀入目前的 Linux 主機環境中! |
[root@test
root]# mkdir -p /usr/local/virus/iptables
[root@test root]# cd /usr/local/virus/iptables [root@test iptables]# vi iptables.rule #!/bin/bash # # ======================================================== # 程式說明: # 歡迎使用 iptables.rule 這個 script 來建立您的防火牆! # 這支 script 還需要您的額外設定方可適合您的主機環境! # 基本規則定義為『拒絕所有,開放特定』的模式! # # 使用說明: # 請先將這個 scripts 的權限更改為可執行: # chmod 755 iptables.rule # 在將這個程式放置在 /usr/local/virus/iptables 目錄下: # mkdir -p /usr/local/virus/iptables # mv /完整的路徑/iptables.rule /usr/local/virus/iptables # 執行測試: # /usr/local/virus/iptables/iptables.rule # iptables -L -n (這個動作在檢查防火牆規則) # 將底下這一行加入 /etc/rc.d/rc.local 當中 # /usr/local/virus/iptables/iptables.rule # 取消防火牆: # iptables -F # iptables -X # iptables -t nat -F # iptables -t nat -X # # ======================================================== # 版權宣告: # 這支程式為 GPL 授權,任何人皆可使用, # 然,若使用本 scripts 發生問題時, # 本人不負任何責任 # VBird <vbird@tsai.adsldns.org> # ======================================================== # 歷史紀錄: # 2002/08/20 VBird 首次釋出 # 2003/04/26 VBird 加入砍站軟體的相關執行檔案! # 2003/08/25 VBird 修改 INPUT 的 Policy 成為 DROP # ======================================================== # 0.0 Please
key in your parameters
# 底下這個 INIF
為對內的網路卡介面,
# 1.0 測試您的核心版本與防火牆模組
# 2.0 載入適當的模組
# 3.0 先清除所有的防火牆規則
# 4.0 先允許信任網域,這包含
lo 這個內部迴圈介面,
# 5.0 開始載入信任與拒絕的網域設定的檔案,
# 6.0 底下這個檔案若存在,則執行!請注意,
# 7.0 允許 ICMP
封包與允許已建立的連線通過!
# 8.0 Allow
services特別留意底下的服務,將您主機沒有開放的服務關閉吧!
|
[root@test
iptables]# vi iptables.allow
#!/bin/bash # # This program is used to allow some IP or hosts to access your Server # # HISTORY # 2002/08/20 first release by VBird /sbin/iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT [root@test iptables]#
vi
iptables.deny
/sbin/iptables
-A INPUT -i $EXTIF -s 140.115.236.8 -j DROP
|
[root@test
/root]# vi /etc/rc.d/rc.local
#!/bin/sh # # This script will be executed *after* all the other init scripts. # You can put your own initialization stuff in here if you don't # want to do the full Sys V style init stuff. touch /var/lock/subsys/local #1. adsl connectting.
2002/04/06 VBird
|
上面的三個檔案可以在底下的網站上取得下載:
http://linux.vbird.org/download/index.php#firewall_iptables
舊版的使用
tcpd 程式的語法
<服務名稱> : <IP/network> : <action> # 特別注意, network 可以使用 192.168.0.0/255.255.255.0 , # 但不可使用 192.168.0.0/24 ! 範例一: [root@test root]# vi /etc/hosts.allow in.telnetd: 127.0.0.1 : allow in.telnetd: 192.168.1.0/255.255.255.0 : allow in.telnetd: .ncku.edu.tw : allow in.ftpd: 127.0.0.1 : allow # 允許的 127.0.0.1 這個 IP 使用本機的 telnet 及 ftp 這兩個服務! # 請特別注意,那個『服務名稱』其實就是『程式檔名』喔! [root@test root]# vi /etc/hosts.deny in.telnetd: 192.168.2.3 : deny # 將來自 192.168.2.3 對於使用本機 telnet 的權限關掉! # 特別注意,這個語法在 xinetd 裡面時,<action> 已經被拿掉了! # 所以,目前您可以使用這樣的格式: [root@test root]# vi /etc/hosts.allow in.telnetd: 127.0.0.1 in.telnetd: 192.168.1.0/255.255.255.0 in.telnetd: .ncku.edu.tw # 事實上,這也是 TCP Wrappers 支援的格式,所以建議您直接使用此格式即可, # 亦即不需要加上 allow 或者是 deny 的動作,因為在 hosts.allow 裡面的 # 規則就是 allow 而在 hosts.deny 裡面的規則就是 deny 的意思! |
[root@test
root]# vi /etc/hosts.allow
# 先寫關於 telnet, ftp 及 sshd 開放的資料 in.telnetd: 192.168.1.2, 192.168.1.10, 192.168.1.20 in.ftpd: 192.168.1.2, 192.168.1.10, 102.168.1.20 sshd: 192.168.1.0/255.255.255.0, xxx.yyy.zzz.qqq # 每個 IP 或者主機之間,可以利用逗號或空格來隔開! [root@test root]# vi /etc/hosts.deny # 將上面的三個服務都關掉啦! in.telnetd: ALL in.ftpd: ALL sshd: ALL # 特別注意,很多朋友喜歡在 /etc/hosts.deny 裡面加入這一行: ALL: ALL # 來抵擋所有的服務與所有的來源!不過,我個人是不太建議這樣做的! # 因為很多時候,當您架設好網站之後,卻發現老是無法讓 Client 連線成功, # 很多經驗告訴我們,最大的問題就是出現在 ALL : ALL 這一行! |
[root@test
root]# vi /etc/hosts.deny
in.telnetd : ALL : spawn (/bin/echo Security notice from host `/bin/hostname`; \ /bin/echo; /usr/sbin/safe_finger @%h ) | \ /bin/mail -s "%d -%h security" root@localhost & \ : twist ( /bin/echo -e "\n\nWARNING connectin not allowed. Your attempt has been logged. \n\n\n警告您尚未允許登入,您的連線將會被紀錄,並且作為以後的參考\n\n ". ) in.ftpd : ALL
: spawn (/bin/echo Security notice from host `/bin/hostname`; \
sshd : ALL :
spawn (/bin/echo Security notice from host `/bin/hostname`; \
|
雖然這樣一來就稍微建置好了您的防火牆了!但是誰都不知道到底這樣的防火牆效果如何?所以,您需要花費更多的時間來進行測試呢!測試的步驟可以是:一步一步作下來,看看問題出在哪裡,然後多多的去改進、改良!!基本上,網路上目前很多的資料可以提供您不錯的參考了!這一篇的設定寫的是很簡單,大部分都還在介紹階段而已!希望對大家有幫助!我在參考資料當中列出幾個有用的防火牆網頁,希望大家有空真的要多多的去看看!會很有幫助的!
- 先由主機向外面主動連線試看看;
- 再由私有網域內的 PC 向外面主動連線試看看;
- 最後,由 Internet 上面的主機,主動連線到您的 Linux 主機試看看;
我們來考慮一個比較有趣的問題,那就是如同圖四的情況,事實上,主機是架設在防火牆後端的!在這樣的情況下,我們要怎麼將來自 Internet 的封包,經由 firewall 轉遞到後端的主機上面呢?!我們可以參考一下封包的流程,如同上面圖九的說明,因為來自 Internet 的封包要丟給防火牆後端的主機,所以在『路由之前就需要先設定好轉換路由』的狀態了!因此在 nat table 的 PREROUTING 的鏈上面來進行所謂的『 Destination NAT, DNAT 』的動作才行啦!您需要在防火牆的 iptables 機制上面,在 nat table 上面新增一條規則才行!語法如下:
iptables 的其他相關參數說明:
-j <動作>:除了比較常見的 ACCEPT 與 DROP 之外,還有哪些動作?
DNAT --to IP[:port]
常用在防火牆後端的主機之封包轉遞上面!
範例:將來自 Internet 的 port 80 連線的封包轉遞到 192.168.10.10 這個主機上
[root@test root]# iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 80 \
> -j DNAT --to 192.168.10.10:80
上面的範例是很簡單的一個例子,在比較簡易的環境下是可以成功的幫您進行 WWW 或者是 Mail 的服務的!不過,如果用在 FTP 上面可就很麻煩了~因為 FTP 除了正規的 21 這個命令通道埠口外,還有資料傳送的主動性與被動性!設定上很是困擾~有興趣的話,可以參考底下列出的幾個 iptables 的網站喔!這裡不再說明了!