工作機制
基礎(chǔ)說明
iptables并不是真正的防火墻亚脆、它只是位于用戶空間的一個命令行工具, netfilter 才是真正的安全框架型酥、iptables只是將我們定義的規(guī)則轉(zhuǎn)交給netfilter.
netfilter 是Linux操作系統(tǒng)核心層的一個數(shù)據(jù)包處理模塊
規(guī)則鏈名稱
規(guī)則鏈名稱包括以下5個查乒、也被稱為5個鉤子函數(shù):
INPUT鏈
: 處理輸入數(shù)據(jù)包
OUTPUT鏈
: 處理輸出數(shù)據(jù)包
FORWARD鏈
: 處理轉(zhuǎn)發(fā)數(shù)據(jù)
PREROUTING鏈
: 用于目的地址轉(zhuǎn)換(DNAT)
POSTROUTING鏈
: 用于源地址轉(zhuǎn)換(SNAT)
報文流向
本機到某進程: prerouting -> input
本機轉(zhuǎn)發(fā): prerouting -> forward -> postrouting (直接在內(nèi)核空間轉(zhuǎn)發(fā))
本機進程發(fā)出(通常為響應(yīng)報文): output -> postrouting
即: 當啟用你過來防火墻功能時玛迄、報文需要經(jīng)過不同的關(guān)卡(鏈)蓖议、但根據(jù)情況的不同、會經(jīng)過不同的鏈
為什么稱為鏈
防火墻的作用就在于對經(jīng)過的報文進行規(guī)則匹配纺阔、然后執(zhí)行對應(yīng)的動作修然、但是每個關(guān)卡上可能有很多規(guī)則、這些規(guī)則按照配置順序從上到下執(zhí)行玻靡、看起來就像是一個鏈
表
這么多的鏈都放了一系列的規(guī)則中贝、但是有些很類似邻寿、比如A類規(guī)則是對ip或者短褲過濾; B類規(guī)則是修改報文... , 那么這些類似功能的規(guī)則能不能放在一起呢 ?
答案是可以的、iptables提供了如下規(guī)則的分類(表):
filter表: 負責過濾功能 , 防火墻; 內(nèi)核模塊 iptable_filter
nat表: 網(wǎng)絡(luò)地址轉(zhuǎn)換; 內(nèi)核模塊: iptable_nat
mangle表: 解析報文瘟则、修改報文枝秤、并重新封裝 內(nèi)核模塊: iptable_mangle
raw表: 關(guān)閉nat表上啟用的連接追蹤機制; 內(nèi)核模塊: iptable_raw
當這些表處于同一條鏈時優(yōu)先級如下:
raw -> mangle -> nat -> filter
防火墻的策略
通
: 默認不允許淀弹、需要定義誰可以進入
堵
: 默認允許、但需要證明自己的身份
filter功能: 定義允許或者不允許的策略, 工作在 input / output / forward 鏈
nat選項: 定義地址轉(zhuǎn)換功能, 工作在 prerouting / output / postrouting 鏈
為了讓這些功能都工作菌赖、制定了表
的定義, 來區(qū)分不同的工作功能和處理方式
常用功能
filter
定義允許或者不允許琉用、工作在 input
, output
, forward
鏈上
nat
定義地址轉(zhuǎn)換, 工作在 prerouting
, output
, postrouting
鏈上
mangle
修改報文原數(shù)據(jù), 5個鏈都可以工作
注意: 設(shè)置多個規(guī)則鏈時、要把規(guī)則嚴格的放在前邊奴紧、因為它是從上到下檢查的~
規(guī)則動作
accept
: 接收數(shù)據(jù)包
drop
: 丟棄數(shù)據(jù)包
redirect
: 重定向晶丘、映射浅浮、透明代理
snat
: 源地址轉(zhuǎn)換
dnat
: 目標地址轉(zhuǎn)換
masquerade
: ip偽裝(nat), 用于ADSL
log
: 日志記錄
思考:
其實iptables就是幫我們實現(xiàn)了網(wǎng)絡(luò)包選擇、地址轉(zhuǎn)換专执、報文修改這些功能他炊、為了實現(xiàn)這些功能已艰、它劃分了很多鏈、包括 prerouting凿叠、input盒件、forward舱禽、output、postrouting, 定義了規(guī)則動作 accept翔始、drop里伯、redirect、snat脖镀、dnat蜒灰、log、masquerade來實現(xiàn)這些功能.
實例
清空當前所有規(guī)則和計數(shù)
iptables -F # 清空所有防火墻規(guī)則
iptables -X # 刪除用戶自定義的空鏈
iptables -Z # 清空計數(shù)
配置允許ssh端口連接
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 accept 接受這種類型的請求
允許本地回環(huán)地址可以正常使用
iptables -A INPUT -i lo -j accept
iptables -A INPUT -o lo -j accept
設(shè)置默認規(guī)則
iptables -P INPUT DROP # 配置默認的不讓進
iptables -P FORWARD DROP # 默認的不允許轉(zhuǎn)發(fā)
iptables -P OUTPUT ACCEPT # 默認的可以出去
配置白名單
iptables -A INPUT -p all -s 192.168.1.0/24 -j ACCEPT # 允許機房內(nèi)網(wǎng)機器可以訪問
iptables -A INPUT -p all -s 192.168.140.0/24 -j ACCEPT # 允許機房內(nèi)網(wǎng)機器可以訪問
iptables -A INPUT -p tcp -s 183.121.3.7 --dport 3380 -j ACCEPT
# 允許183.121.3.7訪問本機的3380端口
開啟相應(yīng)的服務(wù)端口
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)建立的連接得讓它進來
保存規(guī)則到配置文件
cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak # 任何改動之前先備份未巫,請保持這一優(yōu)秀的習慣
iptables-save > /etc/sysconfig/iptables
cat /etc/sysconfig/iptables
列出已設(shè)置規(guī)則
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 -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222 -j DNAT --to-dest 192.168.188.115:22
# 將本機的 2222端口 映射到虛擬機的 22端口
防止SYN洪水攻擊
iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT
寫在最后
iptables --help 可以看到更多的選項新啼、可以看到每一個選項的解釋、本文列出了一些簡單使用刹碾、歡迎指正燥撞、交流~