一、防火墻簡介
Firewall:防火墻,隔離工具;工作于主機或網絡邊緣,對于進出本主機或本網絡的報文根據事先定義的檢查規則作匹配檢測,對于能夠被規則匹配到的報文作出相應處理的組件;
軟件防火墻(軟件邏輯):一般寄生在操作系統平臺。軟件防火墻是通過純軟件的的方式實現隔離內外部網絡的目的。
硬件防火墻(硬件和軟件邏輯):系統是嵌入式的系統。一般開源的較多。硬件防火墻是通過硬件和 軟件的組合來達到隔離內外部網絡的目的。 硬件防火墻是流行趨勢,相比軟件防火墻除成本外很有優勢。
本文只對軟件防火墻進行介紹
主機防火墻:服務范圍為當前主機
網絡防火墻:服務范圍為某個局域網
iptables的基本認識:
1、netfilter組件被稱為內核空間,它被集中在內核中。netfilter是一種內核中用于擴展各種網絡服務的結構化底層框架。它是在內核中選取五個位置放了五個hook function,這五個hook function 向用戶開放,用戶可以通過工具(iptables)向其寫規則。
2、iptables是一個工作在用戶層用來寫規則的工具,寫好的規則被送往netfilter。這些規則告訴內核中的netfilter組件如何處理信息包
iptables的組成:
iptables是由四個表和五個鏈組成
1、四表:
filter:過濾,防火墻;
nat:network address translation;用于修改源IP或目標IP,也可以改端口;(從而達到隱藏后臺服務器的目的)
mangle:拆解報文,做出修改,并重新封裝起來;(除了該地址之外的其它數據, 如協議)
raw:關閉nat表上啟用的連接追蹤機制;
實際上還有第五個表:security 此表用于強制訪問控制(MAC)網絡規則,一般很少很少用到此表
2、五鏈:
PREROUTING:對數據包作路由選擇前應用此鏈中的規則(所有的數據包進來的時侯都先由這個鏈處理)
INPUT:進來的數據包應用此規則鏈中的策略
OUTPUT:外出的數據包應用此規則鏈中的策略
POSTROUTING:對數據包作路由選擇后應用此鏈中的規則(所有的數據包出來的時侯都先由這個鏈處理)
FORWARD:轉發數據包時應用此規則鏈中的策略
3、表與鏈的關系
raw:PREROUTING, OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING(在centos6上沒有INPUT)
filter:INPUT,FORWARD,OUTPUT
功能生效先后次序raw –>mangle–>nat–>filter
4、如何寫規則
添加規則時的考量點:
(1) 要實現哪種功能:判斷添加到哪個表上;
(2) 報文流經的路徑:判斷添加到哪個鏈上;
鏈:鏈上的規則次序,即為檢查的次序;因此,隱含一定的應用法則:
(1) 同類規則(訪問同一應用),匹配范圍小的放上面;
(2) 不同類的規則(訪問不同應用),匹配到報文頻率較大的放在上面;
(3) 將那些可由一條規則描述的多個規則合并起來;
(4) 設置默認策略;
二、iptables的基本使用
iptables [-t 表名] <-A|-D|-I|-R…> 鏈名 [規則編號] [-i|-o 網卡名稱] [-p 協議類型] [-s 源IP地址|源子網] [–sport 源端口] [-d 目標地址|子網地址] [–dport 目標端口] <-j 處理動作>
1、-t table:
raw, mangle, nat, [filter](默認是filter鏈)
2、鏈管理:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
-N:new, 自定義一條新的規則鏈;
-X: delete,刪除自定義的規則鏈;
注意:只有具備以下全部條件才能刪除鏈
用戶自定義的
空的
引用計數為0的
必須符合以上三個條件才能刪除
-P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受(內建)
DROP:丟棄(內建)
REJECT:拒絕(擴展)
-E:重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也 不能被刪除;
3、規則管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略時表示第一條;
-D:delete,刪除;
-R:replace,替換指定鏈上的指定規則;
-F:flush,清空指定的規則鏈;
-Z:zero,置零;
iptables的每條規則都有兩個計數器:
(1) 匹配到的報文的個數;
(2) 匹配到的所有報文的大小之和;
4、查看:
-L:list, 列出指定鏈上的所有規則;(必須寫在后面)
-n:numberic,以數字格式顯示地址和端口號;
-v:verbose,詳細信息;
-vv, -vvv
-x:exactly,顯示計數器結果的精確值;
–line-numbers:顯示規則的序號;
5、匹配條件:
(1)基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
[!] -s, –source address[/mask][,…]:檢查報文中的源IP地址是否符合此處指定的地址或范圍;
[!] -d, –destination address[/mask][,…]:檢查報文中的目標IP地址是否符合 此處指定的地址或范圍;
匹配所有地址:0.0.0.0
[!] -p, –protocol protocol(四層協議)
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or “all”
[!] -i, –in-interface name:數據報文流入的接口;只能應用于數據報文流入 的環節,只能應用于PREROUTING,INPUT和 FORWARD鏈;
[!] -o, –out-interface name:數據報文流出的接口;只能應用于數據報文流 出的環節,只能應用于FORWARD、OUTPUT和 POSTROUTING鏈;
(2)擴展匹配條件: 需要加載擴展模塊,方可生效;又分為隱式擴展和顯示擴展
隱式擴展:不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使 用-p指明了協議,就表示已經指明了要擴展的模塊;
常用的協議
tcp:
[!] –source-port, –sport port[:port]:匹配報文的源端口;可以是端口范圍;
[!] –destination-port,–dport port[:port]:匹配報文的目標端口;可以是端 口范圍;
[!] –tcp-flags mask compmask is the flags which we should examine, written as a comma-separated list,例如 SYN,ACK,FIN,RST
comp is a comma-separated list of flags which must be set,例如:SYN
例如:“–tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標志位為 SYN,ACK,FIN,RST四個,其中SYN必須為1,余下的必須為0;
[!] –syn:用于匹配第一次握手,相當于”–tcp-flags SYN,ACK,FIN,RST SYN
“; udp
[!] –source-port, –sport port[:port]:匹配報文的源端口;可以是端口范圍;
[!] –destination-port,–dport port[:port]:匹配報文的目標端口;可以是端口范圍;
icmp
[!] –icmp-type {type[/code]|typename}
echo-request:8 (回顯請求)
echo-reply:0 (回顯響應)
6、處理動作:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回調用鏈;
REDIRECT:端口重定向;
LOG:記錄日志;
MARK:做防火墻標記;
DNAT:目標地址轉換;
SNAT:源地址轉換;
MASQUERADE:地址偽裝;
…
自定義鏈:
三、擴展模塊
1、multiport擴展:以離散方式定義多端口匹配;最多指定15個端口;
[!] –source-ports,–sports port[,port|,port:port]…:指定多個源端口;
[!] –destination-ports,–dports port[,port|,port:port]…:指定多個目標端口;
[!] –ports port[,port|,port:port]…:指明多個端口;
2、iprange擴展:指明連續的ip地址范圍;
[!] –src-range from[-to]:源IP地址;
[!] –dst-range from[-to]:目標IP地址;
3、string擴展:對報文中的應用層數據做字符串模式匹配檢測;
–algo {bm|kmp}:字符串匹配檢測算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!] –string pattern:要檢測的字符串模式;
[!] –hex-string pattern:要檢測的字符串模式,16進制格式;
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…]
–kerneltz:使用內核上的時區,而非默認的UTC;
5、connlimit擴展:根據每客戶端IP做并發連接數數量匹配;
–connlimit-upto n:連接的數量小于等于n時匹配;
–connlimit-above n:連接的數量大于n時匹配;
6、limit擴展:基于收發報文的速率做匹配;
令牌桶過濾器;
–limit rate[/second|/minute|/hour|/day](速率)
–limit-burst number(定義桶最大收集多少個令牌)
7、state擴展(在并發訪問量很大時,不建議開啟此功能)
state模塊是contract模塊的子集:根據”連接追蹤機制“去檢查連接的狀態;
conntrack機制:追蹤本機上的請求和響應之間的關系;狀態有如下幾種:
NEW:新發出請求;連接追蹤模板中不存在此連接的相關信息條目,因此, 將其識別為第一次發出的請求;
ESTABLISHED:NEW狀態之后,連接追蹤模板中為其建立的條目失效之前 期間內所進行的通信狀態;(established)
RELATED:相關聯的連接;如ftp協議中的數據連接與命令連接之間的關 系
INVALID:無效的連接;
UNTRACKED:未進行追蹤的連接;
三、iptables之forward配置
1、 客戶端配置
(1)配置網絡橋接模式 ip 172.16.254.187
(2)設置默認路由
route add default gw 172.16.251.210
(3)ping測試
172.16.251.210 ping 通
192.168.70.139 ping 通
192.168.70.138 不通
2、 web服務器配置
(1)配置網絡為僅主機模式 ip192.168.70.138
(2)添加默認路由
route add default gw 192.168.70.139
(3)測試
192.168.70.139 通
172.16.251.210 通
172.16.254.187 不通
(4)配置httpd服務
安裝服務
修改主頁面 vim /var/www/html/index.html
啟動服務
3、 iptables服務器配置
echo 1 >/proc/sys/net/ipv4/ip_forward (開啟內核轉發功能)
測試:
在172.16.254.178(客戶端)主機
通
在192.168.70.138(web服務器)主機
通
書寫規則鏈
4、測試
能正常訪問web服務器
四、iptables之地址裝換法則
1、NAT:網絡地址裝換。分為源地址轉換和目標地址裝換
SNAT:修改IP報文中的源IP地址,讓本地網絡中的主機刻使用同一地址與外部主機通信,從而實現偽裝地址
DNAT:修改IP報文的目的地址,讓本地網絡中的服務器使用統一的地址想歪提供服,但是隱藏自己的真實的地址。
PNAT:端口轉換,一般與DNAT結合王城目標地址和端口的轉換
2、SNAT的實現
要求:隱藏客戶端地址
客戶端配置
(1)配置網絡橋接模式 ip 172.16.254.187
(2)設置默認路由
route add default gw 172.16.251.210
(3)ping測試
172.16.251.210 ping 通
192.168.70.139 ping 通
192.168.70.138 不通
web服務器配置
(1)配置網絡為僅主機模式 ip192.168.70.138
(2)添加默認路由
route add default gw 192.168.70.139
(3)測試
192.168.70.139 通
172.16.251.210 通
172.16.254.187 不通
(4)配置httpd服務
安裝服務
修改主頁面 vim /var/www/html/index.html
啟動服務
iptables服務器配置
echo 1 >/proc/sys/net/ipv4/ip_forward (開啟內核轉發功能)
測試:
在172.16.254.178(客戶端)主機
通
在192.168.70.138(web服務器)主機
通
(1)配置iptables規則
隱藏客戶端主機的IP地址為(192.168.70.139)
(2) 測試
在客戶端抓包
客戶端訪問web服務器
看到:在客戶端顯示: 172.16.254.187發出請求
192.168.70.138響應請求
在iptables服務器抓包
抓包ens37(192.168.70.139)
看到發出請求報文的是 192.168.70.139而不是 172.16.254.187
在web服務器上抓包
看到發出請求報文的是 192.168.70.139而不是 172.16.254.187
這樣就可以隱藏客戶端地址了
3、DNAT配置
要求:隱藏web服務端地址
客戶端配置
(1)配置網絡橋接模式 ip 172.16.254.187
(2)設置默認路由
route add default gw 172.16.251.210
(3)ping測試
172.16.251.210 ping 通
192.168.70.139 ping 通
192.168.70.138 不通
web服務器配置
將web服務器的地址隱藏為172.16.251.210
(1)配置網絡為僅主機模式 ip192.168.70.138
(2)添加默認路由
route add default gw 192.168.70.139
(3)測試
192.168.70.139 通
172.16.251.210 通
172.16.254.187 不通
(4)配置httpd服務
安裝服務
修改主頁面 vim /var/www/html/index.html
啟動服務
iptables服務器配置
echo 1 >/proc/sys/net/ipv4/ip_forward (開啟轉發功能)
測試:
在172.16.254.178(客戶端)主機
通
在192.168.70.138(web服務器)主機
通
(1)配置iptables規則
(2)測試
在 客戶端測試
可以看到客戶端發出的請求報文給172.16.251.210了
在iptables服務器上抓包
可以看到客戶端發出的請求報文給自己了
在web服務器上抓包
可以看到客戶端給自己發的請求報文
4、在DNAT配置的基礎上擴展實現端口隱藏(PNAT)
現在web服務器上把web服務的端口改為8080
重啟服務
(1)在iptables服務器上做規則
iptables -t nat -A PREROUTING -d 172.16.251.210 -p tcp –dport 80 -j DNAT –to-destination 192.168.70.139:8080
(2)抓包測試
在客戶端測試
客戶端顯示我們訪問的是172.16.251.210的80端口
iptables測試
內網網卡(ens33)
內網網卡顯示我們訪問的是172.16.251.210的80端口
外網網卡(ens37)
外網網卡顯示我們訪問的是192.168.70.138的8080端口
web服務器測試
外網網卡顯示我們訪問的是192.168.70.138的8080端口
通過各個點的測試表明了 隱藏了服務器的端口,PNAT配置成功
原創文章,作者:zq,如若轉載,請注明出處:http://www.www58058.com/78169