##tcpd tcpd即tcp wrapper,TCP Wrapper是一個基於主機的網絡訪問控制表系統,用於過濾對類Unix系統(如Linux或BSD)的網絡訪問。其能將主機或子網IP地址、名稱及ident查詢回覆做爲篩選標記,實現訪問控制。能夠用來做爲防火牆使用。 關於tcpd的架構能夠參閱做者本人的論文:Tcp Wrapperlinux
如今Linux主要使用xinetd來實現 tcpd主要配置文件爲:/etc/hosts.deny, /etc/hosts.allow
通常而言,對於一個網絡鏈接請求,linux會首先判斷/etc/hosts.allow這個文件,若是遠程登陸的計算機知足文件/etc/hosts.allow設定的話,就不會去使用/etc/hosts.deny文件了,相反,若是不知足hosts.allow文件設定的規則的話,就會去使用hosts.deny文件了,若是知足hosts.deny的規則,此主機就被限制爲不可訪問linux服務器,若是也不知足hosts.deny的設定,此主機默認是能夠訪問 linux服務器的。只有當一個服務由xinetd管理或者支持tcp wrapper功能時才能使用tcpd來作防火牆。 若是想知道一個服務是否支持tcp wrapper功能,可使用ldd命令查看是否引用了tcp wrapper的庫文件:
lld $(which sshd)
shell
linux-vdso.so.1 => (0x00007ffff9144000)
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f798ff52000)
libpam.so.0 => /lib/x86_64-linux-gnu/libpam.so.0 (0x00007f798fd44000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f798fb20000)
libck-connector.so.0 => /usr/lib/x86_64-linux-gnu/libck-connector.so.0 (0x00007f798f91c000)vim
配置文件語法: <服務 (亦即程序名稱,例如sshd)> : <IP 或領域 或主機名> : < 動做 > 重點是兩個,第一個是找出你想要管理的那個程序的文件名,第二個纔是寫下來你想要放行或者是抵擋的 IP 或網域呢。 例如:後端
cat /etc/host.deny rsync : 127.0.0.100 127.0.0.200 : denycentos
cat /etc/host.allow rsync:192.168.1.0/24 allowbash
特殊字段:服務器
[root@www ~]# vim /etc/hosts.allow
rsync: 140.116.0.0/255.255.0.0
rsync: 203.71.39.0/255.255.255.0
rsync: 203.71.38.123
rsync: LOCAL
[root@www ~]# vim /etc/hosts.deny
rsync: ALL <==利用 ALL 配置讓全部其餘來源不可登錄網絡
擴展:架構
spawn (action) 能夠利用後續接的 shell 來進行額外的工做,且具備變量功能,主要的變量內容爲: %h (hostname), %a (address), %d (daemon)等等;app
twist (action) 馬上之後續的命令進行,且運行完後終止該次聯機的要求 (DENY)
例如:
cat /etc/hosts.deny rsync : ALL: spawn (echo "security notice from host $(/bin/hostname)" ;
echo; /usr/sbin/safe_finger @%h ) |
/bin/mail -s "%d-%h security" root &
: twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" )
這個中spawn 到root部分是將偵測的訪問者數據送給 root 的郵件信箱,重點在於 safe_finger 的項目,他會偵測到客戶端主機的相關信息,而後使用管線命令將這些數據送給 mail 處理, mail 會將該信息以標頭爲 security 的字樣寄給 root 啦!因爲 spawn 只是中間的過程,因此還可以有後續的動做!
twist ( /bin/echo -e "\n\nWARNING connection not allowed.\n\n" ): 這個動做會將 Warning 的字樣傳送到客戶端主機的屏幕上! 而後將該聯機中斷。
##iptables 相比於tcp wrapper,iptables更通用一些,iptables並不須要軟件提供xinted服務的支持,更加靈活,使用範圍也更廣。
iptables僅僅是用戶空間的一個軟件,其功能是由內核空間的Netfilter提供,Netfilter是Linux內核中的一個軟件框架,用於管理網絡數據包。不只具備網絡地址轉換(NAT)的功能,也具有數據包內容修改、以及數據包過濾等防火牆功能。 因爲Netfilter做用於內核,所以效率相對較高。
###防火牆規則順序
當一個網絡封包要進入到主機以前,會先經由 NetFilter 進行檢查,那就是 iptables 的規則了。 檢查經過則接受 (ACCEPT) 進入本機取得資源,若是檢查不經過,則可能予以丟棄 (DROP) ! 上圖中主要的目的在告知你:『規則是有順序的』!例如當網絡封包進入 Rule 1 的比對時, 若是比對結果符合 Rule 1 ,此時這個網絡封包就會進行 Action 1 的動做,而不會理會後續的 Rule 2, Rule 3.... 等規則的分析了。
例:若是你但願禁止192.168.199.143訪問本機的80端口,通常你的正確規則可能以下:
可是若是你把1和2顛倒,那麼當192.168.199.143試圖訪問你的80端口時,NetFilter會先匹配第一條規則,容許全部人訪問80,而後放行,第二條規則就無效了。 因此必定要安排好規則順序
##iptables 的表格 (table) 與鏈 (chain)
鏈:上面那個例子就是一個鏈,能夠視爲有序排列的規則。
表格:iptables裏有許多表格,每一個表格都定義出本身的默認政策與規則, 且每一個表格的用途都不相同,例以下圖是Linux下iptables的幾個常見表格:
filter (過濾器):主要跟進入 Linux 本機的封包有關。 * INPUT:主要與想要進入咱們 Linux 本機的封包有關 * OUTPUT:主要與咱們 Linux 本機所要送出的封包有關 * FORWARD:這個與 Linux 本機比較沒有關係, 他能夠『轉遞封包』到後端的計算機中,與下列 nat table 相關性較高。
NAT (地址轉換):是 Network Address Translation 的縮寫, 這個表格主要在進行來源與目的之 IP 或 port 的轉換,與 Linux 本機較無關,主要與 Linux 主機後的局域網絡內計算機較有相關。例如將主機A的80端口轉發到主機B的2333端口 * PREROUTING:在進行路由判斷以前所要進行的規則(DNAT/REDIRECT) * POSTROUTING:在進行路由判斷以後所要進行的規則(SNAT/MASQUERADE) * OUTPUT:與發送出去的封包有關
mangle (破壞者):這個表格主要是與特殊的封包的路由旗標有關, 早期僅有 PREROUTING 及 OUTPUT 鏈,不過從 kernel 2.4.18 以後加入了 INPUT 及 FORWARD 鏈。 因爲這個表格與特殊旗標相關性較高,因此像我們這種單純的環境當中,較少使用 mangle 這個表格。
用戶自定義部分
一個封包通過iptables的處理過程大體以下:
封包進入 Linux 主機使用資源 (路徑 A): 在路由判斷後肯定是向 Linux 主機要求數據的封包,主要就會透過 filter 的 INPUT 鏈來進行控管;
封包經由 Linux 主機的轉遞,沒有使用主機資源,而是向後端主機流動 (路徑 B): 在路由判斷以前進行封包表頭的修訂做業後,發現到封包主要是要透過防火牆而去後端,此時封包就會透過路徑 B 來跑動。 也就是說,該封包的目標並不是咱們的 Linux 本機。主要通過的鏈是 filter 的 FORWARD 以及 nat 的 POSTROUTING, PREROUTING。
封包由 Linux 本機發送出去 (路徑 C): 例如響應客戶端的要求,或者是 Linux 本機主動送出的封包,都是透過路徑 C 來跑的。先是透過路由判斷, 決定了輸出的路徑後,再透過 filter 的 OUTPUT 鏈來傳送的!固然,最終仍是會通過 nat 的 POSTROUTING 鏈。
###iptables語法 注意:不要在遠程主機上進行實驗,不當心把本身封了就很差玩了。
1.規則查看與清除
查看: iptables [-t tables] [-L] [-nv]
通常而言對於新安裝的操做系統,iptables是空的。下面這個例子來自於鳥哥的書:
Chain INPUT (policy ACCEPT) <==針對 INPUT 鏈,且預設政策爲可接受
target prot opt source destination <==說明欄 內容見下方 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED # 只要是封包狀態爲 RELATED,ESTABLISHED 就予以接受 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 # 只要封包協議是 icmp 類型的,就予以放行 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 #不管任何來源 (0.0.0.0/0) 且要去任何目標的封包,不論任何封包格式 (prot 爲 all),統統都接受(注意:這一條是針對lo,也就是迴環接口的,能夠經過iptables-save查看) ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 #只要是傳給 port 22 的主動式聯機 tcp 封包就接受REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited #拒絕所有封包信息 Chain FORWARD (policy ACCEPT) <==針對 FORWARD 鏈,且預設政策爲可接受
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedChain OUTPUT (policy ACCEPT) <==針對 OUTPUT 鏈,且預設政策爲可接受
target prot opt source destination
注意以上信息沒有列出iptables的接口信息(例如lo,eth0),若是但願看到更詳細的信息能夠經過iptables-save
查看。 使用方式相對簡單: iptables-save [-t table] #-t指定表格。
上面對應的iptables-save輸出以下:
# Generated by iptables-save v1.4.7 on Fri Jul 22 15:51:52 2011
*filter <==星號開頭的指的是表格,這裏爲 filter
:INPUT ACCEPT [0:0] <==冒號開頭的指的是鏈,三條內建的鏈
:FORWARD ACCEPT [0:0] <==三條內建鏈的政策都是 ACCEPT 囉!
:OUTPUT ACCEPT [680:100461]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT <==針對 INPUT 的規則
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT <==這條很重要!針對本機內部接口開放!
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited <==針對 FORWARD 的規則
COMMIT
# Completed on Fri Jul 22 15:51:52 2011
iptables [-t tables] [-FXZ]
因爲這三個指令會將本機防火牆的全部規則都清除,但卻不會改變預設政策 (policy) , 因此若是你不是在本機下達這三行指令時,極可能你會被本身擋在家門外 (若 INPUT 設定爲 DROP 時)!要當心啊! 通常來講,咱們在從新定義防火牆的時候,都會先將規則給他清除掉。還記得咱們前面談到的, 防火牆的『規則順序』是有特殊意義的,因此囉, 固然先清除掉規則,而後一條一條來設定會比較容易一點啦。底下就來談談定義預設政策吧!
###定義預設政策 當你的封包不在你設定的規則以內時,則該封包的經過與否,是以 Policy 的設定爲準。能夠經過 iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP]
設定,例如:
[root@www ~]# iptables -P INPUT DROP #INPUT鏈(從外面進入的包)默認直接丟棄 [root@www ~]# iptables -P OUTPUT ACCEPT #OUTPUT(從本機發出的包)默認放行 [root@www ~]# iptables -P FORWARD ACCEPT #FORWARD(通過本機的包)默認放行
能夠經過上面提到的iptables-save查看修改結果。
最基礎的過濾:
iptables [-AI 鏈名] [-io 網絡接口] [-p 協議] [-s 來源IP/網域] [-d 目標IP/網域] -j [ACCEPT|DROP|REJECT|LOG]
選項與參數:
-AI 鏈名:針對某的鏈進行規則的 "插入" 或 "累加"
-A :新增長一條規則,該規則增長在本來規則的最後面。例如本來已經有四條規則,
使用 -A 就能夠加上第五條規則!
-I :插入一條規則。若是沒有指定此規則的順序,默認是插入變成第一條規則。
例如本來有四條規則,使用 -I 則該規則變成第一條,而本來四條變成 2~5 號 推薦使用防止順序出錯 鏈 :有 INPUT, OUTPUT, FORWARD 等,此鏈名稱又與 -io 有關,請看底下。
-io 網絡接口:設定封包進出的接口規範
-i :封包所進入的那個網絡接口,例如 eth0, lo 等接口。需與 INPUT 鏈配合;
-o :封包所傳出的那個網絡接口,需與 OUTPUT 鏈配合;
-p 協定:設定此規則適用於哪一種封包格式
主要的封包格式有: tcp, udp, icmp 及 all(所有) 。
-s 來源 IP/網域:設定此規則之封包的來源項目,可指定單純的 IP 或包括網域,例如:
IP :192.168.0.100
網域:192.168.0.0/24, 192.168.0.0/255.255.255.0 都可。
若規範爲『不準』時,則加上 ! 便可,例如:
-s ! 192.168.100.0/24 表示不準 192.168.100.0/24 之封包來源;
-d 目標 IP/網域:同 -s ,只不過這裏指的是目標的 IP 或網域。
-j :後面接動做,主要的動做有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT)及記錄(LOG) 例如
iptables -A INPUT -i eth1 -s 192.168.100.10 -j ACCEPT #eth1接收192.168.100.10發來的封包
iptables -A INPUT -i eth1 -s 192.168.100.230 -j DROP #eth1丟棄192.168.100.230發來的封包
iptables -A INPUT -i lo -j ACCEPT #容許本地迴環,**不論封包來自何處或去到哪裏,只要是來自 lo 這個界面,就予以接受**
PS:注意,與centos不一樣Debian中並不存在iptables配置文件,經過iptables配置不能自動保存,通常作法是經過iptables-save > /etc/iptables.conf
,而後在/etc/network/if-pre-up.d/添加一個bash腳本,經過iptables-restore從新加載:/sbin/iptables-restore < /etc/iptables.conf
。
###TCP, UDP 的規則比對:針對端口設定 針對端口的設定也是最長用到的。
iptables [-AI 鏈] [-io 網絡接口] [-p tcp,udp] [-s 來源IP/網域] [--sport 端口範圍] [-d 目標IP/網域] [--dport 端口範圍] -j [ACCEPT|DROP|REJECT]
例:
iptables -A INPUT -i eth0 -p tcp --dport 21 -j DROP #丟棄經過eth0的試圖鏈接端口21(通常是ftp)的tcp包
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --sport 1024:65534 --dport ssh -j DROP # 只要來自 192.168.1.0/24 的 1024:65535 埠口的封包,且想要連到本機的 ssh(端口號22) port 就直接丟棄
(遠程主機千萬不要亂封ssh端口,一不當心封錯了是很麻煩的)iptables -A INPUT -i eth0 -p tcp --sport 1:1023 --dport 1:1023 --syn -j DROP #未來自任何地方來源 port 1:1023 的主動鏈接到本機端的 1:1023 tcp請求忽略
###iptables 外掛模塊:mac 與 state
mac,是指網卡的mac地址,能夠經過指定mac地址來指定規則,這樣當使用DHCP服務時,就可經過網卡,而不是IP來指定規則,例如:
iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
這條命令會容許局域網內MAC地址爲 aa:bb:cc:dd:ee:ff**訪問。
state 若是咱們的主機是服務端,而客戶的端口不停的變,並且不是一臺,而是10臺的時候,一個個編寫規則會很麻煩。 Linux引入netfilter以後,便擁有了狀態模塊,能夠分析出這個想要進入的封包是否爲剛剛我發出去的響應。若是是剛剛我發出去的響應,那麼就能夠予以接受放行。
iptables -A INPUT [-m state] [--state 狀態]
-m :一些 iptables 的外掛模塊,主要常見的有: state :狀態模塊 mac :網絡卡硬件地址 (hardware address)
--state :一些封包的狀態,主要有: INVALID :無效的封包,例如數據破損的封包狀態 ESTABLISHED:已經聯機成功的聯機狀態; NEW :想要新創建聯機的封包狀態; RELATED :這個最經常使用!表示這個封包是與咱們主機發送出去的封包有關
例: iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #只要已創建或相關封包就予以經過
iptables -A INPUT -m state --state INVALID -j DROP #只要是不合法封包就丟棄
###不發送ping迴響 爲了避免讓攻擊者檢測到主機存在,一般會drop ICMP type 8 (echo request) ,不接受ping相應。 iptables -A INPUT [-p icmp] [--icmp-type 類型] -j ACCEPT --icmp-type :後面必需要接 ICMP 的封包類型,也可使用代號,例如 8 表明 echo request 的意思。 若是採用上面的INPUT默認拒絕策略,能夠編寫shell腳本:
#!/bin/bash icmp_type="0 3 4 11 12 14 16 18" for typeicmp in $icmp_type do iptables -A INPUT -i eth0 -p icmp --icmp-type $typeicmp -j ACCEPT done