我正在尝试对 HTTP 数据包进行深度数据包检查。这样做的目的是收集 HTTP 有效负载数据,然后创建一些独立于代理/缓存的报告。接下来,我的想法是开发特定的代理/缓存插件(例如 Squid)来使用这些报告。
我使用以下测试场景(VirtualBox 机器,所有机器都是 CentOS 6.3):
ROUTER:
接口:
eth0 连接到 192.168.1.0/24 网络(ip 192.168.1.10)
eth1 连接到 192.168.2.0/24 网络(ip 192.168.2.20)
eth2 连接到 192.168.3.0/24 网络(ip 192.168.3.30)
eth3 上网
PC1(深度数据包检测 - DPI PC):
接口:
eth0 连接到 192.168.1.0/24 网络(ip 192.168.1.1)
来自 192.168.2.0 和 192.168.3.0 网络内的 PC 的 HTTP 请求经过 iptables 标记,然后路由到 DPI PC。ROUTER
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
ROUTER的日志:
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 到达路由器的 eth2
2. 标记为 0x7
3. 通过路由器的 eth0 路由到 DPI PC
4. 到达 DPI PC 的 eth0(传入)
5. 标记为 0x7
6. 通过 DPI PC 的 eth0 路由回路由器(传出)
7. 返回路由器的 eth0
(数据包不会通过 eth3 路由,而是再次重复这些步骤,使用 ID=48080 的新数据包)
一旦此方案奏效,深度数据包检查将在步骤 4-6 之间进行。
数据包必须从路由器路由到 DPI PC,再从 DPI PC 路由回路由器,因为稍后我将在 DPI PC 上使用 Squid。
我很感激任何人的指导,
提前致谢
答案1
最有可能的是其 rp 过滤器在路由器设备上起作用。
Google:Linux rp 过滤器