
我正在嘗試對 HTTP 封包進行深度封包檢查。這樣做的目的是收集 HTTP 有效負載數據,然後創建一些與代理/快取無關的報告。接下來,我們的想法是開發特定的代理/快取外掛(例如 Squid)來使用報告。
我使用以下測試場景(VirtualBox機器,所有機器都是CentOS 6.3):
路由器:
介面:
eth0 連接到 192.168.1.0/24 網路 (ip 192.168.1.10)
eth1 連接到 192.168.2.0/24 網路
(ip 192.168.2.20)
eth2913. eth3網際網路
PC1(深度資料包偵測 - DPI PC):
介面:
連接到 192.168.1.0/24 網路的 eth0(ip 192.168.1.1)
來自192.168.2.0和192.168.3.0網路中的PC的HTTP請求被iptables標記,然後路由到DPI PC。
路由器 iptables 腳本:
#ALL CHAINS POLICY = ACCEPT
# DPI PC IP
IP_DPI=192.168.1.1
# Interface to reach DPI PC from router
IF_DPI_OUT=eth0
# Internet access interface
IF_MASQ=eth3
# Flush everything
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
# Zero counters
iptables -Z
iptables -t nat -Z
iptables -t mangle -Z
# Enable MASQUERADING
iptables -t nat -A POSTROUTING -s 192.16.1.0/24 -o $IF_MASQ -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o $IF_MASQ -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.3.0/24 -o $IF_MASQ -j MASQUERADE
### HTTP packets redirection
# Mark HTTP packets
iptables -t mangle -A PREROUTING -p tcp --dport 80 -m state --state NEW -s 192.168.2.0/24 -i eth1 -j MARK --set-mark 7
iptables -t mangle -A PREROUTING -p tcp --dport 80 -m state --state NEW -s 192.168.3.0/24 -i eth2 -j MARK --set-mark 7
# Create routing table named "http_redirect"
echo 202 http_redirect >> /etc/iproute2/rt_tables
# Marked packets use "http_redirect" table
ip rule add fwmark 7 table http_redirect
# Sent packets to DPI PC
ip route add default via $IP_DPI dev $IF_DPI_OUT table http_redirect
# Flush route cache
ip route flush cache
在 DPI PC 中我做了同樣的事情,封包再次重定向到路由器:
DPI PC iptables 腳本:
#ALL CHAINS POLICY = ACCEPT
IP_ROUTER=192.168.1.10
IF_ROUTER_OUT=eth0
# Flush everything
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X
iptables -t nat -X
iptables -t mangle -X
# Zero counters
iptables -Z
iptables -t nat -Z
iptables -t mangle -Z
### HTTP packets redirection
# Mark HTTP packets
iptables -t mangle -A PREROUTING -p tcp --dport 80 -i eth0 -j MARK --set-mark 7
# Create routing table named "http_redirect"
echo 202 http_redirect >> /etc/iproute2/rt_tables
# Marked packets use "http_redirect" table
ip rule add fwmark 7 table http_redirect
# Sent packets back to ROUTER
ip route add default via $IP_ROUTER dev $IF_ROUTER_OUT table http_redirect
# Flush route cache
ip route flush cache
使用iptables 日誌,我看到只有第一個資料包(SYN 開啟的資料包)從ROUTER 重定向到DPI PC,然後從DPI PC 重定向回ROUTER,但是一旦資料包再次到達ROUTER,它就不會通過eth3 路由(網際網路存取) )。然後產生一個 SYN 開啟且 ID=previous_ID+1 的新資料包,並再次重複這些步驟。
在本機 PC(ip 192.168.3.3)上進行以下操作:
wget www.yahoo.com
DPI PC 日誌:
Jan 8 19:29:03 localhost kernel: D:IN:eth0:HTTP:d80: IN=eth0 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48079 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139AFDB0000000001030305)
Jan 8 19:29:03 localhost kernel: D:IN:eth0:MARK-1.0 IN=eth0 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48079 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139AFDB0000000001030305)
Jan 8 19:29:03 localhost kernel: D:OUT:eth0:HTTP:d80: IN= OUT=eth0
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=48079 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139AFDB0000000001030305) MARK=0x7
Jan 8 19:29:04 localhost kernel: D:IN:eth0:HTTP:d80: IN=eth0 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48080 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139B3C30000000001030305)
Jan 8 19:29:04 localhost kernel: D:IN:eth0:MARK-1.0 IN=eth0 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48080 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139B3C30000000001030305)
Jan 8 19:29:04 localhost kernel: D:OUT:eth0:HTTP:d80: IN= OUT=eth0
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=48080 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139B3C30000000001030305) MARK=0x7
Jan 8 19:29:06 localhost kernel: D:IN:eth0:HTTP:d80: IN=eth0 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48081 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139BB930000000001030305)
Jan 8 19:29:06 localhost kernel: D:IN:eth0:MARK-1.0 IN=eth0 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48081 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139BB930000000001030305)
Jan 8 19:29:06 localhost kernel: D:OUT:eth0:HTTP:d80: IN= OUT=eth0
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=48081 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139BB930000000001030305) MARK=0x7
路由器日誌:
Jan 8 19:28:48 localhost kernel: R:IN:eth2:HTTP:d80: IN=eth2 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48079 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139AFDB0000000001030305)
Jan 8 19:28:48 localhost kernel: R:IN:eth2:MARK-3.0 IN=eth2 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48079 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139AFDB0000000001030305)
Jan 8 19:28:48 localhost kernel: R:OUT:eth0:HTTP:d80: IN= OUT=eth0
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48079 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139AFDB0000000001030305) MARK=0x7
Jan 8 19:28:48 localhost kernel: R:IN:eth0:HTTP:d80: IN=eth0 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=48079 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139AFDB0000000001030305)
Jan 8 19:28:49 localhost kernel: R:IN:eth2:HTTP:d80: IN=eth2 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48080 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139B3C30000000001030305)
Jan 8 19:28:49 localhost kernel: R:IN:eth2:MARK-3.0 IN=eth2 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48080 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139B3C30000000001030305)
Jan 8 19:28:49 localhost kernel: R:OUT:eth0:HTTP:d80: IN= OUT=eth0
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48080 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139B3C30000000001030305) MARK=0x7
Jan 8 19:28:49 localhost kernel: R:IN:eth0:HTTP:d80: IN=eth0 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=48080 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139B3C30000000001030305)
Jan 8 19:28:51 localhost kernel: R:IN:eth2:HTTP:d80: IN=eth2 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48081 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139BB930000000001030305)
Jan 8 19:28:51 localhost kernel: R:IN:eth2:MARK-3.0 IN=eth2 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=48081 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139BB930000000001030305)
Jan 8 19:28:51 localhost kernel: R:OUT:eth0:HTTP:d80: IN= OUT=eth0
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=63 ID=48081 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139BB930000000001030305) MARK=0x7
Jan 8 19:28:51 localhost kernel: R:IN:eth0:HTTP:d80: IN=eth0 OUT=
SRC=192.168.3.3 DST=200.152.175.146 LEN=60 TOS=0x00 PREC=0x00 TTL=62 ID=48081 DF PROTO=TCP SPT=49268 DPT=80 WINDOW=14600 RES=0x00 SYN URGP=0 OPT (020405B40402080A0139BB930000000001030305)
ID=48079 的封包:
1. 從主機 192.168.3.3 取得到 ROUTER 的 eth2
2. 標記為 0x7
3. 透過 ROUTER 的 eth0 路由到 DPI PC 4.
取得到 DPI PC 的 eth0(
0x7
6經由 DPI PC 的 eth0(傳出)路由回 ROUTER
7. 返回 ROUTER 的 eth0
(封包不會透過 eth3 路由,並且使用 ID=48080 的新封包再次重複這些步驟)
一旦此模式起作用,深度資料包檢查將在步驟 4-6 之間完成。
封包必須從 ROUTER 路由到 DPI PC,然後從 DPI PC 路由回 ROUTER,因為稍後我將在 DPI PC 上使用 Squid。
我很感激任何人的指導,
先致謝
答案1
最有可能的是它的 rp 過濾器在路由器設備上工作。
Google:linux rp 過濾器