很多人認(rèn)為iptables就是防火墻,其實(shí)這是片面的,Linux的防火墻其實(shí)是由netfilter和iptables組成的。
我會(huì)簡單的闡述這兩個(gè)組件的含義:
netfilter也叫內(nèi)核空間,它其實(shí)是內(nèi)核的一部分,工作在內(nèi)核空間。那它干嘛的呢,簡單的說,netfilter就是定義那些規(guī)則是如何實(shí)行的(規(guī)則是在內(nèi)核中實(shí)現(xiàn)的)。
iptables那就叫用戶空間了,netfilter定義好了哪個(gè)規(guī)則有哪樣的作用,那就交給用戶空間的iptables用來操作了。netfilter只是負(fù)責(zé)翻譯。
如此看來,我們能操作的也就是用戶空間iptables了。
姑且我們講iptables就看做是一個(gè)軟件,因?yàn)楸救耸峭ㄟ^RPM安裝的,所以可以通過rpm -ql iptables來查看iptables軟件包安裝所生成的文件都有那些。
[root@station153 ~]# rpm -ql iptables 查看安裝生成的文件
/bin/iptables-xml-1.4.7
/etc/rc.d/init.d/iptables iptables對應(yīng)的啟動(dòng)服務(wù)
/etc/sysconfig/iptables-config 對應(yīng)的開機(jī)要配置參數(shù)
/lib64/libip4tc.so.0-1.4.7 iptables所需的庫文件
/lib64/xtables
/lib64/xtables/libipt_CLUSTERIP.so
/sbin/iptables-1.4.7 iptables的啟動(dòng)程序
/sbin/iptables-multi-1.4.7
/sbin/iptables-restore-1.4.7 iptables的重載規(guī)則程序
/sbin/iptables-save-1.4.7 iptables的保存規(guī)則的程序
/usr/share/doc/iptables-1.4.7 iptables相關(guān)文檔
/usr/share/doc/iptables-1.4.7/COPYING
/usr/share/doc/iptables-1.4.7/INCOMPATIBILITIES
/usr/share/doc/iptables-1.4.7/INSTALL
/usr/share/man/man8/iptables-1.4.7.8.gz man文檔
當(dāng)然并不是生成只有這么多的文件,因?yàn)槠脑颍抑皇菑?fù)制了各種類型的文件出來已做解釋。
了解完這些后,就去看看具體怎么使用了,當(dāng)然軟件都是看其怎么使用的。
先說說規(guī)劃,我先將所以的命令和解釋都寫出來,然后通過舉例子來演示他們的用法,這樣子能夠在全局上有個(gè)了解。
當(dāng)然,中間還會(huì)穿插一些筆者自己不太清楚的東西,這樣能夠?yàn)槟切┰诰W(wǎng)絡(luò)方面基礎(chǔ)也不好的同學(xué)來個(gè)鞏固。
防火墻種類:
主機(jī)防火墻 網(wǎng)絡(luò)防火墻
iptables中有四表五鏈:
四表:filter nat mangle raw 五鏈:INPUT OUTPUT FORWARD PREROUTING POSTROUTING
表是按照數(shù)據(jù)包的不同操作區(qū)分的,按優(yōu)先級順序?yàn)閞aw,mangle,nat,filter
raw :一般是為了不再讓iptables做數(shù)據(jù)包的鏈接跟蹤處理,提高性能
mangle:用于對數(shù)據(jù)包相關(guān)字段的修改,如設(shè)置TOS、TTL
nat :只用于NAT轉(zhuǎn)換時(shí)的訪問控制
filter:默認(rèn)表,用于一般的過濾
鏈?zhǔn)前刺幚磉^程的hook點(diǎn)進(jìn)行劃分的,類似時(shí)間先后,有以下幾種鏈:
PREROUTING :路由之前,進(jìn)入防火墻之后
INPUT :路由之后目的地為本機(jī)
FORWARDING :路由之后目的地不為本機(jī)
OUTPUT :本機(jī)產(chǎn)生,向外轉(zhuǎn)發(fā)
POSTROUTIONG:發(fā)送到網(wǎng)卡接口之前
filter表中,只有INPUT OUTPUT FORWARD
因?yàn)槠溥^濾封包或者數(shù)據(jù)包,只能過濾進(jìn)入本機(jī)或者從本機(jī)出去的(人家轉(zhuǎn)發(fā)的數(shù)據(jù)封包你不能隨便的給人家過濾吧)
nat表中,只有 PREROUTING POSTROUTING OUTPUT
iptables <-t 表名> <操作 鏈> <一級參數(shù) [二級參數(shù)]> <-j 行為 [參數(shù)]>
Iptables [-t tables] -A/-R/-I chain -i/-o/-s/-d/-p tcp.udp.icmp –dport/–sport PORT -m time/multiport/iprange/state –> ESTABLESHED RELEAVED NEW -j ACCEPT DROP return REJECT SNAT DNAT
iptables [-t table] -N chain 創(chuàng)建一條新鏈
//例如:iptables -N chainA 創(chuàng)建一個(gè)名為chainA的新表
-D chain 刪除一條已有鏈中的規(guī)則,可以輸入完整規(guī)則,或直接指定規(guī)則編號加以刪除(常用)
iptables -D INPUT –dport 80 -j DROP //刪除INPUT鏈中匹配的規(guī)則
iptables -D INPUT 1 //刪除INPUT鏈第一條規(guī)則
-E old_chain new_chain
//例如: iptables -E filterA filterB 講filterA改名為filterB
-R 替換某條規(guī)則,規(guī)則被替換并不會(huì)改變順序,必須要指定替換的規(guī)則編號
//例如: iptables -R INPUT 1 -s 192.168.1.1 -j ACCEPT 替換INPUT鏈中的第一行規(guī)則
-I 在指定規(guī)則編號處插入一條規(guī)則,原本該位置上的規(guī)則將會(huì)往后順序移動(dòng),如果沒有指定規(guī)則編號,則在第一條規(guī)則前插入(常用)
//例如: iptables -I INPUT 1 -s 192.168.1.1 -j ACCEPT 在filter表的INPUT鏈中加入這個(gè)一條規(guī)則
-F:清空所選的鏈。如果沒有指定鏈,則清空指定表中的所有鏈。如果什么都沒有指定,就清空默認(rèn)表所有的鏈。
//例如: iptables -F INPUT //清空filter表中INPUT鏈中的所以規(guī)則
-Z:將指定鏈中的數(shù)據(jù)包計(jì)數(shù)器和流量計(jì)數(shù)器歸零
//例如: iptables -Z INPUT //清空INPUT鏈中的計(jì)數(shù)器
-X:后接名稱,刪除自定義鏈。如果沒有給出參數(shù),這條命令將會(huì)刪除默認(rèn)表所有非內(nèi)建的鏈。
-P:設(shè)置默認(rèn)策略
iptables -P INPUT DROP //設(shè)置表filter的INPUT鏈的默認(rèn)策略為DROP
一級參數(shù):這一欄可以多個(gè)參數(shù)并存
-i:后接網(wǎng)卡名,指定數(shù)據(jù)表從哪塊網(wǎng)卡輸入,要和INPUT鏈配合,如ppp0、eth0,查詢網(wǎng)卡名:ifconfig
-o:后接網(wǎng)卡名,指定數(shù)據(jù)表從哪塊網(wǎng)卡輸出,要和OUTPUT鏈配合同上
-s:后接源IP或子網(wǎng),表示數(shù)據(jù)包的源IP是否相同或在此網(wǎng)段,可加!,表示指定之外的網(wǎng)段
-d:后接目的IP或子網(wǎng),表示數(shù)據(jù)包的目的IP是否相同或者在此網(wǎng)段1
-p:后接協(xié)議名,該協(xié)議是封裝在IP中的,常見有TCP、UDP、ICMP,具體請查看/etc/protocols,all代表全部協(xié)議
如果接的是tcp、udp、icmp,他們還有二級參數(shù)
//tcp:根據(jù)tcp相關(guān)信息進(jìn)行過濾,詳見iptables -p tcp -h
–sport:后接源端口號或服務(wù)名,具體查看/etc/services,可以接多端口,如1024:65535
–dport:后接目的端口號服務(wù)名,同上
–tcp-flags:后接A B,A表示標(biāo)記范圍標(biāo)記之間用逗號隔開;B表示已設(shè)置的標(biāo)記位,標(biāo)記有SYN | ACK | FIN | RST | URG | PSH
–syn:后不接參數(shù),作用同iptables -p tcp –tcp-flags SYN,RST,ACK SYN 過濾由外到內(nèi)的TCP連接請求
//udp:根據(jù)tcp相關(guān)信息進(jìn)行過濾,詳見iptables -p udp -h
–sport:后接源端口號或服務(wù)名,具體查看/etc/services,可以接多端口,如1024:65535
–dport:后接目的端口號服務(wù)名,同上
//icmp:根據(jù)tcp相關(guān)信息進(jìn)行過濾,詳見iptables -p icmp -h
–icmp-type:后接icmp報(bào)文類型名或?qū)?yīng)值
-m:后接外掛模塊,外掛模塊就是根據(jù)其他的維度來對數(shù)據(jù)進(jìn)行過濾,常見的有state、mac、limit
不同的模塊有他們自己的二級參數(shù)
//state:根據(jù)狀態(tài)匹配機(jī)制進(jìn)行過濾,幾乎適用于所有的協(xié)議,包括那些無狀態(tài)的協(xié)議,如UDP和ICP
–state:后接狀態(tài)類型,狀態(tài)類型有INVALID、ESTABLISHED、NEW、RELATED
//multiport:根據(jù)多端口進(jìn)行過濾,其實(shí)這個(gè)和–sport上面多端口差不多,同時(shí)用以第一個(gè)出現(xiàn)起作用,感覺有點(diǎn)雞肋
–source-port:后接端口號,多個(gè)用逗號隔開,如3,34-36
–destination-port:同上
–port:后接端口號,適用于源和目的端口號一致的連接
//limit:根據(jù)包的速率進(jìn)行過濾
–limit:后接速率,設(shè)置最大平均匹配速率,格式如:1/second、12/minute、3/hour 7/day
–limit-burst:后接數(shù)值,設(shè)定峰值,超出則拋棄
//mac:根據(jù)mac地址進(jìn)行過濾
–mac-source:后接MAC地址XX:XX:XX:XX:XX:XX,只適用于以太口和PREROUTING,F(xiàn)ORWARD 和INPUT鏈
//mark:根據(jù)數(shù)據(jù)包標(biāo)記進(jìn)行過濾
–mark:后接數(shù)值或數(shù)值和掩碼,如1,2/3,如果有掩碼,則將兩數(shù)進(jìn)行與操作,最大4個(gè)字節(jié),即2^32-1,設(shè)置詳見MARK動(dòng)作
//owner:根據(jù)包生成者進(jìn)行過濾,只適用于OUTPUT鏈,可以是啟動(dòng)進(jìn)程的用戶的ID,或用戶所在的組的ID,或進(jìn)程的ID,或會(huì)話的ID
–uid-owner:后接UID,按生成包的用戶的ID來匹配外出的包
–gid-owner:后接GID,按生成包的用戶所在組的ID來匹配外出的包
–pid-owner:后接PID,按生成包的進(jìn)程的ID來匹配外出的包
–sid-owner:后接SID,按生成包的會(huì)話的ID來匹配外出的包
//tos:根據(jù)IP頭部中TOS字段進(jìn)行過濾
–tos:后接16進(jìn)制數(shù)值,詳情使用iptables -m tos -h查詢
//ttl:根據(jù)IP報(bào)文中TTL字段進(jìn)行過濾
–ttl:后接TTL
行為:Target和Jump。Target就是下面要講的鏈的操作,JUMP會(huì)指定鏈名,然后轉(zhuǎn)調(diào)到該鏈,進(jìn)行鏈中其他操作,如
iptables -A INPUT -p tcp -j ABCD //轉(zhuǎn)跳到自定義的ABCD鏈
—————–如果在ABCD子鏈中未匹配任何規(guī)則,則會(huì)轉(zhuǎn)到父鏈INPUT,繼續(xù)INPUT鏈后面的規(guī)則匹配———————
如果在ABCD子鏈中匹配了一條規(guī)則,也就說明父鏈INPUT匹配,然后跳到INPUT的下一條鏈。
Target有如下分類:
1、ACCEPT:接受數(shù)據(jù)表
2、DROP:拒絕數(shù)據(jù)表
3、REJECT:作用同DROP,并將錯(cuò)誤信息返回給信息發(fā)送方,只能用在INPUT、FORWARD、OUTPUT和它們的子鏈里
–reject-with:tcp-reset
4、TOS:改變IP頭部中的TOS字段,只能在mangle表內(nèi)使用,它后面要接參數(shù)
–set-tos:后接數(shù)值0-255或者0x00-0xFF
5、TTL:改變IP頭部中的TTL字段,只能在mangle表內(nèi)使用,他后面要接參數(shù)
–ttl-set:后接數(shù)值,作用是設(shè)置ttl的值
–ttl-dec:后接數(shù)值,作用是在原TTL基礎(chǔ)上減去這個(gè)數(shù)值
–ttl-inc:后接數(shù)值,作用是在原TTL基礎(chǔ)上加上這個(gè)數(shù)值
6、MARK:給數(shù)據(jù)包打上標(biāo)記,用于高級路,其實(shí)并不是修改報(bào)文,而是在包穿越計(jì)算機(jī)的過程中由內(nèi)核分配的和它相關(guān)聯(lián)的一個(gè)字段
只用于mangle表,它后面要接參數(shù)
–set-mark:后接無符號整數(shù),用于標(biāo)記
7、SNAT:改變數(shù)據(jù)表源地址,只用于nat表的PREROUTING和OUT鏈和它們的子鏈里,它后面要接參數(shù)
–to-source:后接改變后的源地址
8、DNAT:改變數(shù)據(jù)包目的地址,只用于nat表的PREROUTING和OUT鏈和它們的子鏈里,它后面要接參數(shù)
–to-destination:后接改變后的目的地址
9、MASQUERADE:基于端口的NAT,只用于nat表的POSTROUTING鏈和它的子鏈里,它后面可接參數(shù)
–to-ports:后接端口號,如1024-65535
10、LOG:記錄行為,存在/var/log/messages,它后面可接參數(shù)
–log-level:后接信息級別,級別有debug,info,notice,warning,warn,err,error,crit,alert, emerg,panic
–log-prefix:后接"STRING",告訴iptables在記錄的信息之前加上指定的前綴
–log-tcp-sequence:把包的TCP序列號和其他日志信息一起記錄下來
–log-tcp-options:記錄TCP包頭中的字段大小不變的選項(xiàng)
–log-ip-options:記錄IP包頭中的字段大小不變的選項(xiàng)
11、REDIRECT:后接重定向端口,它后面要接參數(shù),只能用在nat表的 PREROUTING、OUTPUT鏈和被它們調(diào)用的自定義鏈里
–to-ports:后接端口號
12、RETURN:返回上一級鏈,子鏈 -> 父鏈 -> 默認(rèn)策略
13、NOTRACK:跳過追蹤,只用于raw表,當(dāng)行為為NOTRACK,則跳過后面所有的鏈
iptables-save > /path/to/somefile 將內(nèi)存中生效的規(guī)則保存到一個(gè)文件中
iptables-restore > /path/to/somefile 恢復(fù)由iptables-save保存文件中的規(guī)則到內(nèi)存
//拒絕192.168.1.0/24端口1024到65535程序從eth0網(wǎng)卡訪問本機(jī)SSH服務(wù)
iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 –sport 1024:65534 –dport ssh -j DROP
//SNAT示例:從eth0口出去的包將數(shù)據(jù)包的源地址改成192.168.1.10到192.168.1.20這個(gè)范圍
iptables -t nat -A POSTROUTING -o eth0 -j SNAT –to-source 192.168.1.10-192.168.1.20
//DNAT示例:外網(wǎng)訪問80端口都轉(zhuǎn)到192.168.100.10這臺主機(jī)上
iptables -t nat -A PREROUTING -i eth0 -p tcp –dport 80 -j DNAT –to-destination 192.168.100.10:80
//MASQUERADE示例:將192.168.1.0/24內(nèi)的主機(jī)進(jìn)行基于端口的NAT轉(zhuǎn)換
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
//重定向端口,僅適用于nat:PREROUTING和OUTPUT鏈上
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8080
相關(guān)注意事項(xiàng):
iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
MASQUERADE和SNAT作用一樣哈~同樣是提供源地址轉(zhuǎn)換的操作,但是MASQUERADE是針對外部接口為動(dòng)態(tài)IP地址來設(shè)置滴,不需要使用–to-source指定轉(zhuǎn)換的IP地址。如果網(wǎng)絡(luò)采用的是撥號方式接入互聯(lián)網(wǎng),而沒有對外的靜態(tài)IP地址(主要用在動(dòng)態(tài)獲取IP地址的連接,比如ADSL撥號、DHCP連接等等),那么建議使用MASQUERADE哈~
注意:MASQUERADE是特殊的過濾規(guī)則,其只可以映射從一個(gè)接口到另一個(gè)接口的數(shù)據(jù)哈
做了NAT之后要是拒絕誰訪問的話,就要用到過濾filter上的forward了,不給被拒絕的IP做轉(zhuǎn)發(fā)。
端口映射:
Iptables -t nat -A PREROUTING -d 172.16.251.153 -p tcp –dport 22022 -j DNAT –to-destination 192.168.100.2:22
如果你去連接172.16.251.153的22022端口,就會(huì)被轉(zhuǎn)換成為192.168.100.2的22號端口
iptables實(shí)現(xiàn)七層訪問過濾:
對內(nèi)核中的netfilter,打補(bǔ)丁layer7,重新編譯內(nèi)核
獲取內(nèi)核源碼 https://www.kernel.org
內(nèi)核編譯安裝是基于 mockbuild 這個(gè)用戶的,所以要先創(chuàng)建這個(gè)賬戶:
編譯內(nèi)核:
[root@station153 ~]# useradd mockbuild
[root@station153 ~]# rpm -ivh kernel-2.6.32-431.5.1.el6.src.rpm
warning: kernel-2.6.32-431.5.1.el6.src.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
1:kernel ########################################### [100%]
[root@station153 ~]# cd rpmbuild/SOURCES/
[root@station153 SOURCES]# ls
check-kabi config-powerpc64 config-x86_64-debug Makefile.common
config-debug config-powerpc64-debug config-x86_64-debug-rhel Makefile.config
config-debug-rhel config-powerpc64-debug-rhel config-x86_64-generic merge.pl
config-framepointer config-powerpc64-kdump config-x86_64-generic-rhel Module.kabi_greylist_i686
config-generic config-powerpc64-kdump-rhel config-x86_64-nodebug Module.kabi_greylist_ppc64
config-generic-rhel config-powerpc64-rhel config-x86_64-nodebug-rhel Module.kabi_greylist_s390x
config-i686 config-powerpc-generic config-x86-generic Module.kabi_greylist_x86_64
config-i686-debug config-powerpc-generic-rhel config-x86-generic-rhel Module.kabi_i686
config-i686-debug-rhel config-s390x extrakeys.pub Module.kabi_ppc64
config-i686-nodebug config-s390x-debug find-provides Module.kabi_s390x
config-i686-nodebug-rhel config-s390x-debug-rhel genkey Module.kabi_x86_64
config-i686-rhel config-s390x-generic-rhel kabitool perf
config-ia64-generic-rhel config-s390x-kdump kernel-abi-whitelists.tar.bz2 perf-archive
config-nodebug config-s390x-kdump-rhel linux-2.6.32-431.5.1.el6.tar.bz2
config-nodebug-rhel config-s390x-rhel linux-kernel-test.patch
[root@station153 SOURCES]# tar xf kernel-abi-whitelists.tar.bz2 -C /usr/src/
[root@station153 usr]# cd src/
[root@station153 src]# ls
debug kabi-rhel60 kabi-rhel61 kabi-rhel62 kabi-rhel63 kabi-rhel64 kabi-rhel65 kernels
[root@station153 src]# cd kernels/
[root@station153 kernels]# ls
2.6.32-431.el6.x86_64
[root@station153 kernels]# ln -sv 2.6.32-431.el6.x86_64 linux
`linux' -> `2.6.32-431.el6.x86_64'
[root@station153 kernels]# cd linux/
[root@station153 linux]# ls
arch crypto firmware include ipc lib Makefile.common Module.symvers samples security System.map usr
block drivers fs init kernel Makefile mm net scripts sound tools virt
[root@station153 linux]# cp /boot/config-2.6.32-431.el6.x86_64 .config
[root@station153 linux]# cd ~
[root@station153 ~]# ls
anaconda-ks.cfg bind-9.9.5.tar.gz kernel-2.6.32-431.5.1.el6.src.rpm Python-3.4.0 rpmbuild
bind10-1.1.0 Discuz_X2.5_SC_GBK.zip netfilter-layer7-v2.23.tar.bz2 Python-3.4.0.tar.xz
bind10-1.1.0.tar.gz install.log phpwind_UTF8_8.5 readme
bind-9.9.5 install.log.syslog phpwind_UTF8_8.5.zip Readme–?+?.htm
[root@station153 ~]# tar xf netfilter-layer7-v2.23.tar.bz2
[root@station153 ~]# ls
anaconda-ks.cfg bind-9.9.5.tar.gz kernel-2.6.32-431.5.1.el6.src.rpm phpwind_UTF8_8.5.zip Readme–?+?.htm
bind10-1.1.0 Discuz_X2.5_SC_GBK.zip netfilter-layer7-v2.23 Python-3.4.0 rpmbuild
bind10-1.1.0.tar.gz install.log netfilter-layer7-v2.23.tar.bz2 Python-3.4.0.tar.xz
bind-9.9.5 install.log.syslog phpwind_UTF8_8.5 readme
[root@station153 ~]# cd netfilter-layer7-v2.23
[root@station153 netfilter-layer7-v2.23]# ls
CHANGELOG iptables-1.4.3forward-for-kernel-2.6.20forward kernel-2.6.32-layer7-2.23.patch README
下來要給內(nèi)核打補(bǔ)丁,讓內(nèi)核支持 netfilter-layer7,一會(huì)直接編譯進(jìn)內(nèi)核
1
[root@station153 linux]# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
wKiom1M2rADTpfQYAAMO2jlNe1U103.jpg
2、給內(nèi)核打補(bǔ)丁
# tar xf netfilter-layer7-v2.23.tar.bz2
# cd /usr/src/linux
# patch -p1 < /root/netfilter-layer7-v2.23/kernel-2.6.32-layer7-2.23.patch
# cp /boot/config-* .config
# make menuconfig
3、編譯并安裝內(nèi)核
# make
# make modules_install
# make install
4、重啟系統(tǒng),啟用新內(nèi)核
5、編譯iptables
# tar xf iptables-1.4.20.tar.gz
# cp /root/netfilter-layer7-v2.23/iptables-1.4.3forward-for-kernel-2.6.20forward/* /root/iptables-1.4.20/extensions/
# cp /etc/rc.d/init.d/iptales /root
# cp /etc/sysconfig/iptables-config /root
# rpm -e iptables iptables-ipv6 –nodeps
# ./configure –prefix=/usr –with-ksource=/usr/src/linux
# make && make install
# cp /root/iptables /etc/rc.d/init.d
# cp /root/iptables-config /etc/sysconfig
6、為layer7模塊提供其所識別的協(xié)議的特征碼
# tar zxvf l7-protocols-2009-05-28.tar.gz
# cd l7-protocols-2009-05-28
# make install
7、如何使用layer7模塊
ACCT的功能已經(jīng)可以在內(nèi)核參數(shù)中按需啟用或禁用。此參數(shù)需要裝載nf_conntrack模塊后方能生效。
net.netfilter.nf_conntrack_acct = 1
l7-filter uses the standard iptables extension syntax
# iptables [specify table & chain] -m layer7 –l7proto [protocol name] -j [action]
# iptables -A FORWARD -i eth1 -m layer7 –l7proto qq -j REJECT
注意:
網(wǎng)絡(luò)防火墻:ip_forward
net.netfilter.nf_conntrack_acct參數(shù)只有裝載nf_conntrack模塊后方能生效