防火牆:是一種位於內部網絡與外部網絡之間的網絡安全系統,工做於網絡或主機的邊緣(通訊報文的進出口),對於進出本網絡或主機的報文根據事先定義的檢查規則做匹配檢測,對於可以被規則匹配到的報文作出相應的處理

防火牆分類:
1:網絡防火牆:整個網絡的報文入口,出口
2:主機防火牆:單臺主機的報文入口,出口
html
(二)防火牆入門
web
前言:

1:Netfilter是Linux 2.4.x引入的一個子系統,能夠簡單的將其看作內核的一個特殊的功能模塊,它做爲一個通用的、抽象的框架,提供一整套的hook函數的管理機制,使得諸如數據包過濾、網絡地址轉換(NAT)和基於協議類型的鏈接跟蹤成爲了可能。
2:netfilter的架構就是在整個網絡流程的若干位置放置了一些檢測點(HOOK),而在每一個檢測點上登記了一些處理函數進行處理。
3:netfilter的hooks 有5個,任何報文進入主機必須通過一個鉤子函數或多個鉤子
剛剛到達本機,沒有通過路由的:prerouting
路由完畢以後,要到達本機內部的:input
經由本機轉發的,不到本機內部的:forward
由本機內部發出的:output
即將由本機發出的:postrouting

1:iptables就是在各個鉤子上定義的規則,讓每個鉤子在處理報文的時候,有不一樣的處理規則
2:iptables對於運維工程師而言,只是一個寫規則的命令行工具
1:流入本機:prerouting –> input –> 用戶空間請求報文
2:流出本機:用戶空間響應報文 –> output –> postrouting
3:由本機轉發的:prerouting –> forward –> postrouting
1:filter:實現過濾,防火牆(默認)
2:mangle:將報文拆解,修改以後再封包
3:nat:網絡地址轉換,只拆解修改其地址的那一部分,通常是IP層地址和傳輸層地址
4:raw:關閉在nat表上啓用的鏈接追蹤機制
1:內置鏈 (與netfilter的hooks函數一一對應,每個內置鏈對應於一個hooks函數,在內核中直接實現)
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
2:自定義鏈
對內置鏈進行擴充的,而定義在自定義鏈上的規則只有經過內置鏈的調用才能實現,能夠實現更加靈活的規則管理機制
防火牆功能表與防火牆內置鏈的對應關係
(這裏的表就是指下面的四種功能)
1:filter:INPUT , FORWARD , OUTPUT
2:mangle:PREROUTING , INPUT , FORWARD , OUTPUT , POSTROUTING
3:nat:PREROUTING ,INPUT, OUTPUT , POSTROUTING
4:raw:PREROUTING , OUTPUT

當報文從一個網絡到達本地主機的網卡的時候,以及經過本地網卡須要發送出去的時候,會通過這麼幾個鏈
全部的報文到達網卡首先通過的是PREROUTING ,PREROUTING 而對應的會有三種功能,分別是 raw,mangle,nat(從上到下)。通過這三個功能以後,由路由進行選擇,要麼到達本機內部,要麼通過本機轉發,若是到達本機內部會到達
INPUT,而INPUT只能實現兩種功能,mangle,filter。若是是通過本機轉發的,會到達FORWARD,兩種功能,mangle,filter。若是是由本機內部發出,會到達OUTPUT,四種功能,raw, mangle , nat, filter 。再經過路由選擇出去到達OUTPUT,兩種功能mangle, nat 。可是每個鏈上的規則可能只有一個或兩個
組成部分:根據規則的匹配條件匹配報文,對應匹配到的報文使用定義的處理動做進行處理
匹配條件:
基本匹配
擴展匹配
處理動做:
基本的常見的處理動做
擴展處理動做
自定義處理動做
(三)TCP三次握手與四次斷開
(瞭解)算法
前言:



(四)iptables 工具的使用詳解
(掌握)centos
試驗建議:關閉CentOS 7 或 CentOS 6的防火牆 (systemctl stop firewalld ; systemctl disable firewalld 或 service iptables stop ; chkconfig iptables off)
# 在表的對應鏈上添加規則
iptables [-t
table] {-A|-C|-D} chain
# ipv6
ip6tables [-t
table] {-A|-C|-D} chain
# 在鏈中插入規則
iptables [-t
table] -I
# 修改對應鏈的規則
iptables [-t
table] -R
# 刪除對應鏈上的規則
iptables [-t
table] -D
# 顯示鏈上的規則
iptables [-t
table] -S
# 將鏈上的規則所有清除
iptables [-t
table] {-F|-L|-Z} [chain
# 增長一條自定義鏈
iptables [-t
table] -N
# 刪除一條自定義鏈
iptables [-t
table] -X
# 修改鏈上的默認策略
iptables [-t
table] -P
# 重命名自定義鏈
iptables [-t
table] -E
# 規則的格式
rule-specification = [matches...] [target]
# 匹配的格式
match = -m matchname [per-match-options]
# 處理的格式
target = -j targetname [per-target-options]
iptables命令格式(記牢,若是你在這裏有點蒙的話,請不要急。稍後帶你玩一玩你就懂了)
# -t 指定功能表,SUBCOMMAND其實就是各類選項,做用在哪一條鏈上 matches表示匹配規則,target表示處理的動做
iptables
[-t table] SUBCOMMAND chain [matches...] [ -j target]
1:-t table 指定功能表
功能表有:raw , mangle , nat , filter,若是不指定,默認就是filter
2:SUBCOMMAND:指定在對應鏈上的增、刪、改、查
(1)查看規則
-L:表示列出功能表對應鏈上的全部的規則
-n:以數字格式顯示地址和端口,若是不加n選項,會反解主機名和端口對應的服務名
-v:顯示詳細格式
-x:顯示計數器的精確值,每一條規則都有兩類計數器,一類用於顯示被匹配到的報文的個數,一類用於顯示size
--line-numbers:顯示鏈上的規則編號
(2)規則管理
-A :表示append 追加,默認爲最後一個
-I: 表示insert插入,默認爲第一個
-D:delete,刪除
1:rule specification
2: rule number
-R: replace, 替換
-F:flush, 清刷鏈上的規則
-Z:zero,置0
-S:顯示指定鏈的全部的規則,以iptables-save命令的格式顯示
iptables的每一條規則有兩類計數器
(1)由本規則匹配到的全部的packets
(2)由本規則匹配到的全部的bytes
(3)鏈管理
-N :新增一條自定義鏈
-X:刪除自定義的空鏈
-E:rename,重命名自定義鏈的未被引用的鏈(引用計數器爲0)
例如:iptables -N uplooking
例如:iptables -E uplooking mychain
例如:iptables -P FORWARD DROP
(4)默認策略管理
-P:設置默認策略
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
例如:iptables -P FORWARD DROP
例如:iptables -P INPUT DROP
例如:iptables -vnL --
line-numbers 查看filter表做用的鏈
例如:iptables -t nat -
nL查看nat表對應的鏈
例如:iptables -
N uplooking 增長一個自定義鏈
例如:iptables -
E uplooking mychain 將自定義鏈 uplooking 更名爲 mychain
例如:iptables -X mychain 刪除自定義鏈,注意只有是空的鏈才能刪除
例如:iptables -P FORWARD
DROP 將FARWARD鏈的默認策略改成DROP
例如:iptables -P
INPUT DROP 將INPUT的默認鏈改成DROP,這樣的話,報文沒法進入內核,不能被用戶空間的服務接受,如ssh協議沒法實現,遠程沒法鏈接
match匹配條件
(實操第一部分:基本匹配)(很是重要,請務必認真聽講)
1:基本匹配:
netfilter的hooks函數自帶的匹配機制
[!] -s, --source address[/mask][,...]: 原地址匹配, ! 表示取反,表示不被匹配之意
[!] -d, --destination address[/mask][,...] :目標地址匹配,! 表示取反,表示不被匹配之意
[!] -i, --in-interface name:限制報文流入的接口匹配(入棧報文),只能因爲:PREROUTING,INPUT,FORWARD
[!] -o, --out-interface name:限制報文流出的接口匹配(出棧報文),只能因爲:OUTPUT,POSTROUTING, FORWARD
例如:
iptables -A INPUT -s 192.168.10.223 -d 192.168.10.222 -j DROP 在INPUT鏈中添加一個規則,使得192.168.10.223的報文丟棄
例如:
iptables -A INPUT -s 192.168.10.223 -d 192.168.10.222 -j ACCEPT 將192.168.10.223的報文接受,可是若是對於一個IP的規則只能作出一個動做,若是想從新設置須要將規則清空,使用iptables -F
match匹配條件
(實操第二部分:隱式擴展匹配)(很是重要,請務必認真聽講)
2:擴展匹配:擴展模塊匹配引入的匹配機制,-m matchname
隱式擴展:能夠不使用-m選項專門的加載相應的模塊,可是要加-p選項,指明使用哪一種協議
[!] -p {tcp|udp|icmp|icmpv6|esp|ah|sctp|mh|all}:限制協議,就不須要用-m指定加載的擴展模塊
例如:iptables -A INPUT -s
192.168.10.223 -d 192.168.10.222 -p tcp -j ACCEPT 代表若是是tcp協議的放行
① tcp:隱含了-m tcp。 有專用選項
[!] --source-port,--sport port[:port]:匹配報文中的TCP首部的源端口,能夠是端口範圍
[!] --destination-port,--dport port[:port]:匹配報文中的TCP首部的目標端口,能夠是端口範圍
[!] --tcp-flags mask comp: 檢查報文中的指明mask的TCP標誌位,要這些標誌位中comp必須爲1,瞭解便可
[!] --syn:至關於--tcp-flags syn,fin,ack,rst syn,匹配三次握手的第一次,瞭解便可
例如: --tcp-flags syn,fin,ack,rst syn:指明這四個標誌位中的syn必須爲
1,而其餘的爲0,也就是TCP的第一次握手
例如:--tcp-flags syn,fin,ack,rst syn,fin:就是四次斷開中的第一次
示例
1:指明開放tcp協議的80端口,也就是web服務
iptables -A INPUT -s
0/0 -d 192.168.10.222 -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -s
192.168.10.222 -d 0/0 -p tcp --sport 80 -j ACCEPT
示例
2:指明開放TCP的22端口,也就是ssh服務
iptables -A INPUT -s
0/0 -d 192.168.10.222 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -s
192.168.10.222 -d 0/0 -p tcp --sport 22 -j ACCEPT
② udp:隱含了-m udp。有專用選項
[!] --source-port,--sport port[:port] :匹配報文中的udp首部的源端口,能夠是端口範圍
[!] --destination-port,--dport port[:port]:匹配報文中的udp首部的目標端口,能夠是端口範圍
③ icmp:隱含指明瞭」-m icmp」。有專用選項
[!] --icmp-type {type[/code]|typename}
type/code有兩種類型:
0/0 :echo reply 指明應答的類型
8/0:echo request 指明請求的類型
示例
1:開放別人能夠ping本身
iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 8 -j ACCEPT
iptables -A OUTPUT -s
192.168.10.222 -p icmp --icmp-type 0 -j ACCEPT
示例
2:開放本身能夠ping別人
iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -s
192.168.10.222 -p icmp --icmp-type 8 -j ACCEPT
match匹配條件
(實操第三部分:顯示擴展匹配)(很是重要,請務必認真聽講)
顯示擴展:必須使用-m加載擴展模塊
1:multiport :多端口匹配,離散的方式定義的多端口匹配,最多能夠指定15個端口
[!] --source-ports,--sports port[,port|,port:port]...:指定源端口
[!] --destination-ports,--dports port[,port|,port:port]...:指定目標端口
[!] --ports port[,port|,port:port]...:能夠指定源端口和目標端口
例如:同時開放
22和80端口
iptables -I INPUT -s
0/0 -d 192.168.10.222 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -s
192.168.10.222 -d 0/0 -p tcp -m multiport --sports 22,80 -j ACCEPT
2:iprange :指明一段連續的IP地址範圍,做爲源地址或目標地址的匹配
[!] --src-range from[-to]:指定源地址範圍
[!] --dst-range from[-to]:指定目標地址範圍
例如:指定客戶端
ip在192.168.10.1-192.168.10.254範圍內的才能訪問telnet服務
iptables -A INPUT -d
192.168.10.222 -p tcp --dport 23 -m iprange --src-range 192.168.10.1-192.168.10.254 -j ACCEPT
iptables -A OUTPUT -s
192.168.10.222 -p tcp --sport 23 -m iprange --dst-range 192.168.10.1-192.168.10.254 -j ACCEPT
3:string:對報文中的應用層數據作字符串匹配檢測
--algo {bm|kmp}
[!] --string pattern :給定要檢查的字符串模式
[!] --hex-string pattern:給定要檢查的字符串模式,十六進制編碼
例如:只要頁面中包含admin的頁面都不能訪問
iptables -I OUTPUT -s
192.168.10.222 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "admin" -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...]:匹配一個週中的哪天
例如:指定客戶端
IP範圍和訪問時間才能訪問
iptables -I INPUT -d
192.168.10.222 -p tcp --dport 23 -m iprange --src-range 192.168.10.1-192.168.10.254 -m time --timestart 08:00:00 --timestop 018:00:00 -j ACCEPT
5:connlimit:根據每一個客戶端主機作併發併發鏈接數量限制,就是每一個客戶端最多發起的鏈接數量
--connlimit-upto n:鏈接數量小於等於n,則匹配
--connlimit-above n:鏈接數量大於n,則匹配
例如:
iptables -A INPUT -s
0/0 -d 192.168.10.222 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
iptables -A OUTPUT -s
192.168.10.222 -d 0/0 -p tcp --sport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
6:limit:基於令牌桶算法對報文的速率作匹配。
--limit rate[/second|/minute|/hour|/day] :限制等待的速率, 也就是接受或響應數據包的速率
--limit-burst number:第一次能夠有多少個不須要等待的
例如:這裏是限制每分鐘只能入棧
20個icmp的報文,而且第一次入棧容許5個不須要等待,後續的報文每次須要等待2秒
iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 5 -j ACCEPT
iptables -A OUTPUT -s
192.168.10.222 -p icmp --icmp-type 0 -j ACCEPT
7:state:用於對報文狀態判斷
[!] --state state:匹配報文的狀態
INVALID :沒法識別的鏈接
ESTABLISHED:鏈接追蹤模塊中存在記錄的鏈接
NEW:鏈接追蹤模板當中不存在的鏈接請求
RELATED:相關聯的鏈接
UNTRACKED:未追蹤的鏈接
例如
1:容許本身ping別人
iptables -A OUTPUT -s
192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
例如
2:容許別人ping本身
iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s
192.168.10.222 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
8:對於鏈接追蹤還需瞭解的知識
已經追蹤到的並記錄下來的鏈接保存在 /proc/net/nf_conntrack裏面
若是追蹤的記錄滿載了,就會顯示鏈接超時
鏈接追蹤功能所可以記錄的最大鏈接數量保存在 (可調整)/proc/sys/net/nf_conntrack_max
這裏能夠經過命令調節內核中的參數
sysctl -w net.nf_conntrack_max=
300000 將最大的追蹤記錄調節到300000個
conntrack所能追蹤的鏈接數量的最大值取決於/proc/sys/net/nf_conntrack_max的設定,已經追蹤的鏈接位於/proc/net/nf_conntrack文件中,超時的鏈接會被刪除,當模板滿載,後續的新鏈接有可能會超時。解決辦法:
(
1)加大nf_conntrack_max的值
(
2)下降nf_conntrack條目的超時時長
不一樣協議的鏈接追蹤時長定義在/proc/sys/net/netfilter下
target處理動做
(實操第四部分:處理動做)(很是重要,請務必認真聽講)
-j
ACTION [per-target-options]
ACCETP , DROP , REJECT
RETURN :返回調用的鏈
REDIRECT:端口重定向
LOG:日誌
MARK:防火牆標記
DNAT:目標地址轉換
SNAT:原地址轉換
MASQUERADE:地址假裝
(五)防火牆規則書寫注意點小結
(掌握)安全
(
1)匹配規則越嚴格的須要放在越上面,越鬆散的放在越下面
(
2)規則的檢查次序:規則在鏈上的次序即爲檢查時生效的次序,所以,其優化使用有必定的法則
1:同類規則(訪問同一個應用),匹配範圍小的放在前面,用於特殊處理
2:不一樣類的規則(訪問不一樣的應用),匹配範圍大的放在前面,也就是規則被報文匹配次數多的放在前面
3:應該將那些由一條規則描述的多個規則合併爲一個規則,這樣使得規則查詢的效率提升
1:開放ssh、web、telnet服務
# 因爲 ESTABLISHED會常常被訪問,所以寫在第一個
iptables -A INPUT -m
state --state ESTABLISHED -j ACCEPT
# 特定的服務開放
iptables -A INPUT -d
192.168.10.222 -p tcp -m multiport --dports 22,80,23 -m state --state NEW -j ACCEPT
iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
# 全部的入棧報文,出棧所有被容許
iptables -A OUTPUT -m
state --state ESTABLISHED -j ACCEPT
2:開放ftp、ssh、web、telnet服務
思考:對於ftp服務來講,有兩個端口,
20、21,若是想使用RELATED關聯追蹤,應該讓內核加載nf_conntrack_ftp模塊
# 內核加載nf_conntrack_ftp模塊
modprobe nf_conntrack_ftp
# 放行了ftp協議的數據鏈接的端口,因爲端口是隨機的,因此不要給定端口號,而且指明鏈接追蹤是related和established
iptables -A INPUT -d
192.168.10.222 -m state --state RELATED,ESTABLISHED -j ACCEPT
# 特定的服務開放
iptalbes -A INPUT -d
192.168.10.222 -p tcp -m miltiport --dports 22,23,80,21 -m state --state NEW -j ACCEPT
iptables -A INPUT -d
192.168.10.222 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
# 全部的入棧報文,出棧所有被容許
iptables -A OUTPUT -s
192.168.10.222 -m state --state ESTABLISHED -j ACCEPT
(六)如何保存寫好的防火牆規則
(掌握)服務器
CentOS
6:
(
1)service iptables save
(
2)iptables-save > /etc/sysconfig/iptables (也能夠重定向保存至任意位置)
CentOS
7:
(
1)iptables -S > 指定保存規則的文件路徑
(
2)iptables-save > 指定保存規則的文件路徑
CentOS
6和CentOS 7:
iptables-restore < 指定保存規則的文件路徑
CentOS
6:會自動從/etc/sysconfig/iptables重載規則
service iptables restart
(
1)把iptables命令放在腳本文件中,讓腳本文件開機自動運行
/etc/rc.d/rc
.local 中寫入執行iptables的命令的腳本
(
2)將保存的規則經過腳本命令自動開機重載
/etc/rc.d/rc
.local 中 寫入 iptables-restore < 指定保存規則的文件路徑
(七)如何搭建網絡防火牆
(掌握)網絡

(八)另外幾個規則處理動做
(瞭解)架構
--log-level level :設定日誌級別
emerg, alert, crit, error, warning, notice, info or debug.
--log-prefix prefix :添加日誌行前綴
例如:iptables -I FORWARD -s
192.168.23.0/24 -p tcp -m multiport --dports 80,22,21,23 -m state --state NEW -j LOG --log-prefix "firewall connection:"
開啓日誌功能,而且制定日誌行的前綴
日誌記錄的文件爲/var/log/messages 內核日誌
返回調用者:不少時候均可以不用寫明,其會隱含的
應用場景:就是內置鏈調用外鏈的時候,外鏈沒有匹配到規則會直接返回
例如:
iptables -N
in_stack
iptables -N
out_stack
iptables -A
in_stack -p icmp --icmp-type 8 -j ACCEPT
iptables -A
out_stack -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -j
in_stack
iptables -A OUTPUT -j
out_stack
其餘主機ping下本主機
這個只能用在nat表上的PREROUTING和OUTPUT鏈上,可以實現指明的端口完成映射
--to-ports port[-port]:將端口轉變爲其餘的端口
例如:iptables -t nat -A PREROUTING -d
192.168.10.223 -p tcp --dport 80 -j REDIRECT --to-ports 8000 這裏將prerouting鏈上的80端口轉發爲8080端口,使得監聽在8000的httpd服務能夠監聽到,這就是一個簡單的引用場景
(九)NAT
(掌握)併發
前言1:經過路由功能使得報文在非本地局域網內通訊時,報文到達時,顯示的是報文的原始IP地址。在正常路由模型下,報文外封裝一個http首部,再封裝一個TCP首部(主要是源端口和目標端口),再封裝一個IP首部(主要是源IP和目標IP),若是須要路由轉發,會在外面封裝一個Mac地址(源Mac和目標Mac),那麼整個路由的過程就是一個Mac地址解封裝的過程,知道最後一個目標Mac的主機,發現目標IP是本身,目標端口也是本身,所以,拆包以後,源端口和目標端口以及源IP和目標IP都不變,這就是路由的地址轉換模型
前言2 :整個互聯網就是經過一個一個的公網地址組成的局域網經過層層路由器鏈接而成的,那麼一個私網的IP訪問公網的IP時,能夠經過層層的路由器到達公網的IP上,必定會有網關將其轉發到公網上的,其網關必定有一個接口是公網地址,可是公網的IP響應私網的IP是不會進行公網的路由的,公網IP只會其內部的局域網尋找這臺私網的IP主機,若是找不到就會丟棄的,那麼私網的客戶端就沒法得到公網響應的報文。那麼若是解決這個問題呢?因爲私網IP的網關必定有一個接口是公網地址,那麼在離公網最近的網關上把報文的原地址改成公網接口的地址,而目標地址不變,所以在目標主機收到報文的時候發現原地址是公網地址,所以能夠經過路由轉發出去,目標IP就會響應給公網地址,而不會私網地址,在響應報文到達公網地址的時候(進入公網的網關)會將響應報文裏面的目標地址改成私網的地址,原地址不變,響應給私網地址。這就實現了私網地址能夠訪問公網了,這就是SNAT,原地址轉換
前言3:若是客戶端請求訪問的是本地的服務器,那麼在客戶端與本地服務器之間須要經過目標地址轉換,來隱藏本地服務器地址,當客戶端訪問本地主機的時候,並非直接訪問本地主機的,請求報文中的源IP爲客戶端IP,目標IP爲一個公網的IP,這個公網IP的主機上還會有一個私網的IP,私網的IP就經過nat機制,將目標地址改成了服務器的IP地址。那麼當服務器接到請求以後,就會將響應報文的原地址爲服務器本身的地址,目標地址爲外網防火牆主機的地址,當報文到達公網的網關後,網關就會發現這是改過的地址,將報文的原地址改成網關本身的地址,目標地址爲客戶端地址,就是現實了本地主機的地址的隱藏,那麼這一臺公網地址轉發的服務器就是負載均衡器,這就是DNAT,目標地址轉換

修改
IP報文中的源IP地址
讓本地網絡中的主機可使用同一的地址與外部通訊,從而實現地址假裝
請求:由內網主機發起,修改源
IP,如何修改由管理員定義
響應:修改目標
IP,由nat自動根據會話表中的追蹤機制實現相應的修改
修改
IP報文中的目標IP地址
讓本地網絡中的服務器使用統一的地址向外提供服務,可是隱藏了本身的真實地址
請求:由外網主機發起,管理員負責修改其目標地址
響應:修改原地址,由nat自動根據會話表中的追蹤機制實現相應的修改
PNAT:port NAT
現實端口轉發
This target is only valid
in the nat table, in the POSTROUTING and INPUT chains, and user-defined chains which are only called from those chains.
--to-source [ipaddr[-ipaddr]][:port[-port]] :指定修改的源
IP(外網IP地址)
例如:這裏指明瞭通過路由以後的源
IP地址
iptables -t nat -A POSTROUTING -s
10.0.1.0/24 -d 0/0 -j SNAT --to-source 192.168.10.222
This target is only valid
in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: 當外網地址是撥號上網的時候,外網地址持續變化,用戶替換的時候,用於替換SNAT,所以, SNAT只用於靜態IP
例如:若是用戶外網地址是動態的,可使用MASQUERADE
iptables -t nat -A POSTROUTING -s
10.0.1.0/24 -j MASQUERADE
小結:SNAT和MASQUERADE都是實現了內網的客戶端能夠上網,訪問公網的主機,若是關閉的話,內網客戶端的請求到達了公網IP也不會被路由回來了,由於公網的路由不會轉發目標地址是私網的報文
app
This target is only valid
in the nat table, in the PREROUTING and OUTPUT chains, and user-defined chains which are only called from those chains.
--to-destination [ipaddr[-ipaddr]][:port[-port]] : 指定須要改變的目標
IP(內網IP地址)
例如:
iptables -t nat -A PREROUTING -s
0/0 -d 192.168.10.222 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22
或者修改
IP和端口:
iptables -t nat -A PREROUTING -s
0/0 -d 192.168.10.222 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080