Iptables 入门进阶
?
一、前言
?
??????? 所謂防火墻就是工作在主機或網絡邊緣,對進出的豹紋根據定義的規則做檢查,進而對匹配到的報文作為相應處理的套件;
??????? 防火墻有軟件防火墻和硬件防火墻;根據位置可分為本機防火墻和網絡防火墻;根據種類可分為包過濾、應用代理、狀態檢測。
·包過濾即檢查每一個數據包,查看包中的一些基本信息,如源地址、目的地址、端口號、協議等
·應用代理工作在應用層,檢查包的所有數據,相對來說會更加安全,但是效率不高,如果對速度要求高,可能會成為瓶頸
·狀態檢測是從動態包過濾上演化而來的,不僅有包過濾的功能,而且可以在每個連接建立時,防火墻會為這個連接構造一個會話狀態,里面包含了這個連接數據包的所有信息,以后這個連接都會基于這個連接的信息進行。狀態檢測可以對包的內容進行分析,從而擺脫了,從而擺脫了傳統防火墻僅局限于過濾包頭信息的弱點,而且這種防火墻可以不必開放過多的端口,從而杜絕了開放過多端口帶來的隱患。
?
?
二、iptables/netfilter
1、iptables的前身叫ipfirewall,2.20核心被ipchain所取代,Linux2.4以后叫iptables,他可以將規則組織成一張表,實現詳細的訪問控制功能。
iptables是一種工具,工作在用戶空間,用于修改信息的過濾規則及其他配置。
netfilter是內核中的一部分,用于定義、保存響應的規則。
?
2、netfilter工作原理
netfilter在內核中提供了一系列表(table),每個表由若干鏈(chain)組成,每個鏈可以由一條或數條規則(rules)組成。在內核空間中設置了5個鉤子函數對進出主機的數據包進行過濾。
1、PREROUTING (路由前)
2、INPUT (進入本機)
3、FORWARD (轉發)
4、OUTPUT (本機流出)
5、POSTROUTING (路由后)
?
?
3、表、鏈、規則、動作
netfilter是表的容器,表是鏈的容器,鏈又是規則的容器。
表(Tables)
raw表 用于配置數據包,raw中的數據包不會被系統追蹤。
mangle表? 該表用于數據包的特殊變更操作,如TOS、TTL、MARK等特性。
nat表 能夠修改數據包,并完成網絡地址轉換。
filter表 用于存放所有防火墻相關的默認表,通常使用該表進行過濾的設置。
raw表有2個內置鏈: PREROUTING, OUTPUT
# iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination
?
mangle表有5個內置鏈: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain INPUT (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain FORWARD (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain POSTROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination
?
nat表有3個內置鏈:PREROUTING, FORWARD, POSTROUTING
# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain POSTROUTING (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination
?
filter表有3個內置鏈: INPUT, FORWARD, OUTPUT
# iptables -t filter -L
Chain INPUT (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain FORWARD (policy ACCEPT)
target???? prot opt source?????????????? destination????????
Chain OUTPUT (policy ACCEPT)
target???? prot opt source?????????????? destination
?
?
?
鏈 (Chains)
PREROUTING??? 路有前,到達的數據包
INPUT??????????????? 路由后,發往本機的數據包
FORWARD??????? 路由經過本地的數據包,目的地不是本機
OUTPUT??????????? 路由之前,本地產生的數據包
POSTROUTING 路由后,發往網卡接口之前的數據包
?
動作(Target)
ACCEPT??? 允許數據包通過
DROP?????? 丟棄數據包
REJECT???? 丟棄數據包并返回錯誤
LOG????????? 將符合條件的數據包寫入日志
QUEUE???? 傳遞給應用程序處理該數據包
?
?
4、數據報文的流向
?
4.1 如果是跟本機內部進行通信
流入:--> PREROUTING,? --> INPUT
流出:--> OUTPUT, --> POSTROUTING
?
4.2 有本機轉發
請求: --> PRETOUTING, --> FORWARD, --> POSTROUTING
響應: --> PRETOUTING, --> FORWARD, --> POSTROUTING
?
4.3 數據報文的流向
源IP和目標IP由流向決定;
?
三、規則語法
寫規則:先確定功能(表),確定報文流向,確定要實現的目標,確定匹配條件
Iptables --> 語法檢查 --> netfilter???
注意:規則會立即生效,遠程配置時,首先需要添加放行ssh的規則
?
格式:iptables [-t table] COMMAND chain CRETIRIA -j Target
-t table: raw,mangle,nat,filter
COMMAND:定義如何對規則進行管理
chain:定義在哪個鏈上生效規則,當定義策略時可以省略
CRETIRIA:指定匹配標準
-j Target:如何進行處理
?
例如:允許192.168.56.0/24段的主機訪問本機的22端口
# iptables -A INPUT -s 192.168.56.0/24 -p tcp --dport 22 -j ACCEPT
# iptables -L -n -v --line-numbers ??# 查看定義的規則詳情并顯示行號
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num?? pkts bytes target???? prot opt ?????????in???? out???? source?????????????? destination????
行號?? 包數? 字計數? 目標???? 協議? 選項 流入接口 ?流出接口? 源地址????? 目的地址
1?????? 36? 2620 ACCEPT???? tcp? --? *????? *?????? 192.168.56.0/24????? 0.0.0.0/0?????????? tcp dpt:22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination????????
Chain OUTPUT (policy ACCEPT 26 packets, 3104 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination
?
?
四:COMMAND詳解
1、鏈管理命令:
-P:設置默認策略
規則:iptables [-t table] -P chain target
eg:# iptables -t filter -P FORWARD DROP? //設置filter的FORWARD鏈默認為DROP
?
-N:?? 新建一個鏈
規則:iptables [-t table] -N chain
eg:# iptables -t filter -N http_in?? // 在filter表新建一個http_in的鏈
?
-X: 刪除用戶自定義鏈
規則: iptables [-t table] -X [chain]
eg:# iptables -t filter -X http_in? //刪除用戶自定義鏈http_in ( 刪除前此引用數 references 需要為0 )
?
-E: 重命名用戶自定義鏈
規則: iptables [-t table] -E old-chain-name new-chain-name
eg:# iptables -t filter -E http_in httpd_in?? //修改自定義鏈http_in 為httpd_in
?
-F: 清空規則
規則:iptables [-t table] -F [chain [rulenum]] [options...]
eg:# iptables -t filter -F? //清空filter表,鏈和規則可以省略,如果不寫則為清空所有
?
-Z:??? 計數器清零
規則:iptables [-t table] -Z [chain [rulenum]] [options...]
eg: # iptables -t filter -Z OUTPUT? //將filter表的OUTPUT鏈計數器清空,如果不寫,則為所有計數器清空
?
2、規則管理命令
-A:追加,在當前鏈最后添加一條規則
規則: iptables [-t table] {-A|-D} chain rule-specification
eg:# iptables -t filter -A INPUT -s 192.168.56.0/24 -p tcp --dport 80 -j ACCEPT? //允許192.168.56.0/24網絡訪問本機80端口
?
-I NUM:???? 插入一條規則
規則: iptables [-t table] -I chain [rulenum] rule-specification
eg:# iptables -t filter -I INPUT 2 -s 192.168.56.0/24 -p tcp --dport 80 -j DROP? //第二條插入一條規則,拒絕192.168.56.0/24網絡訪問本機80端口(不寫第幾行默認為第一行)
?
-D NUM: 刪除一條規則
規則:iptables [-t table] -D chain rulenum
eg:# iptables -t filter -D INPUT 2?? //刪除filter表INPUT鏈的第二條規則
?
-R NUM:修改一條規則
規則:iptables [-t table] -R chain rulenum rule-specification
eg:# iptables -t filter -R INPUT 1 -s 192.168.56.0/24 -p tcp --dport 80 -j ACCEPT? //修改filter表INPUT鏈的第一條規則
?
3、查看管理命令
-L: 查看規則
子命令:
-n:不反解析主機名,直接以數組的方式顯示ip
-v:顯示詳細信息? -vv?? -vvv
-x:在計數器上顯示精確值,不做單位換算
--line-numbers:顯示規則的行號
-t 表名: 顯示指定表的信息
eg:# iptables -t filter -L -n -v --line-numbers
Chain INPUT (policy ACCEPT 216 packets, 15244 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination????????
1??????? 0???? 0 ACCEPT???? tcp? --? *????? *?????? 192.168.56.0/24????? 0.0.0.0/0?????????? tcp dpt:80
?
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination????????
?
Chain OUTPUT (policy ACCEPT 196 packets, 22160 bytes)
num?? pkts bytes target???? prot opt in???? out???? source?????????????? destination????????
1??????? 0???? 0 ACCEPT???? tcp? --? *????? *?????? 192.168.56.202?????? 0.0.0.0/0?????????? tcp spt:80
?
?
五、CRETIRIA匹配條件
1、通用匹配: 源地址、目標地址的匹配
-s IP: 指定作為源地址匹配,這里不能為主機名,必須是IP地址或網絡地址
IP | IP/MASK | 0.0.0.0/0.0.0.0
前面可以加!取反,表示除了哪個IP或網絡之外
-d IP: 表示匹配目標地址
-p {tcp|udp|icmp}: 用于匹配協議
-I 網卡名稱:從這塊網卡流入的數據(流入一般是INPUT和PREROUTING)
?
-o 網卡名稱: 從這塊網卡流出的數據 (流出一般是OUTPUT和POSTROUTING)
?
2、擴展匹配
擴展匹配:調用netfilter額外模塊實現特殊檢查機制,(使用到相關功能,要使用iptables命令的-m選項來指定調用哪個模塊)
?
2.1 隱式擴展:對協議的擴展
-p tcp [-m tcp]
[!] --sport PORT[-PORT]
[!] --dport PORT[-PORT]
--tcp-flags: TCP的標志位(SYN, ACK, FIN, PSH, RST, URG)all ??none
有兩個參數
1. 要檢查標志位列表(用逗號分隔)
2. 必須為1的標志位列表(逗號分隔)
--tcp-flags syn,ack,fin,rst syn??此參數等于? --syn
表示檢查syn,ack,fin,rst 4個位,其中syn必須為1,其他的必須為0。用于檢測三次握手的第一次握手。
可簡寫為--syn
eg:# iptables -A INPUT -p tcp --dport 21 --tcp-flags syn,ack,rst,fin syn? -j ACCEPT? //允許tcp21端口的 syn,ack,rst,fin 其中syn為1 的數據包(即第一次握手)
# iptables -A OUTPUT -p tcp --sport 21 --tcp-flags all syn,ack? -j LOG? //檢查tcp21端口的所有數據包,其中syn,ack為1 的記錄到日志(即第二次握手)
?
-p udp [-m udp]:? UDP協議的擴展
[!] --dport? port[:port]
[!] --sport? port[:port]
eg:
?
-p icmp [-m icmp]: icmp數據報文的擴展
--icmp-type
0: echo-reply, ping響應
8: echo-request,ping請求
eg:
//響應外部ping本機
# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT?
//允許本機ping外部主機
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
?
2.2? 顯式擴展
-m 擴展模塊名稱
模塊: iptables,netfilter各擁有一部分代碼
?
multiport: 多端口匹配
可以用于匹配非連續或連續端口;最多指定15個端口;
選項:
[!] ?--source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]…
[!] --ports port[,port|,port:port]…
eg:
# iptables -I INPUT -d 192.168.56.102 -p tcp -m multiport --dports 22,80 -j ACCEPT? //允許訪問本地22,80端口
# iptables -I OUTPUT -s 192.168.56.102 -p tcp -m multiport --sports 22,80 -j ACCEPT?? //允許本地22,80 端口響應
?
Iprange: 用于匹配指定范圍內的IP地址
匹配一段連續的地址而非整個網絡時用
選項:
[!] --src-range from[-to]?? 匹配源地址
[!] --dst-range from[-to]?? 匹配目標地址
eg:
# iptables -A INPUT -d 192.168.56.102 -p tcp --dport 22-m iprange --src-range 192.168.56.1-192.168.56.100 -j ACCEPT ?//允許 192.168.56.1-192.168.56.100 ip段訪問本機22端口數據包
# iptables -A OUTPUT -s 192.168.56.102 -p tcp --sport 22 -m iprange --dst-range 192.168.56.1-192.168.56.100 -j ACCEPT? //允許響應 192.168.56.1-192.168.56.100 ip段22端口數據包
?
string: 字符串匹配,能夠檢測報文應用層中的字符串(linux? kernel >= 2.6.14)
字符匹配檢查高效算法
bm,kmp
選項:
--algo {bm|kmp}??? 指定算法
[!] --string "STRING"??? 匹配指定的字串
[!] --hex-string"HEX_STRING":? HEX_STRING為編碼成16進制的字串;
eg:iptables -A INPUT -m string --algo kmp --string "sex" -j DROP? //使用kmp 算法拒絕字符串有sex的包訪問
?
time: 基于時間做訪問控制
選項:
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]?? Possible values are 1 to 31
[!] --weekdays day[,day...]?? Possible values are Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values ?from 1 to 7, respectively.
eg:
# iptables -A FORWARD -p tcp --dport 80 -m time --timestart 9:00 --timestop 18:00 --weekday Mon,Tue,Wed,Thu,Fri -j DROP??? //周一至周五每天8:00到18:00 禁止通過本機上網
?
connlimit: 連接數限制,對每個IP所能夠發起并發數做限制;
選項:
[!] --connlimit-above N: 匹配大于N個限制
eg: //允許22最大連接數為2個,超過會被丟棄
# iptables -A INPUT -d 192.168.56.102 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
?
limit: 速率限制
選項:
--limit rate[/second|/minute|/hour|/day]?? 限制包的速率
--limit-burst NUMBER: 最大通過包數,默認為5
eg://限制ping往本地的請求包數量為每分鐘20個,最大通過包數為5個
# iptables -A INPUT -d 192.168.56.202 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
?
state:狀態檢查
選項:
[!] --state STATE
連接追蹤中的狀態有:
NEW:新建一個會話
ESTABLISHED:已建立的連接
RELATED:有關聯的連接
INVALID:無法識別的連接
?
注意:
1、調整連接追蹤功能所能容納的連接的最大數目:
/proc/sys/net/nf_conntrack_max
2、當前追蹤的所有連接
/proc/net/nf_conntrack
3、不同協議或連接類型追蹤時的屬性:
/proc/sys/net/netfilter目錄:
?
例子:放行被動模式下FTP的服務
1、裝載模塊/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
eg:
# modprobe nf_conntrack_ftp
# modprobe nf_nat_ftp
# modprobe nf_conntrack
2、放行請求報文
(1)放行NEW狀態對21端口請求的報文;
eg:# iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
(2)放行ESTABLISHED以及RELATED狀態的報文
eg:# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
?
3、放行響應報文
放行ESTABLISHED以及RELATED狀態的報文
eg:# iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
?
六、target 詳解
?
ACCEPT:???? 接受
DROP:???????? 悄悄丟棄
REJECT:?????? 明確拒絕并返回錯誤
SNAT:?????????? 源地址轉換
DNAT:????????? 目的地址轉換
MASQUERADE:?源地址偽裝
REDIRECT:???????????? 重定向;主要用于實現端口重定向
MARK:??????????????????? 打標記
RETURN:???????????????? 返回,在自定義鏈執行完畢后使用RETURN來返回原規則鏈。
?
七、SNAT和DNAT的實現
1、SNAT基于源地址的轉換
源地址轉換就是在進行包的轉發時修改數據包的源地址,此方法可以實現多個內網用戶通過外網地址訪問外網IP的功能呢個。
選項:
--to-source ipaddr[-ipaddr][:port[-port]]
?
例如:
# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j SNAT --to-source 192.168.100.2
?
2、MASQUERADE
然而當外網IP為ADSL撥號自動獲取的IP時,外網IP不固定,是動態的分配的。此時可以使用MASQUERADE來實現動態獲取外網地址
?
例如:
# iptables -t nat -A POSTROUTING -s 192.168.56.0/24 -j MASQUERADE
?
3、DNAT基于目的地址的轉換
對于目標地址轉換,數據流向是從外到內,通過對服務器的目標地址轉換,可以讓客戶端通過外網IP來訪問響應服務,而真正的服務卻在內網的服務器上,增加了安全性。
?
選項:
--to-destination [ipaddr][-ipaddr][:port[-port]]
?
例如:
# iptables -t nat -A PREROUTING -d 192.168.100.2 -p tcp --dport 80 -j DNAT --to-destination 192.168.56.102
?
?
?
八、iptables的規則保存與恢復
因為定義的規則當你重啟的時候會失效,所以我們要想永久生效就要保存起來
1、 service iptables save 命令
此命令會保存到默認配置文件,開機自動加載 。 /etc/sysconfig/iptables
?
2、使用 iptables-save命令
# iptables-save > /tmp/iptables?? # 手動保存配置到自定義目錄
?
3、使用iptables-restore命令
# iptables-restore < /tmp/iptables?? 手動加載配置
?
注:
iptables的鏈接跟蹤表最大容量為/proc/sys/net/ipv4/if_conntrack_max,鏈接碰到各種狀態的超時后就會從表中刪除。
所以解決方法一般有兩個:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.ipv4.nf_conntrack_max = 393216
net.ipv4.netfilter.nf_conntrack_max = 393216
?
(2): 降低 nf_conntrack timeout時間
vi /etc/sysctl.conf
net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
?
?
?
?
?
轉載于:https://blog.51cto.com/wzgl08/1673352
總結
以上是生活随笔為你收集整理的Iptables 入门进阶的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序补天笔记
- 下一篇: Kinect学习笔记(五)——更专业的深