Linux上常用的防火墻軟件
iptables命令 是Linux上常用的防火墻軟件,是netfilter項目的一部分。可以直接配置,也可以通過許多前端和圖形界面配置。
iptables(選項)(參數(shù))
-t, --table table 對指定的表 table 進(jìn)行操作, table 必須是 raw, nat,filter,mangle 中的一個。如果不指定此選項,默認(rèn)的是 filter 表。
# 通用匹配:源地址目標(biāo)地址的匹配
-p:指定要匹配的數(shù)據(jù)包協(xié)議類型;
-s, --source [!] address[/mask] :把指定的一個/一組地址作為源地址,按此規(guī)則進(jìn)行過濾。當(dāng)后面沒有 mask 時,address 是一個地址,比如:192.168.1.1;當(dāng) mask 指定時,可以表示一組范圍內(nèi)的地址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但這里是指定地址為目的地址,按此進(jìn)行過濾。
-i, --in-interface [!] <網(wǎng)絡(luò)接口name> :指定數(shù)據(jù)包的來自來自網(wǎng)絡(luò)接口,比如最常見的 eth0 。注意:它只對 INPUT,F(xiàn)ORWARD,PREROUTING 這三個鏈起作用。如果沒有指定此選項, 說明可以來自任何一個網(wǎng)絡(luò)接口。同前面類似,"!" 表示取反。
-o, --out-interface [!] <網(wǎng)絡(luò)接口name> :指定數(shù)據(jù)包出去的網(wǎng)絡(luò)接口。只對 OUTPUT,F(xiàn)ORWARD,POSTROUTING 三個鏈起作用。
# 查看管理命令
-L, --list [chain] 列出鏈 chain 上面的所有規(guī)則,如果沒有指定鏈,列出表上所有鏈的所有規(guī)則。
# 規(guī)則管理命令
-A, --append chain rule-specification 在指定鏈 chain 的末尾插入指定的規(guī)則,也就是說,這條規(guī)則會被放到最后,最后才會被執(zhí)行。規(guī)則是由后面的匹配來指定。
-I, --insert chain [rulenum] rule-specification 在鏈 chain 中的指定位置插入一條或多條規(guī)則。如果指定的規(guī)則號是1,則在鏈的頭部插入。這也是默認(rèn)的情況,如果沒有指定規(guī)則號。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的鏈 chain 中刪除一個或多個指定規(guī)則。
-R num:Replays替換/修改第幾條規(guī)則
# 鏈管理命令(這都是立即生效的)
-P, --policy chain target :為指定的鏈 chain 設(shè)置策略 target。注意,只有內(nèi)置的鏈才允許有策略,用戶自定義的是不允許的。
-F, --flush [chain] 清空指定鏈 chain 上面的所有規(guī)則。如果沒有指定鏈,清空該表上所有鏈的所有規(guī)則。
-N, --new-chain chain 用指定的名字創(chuàng)建一個新的鏈。
-X, --delete-chain [chain] :刪除指定的鏈,這個鏈必須沒有被其它任何規(guī)則引用,而且這條上必須沒有任何規(guī)則。如果沒有指定鏈名,則會刪除該表中所有非內(nèi)置的鏈。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的鏈。這并不會對鏈內(nèi)部造成任何影響。
-Z, --zero [chain] :把指定鏈,或者表中的所有鏈上的所有計數(shù)器清零。
-j, --jump target <指定目標(biāo)> :即滿足某條件時該執(zhí)行什么樣的動作。target 可以是內(nèi)置的目標(biāo),比如 ACCEPT,也可以是用戶自定義的鏈。
-h:顯示幫助信息;
| 參數(shù) | 作用 | | ---- | ---- | | -P | 設(shè)置默認(rèn)策略:iptables -P INPUT (DROP|ACCEPT) | | -F | 清空規(guī)則鏈 | | -L | 查看規(guī)則鏈 | | -A | 在規(guī)則鏈的末尾加入新規(guī)則 | | -I | num 在規(guī)則鏈的頭部加入新規(guī)則 | | -D | num 刪除某一條規(guī)則 | | -s | 匹配來源地址IP/MASK,加嘆號"!"表示除這個IP外。 | | -d | 匹配目標(biāo)地址 | | -i | 網(wǎng)卡名稱 匹配從這塊網(wǎng)卡流入的數(shù)據(jù) | | -o | 網(wǎng)卡名稱 匹配從這塊網(wǎng)卡流出的數(shù)據(jù) | | -p | 匹配協(xié)議,如tcp,udp,icmp | | --dport num | 匹配目標(biāo)端口號 | | --sport num | 匹配來源端口號 |
iptables -t 表名 <-A/I/D/R> 規(guī)則鏈名 [規(guī)則號] <-i/o 網(wǎng)卡名> -p 協(xié)議名 <-s 源IP/源子網(wǎng)> --sport 源端口 <-d 目標(biāo)IP/目標(biāo)子網(wǎng)> --dport 目標(biāo)端口 -j 動作
規(guī)則鏈名包括(也被稱為五個鉤子函數(shù)(hook functions)):
防火墻策略一般分為兩種,一種叫通
策略,一種叫堵
策略,通策略,默認(rèn)門是關(guān)著的,必須要定義誰能進(jìn)。堵策略則是,大門是洞開的,但是你必須有身份認(rèn)證,否則不能進(jìn)。所以我們要定義,讓進(jìn)來的進(jìn)來,讓出去的出去,所以通,是要全通,而堵,則是要選擇
。當(dāng)我們定義的策略的時候,要分別定義多條功能,其中:定義數(shù)據(jù)包中允許或者不允許的策略,filter過濾的功能,而定義地址轉(zhuǎn)換的功能的則是nat選項。為了讓這些功能交替工作,我們制定出了“表”這個定義,來定義、區(qū)分各種不同的工作功能和處理方式。
我們現(xiàn)在用的比較多個功能有3個:
我們修改報文原數(shù)據(jù)就是來修改TTL的。能夠?qū)崿F(xiàn)將數(shù)據(jù)包的元數(shù)據(jù)拆開,在里面做標(biāo)記/修改內(nèi)容的。而防火墻標(biāo)記,其實(shí)就是靠mangle來實(shí)現(xiàn)的。
小擴(kuò)展:
iptables/netfilter(這款軟件)是工作在用戶空間的,它可以讓規(guī)則進(jìn)行生效的,本身不是一種服務(wù),而且規(guī)則是立即生效的。而我們iptables現(xiàn)在被做成了一個服務(wù),可以進(jìn)行啟動,停止的。啟動,則將規(guī)則直接生效,停止,則將規(guī)則撤銷。
iptables還支持自己定義鏈。但是自己定義的鏈,必須是跟某種特定的鏈關(guān)聯(lián)起來的。在一個關(guān)卡設(shè)定,指定當(dāng)有數(shù)據(jù)的時候?qū)iT去找某個特定的鏈來處理,當(dāng)那個鏈處理完之后,再返回。接著在特定的鏈中繼續(xù)檢查。
注意:規(guī)則的次序非常關(guān)鍵,誰的規(guī)則越嚴(yán)格,應(yīng)該放的越靠前
,而檢查規(guī)則的時候,是按照從上往下的方式進(jìn)行檢查的。
表名包括:
動作包括:
┏???????????????┓
┌───────────────┐ ┃ Network ┃
│ table: filter │ ┗━━━━━━━┳━━━━━━━┛
│ chain: INPUT │?────┐ │
└───────┬───────┘ │ ▼
│ │ ┌───────────────────┐
┌ ▼ ┐ │ │ table: nat │
│local process│ │ │ chain: PREROUTING │
└ ┘ │ └─────────┬─────────┘
│ │ │
▼ │ ▼ ┌─────────────────┐
┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │table: nat │
Routing decision └───── outing decision ─────?│chain: PREROUTING│
┅┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅┅ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ └────────┬────────┘
│ │
▼ │
┌───────────────┐ │
│ table: nat │ ┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅ │
│ chain: OUTPUT │ ┌─────? outing decision ?──────────────┘
└───────┬───────┘ │ ┅┅┅┅┅┅┅┅┳┅┅┅┅┅┅┅┅
│ │ │
▼ │ ▼
┌───────────────┐ │ ┌────────────────────┐
│ table: filter │ │ │ chain: POSTROUTING │
│ chain: OUTPUT ├────┘ └──────────┬─────────┘
└───────────────┘ │
▼
┏???????????????┓
┃ Network ┃
┗━━━━━━━━━━━━━━━┛
iptables -F # 清空所有的防火墻規(guī)則
iptables -X # 刪除用戶自定義的空鏈
iptables -Z # 清空計數(shù)
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 22為你的ssh端口, -s 192.168.1.0/24表示允許這個網(wǎng)段的機(jī)器來連接,其它網(wǎng)段的ip地址是登陸不了你的機(jī)器的。 -j ACCEPT表示接受這樣的請求
iptables -A INPUT -i lo -j ACCEPT
#本地圓環(huán)地址就是那個127.0.0.1,是本機(jī)上使用的,它進(jìn)與出都設(shè)置為允許
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT DROP # 配置默認(rèn)的不讓進(jìn)
iptables -P FORWARD DROP # 默認(rèn)的不允許轉(zhuǎn)發(fā)
iptables -P OUTPUT ACCEPT # 默認(rèn)的可以出去
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允許機(jī)房內(nèi)網(wǎng)機(jī)器可以訪問
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允許機(jī)房內(nèi)網(wǎng)機(jī)器可以訪問
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允許183.121.3.7訪問本機(jī)的3380端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 開啟80端口,因為web對外都是這個端口
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT # 允許被ping
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 已經(jīng)建立的連接得讓它進(jìn)來
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改動之前先備份,請保持這一優(yōu)秀的習(xí)慣
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
iptables -L [-t 表名] [鏈名]
raw
,nat
,filter
,mangle
INPUT
、OUTPUT
、FORWARD
、PREROUTING
、POSTROUTING
INPUT
、OUTPUT
、FORWARD
三個規(guī)則鏈iptables -L -t nat # 列出 nat 上面的所有規(guī)則
# ^ -t 參數(shù)指定,必須是 raw, nat,filter,mangle 中的一個
iptables -L -t nat --line-numbers # 規(guī)則帶編號
iptables -L INPUT
iptables -L -nv # 查看,這個列表看起來更詳細(xì)
iptables -F INPUT # 清空指定鏈 INPUT 上面的所有規(guī)則
iptables -X INPUT # 刪除指定的鏈,這個鏈必須沒有被其它任何規(guī)則引用,而且這條上必須沒有任何規(guī)則。
# 如果沒有指定鏈名,則會刪除該表中所有非內(nèi)置的鏈。
iptables -Z INPUT # 把指定鏈,或者表中的所有鏈上的所有計數(shù)器清零。
# 添加一條規(guī)則
iptables -A INPUT -s 192.168.1.5 -j DROP
將所有iptables以序號標(biāo)記顯示,執(zhí)行:
iptables -L -n --line-numbers
比如要刪除INPUT里序號為8的規(guī)則,執(zhí)行:
iptables -D INPUT 8
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允許本地回環(huán)接口(即運(yùn)行本機(jī)訪問本機(jī))
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允許已建立的或相關(guān)連的通行
iptables -A OUTPUT -j ACCEPT #允許所有本機(jī)向外的訪問
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允許訪問22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允許訪問80端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT #允許ftp服務(wù)的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允許FTP服務(wù)的20端口
iptables -A INPUT -j reject #禁止其他未允許的規(guī)則訪問
iptables -A FORWARD -j REJECT #禁止其他未允許的規(guī)則訪問
iptables -A INPUT -p tcp -m tcp -s 192.168.0.8 -j DROP # 屏蔽惡意主機(jī)(比如,192.168.0.8
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽單個IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整個段即從123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即從123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即從123.45.6.1到123.45.6.254的命令是
只對 OUTPUT,F(xiàn)ORWARD,POSTROUTING 三個鏈起作用。
iptables -A FORWARD -o eth0
iptables -L -n -v
Chain INPUT (policy DROP 48106 packets, 2690K bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
191K 90M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
1499K 133M ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
4364K 6351M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
6256 327K ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 3382K packets, 1819M bytes)
pkts bytes target prot opt in out source destination
5075 589K ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
公網(wǎng)210.14.67.7
讓內(nèi)網(wǎng)192.168.188.0/24
上網(wǎng)
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
本機(jī)的 2222 端口映射到內(nèi)網(wǎng) 虛擬機(jī)的22 端口
iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22
比如,我們要過濾所有TCP連接中的字符串test
,一旦出現(xiàn)它我們就終止這個連接,我們可以這么做:
iptables -A INPUT -p tcp -m string --algo kmp --string "test" -j REJECT --reject-with tcp-reset
iptables -L
# Chain INPUT (policy ACCEPT)
# target prot opt source destination
# REJECT tcp -- anywhere anywhere STRING match "test" ALGO name kmp TO 65535 reject-with tcp-reset
#
# Chain FORWARD (policy ACCEPT)
# target prot opt source destination
#
# Chain OUTPUT (policy ACCEPT)
# target prot opt source destination
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --algo kmp --string "cmd.exe"
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
iptables -t mangle -A INPUT -p tcp --src 192.168.1.2 --dport 443 -j SECMARK --selctx system_u:object_r:myauth_packet_t
# 向從 192.168.1.2:443 以TCP方式發(fā)出到本機(jī)的包添加MAC安全上下文 system_u:object_r:myauth_packet_t
用iptables搭建一套強(qiáng)大的安全防護(hù)盾 http://www.imooc.com/learn/389
iptables: linux 下應(yīng)用層防火墻工具
iptables 5鏈: 對應(yīng) Hook point
netfilter: linux 操作系統(tǒng)核心層內(nèi)部的一個數(shù)據(jù)包處理模塊
Hook point: 數(shù)據(jù)包在 netfilter 中的掛載點(diǎn); PRE_ROUTING / INPUT / OUTPUT / FORWARD / POST_ROUTING
iptables & netfilter
iptables 4表5鏈
iptables rules
filter: 訪問控制 / 規(guī)則匹配 nat: 地址轉(zhuǎn)發(fā) mangle / raw
數(shù)據(jù)訪問控制: ACCEPT / DROP / REJECT 數(shù)據(jù)包改寫(nat -> 地址轉(zhuǎn)換): snat / dnat 信息記錄: log
開放 tcp 10-22/80 端口 開放 icmp 其他未被允許的端口禁止訪問
存在的問題: 本機(jī)無法訪問本機(jī); 本機(jī)無法訪問其他主機(jī)
ftp: 默認(rèn)被動模式(服務(wù)器產(chǎn)生隨機(jī)端口告訴客戶端, 客戶端主動連接這個端口拉取數(shù)據(jù)) vsftpd: 使 ftp 支持主動模式(客戶端產(chǎn)生隨機(jī)端口通知服務(wù)器, 服務(wù)器主動連接這個端口發(fā)送數(shù)據(jù))
允許外網(wǎng)訪問: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp
內(nèi)部使用: file nfs -> 123/udp samba -> 137/138/139/445/tcp ftp -> 20/21/tcp remote ssh -> 22/tcp sql mysql -> 3306/tcp oracle -> 1521/tcp
nat 轉(zhuǎn)發(fā)
防CC攻擊
iptables -L -F -A -D # list flush append delete
# 場景一
iptables -I INPUT -p tcp --dport 80 -j ACCEPT # 允許 tcp 80 端口
iptables -I INPUT -p tcp --dport 10:22 -j ACCEPT # 允許 tcp 10-22 端口
iptables -I INPUT -p icmp -j ACCEPT # 允許 icmp
iptables -A INPUT -j REJECT # 添加一條規(guī)則, 不允許所有
# 優(yōu)化場景一
iptables -I INPUT -i lo -j ACCEPT # 允許本機(jī)訪問
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網(wǎng)
iptables -I INPUT -p tcp --dport 80 -s 10.10.188.233 -j ACCEPT # 只允許固定ip訪問80
# 場景二
vi /etc/vsftpd/vsftpd.conf # 使用 vsftpd 開啟 ftp 主動模式
port_enable=yes
connect_from_port_20=YES
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
vi /etc/vsftpd/vsftpd.conf # 建議使用 ftp 被動模式
pasv_min_port=50000
pasv_max_port=60000
iptables -I INPUT -p tcp --dport 21 -j ACCEPT
iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
# 還可以使用 iptables 模塊追蹤來自動開發(fā)對應(yīng)的端口
# 場景三
iptables -I INPUT -i lo -j ACCEPT # 允許本機(jī)訪問
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網(wǎng)
iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允許內(nèi)網(wǎng)訪問
iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允許端口, 80 -> http, 1723 -> vpn
iptables -A INPUT -j REJECT # 添加一條規(guī)則, 不允許所有
iptables-save # 保存設(shè)置到配置文件
# 場景四
iptables -t nat -L # 查看 nat 配置
iptables -t nat -A POST_ROUTING -s 10.10.177.0/24 -j SNAT --to 10.10.188.232 # SNAT
vi /etc/sysconfig/network # 配置網(wǎng)關(guān)
iptables -t nat -A POST_ROUTING -d 10.10.188.232 -p tcp --dport 80 -j DNAT --to 10.10.177.232:80 # DNAT
#場景五
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT # 限制并發(fā)連接訪問數(shù)
iptables -I INPUT -m limit --limit 3/hour --limit-burst 10 -j ACCEPT # limit模塊; --limit-burst 默認(rèn)為5