防火牆就是在管制進(jìn)入到我們網(wǎng)域內(nèi)的主機(jī)(或者可以說是網(wǎng)域)的資料封包的一種機(jī)制。只要能夠分析與過濾進(jìn)入我們管理之網(wǎng)域的封包資料,就可以稱為防火牆
硬體防火牆也就是一些廠商設(shè)計(jì)好的硬體,裡面的系統(tǒng)軟體已經(jīng)設(shè)定好了封包資料的過濾機(jī)制
Linux 系統(tǒng)本身提供的軟體防火牆的功能,那就是 iptables 與 TCP Wrappers 喔!
以使用防火牆對(duì)於封包的抵擋機(jī)制來進(jìn)行分類 分為兩大類,分別是代理伺服器 (Proxy) 以及 IP Filter
■ iptables
『iptables 與 ipchains 兩者不能同時(shí)執(zhí)行!』設(shè)定防火牆的時(shí)候,盡量在本機(jī)前面設(shè)定,不要利用遠(yuǎn)端連線服務(wù)來設(shè)定,否則很容易產(chǎn)生自己將自己擋掉的重大問題!』
[root@test root]# lsmod
# 若有發(fā)現(xiàn) ipchains 的字樣,表示系統(tǒng)不小心載入了 ipchains 了,請(qǐng)使用:
[root@test root]# rmmod ipchains
# 這樣就能夠移除 ipchains 了!然後載入 iptables 吧!
[root@test root]# modprobe ip_tables
§ 觀察規(guī)則
[root@test root]# iptables [-t tables] [-L] [-n]
參數(shù)說明:
-t:後面接 iptables 的 table ,例如 nat 或 filter ,如果沒有 -t table
的話,那麼預(yù)設(shè)就是 -t filter 這個(gè) table 喔!
-L:列出目前的 table 的規(guī)則
-n:不進(jìn)行 IP 與 HOSTNAME 的轉(zhuǎn)換,螢?zāi)伙@示訊息的速度會(huì)快很多!
範(fàn)例:
[root@test root]# iptables -L -n
[root@test root]# iptables -t nat -L -n
§ 清除規(guī)則
[root@test root]# /sbin/iptables [-t tables] [-FXZ]
參數(shù)說明:
-F :清除所有的已訂定的規(guī)則;
-X :殺掉所有使用者建立的 chain (應(yīng)該說的是 tables )囉;
-Z :將所有的 chain 的計(jì)數(shù)與流量統(tǒng)計(jì)都?xì)w零
範(fàn)例:
[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
# 請(qǐng)注意,如果在遠(yuǎn)端連線的時(shí)候,『這三個(gè)指令必須要用 scripts 來連續(xù)執(zhí)行』, 不然肯定『會(huì)讓您自己被主機(jī)擋在門外!』
§ 定義政策
[root@test root]# /sbin/iptables [-t tables] [-P] [INPUT,OUTPUT,FORWARD| PREROUTING,OUTPUT,POSTROUTING] [ACCEPT,DROP]
參數(shù)說明:
-P :定義政策( Policy )。注意,這個(gè) P 為大寫?。?
INPUT?。悍獍鼮檩斎胫鳈C(jī)的方向;
OUTPUT :封包為輸出主機(jī)的方向;
FORWARD:封包為不進(jìn)入主機(jī)而向外再傳輸出去的方向;
PREROUTING :在進(jìn)入路由之前進(jìn)行的工作;
OUTPUT ?。悍獍鼮檩敵鲋鳈C(jī)的方向;
POSTROUTING:在進(jìn)入路由之後進(jìn)行的工作。
範(fàn)例:
[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 之外,其他都給他設(shè)定為接受囉!在上面的設(shè)定之後, 我們的主機(jī)發(fā)出的封包可以出去,但是任何封包都無法進(jìn)入,
# 包括回應(yīng)給我們送出封包的回應(yīng)封包(ACK)也無法進(jìn)入喔! ^_^
§ 增加與插入規(guī)則
[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]
參數(shù)說明:
-A ?。盒略黾右粭l規(guī)則,該規(guī)則增加在最後面,例如原本已經(jīng)有四條規(guī)則,
使用 -A 就可以加上第五條規(guī)則!
-I :插入一條規(guī)則,如果沒有設(shè)定規(guī)則順序,預(yù)設(shè)是插入變成第一條規(guī)則,
例如原本有四條規(guī)則,使用 -I 則該規(guī)則變成第一條,而原本四條變成 2~5
INPUT?。阂?guī)則設(shè)定為 filter table 的 INPUT 鏈
OUTPUT :規(guī)則設(shè)定為 filter table 的 OUTPUT 鏈
FORWARD:規(guī)則設(shè)定為 filter table 的 FORWARD 鏈
-i :設(shè)定『封包進(jìn)入』的網(wǎng)路卡介面
-o :設(shè)定『封包流出』的網(wǎng)路卡介面
interface :網(wǎng)路卡介面,例如 ppp0, eth0, eth1....
-p ?。赫?qǐng)注意,這是小寫呦!封包的協(xié)定啦!
tcp :封包為 TCP 協(xié)定的封包;
upd :封包為 UDP 協(xié)定的封包;
icmp:封包為 ICMP 協(xié)定、
all :表示為所有的封包!
-s :來源封包的 IP 或者是 Network ( 網(wǎng)域 );
--sport:來源封包的 port 號(hào)碼,也可以使用 port1:port2 如 21:23
同時(shí)通過 21,22,23 的意思
-d :目標(biāo)主機(jī)的 IP 或者是 Network ( 網(wǎng)域 );
--dport:目標(biāo)主機(jī)的 port 號(hào)碼;
-j ?。簞?dòng)作,可以接底下的動(dòng)作;
ACCEPT :接受該封包
DROP :丟棄封包
LOG ?。簩⒃摲獍馁Y訊記錄下來 (預(yù)設(shè)記錄到 /var/log/messages 檔案)
範(fàn)例:
範(fàn)例一:所有的來自 lo 這個(gè)介面的封包,都予以接受
[root@test root]# iptables -A INPUT -i lo -j ACCEPT
# 注意一下,因?yàn)?-d, --dport, -s, --sport 等等參數(shù)都沒有設(shè)定,這表示:
# 不論封包來自何處或去到哪裡,只要是來自 lo 這個(gè)介面,就予以接受!
# 這個(gè)觀念挺重要的,就是『沒有設(shè)定的規(guī)定,則表示該規(guī)定完全接受』的意思!
# 例如這個(gè)案例當(dāng)中,關(guān)於 -s, -d...等等的參數(shù)沒有規(guī)定時(shí)!
範(fàn)例二:來自 192.168.0.1 這個(gè) IP 的封包都予以接受:
[root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.1 -j ACCEPT
# 新增一條規(guī)則,只要是來自於 192.168.0.1 的封包,不論他要去哪裡,
# 使用的是那個(gè)協(xié)定 (port) 主機(jī)都會(huì)予以接受的意思~
範(fàn)例三:來自 192.168.1.0 這個(gè) C Class 的網(wǎng)域的任何一部電腦,就予以接受!
[root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 -j ACCEPT
# 這個(gè)是網(wǎng)域的寫法喔!稍微注意一下的是,在範(fàn)例二當(dāng)中我們僅針對(duì)一個(gè) IP ,
# 至於這個(gè)範(fàn)例當(dāng)中,則是針對(duì)整個(gè)網(wǎng)域來開放吶!而網(wǎng)域的寫法可以是:
# 192.168.1.0/24 也可以是 192.168.1.0/255.255.255.0 都能夠接受喔!
範(fàn)例四:來自 192.168.1.25 的封包都給他丟棄去!
[root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.25 -j DROP
範(fàn)例五:只要是想進(jìn)入本機(jī)的 port 21 的封包就給他丟棄
[root@test root]# iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP
範(fàn)例六:來自 192.168.0.24 這個(gè) IP 的封包,想要到我的 137,138,139 埠口時(shí),都接受
[root@test root]# iptables -A INPUT -i eth0 -p tcp -s 192.168.0.24 \
> --dport 137:139 -j ACCEPT
範(fàn)例七:只要是接觸到我主機(jī)的 port 25 就將該封包記錄 (LOG) 下來
[root@test root]# iptables -A INPUT -p tcp --dport 25 -j LOG
# 還是請(qǐng)?zhí)貏e注意到『規(guī)則的順序排列』的問題喔!
§ iptables 的其他相關(guān)參數(shù)說明:
[!] --syn :這個(gè)設(shè)定僅能用於 -p tcp 的規(guī)則中,因?yàn)?TCP 封包有 syn 的旗標(biāo)存在啊!當(dāng) TCP 封包存有 syn 旗標(biāo),表示這個(gè)連線是對(duì)方『主動(dòng)』連過來的!
若於 --syn 之前加上 ! 表示該封包不帶有 syn 的意思~(剛好相反之意!)
範(fàn)例一:將來自 192.168.100.200 的主動(dòng)連線封包丟棄:
[root@test root]# iptables -A INPUT -p tcp -i eth0 -s 192.168.1.235 \
> --syn -j DROP
--icmp-type:可以管制 ICMP 封包的某些類型!還記得我們?cè)?網(wǎng)路基礎(chǔ) 裡面談到的 ICMP 的某些類型吧!對(duì)啦!如果您不想要讓對(duì)方 ping 到您的機(jī)器,就是利用這個(gè)項(xiàng)目啦!
範(fàn)例二:別的主機(jī) ping 我們主機(jī)時(shí),我們主機(jī)不予以回應(yīng)
[root@test root]# iptables -A INPUT -p icmp --icmp-type 8 -j DROP
# 當(dāng)您下達(dá)這樣的指令後,就表示未來別人對(duì)您使用 ping 的時(shí)候,我們的主機(jī)將不會(huì)回應(yīng),所以對(duì)方主機(jī)就會(huì)顯示我們主機(jī)『無法連接』的狀態(tài)!
-m :表示封包的狀態(tài),狀態(tài)有底下數(shù)種:
-m mac --mac-source aa:bb:cc:dd:ee:ff
這個(gè)就是我們上面提到的可以控制『網(wǎng)路卡卡號(hào), MAC』的設(shè)定方法囉! 那個(gè) aa:bb:cc:dd:ee:ff 就是網(wǎng)路卡的 MAC !
-m state --state <狀態(tài)>
有數(shù)種狀態(tài),狀態(tài)有:
INVALID:無效的封包,例如資料破損的封包狀態(tài)
ESTABLISHED:已經(jīng)連線成功的連線狀態(tài);
NEW:想要新建立連線的封包狀態(tài);
RELATED:這個(gè)最常用!表示這個(gè)封包是與我們主機(jī)發(fā)送出去的封包有關(guān), 可能是回應(yīng)封包或者是連線成功之後的傳送封包!這個(gè)狀態(tài)很常被設(shè)定,
因?yàn)樵O(shè)定了他之後,只要未來由本機(jī)發(fā)送出去的封包,即使我們沒有設(shè)定封包的 INPUT 規(guī)則,該有關(guān)的封包還是可以進(jìn)入我們主機(jī)喔!可以簡化相當(dāng)多的設(shè)定規(guī)則啦!
範(fàn)例三:讓 bb:cc:dd:aa:ee:ff 網(wǎng)路卡無法使用我們主機(jī)的資源
[root@test root]# iptables -A INPUT -p all -m mac --mac-source \
> 01:01:01:01:02:01 -j DROP
# 這種方式可以用來管制網(wǎng)路卡卡號(hào)喔!就不怕別人使用 IP 搞怪了!
範(fàn)例四:讓已經(jīng)建立或者是與我們主機(jī)有關(guān)的回應(yīng)封包通過,但是讓不合法的,
以及想要嘗試新建立的封包被抵擋在外!
[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
# 需要設(shè)定兩條喔!至於封包狀態(tài)則可以使用逗號(hào)隔開!逗號(hào)兩邊不要有空格
-j <動(dòng)作>:除了比較常見的 ACCEPT 與 DROP 之外,還有哪些動(dòng)作?
REDIRECT --to-ports <port number>
這個(gè)也挺常見的,基本上,就是進(jìn)行本機(jī)上面 port 的轉(zhuǎn)換就是了!
不過,特別留意的是,這個(gè)動(dòng)作僅能夠在 nat table 的 PREROUTING 以及 OUTPUT 鏈上面實(shí)行而已喔!(關(guān)於連線流程,請(qǐng)參考圖八)
MASQUERADE:封包偽裝
這個(gè)就是 NAT 主機(jī)最重要的一個(gè)機(jī)制啦!進(jìn)行封包的偽裝!
範(fàn)例五:將要求與 80 連線的封包轉(zhuǎn)遞到 8080 這個(gè) port
[root@test root]# iptables -t nat -A PREROUTING -p tcp --dport 80 \
> -j REDIRECT --to-ports 8080
# 這玩意最容易在您使用了非正規(guī)的 port 來進(jìn)行某些 well known 的協(xié)定, 例如使用 8080 這個(gè) port 來啟動(dòng) WWW ,但是別人都以 port 80 來連線,
所以,您就可以使用上面的方式來將對(duì)方對(duì)您主機(jī)的連線傳遞到 8080 囉!
範(fàn)例六:進(jìn)行封包的偽裝,將來自 192.168.0.0/24 的封包的來源 IP 偽裝成為
本機(jī)的 ppp0 那個(gè)介面的 IP
[root@test root]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
> -o ppp0 -j MASQUERADE
§ 紀(jì)錄與回復(fù)防火牆規(guī)則
[root@test root]# iptables-save > filename
# 將目前的防火牆機(jī)制儲(chǔ)存成 filename 那個(gè)檔案!該檔案為 ASCII 格式, 您可以進(jìn)入查閱一下喔!
[root@test root]# iptables-restore < filename
# 將 filename 那個(gè)防火牆檔案 (注意!並不是 shell scripts 的格式) 的規(guī)則 讀入目前的 Linux 主機(jī)環(huán)境中!
■ TCP_Wrappers:
TCP Wrappers 的抵擋機(jī)制其實(shí)是以 tcpd 這支程式為主,而這支程式的主要參數(shù)檔在 /etc/hosts.allow 以及 /etc/hosts.deny 兩個(gè)檔案當(dāng)中,『當(dāng)某個(gè)軟體支援 tcpd (TCP Wrappers) 的功能,則當(dāng)網(wǎng)路封包嘗試向該服務(wù)要求資料時(shí),該網(wǎng)路封包將接受 TCP Wrappers 的檢驗(yàn),而檢驗(yàn)的參數(shù)設(shè)定則是取自 /etc/hosts.allow 以及 /etc/hosts.deny兩個(gè)檔案』。
在預(yù)設(shè)的狀態(tài)下,/etc/hosts.allow 這個(gè)檔案的設(shè)定內(nèi)容會(huì)先被讀取; 然後才會(huì)讀取 /etc/hosts.deny 的內(nèi)容。
舊版的使用 tcpd 程式的語法
<服務(wù)名稱> : <IP/network> : <action>
# 特別注意, network 可以使用 192.168.0.0/255.255.255.0 , 但不可使用 192.168.0.0/24 !
範(fàn)例一:
[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 這個(gè) IP 使用本機(jī)的 telnet 及 ftp 這兩個(gè)服務(wù)! 請(qǐng)?zhí)貏e注意,那個(gè)『服務(wù)名稱』其實(shí)就是『程式檔名』喔!
[root@test root]# vi /etc/hosts.deny
in.telnetd: 192.168.2.3 : deny # 將來自 192.168.2.3 對(duì)於使用本機(jī) telnet 的權(quán)限關(guān)掉!
# 特別注意,這個(gè)語法在 xinetd 裡面時(shí),<action> 已經(jīng)被拿掉了! 所以,目前您可以使用這樣的格式:
[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
# 事實(shí)上,這也是 TCP Wrappers 支援的格式,所以建議您直接使用此格式即可, 亦即不需要加上 allow 或者是 deny 的動(dòng)作,因?yàn)樵?hosts.allow 裡面的
# 規(guī)則就是 allow 而在 hosts.deny 裡面的規(guī)則就是 deny 的意思!
在上面的語法當(dāng)中,最重要的莫過於找出『服務(wù)名稱』!
ssh 這個(gè)遠(yuǎn)端連線伺服器,而這個(gè)伺服器的啟動(dòng)的 binary 可執(zhí)行檔為 sshd 這個(gè)檔名的程式,所以您要讓某些來源的 IP 或主機(jī)名稱通過 TCP Wrappers 的檢驗(yàn)時(shí),就必須要:
sshd: 192.168.0.100 並且同時(shí)需要注意 SSH 是否有支援 TCP Wrappers 喔!
您也可以使用 ALL 來代表『所有的服務(wù)』或者是『所有的來源』,例如在 /etc/hosts.deny 裡面加入:
ALL: ALL 代表『不論何種服務(wù)、不論來自哪裡的封包,全部都給他擋掉!』