詳述iptables五鏈
防火墻程序是工作在內核的TCP/IP的網絡協議棧的框架之上,通過網絡過濾可以實現入侵檢測及入侵防御的功能。
凡是到達本機內部來的數據包我們都將其按照某種規則進行轉發,凡是要從本機內部出去的將其按照另外一種規則進行轉發,另外凡是經過本機轉發的我們按照對應的轉發規則轉發的機制就是防火墻框架。
防火墻的框架就是在內核的TCP/IP協議棧中精心設置了幾個卡點,對于數據包必流經的位置設置了幾個鉤子函數:這些卡點的位置如進口或出口處,如有一個人要進入我們的領域,我們在大門口放一臺鉤機,進來之前先用鉤機將其鉤起,然后一條一條的進行規制匹配,匹配通過了就放進來,匹配不通過的就直接扔掉。
Linux系統上的防火墻是由iptables/netfilter組成,其中iptables是規則的制定工具,netfilter在內核協議框架中定義了5個卡點位置,并在這5個位置通過鉤子函數對進出的數據包進行過濾,從而達到防火墻的功能。iptables工具工作在用戶控件,他可以制定一些規則然后送到內核空間,然后結合netfilter的鉤子函數及處理方法對數據包進行放行或者拒絕處理。
-
5個鉤子(hook function)的位置如下圖:
5鉤圖.png
-
hook function :
- prerouting: 流入的數據包進入路由表之前
- input:通過 路由表判斷后目的是本機,然后進入本機內部資源
- forward:通過路由表判斷后目的地不是本機,然后通過路由轉發到其他地方
- output:由本機產生的數據向外部轉發
- postrouting:傳出的數據包到達網卡出口之前
- 在每個鉤子上對應的有五個鏈,用于添加匹配規則,名稱和鉤子相同,但是都必須用大寫來標識:
- PREROUTING
- INPUT
- FORWARD
- OUTPUT
- POSTROUTING
- 防火墻里面有多個table,每個表格里面都定義許多規則,并且每個表的用途不同,iptables按用途個功能將其分為四個表,這四個表又由五個鏈組成,這五個鏈對應五個鉤子函數。
- 這四個表分別是filter、nat、mangle、raw,默認為filter;表的處理優先級一次是:raw、mangle、nat、filter;每個表的功能:
- filter:一般用于過濾功能,防火墻
- nat:用于修改源IP或目標IP,也可以修改端口
- mangle:拆解報文,做出修改并重新封裝起來,對特定數據包修改(使用情況很少)
- raw:關閉natbiao上啟用的連接追蹤機制
- 四個表中每個表多對應的鏈分別為:
- FILTER: INPUT、OUTPUT、FORWARD
- NAT: PREROUTING、 POSTROUTING 、 FORWARD
- MANGLE: INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING
- RAW: PREROUTING、 OUTPUT
- 報文流向
- 流入本機:PREROUTING --> INPUT
- 由本機流出:OUTPUT --> POSTROUTING
- 轉發:PREROUTING --> FORWARD --> POSTROUTING
iptables /netfilter規則:
- 組成部分:根據規則的匹配條件來嘗試匹配報文,一旦匹配成功,就由規則定義的處理動作做出處理;
- 匹配條件:
- 基本匹配條件:內建
- 擴展匹配條件:由擴展模塊定義;
- 處理動作:
- 基本處理動作:內建
- 擴展處理動作:由擴展模塊定義;
- 自定義處理機制:自定義鏈
- 匹配條件:
- iptables的鏈:內置鏈和自定義鏈
- 內置鏈:對應于hook function
- 自定義鏈接:用于內置鏈的擴展和補充,可實現更靈活的規則管理機制;
- 添加規則時的考量點:
<1> 要實現那種功能:判斷添加在哪個表上;
<2> 報文流經的路徑:判斷添加在哪個鏈上; - 鏈上的規則在匹配的過程中是有次序的,即為檢查次序,因此在制定時要遵循以下法則:
<1> 同類規則(訪問同一應用),匹配范圍小的放上面;
<2> 不同類的規則(訪問不同應用),匹配到報文頻率較大的放在上面;
<3> 將那些可由一條規則描述的多個規則合并起來;
<4> 設置默認策略;
iptables命令:
高度模塊化,由諸多擴展模塊實現其檢查條件或處理動作的定義;其擴展模塊路徑:/usr/lib64/xtables; IPv4的模塊為libipt_,libxt_;
IPv6的模塊為libip6t_;
規則格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
- -t table:
> raw, mangle, nat, [filter]默認
-
COMMAND:
- 鏈管理:
- -N:new, 自定義一條新的規則鏈;
- -X: delete,刪除自定義的規則鏈;
注意:僅能刪除 用戶自定義的 引用計數為0的 空的 鏈; - -P:Policy,設置默認策略;對filter表中的鏈而言,其默認策略有:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕 - -E:重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也不能被刪除;
- 規則管理:
- -A:append,追加;
- -I:insert, 插入,要指明位置,省略時表示第一條;
- -D:delete,刪除;
(1) 指明規則序號;
(2) 指明規則本身; - -R:replace,替換指定鏈上的指定規則;
- -F:flush,清空指定的規則鏈;
- -Z:zero,置零;
iptables的每條規則都有兩個計數器:
(1) 匹配到的報文的個數;
(2) 匹配到的所有報文的大小之和;
- 查看:
- -L:list, 列出指定鏈上的所有規則;
- -n:numberic,以數字格式顯示地址和端口號;
- -v:verbose,詳細信息;
-vv, -vvv - -x:exactly,顯示計數器結果的精確值;
- --line-numbers:顯示規則的序號;
- 鏈管理:
-
chain:
- PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
-
匹配條件:
- 基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
- [!] -s, --source address[/mask][,...]:檢查報文中的源IP地址是否符合此處指定的地址或范圍;
- [!] -d, --destination address[/mask][,...]:檢查報文中的目標IP地址是否符合此處指定的地址或范圍;
所有地址:0.0.0.0/0 - [!] -p, --protocol protocol
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all"
{tcp|udp|icmp} - [!] -i, --in-interface name:數據報文流入的接口;只能應用于數據報文流入的環節,只能應用于PREROUTING,INPUT和FORWARD鏈;
- [!] -o, --out-interface name:數據報文流出的接口;只能應用于數據報文流出的環節,只能應用于FORWARD、OUTPUT和POSTROUTING鏈;
- 基本匹配條件:無需加載任何模塊,由iptables/netfilter自行提供;
- 擴展匹配條件:
- 隱式擴展:在使用-p選項指明了特定的協議時,無需再同時使用-m選項指明擴展模塊的擴展機制;
- 隱式擴展:不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊;
- tcp:
[!] --source-port, --sport port[:port]:匹配報文的源端口;可以是端口范圍;
[!] --destination-port,--dport port[:port]:匹配報文的目標端口;可以是端口范圍;
[!] --tcp-flags mask comp
mask 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
- tcp:
- 隱式擴展:不需要手動加載擴展模塊;因為它們是對協議的擴展,所以,但凡使用-p指明了協議,就表示已經指明了要擴展的模塊;
- 顯式擴展:必須使用-m選項指明要調用的擴展模塊的擴展機制;
- 顯式擴展:必須要手動加載擴展模塊, [-m matchname [per-match-options]];必須使用-m選項指明要調用的擴展模塊的擴展機制;
- 1、multiport
This module matches a set of source or destination ports. Up to 15 ports can be specified. A port range (port:port) counts as two ports. It can only be used in conjunction with one of the following protocols: tcp, udp, udplite, dccp and sctp.
以離散或連續的 方式定義多端口匹配條件,最多15個;- [!] --source-ports,--sports port[,port|,port:port]...:指定多個源端口;
- [!] --destination-ports,--dports port[,port|,port:port]...:指定多個目標端口;
- 2、iprange
以連續地址塊的方式來指明多IP地址匹配條件;- [!] --src-range from[-to]
- [!] --dst-range from[-to]
- 3、time
This matches if the packet arrival time/date is within a given range.- --timestart hh:mm[:ss]
- --timestop hh:mm[:ss]
- [!] --weekdays day[,day...]
- [!] --monthdays day[,day...]
- --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
- --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
- --kerneltz:使用內核配置的時區而非默認的UTC;
- 4、string
This modules matches a given string by using some pattern matching strategy.- --algo {bm|kmp}
- [!] --string pattern
- [!] --hex-string pattern
- --from offset
- --to offset
- 5、connlimit
Allows you to restrict the number of parallel connections to a server per client IP address (or client address block).- --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
This module matches at a limited rate using a token bucket filter.- --limit rate[/second|/minute|/hour|/day]
- --limit-burst number
~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT
限制本機某tcp服務接收新請求的速率:--syn, -m limit
- 7、state
The "state" extension is a subset of the "conntrack" module. "state" allows access to the connection tracking state for this packet.- [!] --state state
- INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
NEW: 新連接請求;
ESTABLISHED:已建立的連接;
INVALID:無法識別的連接;
RELATED:相關聯的連接,當前連接是一個新請求,但附屬于某個已存在的連接;
UNTRACKED:未追蹤的連接;
- INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.
- state擴展:
- 內核模塊裝載:
nf_conntrack
nf_conntrack_ipv4 - 手動裝載:
nf_conntrack_ftp
- 內核模塊裝載:
- 追蹤到的連接:
/proc/net/nf_conntrack - 調整可記錄的連接數量最大值:
/proc/sys/net/nf_conntrack_max - 超時時長:
/proc/sys/net/netfilter/timeout
- [!] --state state
- 1、multiport
- 顯式擴展:必須要手動加載擴展模塊, [-m matchname [per-match-options]];必須使用-m選項指明要調用的擴展模塊的擴展機制;
- 隱式擴展:在使用-p選項指明了特定的協議時,無需再同時使用-m選項指明擴展模塊的擴展機制;
- 處理動作(跳轉目標):
- -j targetname [per-target-options]
- 簡單target:
ACCEPT, DROP - 擴展target:
REJECT
This is used to send back an error packet in response to the matched packet: otherwise it is equivalent to DROP so it is a terminating TARGET, ending rule traversal.- --reject-with type
The type given can be icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐ able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited (*), which return the appropriate ICMP error message (icmp-port-unreachable is the default).
- --reject-with type
- LOG
Turn on kernel logging of matching packets.- --log-level
- --log-prefix
默認日志保存于/var/log/messages
- 簡單target:
- RETURN:
返回調用者;
自定義鏈做為target:
- -j targetname [per-target-options]
#多端口匹配mulitport示例:
#放行ssh服務端口22,以便xshell可以連接到服務器
[root@localhost ~]# iptables -A INPUT -s 192.168.1.0/24 -d 192.168.1.106 -p tcp --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 192.168.1.106 -d 192.168.1.0/24 -p tcp --sport 22 -j ACCEPT
#設置默認規則為拒絕
[root@localhost ~]# iptables -A INPUT -d 192.168.1.106 -j REJECT
[root@localhost ~]# iptables -A OUTPUT -s 192.168.1.106 -j REJECT
#多端口匹配示例
[root@localhost ~]# iptables -I INPUT 1 -d 192.168.1.106 -p tcp -m multiport --dports 21,53,80,139,445 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT 1 -s 192.168.1.106 -p tcp -m multiport --sports 21,53,80,139,445 -j ACCEPT
#在另外一臺192.168.1.107主機上測試本機開放的端口80
[root@localhost ~]# curl http://192.168.1.106
<h1>192.168.1.106</h1>
hello gay
...
#iprange使用示例:
[root@localhost ~]#iptables -I INPUT 3 -d 192.168.1.106 -p tcp --dport 23 -m iprange --src-range 192.168.1.107-192.168.1.110 -j ACCEP
[root@localhost ~]#iptables -I OUTPUT 3 -s 192.168.1.106 -p tcp --sport 23 -m iprange --dst-range 192.168.1.107-192.168.1.110 -j ACCEP
#使用192.168.1.107的主機telnet測試服務器
[root@localhost ~]# telnet 192.168.1.106 23
Trying 192.168.1.106...
Connected to 192.168.1.106.
Escape character is '^]'.
Kernel 3.10.0-693.el7.x86_64 on an x86_64
localhost login:
...
#time示例:
[root@localhost ~]# iptables -R INPUT 3 -d 192.168.1.106 -p tcp -m iprange --src-range 192.168.1.107-192.168.1.110 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT
[root@localhost ~]# iptables -R OUTPUT 3 -s 192.168.1.106 -p tcp -m iprange --dst-range 192.168.1.107-192.168.1.110 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT
#使用192.168.1.107telnet測試
[root@localhost ~]# telnet 192.168.1.106 23
Trying 192.168.1.106...
...
#string示例:(只對明文編碼的生效)
[root@localhost ~]# curl http://192.168.1.106
<h1>192.168.1.106</h1>
hello gay
#添加規則過濾gay
[root@localhost ~]# iptables -I OUTPUT -s 192.168.1.106 -m string --algo kmp --string "gay" -j REJECT
#添加規則后重新訪問被拒絕
[root@localhost ~]# curl http://192.168.1.106
|
...
#connlimit并發連接限制:
[root@localhost ~]# iptables -I INPUT 2 -s 192.168.0.0/16 -d 192.168.1.106 -p tcp --dport 3306 -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT 2 -d 192.168.0.0/16 -s 192.168.1.106 -p tcp --sport 3306 -j ACCEPT
#先放行3306端口后修改此條規則,限制并發訪問數量為2
[root@localhost ~]# iptables -R INPUT 2 -s 192.168.0.0/16 -d 192.168.1.106 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
[root@localhost ~]# iptables -R OUTPUT 2 -d 192.168.0.0/16 -s 192.168.1.106 -p tcp --sport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
#分別使用192.168.1.107-192.168.1.109三臺主機測試,前2臺連接mysql數據庫正常
[root@localhost ~]# mysql -utest -h192.168.1.106 -pmagedu
Welcome to the MariaDB monitor. Commands end with ; or \g.
...
MariaDB [(none)]>
#使用192.168.1.109主機已經連接不上
[root@localhost ~]# mysql -utest -h192.168.1.106 -pmagedu
ERROR 2003 (HY000): Can't connect to MySQL server on '192.168.1.106' (110)
...
#limit 速率限制示例:
[root@localhost ~]# iptables -I INPUT 3 -d 192.168.1.106 -s 192.168.1.0/24 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT
[root@localhost ~]# iptables -R OUTPUT 3 -s 192.168.1.106 -d 192.168.1.0/24 -p icmp -m state --state ESTABLISHED -j ACCEPT
#使用107的主機ping測試
[root@localhost ~]# ping 192.168.1.106
PING 192.168.1.106 (192.168.1.106) 56(84) bytes of data.
64 bytes from 192.168.1.106: icmp_seq=1 ttl=64 time=31.1 ms
64 bytes from 192.168.1.106: icmp_seq=2 ttl=64 time=1.56 ms
64 bytes from 192.168.1.106: icmp_seq=3 ttl=64 time=0.903 ms
64 bytes from 192.168.1.106: icmp_seq=4 ttl=64 time=0.837 ms
64 bytes from 192.168.1.106: icmp_seq=5 ttl=64 time=1.88 ms
64 bytes from 192.168.1.106: icmp_seq=8 ttl=64 time=0.751 ms
64 bytes from 192.168.1.106: icmp_seq=11 ttl=64 time=0.869 ms
64 bytes from 192.168.1.106: icmp_seq=14 ttl=64 time=2.81 ms
...
#state報文狀態匹配示例:
#放行22,23,80,139,445的tcp端口,和123,323 ,137,138的udp端口
[root@localhost ~]# iptables -A INPUT -d 192.168.1.106 -p tcp -m multiport --dports 22:23,80,139,445,3306 -m state --state NEW -j ACCEPT
[root@localhost ~]# iptables -I INPUT -d 192.168.1.106 -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -s 192.168.1.106 -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A INPUT -d 192.168.1.106 -j REJECT
[root@localhost ~]# iptables -A OUTPUT -s 192.168.1.106 -j REJECT
[root@localhost ~]# iptables -I INPUT 2 -d 192.168.1.106 -p udp --dport 137:138 -m state --state NEW -j ACCEPT
[root@localhost ~]# iptables -I OUTPUT 2 -s 192.168.1.106 -p udp -m multiport --dports 123,323 -m state --state NEW -j ACCEPT
#放行FTP,裝載連接追蹤
[root@localhost ~]# iptables -R INPUT 3 -d 192.168.1.106 -p tcp -m multiport --dports 21:23,80,139,445,3306 -m state --state NEW -j ACCEPT
[root@localhost ~]# iptables -R INPUT 1 -d 192.168.1.106 -m state --state ESTABLISHED,RELATED -j ACCEPT
#訪問ftp服務測試
[root@localhost ~]# lftp 192.168.1.106
lftp 192.168.1.106:~> ls
drwxr-xr-x 2 0 0 6 Aug 03 2017 pub
lftp 192.168.1.106:/>
iptables/netfilter網絡防火墻:
-
iptables/netfilter網絡防火墻
- (1) 網關;
- (2) filter表的FORWARD鏈;
要注意的問題:
(1) 請求-響應報文均會經由FORWARD鏈,要注意規則的方向性;
(2) 如果要啟用conntrack機制,建議將雙方向的狀態為ESTABLISHED的報文直接放行;-
NAT: Network Address Translation
請求報文:由管理員定義;
響應報文:由NAT的conntrack機制自動實現;- 請求報文:
- 改源地址:SNAT,MASQUERADE
- 改目標地址:DNAT
- iptables/netfilter:
- NAT定義在nat表;
PREROUTING,INPUT,OUTPUT,POSTROUTING
SNAT:POSTROUTING
DNAT:PREROUTING
PAT:
- NAT定義在nat表;
- target:
- SNAT:隱藏內網主機去訪問外網
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]] - DNAT:隱藏服務器,只開放有限協議有限服務的端口
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]] - MASQUERADE
This target is only valid in the nat table, in the POSTROUTING chain. It should only be used with dynamically assigned IP (dialup) connections: if you have a static IP address, you should use the SNAT target.
SNAT場景中應用于POSTROUTING鏈上的規則實現源地址轉換,但外網地址不固定時,使用此target; - REDIRECT
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-ports port[-port]
- SNAT:隱藏內網主機去訪問外網
- 請求報文:
實驗:按下圖配置網關主機實現客戶端訪問服務器,演示網絡防火墻功能
-
按上圖配置好三臺虛擬機,并按圖中ip配置好,開啟網關主機的核心轉發功能
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1 net.ipv4.ip_forward = 1 #在客戶端添加默認路由條目 [root@localhost ~]# route add default gw 192.168.10.254 #在服務端添加路由 [root@localhost ~]# route add -net 192.168.10.0/24 gw 192.168.1.107 #至此客戶端和服務端之間連接建立,在客戶端192.168.10.2上訪問服務器192.168.1.106的web服務 [root@localhost ~]# curl http://192.168.1.106 <h1>192.168.1.106</h1> hello gay
-
在網關主機192.168.106上的FORWARD鏈上添加規則
#添加默認規則,拒絕訪問 [root@localhost ~]# iptables -A FORWARD -j REJECT #使用客戶端測試web服務 [root@localhost ~]# curl http://192.168.1.106 curl: (7) couldn't connect to host #是用ping命令測試客戶端和服務端之間連接被拒絕 [root@localhost ~]# ping 192.168.10.2 PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data. From 192.168.1.107 icmp_seq=1 Destination Port Unreachable From 192.168.1.107 icmp_seq=2 Destination Port Unreachable #放行服務器的80端口,使客戶端可以訪問web服務 [root@localhost ~]# iptables -I FORWARD -s 192.168.10.0/24 -d 192.168.1.106 -p tcp --dport 80 -j ACCEPT [root@localhost ~]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT #使用客戶機訪問測試成功 [root@localhost ~]# curl http://192.168.1.106 <h1>192.168.1.106</h1> hello gay #單方向放行服務端到客戶端的所有訪問 [root@localhost ~]# iptables -D FORWARD 2 [root@localhost ~]# iptables -I FORWARD 2 -d 192.168.10.0/24 -m state --state NEW -j ACCEPT
...
-
實現SNAT,DNAT
SNAT: #清空FORWARD鏈上的所有規則 [root@localhost ~]# iptables -F FORWARD #隱藏服務器IP地址去訪問外網(SNAT)在網關主機192.168.1.107主機上添加規則 [root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.10.254 #使用192.168.1.106訪問192.168.10.2的http服務正常 [root@localhost ~]# curl http://192.168.10.2 <h1>192.168.10.2</h1> #在192.168.10.2主機上抓包分析可以看到服務器IP地址已經被隱藏,顯示的是192.168.10.254的IP地址 [root@localhost ~]# tcpdump -i ens33 -nn tcp port 80 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes 17:30:16.081283 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [S], seq 854561726, win 29200, options [mss 1460,sackOK,TS val 11762377 ecr 0,nop,wscale 7], length 0 17:30:16.081410 IP 192.168.10.2.80 > 192.168.10.254.40290: Flags [S.], seq 2274859692, ack 854561727, win 28960, options [mss 1460,sackOK,TS val 4762953 ecr 11762377,nop,wscale 7], length 0 17:30:16.085611 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 11762382 ecr 4762953], length 0 17:30:16.085658 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [P.], seq 1:77, ack 1, win 229, options [nop,nop,TS val 11762382 ecr 4762953], length 76: HTTP: GET / HTTP/1.1 17:30:16.085735 IP 192.168.10.2.80 > 192.168.10.254.40290: Flags [.], ack 77, win 227, options [nop,nop,TS val 4762957 ecr 11762382], length 0 17:30:16.090704 IP 192.168.10.2.80 > 192.168.10.254.40290: Flags [P.], seq 1:264, ack 77, win 227, options [nop,nop,TS val 4762962 ecr 11762382], length 263: HTTP: HTTP/1.1 200 OK 17:30:16.110303 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [.], ack 264, win 237, options [nop,nop,TS val 11762391 ecr 4762962], length 0 17:30:16.112405 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [F.], seq 77, ack 264, win 237, options [nop,nop,TS val 11762392 ecr 4762962], length 0 17:30:16.113445 IP 192.168.10.2.80 > 192.168.10.254.40290: Flags [F.], seq 264, ack 78, win 227, options [nop,nop,TS val 4762985 ecr 11762392], length 0 17:30:16.117007 IP 192.168.10.254.40290 > 192.168.10.2.80: Flags [.], ack 265, win 237, options [nop,nop,TS val 11762413 ecr 4762985], length 0
...
DNAT:
#在192.168.1.107的網關主機上清空nat表上所有規則
[root@localhost ~]# iptables -t nat -F
#使用DNAT目標地址轉換實現:隱藏服務器ip,僅開放有限協議有限服務的端口
[root@localhost ~]# iptables -t nat -A PREROUTING -d 192.168.1.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.254
#使用192.168.10.2主機訪問192.168.1.106的http服務
[root@localhost ~]# curl http://192.168.1.106
<h1>192.168.1.106</h1>
hello gay
#在192.168.1.106主機上抓包測試
[root@localhost ~]# tcpdump -i ens33 -nn tcp port 80
....