1.相關概念
2.iptables相關用法
3.NAT(DNAT與SNAT)
相關概念
防火牆除了軟件及硬件的分類,也可對數據封包的取得方式來分類,可分為代理服務器(Proxy)及封包過濾機制(IP Filter)。
代理服務是一種網絡服務,通常就架設在路由上面,可完整的掌控局域網的對外連接。
IP Filter這種方式可以直接分析最底層的封包表頭數據來進行過濾,所以包括 MAC地址, IP, TCP, UDP, ICMP 等封包的信息都可以進行過濾分析的功能,用途非常廣泛。
其實Iptables服務不是真正的防火牆,只是用來定義防火牆規則功能的"防火牆管理工具",將定義好的規則交由內核中的netfilter即網絡過濾器來讀取,從而真正實現防火牆功能。
iptables抵擋封包的方式:
拒絕讓 Internet 的封包進入 Linux 主機的某些 port
拒絕讓某些來源 IP 的封包進入
拒絕讓帶有某些特殊標志( flag )的封包進入
分析硬件地址(MAC)來提供服務
iptables命令中設置數據過濾或處理數據包的策略叫做規則,將多個規則合成一個鏈,叫規則鏈。
規則鏈則依據處理數據包的位置不同分類:
PREROUTING: 在進行路由判斷之前所要進行的規則(DNAT/REDIRECT)
INPUT:處理入站的數據包
OUTPUT:處理出站的數據包
FORWARD:處理轉發的數據包
POSTROUTING: 在進行路由判斷之后所要進行的規則(SNAT/MASQUERADE)
iptables中的規則表是用於容納規則鏈,規則表默認是允許狀態的,那么規則鏈就是設置被禁止的規則,而反之如果規則表是禁止狀態的,那么規則鏈就是設置被允許的規則。
raw表:確定是否對該數據包進行狀態跟蹤
mangle表:為數據包設置標記(較少使用)
nat表:修改數據包中的源、目標IP地址或端口
filter表:確定是否放行該數據包(過濾)
規則表的先后順序:raw→mangle→nat→filter
規則鏈的先后順序:
入站順序:PREROUTING→INPUT
出站順序:OUTPUT→POSTROUTING
轉發順序:PREROUTING→FORWARD→POSTROUTING
內建表與鏈的關系流程圖(去掉了mangle表):
另外注意:
1.沒有指定規則表則默認指filter表。
2.不指定規則鏈則指表內所有的規則鏈。
3.在規則鏈中匹配規則時會依次檢查,匹配即停止(LOG規則例外),若沒匹配項則按鏈的默認狀態處理。
iptables命令中則常見的控制類型有:
ACCEPT:允許通過.
LOG:記錄日志信息,然后傳給下一條規則繼續匹配.
REJECT:拒絕通過,必要時會給出提示.
DROP:直接丟棄,不給出任何回應.
iptables命令基本參數和用法
格式為:"iptables [-t 表名] 選項 [鏈名] [條件] [-j 控制類型]"。
以下格式的寫法或許更為清楚明白:
"iptables –[A|I 鏈] [-i|o 網絡接口] [-p 協議] [-s 來源ip/網域] [-d 目標ip/網域] –j[ACCEPT|DROP]"
下表格為幾乎所有常用的iptables參數,
參數 |
作用 |
-P |
設置默認策略:iptables -P INPUT (DROP|ACCEPT) |
-F |
清空規則鏈 |
-L |
查看規則鏈 |
-A |
在規則鏈的末尾加入新規則 |
-I num |
在規則鏈的頭部加入新規則 |
-D num |
刪除某一條規則 |
-s |
匹配來源地址IP/MASK,加嘆號"!"表示除這個IP外。 |
-d |
匹配目標地址 |
-i 網卡名稱 |
匹配從這塊網卡流入的數據 |
-o 網卡名稱 |
匹配從這塊網卡流出的數據 |
-p |
匹配協議,如tcp,udp,icmp |
--dport num |
匹配目標端口號 |
--sport num |
匹配來源端口號 |
Iptables規則查看與清除
查看:
清除:
規則的清除
策略(Policy)的清除
Iptables 開放網口與ip來源
例:所有的來自 lo 這個網口的封包,都予以接受
iptables –A INPUT –i lo –j ACCEPT
例:目標來自 192.168.1.200 這個 IP 的封包都予以接受
iptables –A INPUT –i eth0 –s 192.168.1.200 –j ACCEPT
例:192.168.1.0/24 可接受,但 192.168.1.10 丟棄
iptalbes –A INPUT –i eth0 –s 192.168.1.0/24 –j ACCEPT
iptables -A INPUT -i eth0 -s 192.168.1.10 -j DROP
Iptables 規則記錄
例:# iptables -A INPUT -s 192.168.1.200 -j LOG
相關信息就會被寫入到/var/log/messages當中,然后該封包會繼續進行
后續的規則比對。LOG 這個動作僅在進行記錄而已,並不會影響到這個封包的其它規則比對的。
Iptables 開放tcp、udp端口
例:開放samba端口(udp137,138;tcp139,445)
iptables –A INPUT –i eth0 –p udp –dport 137:138 –j ACCEPT
iptables –A INPUT –i eth0 –p tcp –dport 139–j ACCEPT
iptables –A INPUT –i eth0 –p tcp –dport 445–j ACCEPT
iptables匹配ICMP端口和ICMP類型
iptables –A INPUT –p icmp –icmp-type 類型 –j ACCEPT
參數:--icmp-type :后面必須要接 ICMP 的封包類型,也可以使用代號,
例如 8 代表 echo request 的意思。(可自查詢ICMP-type對應表)
Iptables –syn的處理方式
指定TCP匹配擴展
使用 –tcp-flags 選項可以根據tcp包的標志位進行過濾。
#iptables -A INPUT -p tcp –tcp-flags SYN,FIN,ACK SYN
#iptables -A FROWARD -p tcp –tcp-flags ALL SYN,ACK
上實例中第一個表示SYN、ACK、FIN的標志都檢查,但是只有SYN匹配。第二個表示ALL(SYN,ACK,FIN,RST,URG,PSH)的標志都檢查,但是只有設置了SYN和ACK的匹配。
#iptables -A FORWARD -p tcp --syn
選項—syn相當於"--tcp-flags SYN,RST,ACK SYN"的簡寫。
Iptables 狀態模塊
例:只要已建立或相關封包就予以通過,只要是不合法封包就丟棄
iptables –A INPUT –m state –state RELATED ESTABLISHED –j ACCEPT
iptables –A INPUT –m state –state INVALID –j DORP
例:對局域網內mac地址為00:0C:29:56:A6:A2主機開放其聯機
[root@linux ~]# iptables -A INPUT -m mac --mac-source 00:0C:29:56:A6:A2 -j ACCEPT
Iptables保存於恢復
iptables-save > /etc/sysconfig/iptables.20180606
iptables-restore < /etc/sysconfig/iptables.20180606
NAT(Network AddressTranslation網絡地址轉換)
首先說說局域網內封包的傳送,
1. 先經過 NAT table 的 PREROUTING 鏈;
2. 經由路由判斷確定這個封包是要進入本機與否,若不進入本機,則下一步;
3. 再經過 Filter table 的 FORWARD 鏈;
4. 通過 NAT table 的 POSTROUTING 鏈,最后傳送出去。
NAT 主機的重點就在於上面流程的第 1,4 步驟,也就是 NAT table 的兩條重要的鏈:PREROUTING 與POSTROUTING。 那這兩條鏈重要功能在於修改IP,而這兩條鏈修改的IP又是不一樣的,POSTROUTING在修改來源IP,PREROUTING則在修改目標IP 。由於修改的 IP 不一樣,所以就稱為來源NAT (Source NAT, SNAT) 及目標 NAT (Destination NAT, DNAT)。
SNAT即源地址轉換,能夠讓多個內網用戶通過一個外網地址上網,解決了IP資源匱乏的問題。一個無線路由器也就使用此技術。
SNAT封包傳送示意圖
由上圖可知,需要將192.168.10.10轉換為111.196.211.212,iptables命令如下:
iptables –t nat –A POSTROUTING –s 192.168.10.10 –o eth1 –j SNAT --to-source 111.196.221.212
外網IP地址不穩定的情況即可使用MASQUERADE(動態偽裝),能夠自動的尋找外網地址並改為當前正確的外網IP地址
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
DNAT即目地地址轉換,則能夠讓外網用戶訪問局域網內不同的服務器。(相當於SNAT的反向代理)
DNAT封包傳送示意圖
由上圖可知,目標地址192.168.10.6在路由前就轉換成61.240.149.149,需在網關上運行iptables命令如下:
iptables –t nat –A PREROUTING –i eth1 –d 61.240.149.149 –p tcp –dport 80 –j DNAT --to-destination 192.168.10.6:80
eth1網口傳入,且想要使用 port 80 的服務時,將該封包重新傳導到 192.168.1.210:80 的 IP 及 port 上面,可以同時修改 IP 與 port。此為地址映射與端口轉換。
還可以使用REDIRECT單獨進行端口轉換
例:將 80 端口的封包轉遞到 8080端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
# 使用 8080 這個 port 來啟動 WWW ,但是別人都以80來聯機