W3Cschool
恭喜您成為首批注冊用戶
獲得88經驗值獎勵
Linux上常用的防火墻軟件
iptables命令 是Linux上常用的防火墻軟件,是netfilter項目的一部分。可以直接配置,也可以通過許多前端和圖形界面配置。
iptables(選項)(參數(shù))
-t, --table table 對指定的表 table 進行操作, table 必須是 raw, nat,filter,mangle 中的一個。如果不指定此選項,默認的是 filter 表。
# 通用匹配:源地址目標地址的匹配
-p:指定要匹配的數(shù)據(jù)包協(xié)議類型;
-s, --source [!] address[/mask] :把指定的一個/一組地址作為源地址,按此規(guī)則進行過濾。當后面沒有 mask 時,address 是一個地址,比如:192.168.1.1;當 mask 指定時,可以表示一組范圍內的地址,比如:192.168.1.0/255.255.255.0。
-d, --destination [!] address[/mask] :地址格式同上,但這里是指定地址為目的地址,按此進行過濾。
-i, --in-interface [!] <網絡接口name> :指定數(shù)據(jù)包的來自來自網絡接口,比如最常見的 eth0 。注意:它只對 INPUT,F(xiàn)ORWARD,PREROUTING 這三個鏈起作用。如果沒有指定此選項, 說明可以來自任何一個網絡接口。同前面類似,"!" 表示取反。
-o, --out-interface [!] <網絡接口name> :指定數(shù)據(jù)包出去的網絡接口。只對 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,則在鏈的頭部插入。這也是默認的情況,如果沒有指定規(guī)則號。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的鏈 chain 中刪除一個或多個指定規(guī)則。
-R num:Replays替換/修改第幾條規(guī)則
# 鏈管理命令(這都是立即生效的)
-P, --policy chain target :為指定的鏈 chain 設置策略 target。注意,只有內置的鏈才允許有策略,用戶自定義的是不允許的。
-F, --flush [chain] 清空指定鏈 chain 上面的所有規(guī)則。如果沒有指定鏈,清空該表上所有鏈的所有規(guī)則。
-N, --new-chain chain 用指定的名字創(chuàng)建一個新的鏈。
-X, --delete-chain [chain] :刪除指定的鏈,這個鏈必須沒有被其它任何規(guī)則引用,而且這條上必須沒有任何規(guī)則。如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的鏈。這并不會對鏈內部造成任何影響。
-Z, --zero [chain] :把指定鏈,或者表中的所有鏈上的所有計數(shù)器清零。
-j, --jump target <指定目標> :即滿足某條件時該執(zhí)行什么樣的動作。target 可以是內置的目標,比如 ACCEPT,也可以是用戶自定義的鏈。
-h:顯示幫助信息;
參數(shù) | 作用 |
---|---|
-P | 設置默認策略:iptables -P INPUT (DROP |
-F | 清空規(guī)則鏈 |
-L | 查看規(guī)則鏈 |
-A | 在規(guī)則鏈的末尾加入新規(guī)則 |
-I | num 在規(guī)則鏈的頭部加入新規(guī)則 |
-D | num 刪除某一條規(guī)則 |
-s | 匹配來源地址IP/MASK,加嘆號"!"表示除這個IP外。 |
-d | 匹配目標地址 |
-i | 網卡名稱 匹配從這塊網卡流入的數(shù)據(jù) |
-o | 網卡名稱 匹配從這塊網卡流出的數(shù)據(jù) |
-p | 匹配協(xié)議,如tcp,udp,icmp |
--dport num | 匹配目標端口號 |
--sport num | 匹配來源端口號 |
iptables -t 表名 <-A/I/D/R> 規(guī)則鏈名 [規(guī)則號] <-i/o 網卡名> -p 協(xié)議名 <-s 源IP/源子網> --sport 源端口 <-d 目標IP/目標子網> --dport 目標端口 -j 動作
規(guī)則鏈名包括(也被稱為五個鉤子函數(shù)(hook functions)):
防火墻策略一般分為兩種,一種叫通策略,一種叫堵策略,通策略,默認門是關著的,必須要定義誰能進。堵策略則是,大門是洞開的,但是你必須有身份認證,否則不能進。所以我們要定義,讓進來的進來,讓出去的出去,所以通,是要全通,而堵,則是要選擇。當我們定義的策略的時候,要分別定義多條功能,其中:定義數(shù)據(jù)包中允許或者不允許的策略,filter過濾的功能,而定義地址轉換的功能的則是nat選項。為了讓這些功能交替工作,我們制定出了“表”這個定義,來定義、區(qū)分各種不同的工作功能和處理方式。
我們現(xiàn)在用的比較多個功能有3個:
我們修改報文原數(shù)據(jù)就是來修改TTL的。能夠實現(xiàn)將數(shù)據(jù)包的元數(shù)據(jù)拆開,在里面做標記/修改內容的。而防火墻標記,其實就是靠mangle來實現(xiàn)的。
小擴展:
iptables/netfilter(這款軟件)是工作在用戶空間的,它可以讓規(guī)則進行生效的,本身不是一種服務,而且規(guī)則是立即生效的。而我們iptables現(xiàn)在被做成了一個服務,可以進行啟動,停止的。啟動,則將規(guī)則直接生效,停止,則將規(guī)則撤銷。
iptables還支持自己定義鏈。但是自己定義的鏈,必須是跟某種特定的鏈關聯(lián)起來的。在一個關卡設定,指定當有數(shù)據(jù)的時候專門去找某個特定的鏈來處理,當那個鏈處理完之后,再返回。接著在特定的鏈中繼續(xù)檢查。
注意:規(guī)則的次序非常關鍵,誰的規(guī)則越嚴格,應該放的越靠前,而檢查規(guī)則的時候,是按照從上往下的方式進行檢查的。
表名包括:
動作包括:
┏???????????????┓
┌───────────────┐ ┃ 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表示允許這個網段的機器來連接,其它網段的ip地址是登陸不了你的機器的。 -j ACCEPT表示接受這樣的請求
iptables -A INPUT -i lo -j ACCEPT
#本地圓環(huán)地址就是那個127.0.0.1,是本機上使用的,它進與出都設置為允許
iptables -A OUTPUT -o lo -j ACCEPT
iptables -P INPUT DROP # 配置默認的不讓進
iptables -P FORWARD DROP # 默認的不允許轉發(fā)
iptables -P OUTPUT ACCEPT # 默認的可以出去
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允許機房內網機器可以訪問
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允許機房內網機器可以訪問
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT # 允許183.121.3.7訪問本機的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 # 已經建立的連接得讓它進來
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改動之前先備份,請保持這一優(yōu)秀的習慣
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
iptables -L [-t 表名] [鏈名]
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 # 查看,這個列表看起來更詳細
iptables -F INPUT # 清空指定鏈 INPUT 上面的所有規(guī)則
iptables -X INPUT # 刪除指定的鏈,這個鏈必須沒有被其它任何規(guī)則引用,而且這條上必須沒有任何規(guī)則。
# 如果沒有指定鏈名,則會刪除該表中所有非內置的鏈。
iptables -Z INPUT # 把指定鏈,或者表中的所有鏈上的所有計數(shù)器清零。
# 添加一條規(guī)則
iptables -A INPUT -s 192.168.1.5 -j DROP
將所有iptables以序號標記顯示,執(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)接口(即運行本機訪問本機)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允許已建立的或相關連的通行
iptables -A OUTPUT -j ACCEPT #允許所有本機向外的訪問
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服務的21端口
iptables -A INPUT -p tcp --dport 20 -j ACCEPT #允許FTP服務的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 # 屏蔽惡意主機(比如,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
公網210.14.67.7讓內網192.168.188.0/24上網
iptables -t nat -A POSTROUTING -s 192.168.188.0/24 -j SNAT --to-source 210.14.67.127
本機的 2222 端口映射到內網 虛擬機的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ā)出到本機的包添加MAC安全上下文 system_u:object_r:myauth_packet_t
用iptables搭建一套強大的安全防護盾 http://www.imooc.com/learn/389
iptables: linux 下應用層防火墻工具
iptables 5鏈: 對應 Hook point netfilter: linux 操作系統(tǒng)核心層內部的一個數(shù)據(jù)包處理模塊 Hook point: 數(shù)據(jù)包在 netfilter 中的掛載點; PRE_ROUTING / INPUT / OUTPUT / FORWARD / POST_ROUTING
iptables & netfilter
iptables 4表5鏈
iptables rules
filter: 訪問控制 / 規(guī)則匹配 nat: 地址轉發(fā) mangle / raw
數(shù)據(jù)訪問控制: ACCEPT / DROP / REJECT 數(shù)據(jù)包改寫(nat -> 地址轉換): snat / dnat 信息記錄: log
開放 tcp 10-22/80 端口 開放 icmp 其他未被允許的端口禁止訪問
存在的問題: 本機無法訪問本機; 本機無法訪問其他主機
ftp: 默認被動模式(服務器產生隨機端口告訴客戶端, 客戶端主動連接這個端口拉取數(shù)據(jù)) vsftpd: 使 ftp 支持主動模式(客戶端產生隨機端口通知服務器, 服務器主動連接這個端口發(fā)送數(shù)據(jù))
允許外網訪問: web http -> 80/tcp; https -> 443/tcp mail smtp -> 25/tcp; smtps -> 465/tcp pop3 -> 110/tcp; pop3s -> 995/tcp imap -> 143/tcp
內部使用: 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 轉發(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 # 允許本機訪問
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網
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ā)對應的端口
# 場景三
iptables -I INPUT -i lo -j ACCEPT # 允許本機訪問
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許訪問外網
iptables -I INPUT -s 10.10.155.0/24 -j ACCEPT # 允許內網訪問
iptables -I INPUT -p tcp -m multiport --dports 80,1723 -j ACCEPT # 允許端口, 80 -> http, 1723 -> vpn
iptables -A INPUT -j REJECT # 添加一條規(guī)則, 不允許所有
iptables-save # 保存設置到配置文件
# 場景四
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 # 配置網關
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 默認為5
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: