Linux iptables配置應用
概述:
Linux的防火墻體系主要工作在網絡層,只對tcp/ip數據包實施過濾和限制,屬于典型的包過濾防火墻(或稱為網絡層防火墻)。Linux的防火墻體系基于內核編碼實現,因此具有非常好的性能和效率,因此被更加廣泛的采納和應用。
Iptables:
Firewall:隔離工具;Packets Filter Firewall;工作于主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,對于能夠被規則匹配到的報文實行某預定義的處理機制的一套組件。
硬件防火墻:在硬件級別實現部分功能的防火墻;另一個部分功能基于軟件實現;
軟件防火墻:應用軟件處理邏輯運行于通用硬件平臺之上的防火墻;
主機防火墻:服務范圍為當前主機;
網絡防火墻:服務范圍為防火墻背后的局域網;
iptables/netfilter:
netfilter:防火墻框架,framework;位于內核空間;
iptables:命令行工具程序,位于用戶空間;規則管理工具;
netfilter:
hooks function (鉤子函數)
prerouting
input
forward
output
postrouting
iptables的五個鏈:
CHAINS:鏈
PREROUTING:在對數據包作路由選擇之前,應用此鏈中的規則。
INPUT:當接收到訪問防火墻本機地址的數據包(入站)時,應用此鏈中的規則。
FORWARD :當接收到需要通過防火墻發送給其它主機地址的數據包(轉發)時,應用此鏈中的規則。
OUTPUT:當防火墻本機向外發送數據包(出站)時,應用此鏈中的規則。
POSTROUTING:在對數據包作路由選擇之后,應用此鏈中的規則。
數據報文流向:
到本機某進程的報文:PREROUTING –> INPUT
由本機轉發的報文:PREROUTING –> FORWARD –> POSTROUTING
由本機的某進程發出報文:OUTPUT –> POSTROUTING
iptables四個表(tables):
filter:過濾,防火墻;
nat:network address translation,網絡地址轉換;
mangle:拆解報文,做出修改,并重新封裝;
raw:關閉nat表上啟用的連接追蹤機制;
iptables四個表的優先級順序(由高到低):
raw –> mangle –> nat –> filte
iptables四個表各自所對應的鏈:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,INPUT,OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
iptables規則的組成部分:
匹配條件:
網絡層首部:Source IP, Destination IP
傳輸層首部:Source Port, Destination Port
擴展檢查機制:需要借助于擴展模塊進行指定的匹配條件
處理動作:target
ACCEPT,DROP,REJECT
配置iptables規則條件前操作:
netfilter:位于內核中的tcp/ip協議棧報文處理框架;
iptables:
CentOS 5/6:iptables命令編寫規則;
# iptables -t filter -F //清空防火墻規則
# service iptables save
CentOS 7:firewalld,firewall-cmd, firewall-config
# systemctl disable firewalld //重啟后,防火墻不會自動啟動
程序包:iptables:iptables包名;
iptstate:iptables依賴包,狀態追蹤機制包;
iptables命令匹配條件:
規則:根據指定的匹配條件來嘗試匹配每個流經此處的報文,一旦匹配成功,則由規則后面指定的處理動作進行處理;
匹配條件:
基本匹配條件:源地址,目標地址,傳輸層協議
擴展匹配條件:需要借助于擴展模塊進行指定的匹配條件
隱式擴展:已經在基本匹配條件中指明的協議相關的擴展;
顯式擴展:隱式擴展之外的其它擴展匹配條件;
處理動作:
基本動作:ACCEPT,DROP,…
擴展動作:需要借助于擴展模塊進行,但無須顯式指定,僅需指明動作;
添加規則時需要考量的問題:
(1) 報文流經的位置:用于判斷將規則添加至哪個鏈;
(2) 實現的功能:用于判斷將規則添加至哪個表;
(3) 報文的方向:用于判斷哪個為“源”,哪個為“目標”;
(4) 匹配條件:用于編寫能夠正確匹配目標報文的規則;
規則管理格式:iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
-t table:指明要管理的表; 默認為filter;
COMMANDS:
鏈管理控制選項:
-P:定義鏈的默認策略;其target一般可使用ACCEPT、REJECT、DROP;
示例:[root@centos7 ~]# iptables -P INPUT DROP
-N:自定義規則鏈;僅在默認鏈通過某規則進行調用方可生效;因此,每個自定義鏈都有其引用記數;
-X:刪除自定義的空的引用計數為0的鏈;
-F:清空指定的鏈,或刪除指定鏈上的規則 ;
-E:重命名自定義的引用計數為0的鏈;
-Z:清空指定鏈上的計數器。
鏈規則選項:
-A:追加規則到指定的鏈尾部;
-I:插入規則到指定的鏈中的指定位置,默認為鏈首;
-D:刪除指定的鏈上的指定規則;
-R,將指定的鏈上的指定規則替換為新的規則;
查看鏈規則選項:
-L:list, iptables [-t table] -L [chain [rulenum]] [options…]
-n:數字格式;
-v:verbose,詳細格式信息;
-V:查看iptables命令工具的版本信息;
–line-numbers:顯示鏈上的規則的編號;
-x:exactly,顯示計數器的精確值;
計數器:
每條規則以及鏈的默認策略分別有各自的兩個計數器:
(1) 匹配到的報文的個數:pkts
(2) 匹配到的所有報文的大小之積:bytes
匹配條件:
基本匹配條件
擴展匹配條件
隱式擴展
顯式擴展
注意:多重條件之間的隱含邏輯為“與”操作;
基本匹配條件:
[!] -s :檢查報文中的源IP地址是否符合此處指定的地址或地址范圍;
[!] -d :檢查報文中的目標IP地址是否符合此處指定的地址或地址范圍;
[!] -p :檢查報文中傳輸層的協議類型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";
[!] -i :檢查報文進入本機時的接口是否符合本處指定的接口;INPUT, FORWARD and PREROUTING ;
[!] -o:檢查報文即將離開本機時經由的接口是否符合本處指定的接口;FORWARD, OUTPUT and POSTROUTING;
-m, –match match:顯式指明要使用的擴展模塊;
-j, –jump target:跳轉目標;匹配條件:
示例:
在本機防火墻上只開啟本地網絡ping(icmp)協議的報文通過:
iptables -t filter -A INPUT -j DROP
iptables -t filter -A OUTPUT -j DROP
iptables -t filter -I INPUT -s 192.168.3.0/24 -d 192.168.3.5 -p icmp –icmp-type 8 -j ACCEPT
iptables -t filter -I OUTPUT -s 192.168.3.5 -d 192.168.3.0/24 -p icmp –icmp-type 0/ -j ACCEPT
示例:
在本機防火墻上只開啟ping(icmp)本地網絡中其他主機的報文通過:
iptables -t filter -A INPUT -j DROP
iptables -t filter -A OUTPUT -j DROP
iptables -I INPUT -s 192.168.3.0/24 -d 192.168.3.5 -p icmp –icmp-type 0 -j ACCEPT
iptables -I OUTPUT -s 192.168.3.5 -d 192.168.3.0/24 -p icmp –icmp-type 8 -j ACCEPT
示例:
在本機防火墻只開啟本地網絡openssh遠程登錄:
iptables -t filter -A INPUT -j DROP
iptables -t filter -A OUTPUT -j DROP
iptables -I INPUT -s 192.168.3.0/24 -d 192.168.3.5 -p tcp –dport 22 -j ACCEPT
iptables -I OUTPUT -s 192.168.3.5 -d 192.168.3.0/24 -p tcp –sport 22 -j ACCEPT
擴展匹配條件:
隱式擴展:不用-m選項明確給出要使用的擴展機制的擴展;此處主要指使用-p {tcp|udp|icmp}給定協議后可直接對給定的協議所進行的擴展;
-p tcp:可直接使用tcp協議對應的擴展選項;
[!]–sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口;
[!] –dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;
[!] –tcp-flags mask comp
SYN,ACK,FIN,RST,URG,PSH;
mask:要檢查的標志位列表,以逗號分隔,例如SYN,ACK,FIN,RST
comp:mask給定的眾標志位中,其值必須為1的標志位列表,余下的必須為0;
–tcp-flags SYN,ACK,FIN,RST SYN
[!] –syn:相當于–tcp-flags SYN,ACK,FIN,RST SYN
-p udp:可直接使用udp協議對應的擴展選項
[!] –sport port[:port]:匹配報文中的傳輸層的源端口;可給出多個連接的端口;
[!]–dport port[:port]:匹配報文中的傳輸層的目標端口;可給出多個連接的端口;
-p icmp:可直接使用icmp協議對應的擴展選項;
[!] –icmp-type {type[/code]|typename}
–icmp-type 8/0:匹配ping請求報文
–icmp-type 0/0:匹配對ping請求的響應報文
顯式擴展:必須使用-m選項給出matchname的擴展,而且有些擴展都還存在專用選項;
1、multiport
以離散或連續的方式定義的多端口匹配條件; Up to 15 ports can be specified.
[!] –sports port[,port|,port:port]…:指定多個源端口;
[!] –dports port[,port|,port:port]…:指定多個目標端口;
[!] –ports port[,port|,port:port]…:匹配此處指定的源或目標端口;
示例:
只開放本機防火墻的22、23、80端口給本地網絡訪問:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -I INPUT -d 192.168.3.5 -p tcp -m multiport –dports 22,23,80,9000.3306 -j ACCEPT
iptables -I OUTPUT -s 192.168.3.5 -p tcp -m multiport –sports 22,23,80,9000.3306 -j ACCEPT
2、iprange
以連續的ip地址范圍指明多地址匹配條件;
[!] –src-range from[-to]
[!] –dst-range from[-to]
示例:
-m iprange –src-range 192.168.3.10-192.168.3.20
-m iprange –dst-range 192.168.3.10-192.168.3.20
3、string
對報文中的應用層數據做字符串匹配檢測;
[!] –string pattern
[!] –hex-string pattern
–algo {bm|kmp}:字符串匹配檢查算法;
–from offset
–to offset
示例:
屏蔽掉網站中帶有“sex”的敏感字符串的響應:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -I INPUT -d 192.168.3.5 -p tcp -m multiport –dports 22,23,80 -j ACCEPT
iptables -I OUTPUT -s 192.168.3.5 -p tcp -m multiport –sports 22,23,80 -j ACCEPT
iptables -I OUTPUT -p tcp –sport 80 -m string –string "sex" –algo bm -j REJECT
4、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…]
[!] –weekdays day[,day…]
示例:
禁止在非工作時間登錄防火墻本機telnet服務。
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -I INPUT -d 192.168.3.5 -p tcp –dport 23 -m time –weekdays 6,7 -j DROP
iptables -I INPUT -d 192.168.3.5 -p tcp –dport 23 -m time –timestart 18:00 –timestop 9:00 -j DROP
iptables -I INPUT -d 192.168.3.5 -p tcp -m multiport –dports 22,23,80 -j ACCEPT
iptables -I OUTPUT -s 192.168.3.5 -p tcp -m multiport –sports 22,23,80 -j ACCEPT
注意:ntpdate 時間服務器地址,同步時間。
5、connlimit
根據每客戶端IP做并發連接數限制,即限制單IP可同時發起連接請求;
–connlimit-upto n:連接數小于等于閾值;
–connlimit-above n:連接數超出閾值;
示例:
防火墻本機限制ssh服務單ip主機并發連接不能超過3個:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
Iptables -I INPUT -d 192.168.3.5 -p tcp –dport 22 -m connlimit –connlimit-above 3 -j RJECT
iptables -I INPUT -d 192.168.3.5 -p tcp -m multiport –dports 22,23,80 -j ACCEPT
iptables -I OUTPUT -s 192.168.3.5 -p tcp -m multiport –sports 22,23,80 -j ACCEPT
~]# iptables -I INPUT -d 10.1.0.6 -p tcp –dport 22 -m connlimit –connlimit-above 2 -j REJECT
6、limit
基于收發報文的速率進行匹配;
–limit rate[/second|/minute|/hour|/day]
–limit-burst number
示例:
限制ping防火墻本機為6秒一次:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -I INPUT -d 192.168.3.5 -p icmp –icmp-type 8 -m limit –limit-burst 5 –limit 10/minute -j ACCEPT
iptables -I OUTPUT -s 192.168.3.5 -p icmp –icmp-type 0 -j ACCEPT
~]# iptables -A INPUT -d 10.1.0.6 -p icmp –icmp-type 8 -m limit –limit-burst 3 –limit 20/minute -j ACCEPT
7、state
狀態檢測:連接追蹤機制(conntrack)
NEW:新連接
ESTABLISHED:已建立的連接
RELATED:相關聯的連接
INVALID:無法識別的連接,拒絕放行;
UNTRACKED:未被追蹤連接;
相關的內核模塊:
nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp
追蹤到的連接:/proc/net/nf_conntrack文件中;
能追蹤的最大連接數量定義在:/proc/sys/net/nf_conntrack_max
建議調整至足夠大;
不同的協議的連接追蹤時長:
/proc/sys/net/netfilter/
[!] –state state
如何開放被動模式的ftp服務:
(1) 裝載追蹤ftp協議的模塊;
# modprobe nf_conntrack_ftp
(2) 放行入站命令連接
# iptables -A INPUT -d SERVER_IP -p tcp –dport 21 -m state –state NEW,ESTABLISHED -j ACCEPT
(3) 放行入站數據連接
# iptables -A INPUT -d SERVER_IP -p tcp -m state –state RELATED,ESTABLISHED -j ACCEPT
(4) 放行出站的ESTABLISHED連接
# iptabls -A OUTPUT -s SERVER_IP -m state –state NEW,ESTABLISHED -j ACCEPT
示例:
在本機防火墻上開放21、22、23、80端口服務的訪問:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -I INPUT -d 192.168.3.5 -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -I INPUT 2 -d 192.168.3.5 -p tcp -m multiport –dports 21:23,80 -m state –state NEW -j ACCEPT
iptables -I INPUT 3 -d 192.168.3.5 -p icmp –icmp-type 8 -m state –state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 192.168.3.5 -m state –state NEW,ESTABLISHED -j ACCEPT
注意:ftp服務需要手動裝載nf_conntrack_ftp連接跟蹤ftp協議的模塊;
modprobe nf_conntrack_ftp
8、MAC地址匹配
主要用于檢查數據包源MAC地址在,在iptables命令中使用“–mac-source MAC地址”的形式。
例如:拒絕來自MAC地址00:0C:29:7C:0C:37的所有數據包,到本機防火墻。
iptables -I INPUT 4 -d 192.168.3.5 -m mac –mac-source 00:0C:29:7C:0C:37 -j REJECT
處理動作(跳轉目標):
-j tagetname [per-target-options]
簡單target:
ACCEPT,DROP
擴展target:
REJECT: LOG
–reject-with type
icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐ able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited,默認為icmp-port-unreachable;
LOG:
Turn on kernel logging of matching packets.
–log-level level
emerg,alert,crit,error, warning, notice, info or debug.
–log-prefix prefix:日志信息的前導信息;
示例:注意iptables規則添加的位置
iptables -I INPUT 2 -d 192.168.3.5 -p tcp –dport 22 -j LOG –log-prefix "openssh from kernel:"
保存和載入規則:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE
-n, –noflush:不清除原有規則
-t, –test:僅分析生成規則集,但不予提交;
注意:重載文件中的規則,會清除已有規則;
CentOS 6:
保存規則:service iptables save
保存規則于/etc/sysconfig/iptables,保存操作會清除文件中原有的內容;
重載規則:server iptables restart
默認重載/etc/sysconfig/iptables文件中的規則
腳本配置文件:/etc/sysconfig/iptables-config
IPTABLES_MODULES=""用于指明要裝載的模塊;
CentOS 7開機自動生效規則:
(1) firewalld服務;
(2) shell腳本,直接記錄iptables命令;
(3) 自定義unit file或init script;
規則優化的思路:
(1) 優先放行雙方向狀態為ESTABLISHED的報文;
(2) 服務于不同類別的功能的規則,匹配到報文可能性更大的放前面;
(3) 服務于同一類別的功能的規則,匹配條件較為嚴格的放前面;
(4) 設置默認策略:白名單機制
(a) 可使用iptables -P設定默認策略;
(b) 建議在規則鏈的最后定義規則做為默認策
Iptables本機防火墻作轉發:
實驗環境目的:
允許內網中的主機去訪問外網中的80、21、22、23端口服務;
iptables -A FORWARD -j DROP
iptables -I FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -I FORWARD -s 192.168.3.0/24 -p tcp -m multiport –dports 21:23 80 -m state –state NEW -j ACCEPT
注意:開啟本機防火墻上的路由轉發功能:
echo "1" > /proc/sys/net/ipv4/ip_forward
手動裝載nf_conntrack_ftp連接跟蹤ftp協議的模塊;
modprobe nf_conntrack_ftp
SNAT的配置及應用:
SNAT只能用于nat表的POSTROUTING鏈和INPUT鏈。使用iptables命令設置SNAT策略時,需要結合“SNAT –to-source IP地址”選項指定修改后的IP地址。(例如:-j SNAT –to-source 218.29.30.31)
示例:
iptables -t nat -I POSTROUTING -s 192.168.3.0/24 -j SNAT –to-source 10.1.0.6-10.1.0.9
DNAT的配置及應用:
DNAT只能用于nat表的PREROUTING鏈和OUTPUT鏈,使用iptables命令設置DNAT策略時,需要結合“DNAT –to-destionation IP地址”選項指定修改后的IP地址。(例如:-j SNAT –to-destionation 192.168.3.5)
示例:
iptables -t nat -I PREROUTING -d 10.1.0.6 -p tcp –dport 80 -j DNAT –to-destination 192.168.3.5:8080
iptables -t nat -I PREROUTING -d 10.1.0.6 -p tcp –dport 22 -j DNAT –to-destination 192.168.3.6:22
REDIRECT端口映射:
在web網站服務器上啟用端口映射:
例如:web網站服務器上監聽的是8080端口,IP:192.168.3.6;
iptables -t nat -I PREROUTING -d 192.168.3.6 -p tcp –dport 80 -j REDIRECT –to-ports 8080
MASQUERADE:動態地址轉換
masquerade作用是從服務器的網卡上自動獲得當前IP地址做SNAT源地址轉換。
適用于動態獲取ip+ADSL撥號則使用
示例:
iptables -t nat -A PORTROUTING -s 192.168.3.0/24 -O ppp0 -j MASQUERADE
如此配置的話,不用指定SNAT的目標ip了,不管現在ppp0的出口獲得了怎樣的動態ip,MASQUERADE會自動讀取ppp0現在的ip地址然后做SNAT出去,這樣就實現了很好的動態SNAT地址轉換。
用戶自定義鏈:
iptables -t filter -N icmp_in
iptables -I icmp_in -p icmp -j DROP
Iptables -I FORWARD -s 192.168.3.0/24 -p icmp -j icmp_in
刪除自定義鏈:
1)先刪除被引用的鏈;iptables -D FORWARD 1
2)清空自定義鏈中的規則;iptables -F icmp_in
3)刪除自定義鏈; iptables -X icmp_in
原創文章,作者:zhengyibo,如若轉載,請注明出處:http://www.www58058.com/59600