iptables

今天看到一個很不錯的iptables的文章,留着用到時查
 
Iptables 防火牆講義
• What’ s Iptables ?
• iptables 是一種基於包過濾的防火牆
• Iptables 需要2.4以上版本的內核支持
• 2.6內核仍然支持iptables
• iptables 和內核的關係

iptables 命令
iptables –t filter –A INPUT \
–p tcp --dport 23 –j REJECT
iptables –L
iptables的表
• 包過濾中包含3個表
• filter table,過濾表
• Nat表,用於地址轉換
• mangle 表,俗稱矯正表,本課程不包
括mangle的內容,僅僅簡單介紹其含

filter 表(1)
包含
INPUT、OUTPUT和FORWARD鏈,用
於處理輸入、輸出和轉發包。
filter 表是缺省的表。
filter 表(2)
在我們使用
iptables statement 的時候多數等同於下面
的命令:
iptables -t filter statement
nat 表
用於處理網絡地址翻譯。(包含與
masquerading 相關的功能)
1包含PREROUTING (路由前)
2.POSTROUTING路由後
3.OUTPUT 輸出 (很少用到)
共3個鏈
mangle 表
用於處理特殊包的矯正,包含兩個鏈
PREROUTING (路由前)
POSTROUTING(路由後)
關於Mangle 的討論就此爲止,以下不再
研究
在流量控制和Qos應用中,經常會用到
mangle表。
規則和鏈(1)
• 每個鏈中的規則是按順序的,處理一個
包時,從第一條規則到最後一條規則,
依次匹配。
• 順序很重要
• 可以創建自定義規則。(大體相當於子函
數)
規則和鏈(2)
可以動態添加、刪除和修改規則
可以查看當前規則
簡單的iptalbes 命令
iptables -F 清除所有規則
iptables -X 清除所有自定義規則
iptables -L 列出當前所有規則
在學習過程中,使用自定義腳本,最好以
iptables -F 和iptables -X開頭
確保不受到其他因素的干擾。
iptables 命令
iptables –t filter –A INPUT \
–p tcp --dport 23 –j REJECT
紅色部分定義使用的表
紫色部分定義匹配的規則
綠色部分定義了採取的措施
filter 表中採取的措施(1)
• ACCEPT 接受,等於不進行過濾
• DROP 丟棄,棄之不理.別人可以判斷出
您的系統使用了防火牆.還記得Sendmail
中的DISCARD 麼?
• REJECT 彈回,通常貌似跟本沒有打開
這端口。
• LOG 進行日誌,/var/log/message
• User Chain ,用自定義規則進行處理,
等同於用子函數進行處理
措施中的措施
-j LOG
--log-prefix YOUR_STRING
-j REJECT --reject-with
tcp-reset icmp-port-unrearchable
icmp-host-unreachable
簡單地添加規則(1)
根據源地址進行匹配 的 -s 參數
[!] addr[net mask]
根據目的地址進行匹配-d
[!] addr[net mask]
使用 “!” 的時候,需要在兩端加空格
(下同)
簡單地添加規則(2)
根據協議進行匹配的 -p 參數
• [!] icmp
• [!] tcp
• [!] udp
簡單地添加規則(3)
根據端口進行匹配,這時必須指定協議,
必須是tcp或udp協議。
根據封包來源的端口進行匹配 的
--sport [!] port 。
--source-port = --sport
port 可以用 /etc/services 中的協議名來代

簡單地添加規則(3)
根據封包的目的端口進行匹配
--dport [!] port
--dport = --destination-port
port 可以用 /etc/services 中的協議名來代

實驗及準備工作
1. 徹底關閉tcp_wrappers 防火牆
2. 徹底地、永久地停止ipchains 服務
rpm -e ipchain
3. 打開telnet ipop3 和sendmail服務,實
驗中將使用上述服務的端口進行練習.
4. 實驗中全部使用 -A INPUT 的方式
5. 不要使用內核中禁止ping的參數.
準備腳本
#!/bin/bash
iptables -F
iptables -X
第一行
....
最後一行
思考題
當甲連接乙的telnet server時,甲和乙各
使用那個端口?
練習
1. 使得只有192.168.0.x 和192.168.0.y
的機器可以連接您的pop3服務器。但
同一網段的其他人不行。
2. 每執行一個iptables 命令後。使用
lsmod |grep ip 命令,查看內核中
iptables modules 的載入情況。
3. 禁止某一人ping到你,但別人可以
練習
1.使用iptables –L命令來查看您的當前規

2.使用 iptables --help 命令來查看幫助
3.可否用 ! icmp 來進行port方面的定義
4.使得你可以telnet 某人,但他不能telnet
您。
5.用telnet 和nmap 的方式,體會REJECT
和DROP的差別。
練習
1.本網段中的所有人都可以訪問你的pop3
服務,但禁止某三人。
2.本網段中之有某三人可以訪問你的25端
口。其他人不行。
3.以上兩個練習分別做,爭取能用最少的規
則完成之。
練習
1.使用-j LOG 參數或
-j LOG --log-prefix YOURSTRING參數,
查看/var/log/messages 文件中的內容
2.觀察LOG 和 ACCEPT、DROP以及
REJECT 參數使用不同順序的結果。
INPUT 和OUTPUT的差別(1)
對於INPUT 而言
--dport -d 都是指你自己的端口和地址
--sport 和 -s 指的是發起連接者的端口和
地址
INPUT 和OUTPUT的差別(2)
對於OUTPUT 而言
--sport -s 都是指你自己的端口和地址
--dport 和 -d 指的dest地址
INPUT 和OUTPUT的差別(3)
任務:使得您不能telnet 到
192.168.0.50 ,分別用INPUT 和
OUTPUT方法實現。
INPUT 和OUTPUT的差別(4)
方法一
iptables -t filter -A INPUT –s \
192.168.0.50 -p tcp --sport 23 -j REJECT
方法二
iptables -t filter -A OUTPUT -d \
192.168.0.50 –dport 23 -j REJECT
INPUT 和OUTPUT的差別(5)
方法一中,你發起的telnet 請求被服務器
所接收,但服務器返回給你的封包被
iptables 所阻擋。
方法二中,你發出的telnet 請求本身就被
iptables 所阻擋。服務器當然收不到你的
請求。
理解下面的腳本
• #!/bin/bash
iptables -F;iptables -X; IP=” 192.168.1”
iptables -A INPUT -p tcp --dport 110 -s $IP.101 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -s $IP.102 -j ACCEPT
iptables -A INPUT -p tcp --dport 110 -s $IP.0/24 -j REJECT
iptables -A INPUT -p icmp -s $IP.101 -j REJECT
iptables -A INPUT -s $IP.101 -p tcp --dport 23 -j REJECT
iptables -A INPUT -s $IP.0/24 -p tcp --dport 23 -j ACCEPT
練習: 用OUTPUT鏈改寫上述腳本,並實現相同的功能
常用參數
iptables -A
增加一條規則,
iptables -t filter -A INPUT -s \
192.168.0.1 -j DROP
iptables -t filter -A INPUT -s \
192.168.0.2 -j DROP
用iptables -L可以看到兩條規則
再增加兩條規則
iptables -t filter -A OUTPUT -d \
192.168.0.3 -j DROP
iptables -t filter -A OUTPUT -d \
192.168.0.4 -j DROP
現在就有了4條規則
iptables -L 命令可以看到4條規則
iptables -D 可以刪除規則
方法1:
iptables -t filter -D INPUT -s \
192.168.0.2 -j DROP
要和原來一樣,但把-A 換爲-D
方法二
iptables -D INPUT 2
可以刪除第二條INPUT規則
iptables -D OUTPUT 1
可刪除第一條輸出規則
iptables -L 命令
iptables -L ,列出所有filter 表的規則
等同於iptables -t filter -L
iptables -t nat -L 列出所有nat 表的規則
iptables -L INPUT列出所有filter 表中的
INPUT 規則
iptables -L OUTPUT什麼意思?
插入規則 iptables -I
iptables -t filter -I INPUT \
-s 192.168.0.5 -j REJECT
插入這條規則並做爲第一條INPUT規則.
其餘INPUT規則下移一行
iptables -t filter -I INPUT 3 \
-s 192.168.0.6 -j REJECT
將此條插入作爲第三行,原來第三行及以後
下移一行
思考,執行下列腳本後的規則順序
for i in nat filter mangle ;do
iptables -t $i -F; iptables -t $i -X;done
for i in 1 2 3 4 ;do
iptables -A INPUT -s 192.168.0.$i -j DROP
done
iptables -I INPUT -s 192.168.0.5 -j DROP
iptables -I INPUT 3 -s 192.168.0.6 -j DROP
執行iptables -L INPUT發現第一行是
192.168.0.6,然後規則依次是192.168.0.
5 1 6 2 3 4
iptables -R 規則取代一條規則
iptables -R INPUT 3 -d 192.168.0.7 -j DROP
取代第三條INPUT 規則,必需指定取代第
幾條規則。
iptables -F 命令
清除規則
iptables -t filter -F INPUT
iptables -t filter -F OUTPUT
iptables -t nat -F
Iptables -N ,插入自定義規則
iptables -N dalian
iptables -A dalian -d 192.168.0.9 -j DROP
iptables -A dalian -d 192.168.0.8 -j DROP
使用自定義規則
iptables -A INPUT -j dalian
查詢自定義規則
iptables -L dalian
刪除自定義規則
iptables -X dalian (空鏈)
iptables -F dalian
重命名自定義規則
iptables -E dalian shenyang
缺省策略
Iptables -P 缺省策略
iptables -P INPUT DROP
iptables -P Someting ACTION
Something 必需是INPUT 或OUTPUT之

一般放在腳本的最後一行
對比性匹配的擴展
通過 -m 參數來調用.主要用法有
基於狀態的匹配 -m state
基於Mac地址的匹配 -m mac
基於封包數量的匹配 -m limit
基於uid 、gid 的限制 -m owner
基於狀態的防火牆
第一種狀態叫作 NEW。輸入 "ssh
abc.com" 時,初始包或源自於您的機器並
要發送到 abc.com 的包都處於 NEW 狀
態。但是,即使只從 abc.com 接收到一個
應答包,那麼就立即不再將其它作爲此連接
的一部分、發送至 abc.com 的包看作是
NEW 包.
只有在建立新連接、並且還沒有從遠程主機
接收到通信流時使用的包才被看作是
NEW(當然,這個包是此特定連接的一部
分)。我們已經描述了外出 NEW 包,但
還有可能會有進入 NEW 包(很常見)。
進入 NEW 包通常來自遠程機器,在啓動
與您的連接時使用。
您的 Web 服務器接收到的初始包(作爲
HTTP 請求的一部分)將被看作是進入
NEW 包;但是,只要您應答了一個進入
NEW 包,所接收到的與此特定連接相關的
其它包都不再被看作是處於 NEW 狀態。
ESTABLISHED 狀態
一旦連接看到兩個方向上都有通信流,與此
附加相關的其它包都被看作處於
ESTABLISHED 狀態。NEW 和
ESTABLISHED 之間的區別很重要
RELATED 狀態
第三種連接狀態類別叫作
RELATED。RELATED 包是那些啓動新連
接,但有與當前現有連接相關的包。
RELATED 狀態可以用於調整組成多重連接
協議(如 ftp)的連接,以及與現有連接相
關的錯誤包(如與現有連接相關的 ICMP
錯誤包)
INVALID 狀態
最後是 INVALID 包 ,那些包不能歸入以
上三種類別。應當注意某個包是否被看作

INVALID,因爲這種包不會被自動廢棄;
因此您需要插入適當的規則,並設置鏈策
略,以便可以正確處理這些包。
允許向外主動發出的包(的應答回來)
iptables -A OUTPUT -j ACCEPT
iptables -A INPUT -m state --state
ESTABLISHED,RELATED -j ACCEPT
禁止別人發起的主動連接
iptables -A INPUT -m state --state
NEW,INVALID -j DROP
基於MAC地址的匹配
格式 : -m mac --mac-source mac_addr
iptables -A INPUT -p tcp --dport 23 -m
mac \
--mac-source 00:0C:29:BC:BB:DB \
-j REJECT
注:-m mac 僅僅對PREROUTING 和INPUT
鏈起作用
限制別人ping
允許每秒通過一個icmp包,默認觸發條件
是5個icmp包
iptables -A INPUT -p icmp -m limit \
--limit 1/s -j ACCEPT
超過部分全部拒絕
iptables -A INPUT -p icmp -j DROP
根據uid 或者gid 進行限制
-m owner 參數
-m owner [!] --uid-owner $AN_UID
iptables -A OUTPUT -p tcp --dport 23
-m owner --uid-owner 500 -j REJECT
iptables -A OUTPUT -p tcp --dport 23
-m owner --gid-owner 500 -j REJECT
注:-m owner 僅僅對OUTPUT鏈有效
練習題
• 缺省策略爲INPUT 和OUTPUT拒絕全部
,但:設置
• 允許在本機上以root用戶的身分對你自己
的ip地址(192和127)進行任何訪問.
• 只允許某2臺機器telnet 你
• 允許某2臺機器每秒鐘ping你1次.
• 允許root用戶主動訪問任何機器.
練習題
• Test01 用戶可以使用的自己的ip(127和
192)地址作測試用途,但不能訪問其他的
任何ip。以Test01用戶登陸。嘗試是否
可以ping到別人。爲什麼?
• Test02 用戶可以訪問任意地址
• 對於老師的筆記本電腦,不論老師如何改
變ip地址,都不能使用你的pop3服務器.
但可以使用你的sendmail服務.
練習題
• 定義一個自定義規則,對所有訪問您23端
口的動作進行日誌
What’ s NAT
NAT= Network Address Translation
在兩個網站之間,如sohu.com和163.com
之間傳遞封包,要經過若干個router,他
們不會改變你的封包,僅僅是傳遞而已.
NAT 所做的工作,是將傳出去的封包重新
包裝。然後再將傳回來的封包進行反包裝
Why NAT
1.你只有一個ip地址,但想帶動多臺主機
上網。這時您需要source-NAT
2.一個ip的多個服務器.有時候您想讓人連
接到您真實ip後邊的服務器。這時您需要
的是Destination-NAT。不嚴格的說法叫
映射(map)
3.透明代理
Nat 表
使用nat 表之前,必須調整內核參數
echo 1 > /proc/sys/net/ipv4/ip_forward
應該寫將此值寫入 /etc/sysctl.conf 以使之
在重新啓動後仍然生效
小竅門:用 sysctl –p 命令使該文件立即生

普通的地址僞裝
SNAT 源地址轉換
iptables -t nat -A POSTROUTING -o ppp0
-j MASQUERADE
或者
iptables -t nat -A POSTROUTING -j \
SNAT --to ONE_OF_YOUR_EXT_IP
前者在使用動態IP的時候使用。後者一般
在使用靜態地址的時候使用。
解決網關的ftp和irc問題
modprobe -a ip_conntrack_ftp ip_nat_ftp
modprobe -a ip_conntrack_irc ip_nat_irc
解決QQ的聊天問題? Sorry
透明代理
iptables -t nat -A PREROUTING -s
192.168.10.0/24 -p tcp -m multiport --dport
80,443 -j REDIRECT --to-port 3128
(squid 服務需要特別的配置)
Squid 的配置
在能正常工作的squid.conf 中增加下列四行
即可:
• httpd_accel_host virtual
• httpd_accel_port 80
• httpd_accel_with_proxy on
• httpd_accel_uses_host_header on
穿透防火牆.提供服務
iptables -t nat -A PREROUTING -p tcp -i \
ppp0 --dport 80 -j DNAT –to \
192.168.10.156:80
新參數 -i -o
-i 參數指定網卡,適用於 INPUT 和
PREROUGING
-o 參數指定網卡,適用於 OUTPUT 和
POSTROUGING
幾種流向的順續爲
PREROUTING --->INPUT--> OUTPUT-->
POSTROUTING
Iptables with Redhat
/etc/rc.d/init.d/iptables start
啓動了當前在/etc/sysconfig/iptables 中保存
了的規則.
/etc/rc.d/init.d/iptables save
將當前規則保存在/etc/sysconfig/iptables 中
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章