啟動和停止
1、命令:
復制代碼代碼如下:service iptables start/stop/restart
或者直接去找/etc/init.d/下的
2、配置文件:
/etc/sysconfig/iptables
沒有的話,可以用iptables-save生成
框架: tables > chains > rules(target)
整體上可認為iptables就是由許多chain組成的,要不然其老版本怎麼叫做ipchains呢。但是劃分層次為:
一個table可由多個chain組成,一個chain可由多個rules組成(一個rule對應一個target)。
target概念的好處是:系統預置了一些target,如ACCEPT,DROP,REJECT,LOG等,意思是如果這個包匹配這條rule,其處理辦法就是target。這裡引入target的好處在於,允許用戶自定義一條chain,然後用chain名做為新的target,這樣,就可以聚合一些rule!形成了層次性的rule,就是說如果滿足這條rule,那麼再看其target裡面的rule。
1、iptables由四張table組成,每張table由默認的chain組成:
(1)filter: 默認有三個chain——INPUT,OUTPUT和FORWARD
(2)nat: 做NAT工作,默認三個chain——OUTPUT,PREROUTING,POSTROUTING
(3)mangle: 對包的一些參數進行修改,默認有五個chain——INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
(4)raw:作用未明,默認有兩個chain——OUTPUT,PREROUTING
不同的table分管不同的方面。iptables的默認命令是對filter生效。可以用-t nat指定對nat生效。
2、所謂的配置防火牆就是:
(1)向chain添加rule:
每個chain都是由一系列rule組成的,比如你要更改INPUT這個chain來允許用戶訪問你機器上的某個端口。
比如這個INPUT有兩個rule,一個用於允許用戶訪問你的5901端口,一個用於允許用戶訪問你的5902端口
一般安全策略:
1、從最嚴厲的安全措施開始,當你發現有用的東西不能工作時再一點點兒的放寬限度。
2、防火牆不能當作防范入侵的主要手段,它只能作為每台主機上獨立保護措施的一個補充罷了。每台主機上的獨立保護措施包括crack,tcpd,nmap,COPS,tripwire和相應的策略。
規則和命令:
規則很簡單,相應的包,會交給相應的內置chain,然後對於chain中的rules,是從上到下的順序進行匹配,和break語句一樣。所以,比如你要開放某些端口,就寫上面,最後才寫封閉所有端口。
靜態規則:
1、iptables -F chain-name:
清除名為chain-name的chain中的所有rule,只寫-F清除所有的chain中的所有rule,但保留chain。
這默認只對filter table的。如果要清除如nat table的,要用 iptables -t nat -F
2、iptables -P chain-name target:
給名為chain-name的chain設置默認的rule。這個通常是放在給該chain設置的所有rule的開頭。相當於break語句中的default。 注意,如果給nat或mangle中的chain設置,則別忘了用 -t table。 但是注意的是,這裡的target只能用內置的
3、iptables -A chain-name rule
給名為chain-name的chain添加一條規則,後面rule是一下的組合:
-j target 預置target或用戶自定義的chain
-i interface 如eth0
-p proto 協議,有tcp,udp
-s source-ip 源ip
-d dest-ip 目的ip
--sport source-port 源端口
--dport dest-port 目的端口
--icmp-type type 匹配ICMP類型,比如你允許哪些類型的ICMP包通過,後面跟數字
! 否定
-t table
4、iptables -I chain-name rulenum rule:
這個和-A的區別是:插入,而不是加在末尾。rulenum為1表示加在最前面。
5、iptables -X chain-name:
刪除非系統內置(用戶自定義)的chain,這個不同於-F,這個是把chain整個刪除,名字都沒了,即你用iptables -L -v看不到了。
6、iptables -D chain-name rule/rulenum
這個同iptable -A chain-name rule完全相反,如果你要刪除chain-name中的一條rule,就按照-A時的寫法就可以刪除之。或者用rulenum,即該chain的從上往下數的num數,第一條rule的rulenum為1。
7、iptables -L chain-name
打印名為chain-name的chain的rules。不給出chain-name,則打印所有chain。
8、iptables -L -v chain-name
在6的基礎上加了些有用信息,如從開機到現在,匹配每條rule的包的數量!
動態規則: 針對connection(TCP連接)
1、有三種動態參數:
NEW:指收到的第一次TCP連接
ESTABLISHED:當連接建立後,屬於該connection的包
RELATED:當連接建立後,又有相關的連接建立(典型的是ftp的passive模式,由client發起到server的數據連接,這個端口是由server指定的,但由client發起)
2、命令:
復制代碼代碼如下:
iptables -A INPUT -m state --state NEW -j DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
上面兩條命令,拒絕所有NEW的外來包。但允許自己發出的連接收到外來的數據(ESTABLISHED)
再加上:
復制代碼代碼如下:
iptables -A INPUT -p tcp -dport 21 -j ACCEPT
iptables -A INPUT -p udp -dport 21 -j ACCEPT
則表示可以允許外界訪問21端口(FTP,並假設采用passive模式),結合上面的狀態,則允許外界主動發起到自己的ftp數據連接———可能是任意端口,但這裡已不用寫了!!
所以,一般,先寫上動態規則,然後再寫靜態規則,就可以做到處理一些像FTP Passive模式這種不知道用戶會訪問哪個端口的情況。
3、注意:
有狀態的規則需要內核相應模塊支持,如果沒有編譯進,或沒有加載,則不會生效的。
iptables對請求的URL作IP訪問控制
下面來看一個實例。
服務器運行環境是Tomcat,現在要實現的目的是,只允許特定的IP訪問某個目錄,
一種方法是在tomcat配置文件server.conf中,使用RemoteAddrValve對虛擬主機做訪問控制。
另外一種方法可以通過iptables規則。個人比較喜歡iptables
例如:禁止訪問http://192.168.137.254:10000/managersns 這個路徑,只允許192.168.137.101訪問
復制代碼代碼如下:
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 10000 -s 192.168.137.101 -m string --string "/managersns" --algo bm -j ACCEPT /sbin/iptables -A INPUT -i eth0 -p tcp --dport 10000 -m string --string "/managersns" --algo bm -j DROP
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 10000 -s 192.168.137.101 -m string --string "/managersns" --algo bm -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 10000 -m string --string "/managersns" --algo bm -j DROP
以上規則是正對eth0網卡,可以跟蹤自己需求修改。
參數說明:
-m string
使用string功能,string是iptables的一個module,也就是做字符串匹配的。
–string “xxxx”
定義字符串內容,可以是URL裡任意字符,如果是需要block下載某些類型的文件或請求,這個有很大的發揮空間,可自由想象喔。
–algo bm
設置字符匹配的查詢算法,一般默認使用bm算法效果就可以了,另外還可以設置kmp算法,那是一種更復雜的算法,詳細內容可自行參見高等數學裡的資料。(bm = Boyer-Moore, kmp = Knuth-Pratt-Morris)
-j DROP
這在公司網絡禁用視頻網站是非常有效的,在網關服務器上設置:
復制代碼代碼如下:
iptables -A FORWARD -m string –-string “ku6.com” --algo bm -j DROP iptables -A FORWARD -m string –-string “tudou.com” –-algo bm -j DROP iptables -A FORWARD -m string –-string “ouou.com” –-algo bm -j DROP
iptables -A FORWARD -m string –-string “ku6.com” --algo bm -j DROP
iptables -A FORWARD -m string –-string “tudou.com” –-algo bm -j DROP
iptables -A FORWARD -m string –-string “ouou.com” –-algo bm -j DROP
其中各項參數的意義如下:
-A FORWARD
增加FORWARD鏈的規則,以上規則是針對啟用了路由功能(即:echo 1 > /proc/sys/net/ipv4/ip_forward)
如果是直接訪問,可使用的INPUT或OUTPUT。
設置符合此條件的包的處理方式,DROP即是丟棄,也是reject的意思。
復制代碼代碼如下:iptables -A INPUT -m string --string "stringname" --algo bm -j DROP