Iptables入門到進階
一、前言
Firewall(防火墻): 隔離工具;Packets Filter Firewall(包過濾防火墻);工作于主機或網絡的邊緣,對經由的報文根據預先定義的規則(匹配條件)進行檢測,對于能夠被規則匹配到的報文實行某預定義的處理機制的一套組件; 防火墻類型 從防火墻的實現形式來分的話,防火墻可以分為軟件防火墻和硬件防火墻 硬件防火墻:在硬件級別實現部分功能的防火墻;另一個部分功能基于軟件實現; 軟件防火墻:應用軟件處理邏輯運行于通用硬件平臺之上的防火墻; 從防火墻的服務范圍來分的話,防火墻可以分為主機防火墻,網絡防火墻;主機防火墻:服務范圍為當前主機 網絡防火墻:服務范圍為防火墻被的局域網
二、netfilter/iptables IP信息包過濾系統:
iptables只是Linux防火墻的管理工具而已,位于/sbin/iptables。真正實現防火墻功能的是 netfilter,它是Linux內核中實現包過濾的內部結構。 netfilter/iptables 的最大優點是它可以配置有狀態的防火墻,有狀態的防火墻能夠指定并記住為發送或接收信息包所建立的連接的狀態。防火墻可以從信息包的連接跟蹤狀態獲得該信息。在決定新的信息包過濾時,防火墻所使用的這些狀態信息可以增加其效率和速度。這里有四種有效狀態,名稱分別為 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。 netfilter/iptables 的另一個重要優點是,它使用戶可以完全控制防火墻配置和信息包過濾。您可以定制自己的規則來滿足您的特定需求,從而只允許您想要的網絡流量進入系統。 防火墻在做信息包過濾決定時,有一套遵循和組成的規則,這些規則存儲在專用的信 息包過濾表中,而這些表集成在 Linux 內核中。在信息包過濾表中,規則被分組放在我們所謂的鏈(chain)中。而netfilter/iptables IP 信息包過濾系統是一款功能強大的工具,可用于添加、編輯和移除規則。 雖然 netfilter/iptables IP 信息包過濾系統被稱為單個實體,但它實際上由兩個組件netfilter 和 iptables 組成。
1.netfilter:
定義規則的工具,本身并不算是防火墻。它們定義的規則,可以讓在內核空間當中的netfilter來讀取,并且實現讓防火墻工作。而放入內核的地方必須要是特定的位置,必須是tcp/ip的協議棧經過的地方。而這個tcp/ip協議棧必須經過的地方,可以實現讀取規則的地方就叫做 netfilter.(網絡過濾器);它是防火墻框架,framework;位于內核空間,承載并生效規則;
報文流向: 到本機某進程的報文:PREROUTING --> INPUT 由本機轉發的報文:PREROUTING --> FORWARD --> POSTROUTING 由本機的某進程發出報文:OUTPUT --> POSTROUTING
tcp/ip協議棧必須經過的地方,可以實現讀取規則的五個位置作為控制的地方,這五個位置也被稱為五個“鉤子函數”(hooks function),也叫五個規則鏈
(1)INPUT——進來的數據包應用此規則鏈中的策略 (2)OUTPUT——外出的數據包應用此規則鏈中的策略 (3)FORWARD——轉發數據包時應用此規則鏈中的策略 (4)PREROUTING——對數據包作路由選擇前應用此鏈中的規則 (記住!所有的數據包進來的時侯都先由這個鏈處理) (5)POSTROUTING——對數據包作路由選擇后應用此鏈中的規則 (所有的數據包出來的時侯都先由這個鏈處理)
這是NetFilter規定的五個規則鏈,任何一個數據包,只要經過本機,必將經過這五個鏈中的其中一個鏈。
2.iptables:
IP信息包過濾系統,命令行工具程序,位于用戶空間;規則管理工具。 Iptables 是用來設置、維護和檢查Linux內核的IP包過濾規則的。 可以定義不同的表,每個表都包含幾個內部的鏈,也能包含用戶定義的鏈。每個鏈都是一個規則列表,對對應的包進行匹配:每條規則指定應當如何處理與之相匹配的包。這被稱作'target'(目標),也可以跳向同一個表內的用戶定義的鏈。
Tables:
(1)filter:過濾,防火墻; (2)nat:network address translation,網絡地址轉換; (3)mangle:拆解報文,做出修改,并重新封裝; (4)raw:關閉nat表上啟用的連接追蹤機制;
四種表的優先級次序(由高而低): raw –> mangle –> nat –> filter ;不同的表與鉤子函數(規則鏈)之間的關系:
raw:PREROUTING,OUTPUT mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING nat:PREROUTING,[INPUT] ,OUTPUT,POSTROUTING;(在CentOS 7中nat多了一個INPUT鏈) filter:INPUT,FORWARD,OUTPUT
三、iptables規則的組成部分:
1.規則的定義
規則(rules)其實就是網絡管理員預定義的條件,規則一般的定義為根據指定的匹配條件來嘗試匹配每個流經此處的報文,一旦匹配成功,則由規則后面指定的處理動作進行處理; 規則存儲在內核空間的信息包過濾表中,這些規則分別指定了基礎匹配條件,如源地址、目的地址、傳輸層協議(如TCP、UDP、ICMP),擴展匹配條件,如服務類型(如HTTP、FTP和SMTP)等。其中擴展匹配條件則需要借助于擴展模塊進行指定的匹配條件,當數據包與規則匹配時,iptables就根據規則所定義的方法來處理這些數據包,如放行(accept)、拒絕(reject)和丟棄(drop)等。配置防火墻的 主要工作就是添加、修改和刪除這些規則。
2.添加規則時需要考量的因素:
(1)實現的功能:用于判定將規則添加至哪個表; (2)報文的流經位置:用于判斷將規則添加至哪個鏈; (3)報文的流向:判定規則中何為“源”,何為“目標”; (4)匹配條件:用于編寫正確的匹配規則; (a)專用于某種應用的同類規則,匹配范圍小的放前面; (b)專用于某些應用的不同類規則,匹配到的可能性較多的放前面;同一類別的規則可使用自定義鏈單獨存放; (c)用于通用目的的規則放前面;
filter表:過濾,“防火墻”意義的核心所在,其包含的鏈為:INPUT,FORWARD,OUTPUT;
四、iptables命令詳解
1.安裝
netfilter:位于內核中的tcp/ip協議棧報文處理框架;集成在內核中。
iptables: 在CentOS 5/6中使用iptables命令生成規則,生成的規則是直接送往內核的,立即生效,可保存于文件中以反復裝載生效;
# iptables -t filter –F //說明:將filter表的所有規則清空 # service iptables save //說明:它能把規則自動保存在/etc/sysconfig/iptables中。 當計算機啟動時,rc.d下的腳本將用命令iptables-restore調用這個文件,從而就自動恢復了規則。
使用幫助:
# man iptables 在CentOS 7是通過firewalld服務來生成iptables規則,這個服務生成規則的工具叫做firewall-cmd,可以通過其配置文件 firewall-config來對其進行配置。 # systemctl disable firewalld.service # systemctl stop firewalld.service 說明:關閉開機啟動并禁用firewalld服務;建議關閉firewalld服務繼續使用iptables
在CentOS 7中使用幫助是分割開的分別是:
# man iptables # man iptables-extensions CentOS 7中的iptables的程序包是iptables, iptstate。
2.iptables命令:
iptabls命令的使用格式:
iptables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options]
五、COMMANDS詳解:
規則管理格式:
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]]
1.鏈管理命令:(立即生效)
-P:iptables [-t table] -P chain target //定義鏈的默認策略,對filter表中的鏈而言,其默認策略有ACCEPT(接受)、DROP(丟棄)、REJECT(拒絕)。 例如: # iptables -t filter -P INPUT DROP //(設置filter表默認規則為丟棄) # iptables -t filter -P INPUT ACCEPT //(設置filter表默認規則為接受) -N:iptables [-t table] -N chain //自定義規則鏈;默認為filter;僅在默認鏈通過某規則進行調用方可生效;因此,每個自定義鏈都有其引用記數 -X:iptables [-t table] -X [chain] //刪除自定義的空的引用計數為0的鏈; -F:iptables [-t table] -F [chain [rulenum]] [options...] //清空指定的鏈,或刪除指定鏈上的規則 ; -E:iptables [-t table] -E old-chain-name new-chain-name //重命名自定義的引用計數為0的鏈; -Z:iptables [-t table] -Z [chain [rulenum]] [options...] //置零計數器; 注意:每個規則都有兩個計數器 packets:被本規則所匹配到的所有報文的個數; bytes:被本規則所匹配到的所有報文的大小之和;
2.規則管理:
-A:--append, iptables [-t table] -A chain rule-specification //追加規則到指定的鏈尾部; -I:--insert, iptables [-t table] -I chain [rulenum] rule-specification //插入規則到指定的鏈中的指定位置,默認為鏈首; -D: --delete, iptables [-t table] -D chain rulenum //根據規則編號刪除規則 -D: --delete, iptables [-t table] -D chain roule-specification //根據規則本身刪除規則 -R:--replace,iptables [-t table] -R chain rulenum rule-specification //將指定的鏈上的指定規則替換為新的規則;
3.規則顯示:
-L,--list,iptables [-t table] -L [chain [rulenum]] [options...] 列出規則; -v, --verbose:詳細信息。 -vv,-vvv 更詳細信息。 -n, --numeric:數字方式顯示地址和端口號。 -x, --exact:顯示計數器的精確值,而不是圓整后的值。 --line-numbers:列出規則時,顯示其在鏈上的編號。 -S, --list-rules [chain] 顯示指定鏈的所有規則。
常用的規則顯示命令:
iptables –vnL iptables -t net –nL iptables -t filter –nL iptables -t raw –nL
六、匹配條件:
規則管理格式:
iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]] [-j targetname [per-target-options]] 其中rule-specification = [matches...] [target]
matches:匹配條件
匹配條件分為兩種:基本匹配條件,擴展匹配條件 注意:多重條件之間的隱含邏輯為“與”操作;
1.通用匹配條件:無需加在任何模塊,由iptables/netfilter自行提供。
[!] -s, --source address[/mask][,...]: 檢查報文中的源IP地址是否符合此處指定的地址或地址范圍; [!] -d, --destination address[/mask][,...]: 檢查報文中的目標IP地址是否符合此處指定的地址或地址范圍; 例如: # iptables -t filter -A INPUT -s 172.16.69.8 -d 172.16.69.88 -j DROP 說明:拒絕172.16.69.8對172.16.69.88的訪問 [!] -p, --protocol protocol: 檢查報文中傳輸層的協議類型,支持tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh,或者 "all";也可以使用數字格式指定協議 例如: # iptables -t filter -A INPUT -s 172.16.69.8 -d 172.16.69.88 -p icmp -j REJECT 說明:禁止172.16.69.8通過icmp協議訪問172.16.69.88,即禁止ping操作 [!] -i, --in-interface name: 檢查報文進入本機時的接口是否符合本處指定的接口;只能應用于數據報文流入的環節,只能應用于INPUT, FORWARD和PREROUTING鏈 ; 例如: # iptables -t filter -R INPUT 1 -s 172.16.69.8 -d 172.16.69.88 -p icmp -i eth0 -j DROP 說明:禁止172.16.69.8通過icmp協議訪問172.16.69.88的eth0網卡 [!] -o, --out-interface name: 檢查報文即將離開本機時經由的接口是否符合本處指定的接口;只能應用于數據報文流出的環節,只能應用于FORWARD, OUTPUT和POSTROUTING鏈; -m, --match match:顯式指明要使用的擴展模塊; -j, --jump target:跳轉目標
2.擴展匹配條件:需要加載擴展模塊,方可生效。
2.1隱式擴展:
不用-m選項明確給出要使用的擴展機制的擴展;此處主要指使用-p {tcp|udp|icmp}給定協議后可直接對給定的協議所進行的擴展;
-p tcp:可直接使用tcp協議對應的擴展選項,一般有三種; [!] --source-port,--sport port[:port]: 匹配報文中的傳輸層的源端口;可給出多個連接的端口,但只能是連續的端口范圍; [!] --destination-port,--dport port[:port]: 匹配報文中的傳輸層的目標端口;可給出多個連接的端口,但只能是連續的端口范圍; 例如: # iptables -A INPUT -s 172.16.69.8 -d172.16.69.88 -p tcp --dport 22 -j DROP 說明:禁止172.16.69.8訪問172.16.69.88的tcp協議的22號端口即ssh端口 [!] --tcp-flags mask comp 匹配報文中的tcp協議的標志位,Flags:SYN,ACK,FIN,RST,URG,PSH; mask:要檢查的標志位列表,以逗號分隔,例如SYN,ACK,FIN,RST comp:mask給定的眾標志位中,其值必須為1的標志位列表,余下的必須為0; 例如: --tcp-flags SYN,ACK,FIN,RST SYN 說明:表示要檢查的標志位為SYN,ACK,FIN,RST四個,其中SYN必須為1,余下的必須為0; [!] --syn: 用于匹配tcp的第一次握手,相當于--tcp-flags SYN,ACK,FIN,RST SYN -p udp:可直接使用udp協議對應的擴展選項; [!] --source-port,--sport port[:port]: 匹配報文中的傳輸層的源端口;可給出多個連接的端口,但只能是連續的端口范圍; [!] --destination-port,--dport port[:port]: 匹配報文中的傳輸層的目標端口;可給出多個連接的端口,但只能是連續的端口范圍; -p icmp:可直接使用cimp協議對應的擴展選項; [!] --icmp-type {type[/code]|typename} --icmp-type 0/0:匹配對ping請求的響應報文 --icmp-type 8/0:匹配ping請求報文 例如: # iptables -A INPUT -d 172.16.69.88 -p icmp --icmp-type 8 -j DROP 說明:限制任何人來ping172.16.69.88主機
2.2顯式擴展:
必須使用-m選項指明要調用的擴展模塊,而且有些擴展都還存在專用選項;
(1)multiport: 以離散或連續的方式定義的多端口匹配條件,最多15個;
[!] --source-ports,--sports port[,port|,port:port]...: 指定多個源端口; [!]--destination-ports,--dport port[,port|,port:port]...: 指定多個目標端口; [!] --ports port[,port|,port:port]...: 匹配此處指定的源或目標端口; 例如: # iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT 說明:允許所有主機的通過tcp22.80,139,445,3306端口訪問172.16.0.7的主機
(2)iprange: 以連續的ip地址范圍指明多地址匹配條件;
[!] --src-range from[-to] [!] --dst-range from[-to] 例如: # iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j ACCEPT 說明:允許172.16.0.61-172.16.0.70地址范圍內的主機的通過tcp22.80,139,445,3306端口訪問172.16.0.7的主機
(3)string: 對報文中的應用層數據做字符串匹配檢測;
[!] --string pattern [!] --hex-string pattern --algo {bm|kmp}:字符串匹配檢查算法; --from offset --to offset 例如: # iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT 說明:在OUTPUT鏈首行插入規則,匹配含有”gay”字符串的數據進行拒絕。
(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做并發連接數限制,即限制單IP可同時發起連接請求;
--connlimit-upto n:連接數小于等于閾值; --connlimit-above n:連接數超出閾值; 例如: # iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT
(6)limit: 基于令牌桶過濾機制,按照收發報文的指定速率進行匹配;
--limit rate[/second|/minute|/hour|/day] 指定速率 --limit-burst number 指定速率峰值 例如: # iptables -A INPUT -d 172.16.0.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT 說明:允許以每分鐘20個包,每次最多5個包的速率對172.16.0.7主機進行ping操作。
(7)state: 狀態檢測:連接追蹤機制(conntrack);
連接追蹤機制(conntrack):追蹤本機上的請求和響應之間的關系。對于整個TCP協議來講,它是一個有連接的協議,三次握手中,第一次握手,我們就叫NEW連接,而從第二次握手以后的,ack都為1,這是正常的數據傳輸,和tcp的第二次第三次握手,叫做已建立的連接(ESTABLISHED),還有一種狀態,比較詭異的,比如:SYN=1 ACK=1 RST=1,對于這種我們無法識別的,我們都稱之為INVALID無法識別的。還有第四種,FTP這種古老的擁有的特征,每個端口都是獨立的,21號和20號端口都是一去一回,他們之間是有關系的,這種關系我們稱之為RELATED。
所以連接狀態有如下幾種:
NEW:新發出請求,連接追蹤模板中不存在此連接的相關信息條目,因此將其識別為第一次發出的請求; ESTABLISHED:NEW狀態之后,連接追蹤模板中為其建立的條目失效之前期間內所進行的通信狀態; RELATED:相關聯的連接,當前連接是個新請求,但附屬與某個已存在的鏈接; INVALID:無法識別的連接 UNTRACKED:未被追蹤連接;
用法:
[!] --state state 例如: # iptables -A INPUT -d 172.16.100.76 -p tcp -m multiport --dports 22,80 -m state --state NEW, ESTABLISHED -j ACCEPT # iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED –j ACCEPT 說明:在INPUT鏈追加將目標為172.16.100.76主機,目標端口tcp協議的22和80端口的NEW連接和ESTABLISHED連接放行的規則。同時在OUTPUT鏈追加源主機為172.16.10.67源端口為22和80端口的ESTABLISHED連接放行的規則
想要使用連接追蹤機制需要加載相關的內核模塊:
nf_conntrack nf_conntrack_ipv4 nf_conntrack_ftp
已經追蹤到的連接記錄在/proc/net/nf_conntrack文件中;
不同的協議的連接追蹤時長:/proc/sys/net/netfilter/;
能追蹤的最大連接數量定義在:/proc/sys/net/nfconntrackmax,連接碰到各種狀態的超時后就會從表中刪除;當模板滿載時,后續的連接可能會超時,建議調整至足夠大;
如何開放被動模式的ftp服務:
(a) 裝載追蹤ftp協議的模塊; # modprobe nf_conntrack_ftp (b) 放行入站命令連接 # iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT (c) 放行入站數據連接 # iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT (d) 放行出站的ESTABLISHED連接 # iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT
七、處理動作(跳轉目標):
如何使用自定義鏈:自定義鏈需要被調用才能生效;自定義鏈最后需要定義返回規則;返回規則使用的target叫做RETURN
-j targetname [per-target-options]
target可分為簡單target和擴展target。
簡單target: ACCEPT(允許),DROP(丟棄)
擴展target:
REJECT:用來返回一個錯誤數據包響應匹配的數據包 --reject-with type 給定的類型: icmp-net-unreachable, 網絡不可達 icmp-host-unreachable,主機不可達 icmp-port-unreachable,端口不可達 icmp-proto-unreachable,協議不可達 icmp-net-prohibited, icmp-host-prohibited, icmp-admin-prohibited, 默認為icmp-port-unreachable; LOG:記錄日志,日志需要在iptables規則生效之前進行記錄,所以LOG規則需要放在允許或拒絕規則之前,否則是無法生效的。 Turn on kernel logging of matching packets. --log-level level 日志信息的等級 --log-prefix prefix:日志信息的前導信息; 例如: # Iptables –R INPUT 2 –d 172.16.100.67 –p tcp –dport 21 -j LOG -- log-prefix “netfiles ftp:” 說明:將INPUT鏈第二條規則修改為,將目標為172.16.100.67主機的tcp21端口的訪問寫入日志。并在日志中加上前綴netfiles ftp:
八、保存和載入規則
規則的有效期限:使用iptables命令定義的規則,手動刪除之前,其生效期限為kernel的存活期限。為了使規則永久有效,需要將其保存至文件中。
保存命令:
# iptables-save > /PATH/TO/SOME_RULE_FILE
重載命令:
# iptabls-restore < /PATH/FROM/SOME_RULE_FILE -n, --noflush:不清除原有規則 -t, --test:僅分析生成規則集,但不提交
CentOS 6:
保存規則命令:
# service iptables save 保存規則于/etc/sysconfig/iptables文件,覆蓋保存;
重載規則:
service iptables restart 默認重載/etc/sysconfig/iptables文件中的規則 配置文件:/etc/sysconfig/iptables-config
自動生效規則文件中的規則:
(1)用腳本保存個iptables命令;讓此腳本開機后自動運行 /etc/rc.d/rc.local文件中添加腳本路徑: /PATH/TO/SOME_SCRIPT_FILE (2)用規則文件保存個規則,開機時自動載入此規則文件中的規則; /etc/rc.d/rc.local文件中添加: iptabls-restore < /PATH/FROM/SOME_RULE_FILE
CentOS 7:
(1) 自定義Unit File,進行iptables-restore; (2) firewalld服務; (3) 自定義腳本;
規則優化的思路: 服務器端規則設定:任何不允許的訪問,應該在請求到達時給予拒絕;
使用自定義鏈管理特定應用的相關規則:
(1)優先放行雙方向狀態為ESTABLISHED的報文; (2)服務于不同類別的功能的規則,匹配到報文可能性更大的放前面; (3)服務于同一類別的功能的規則,匹配條件較嚴格的放在前面; (4)設置默認策略:白名單機制 (a) iptables -P,不建議; (b) 建議在規則的最后定義規則做為默認策略;
九、iptables/netfilter網絡防火墻:
netfilter 是Linux 核心中一個通用架構,它提供了一系列的"表"(tables),每個表由若干"鏈"(chains)組成,而每條鏈中可以有一條或數條規則(rule)組 成。并且系統缺省的表是"filter"。但是在使用NAT的時候,我們所使用的表不再是"filter",而是"nat"表,所以我們必須使用"-t nat"選項來顯式地指明這一點。因為系統缺省的表是"filter",所以在使用filter功能時,我們沒有必要顯式的指明"-t filter"。 nat表也有四條缺省的"鏈"(chains),這四條鏈也是規則的容器,它們分別是:
PREROUTING、INPUT、OUTPU、POSTROUTING(注意Centos7版本才INPUT鏈)
1、構建網絡防火墻的基本前提:
(1) iptables主機必須工作為網關;
(2) 我們需要將定義的規則添加在filter表的FORWARD鏈;添加方法與主機防火墻相同。
2、要注意的問題:
(1) 我們在FORWARD鏈上添加規則時,要確保請求-響應報文均會經由FORWARD鏈,要注意規則的方向性;
(2) 如果要啟用conntrack(連接追蹤)機制,建議將雙方向的狀態為ESTABLISHED的報文直接放行;
3、NAT: Network Address Translation(網絡地址轉換)
在傳統的標準的TCP/IP通信過程中,所有的路由器僅僅是充當一個中間人的角 色,也就是通常所說的存儲轉發,路由器并不會對轉發的數據包進行修改,更為確切的說,除了將源MAC地址換成自己的MAC地址以外,路由器不會對轉發的數 據包做任何修改。NAT(Network Address Translation網絡地址轉換)恰恰是出于某種特殊需要而對數據包的源ip地址、目的ip地址、源端口、目的端口進行改寫的操作. NAT的目的:既為了隱藏內網主機,又讓內網主機更多使用可重復使用的私網IP,從而節約IP地址資源。
其中請求報文中的源地址和目標地址可以由管理員定義,但響應報文的源地址和目標地址由NAT的conntrack機制自動實現; 從原理的角度可將NAT分成了兩種類型,即源NAT(SNAT)和目的NAT(DNAT),顧名思義,所謂SNAT就是在請求報文中改變轉發數據包的源地址,所謂DNAT就是在請求報文中改變轉發數據包的目的地址。SNAT的使用環境是內網中的客戶端的私網IP通過同一個公網IP訪問公網中的外部服務器。DNAT的使用環境是內網中的N臺服務器通過同一個公網IP對公網中的客戶端提供服務。所以根據其數據報文流經位置,SNAT需要定義在POSTROUING鏈上,DNAT需要定義在PREROUTING鏈。DANT可以針對有限的幾個服務設置,SNAT則不可以。
NAT不僅可以轉換源地址和目標地址還進行端口轉換又被稱之為端口映射,即PAT;
4、target實現:
SNAT:源地址轉換,這個調轉目標適用在nat表的PREROUTING和OUTPUT鏈,以及用戶自定義鏈上,僅能夠被POSTROUTING鏈和INPUT鏈調用。
--to-source [ipaddr[-ipaddr]] 例如: # iptables –t nat –A POSTROUTING –s 192.168.1.0/24 –j SNAT --to-source 172.16.0.1
DNAT:目標地址轉換,這個調轉目標適用在nat表的PREROUTING和OUTPUT鏈,以及用戶自定義鏈上,僅能夠被POSTROUTING鏈和INPUT鏈調用。
--to-destination [ipaddr[-ipaddr]][:port[-port]] 例如: # iptables –t nat –A PREROUTING –d 172.16.0.1 –p tcp –dport 80 –j DNAT --to-destination 192.168.1.1
MASQUERADE:地址偽裝 SNAT場景中應用于POSTROUTING鏈上的規則實現源地址轉換,但外網地址不固定時,使用此target;
REDIRECT:端口重定向 這個調轉目標適用在nat表的PREROUTING和OUTPUT鏈,或者用戶自定義鏈上,僅能夠被POSTROUTING鏈和INPUT鏈調用。
--to-ports port[-port] 例如: # iptables –t nat -A PREROUTING –d 172.16.69.8 –p tcp –dport 80 –j REDIRECT --to-ports 8080
十:總結
Iptables是一個非常重要的工具,它是每一個防火墻上幾乎必備的設置,也是我們在做大型網絡的時候,為了很多原因而必須要設置的。學好Iptables,可以讓我們對整個網絡的結構有一個比較深刻的了解,同時,我們還能夠將內核空間中數據的走向以及linux的安全給掌握的非常透徹。我們在學習的時候,盡量能結合著各種各樣的
原創文章,作者:征(_少,如若轉載,請注明出處:http://www.www58058.com/68184