实现socks5透明代理

应用场景

  • 把redsocks2部署在网关服务器,让用户无感知使用socks5代理上网,即透明代理;网关服务器需要同时有内网和外网IP

  • redsocks2的作用是将用户的数据包封装上socks5头,然后传递给后端socks5代理服务器(也可以是socks5代理负载均衡器,可用nginx或iptables实现)

  • TCP和UDP均可很好的支持

安装步骤

1. 提前编译好redsocks2可执行文件
yum install libevent2-devel openssl-devel -y
wget https://github.com/semigodking/redsocks/archive/release-0.66.zip
unzip release-0.66
cd redsocks-release-0.66
make -j $(grep -c processor /proc/cpuinfo) 
2.根据实际情况修改transparent_socks5proxy_redirector_setup.sh前置的几个变量
prefix_dir=/usr/local/redsocks2 # 安装路径
logdir=$prefix_dir/log # 用户访问日志路径
logsavedays=300 # 日志保留时间
redsocks_server_ip=192.168.1.254 # redsocks2安装在的服务器内网IP,此处一定不能为127.0.0.1,公网IP不安全也不考虑
redsocks_tcp_port=10001 # redsocks2用于接收TCP包的监听端口
redsocks_udp_port=20001 # redsocks2用于接收UDP包的监听端口
socks_server="101.19.11.60:1080 12.5.11.27:1080" # redsocks2将封装后的数据包转发给后端的socks5代理服务器列表(或socks5代理负载均衡器,或tcp转发器),可以是一个,多个的话使用空格分隔
3.执行安装脚本
bash transparent_socks5proxy_redirector_setup.sh

使用说明

1.安装后的默认路径:/usr/local/redsocks2/, 目录中相关文件说明如下:
redsocks2  # redsocks2程序
redsocks2.service  # 整个服务的启动、关闭、重启、状态查看脚本
redsocks.conf # redsocks2的配置文件
log/access.log   # 用户访问的日志
log/logrotate.sh # 用户日志每日轮转脚本
err.log # redsocks2的debug日志
2. 启用服务:
./redsocks2.service start

附上脚本

#!/usr/bin/env bash
# transparent_socks5proxy_redirector_setup.sh 
# 2017/7/28

# this script implements a {tansparent redirector} as follow architecture, 
# that encapsulate TCP/UDP packets with socks5 header and then redirect them to socks5 proxy servers.
#
#     {transparent redirector}
#                |
#        _ _ _ _ _ _ _ _ _ 
#       |tcp load balancer|   
#        - - - - - - - - - 
#       /       \         \ 
#    _ _ _ _ _ _   _ _ _ _ _ _
#   |socks5proxy| |socks5proxy|  ......
#    - - - - - -   - - - - - -    

set -u

workdir=$(cd $(dirname $0) && pwd)
redsocks2_bin=$workdir/redsocks-release-0.66/redsocks2 
prefix_dir=/usr/local/redsocks2
logdir=$prefix_dir/log
logsavedays=300
# should be local private ip
redsocks_server_ip=192.168.1.254
redsocks_tcp_port=10001
redsocks_udp_port=20001
# socks load balance server or socks proxy server
socks_server="101.19.11.60:1080 12.5.11.27:1080"

cd $workdir

# build redsocks2 first
<<'COMPILE'
yum install libevent2-devel openssl-devel -y
wget https://github.com/semigodking/redsocks/archive/release-0.66.zip
unzip release-0.66
cd redsocks-release-0.66
make -j $(grep -c processor /proc/cpuinfo) 
COMPILE

[ ! -f $redsocks2_bin ] && { echo "err: redsocks2 not exist,build redsocks2 first.";exit 1;}
mkdir -p $prefix_dir
\cp $redsocks2_bin $prefix_dir

cd $prefix_dir

# ------------------------------ redsocks.conf -----------------------------
cat > redsocks.conf <<EOF
base {
        log_debug = off;
        log_info = on;
        //log = stderr;
        log = "file:$prefix_dir/err.log";
        daemon = on;
        redirector = iptables;
}

$(
for server in $socks_server;do
  ip=$(echo $server|awk -F: '{print $1}')
  port=$(echo $server|awk -F: '{print $2}')
  cat <<COM
redsocks {
        //private ip for redsocks2 server; not set 127.0.0.1 if you set this machine as gateway;
        local_ip = $redsocks_server_ip;
        local_port = $redsocks_tcp_port;
        min_accept_backoff = 100;
        max_accept_backoff = 60000;
        //remote socks proxy server
        ip = $ip;
        port = $port;
        type = socks5;
        timeout = 10;
}

redudp {
        // private ip for redsocks2 server;
        local_ip = $redsocks_server_ip;
        local_port = $redsocks_udp_port;
        // remote socks proxy server
        ip = $ip;
        port = $port;
        type = socks5;
        udp_timeout = 10;
}
COM

  ((redsocks_tcp_port++))
  ((redsocks_udp_port++))
done
)

EOF

# ----------------------- iptables --------------------------

# clean iptables
iptables -F
iptables -Z
iptables -X
iptables -t nat -F
iptables -t nat -Z
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -Z
iptables -t mangle -X

# create new chain
iptables -t nat -N REDSOCKS2
iptables -t mangle -N REDSOCKS2
iptables -t mangle -N REDSOCKS2_MARK

# ignore LANs and some other addresses 
iptables -t nat -A REDSOCKS2 -d 0.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS2 -d 10.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS2 -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS2 -d 169.254.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS2 -d 172.16.0.0/12 -j RETURN
iptables -t nat -A REDSOCKS2 -d 192.168.0.0/16 -j RETURN
iptables -t nat -A REDSOCKS2 -d 224.0.0.0/4 -j RETURN
iptables -t nat -A REDSOCKS2 -d 240.0.0.0/4 -j RETURN

# ignore local addresses
iptables -t nat -A REDSOCKS2 -d $(ifconfig |awk '/inet addr/{print $2}'|awk -F: '{print $2}'|xargs  |sed 's/ /,/g') -j RETURN

# ignore your remote socks proxy server's addresses 
iptables -t nat -A REDSOCKS2 -d $(echo $socks_server|egrep -o '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'|xargs |sed 's/ /,/') -j RETURN

# for tcp
for ((i=$(echo $socks_server|xargs -n1|wc -l);i>=1;i--)){
  iptables -t nat -A REDSOCKS2 -p tcp -m statistic --mode nth --every $i --packet 0 -j REDIRECT --to-ports $redsocks_tcp_port
  ((redsocks_tcp_port++))
}
iptables -t nat -A PREROUTING -p tcp -j REDSOCKS2

# for udp
ip route del local default dev lo table 100
ip rule del fwmark 1 lookup 100
ip route add local default dev lo table 100
ip rule add fwmark 1 lookup 100

for ((i=$(echo $socks_server|xargs -n1|wc -l);i>=1;i--)){
  iptables -t mangle -A REDSOCKS2 -p udp -m multiport --dports 1:10000 -m statistic --mode nth --every $i --packet 0 -j TPROXY --on-port $redsocks_udp_port --tproxy-mark 1
  ((redsocks_udp_port++))
}
iptables -t mangle -A PREROUTING -p udp -j REDSOCKS2
iptables -t mangle -A REDSOCKS2_MARK -p udp -m multiport --dports 1:10000 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p udp -j REDSOCKS2_MARK

# log
iptables -t nat -I PREROUTING -j LOG --log-prefix 'IPTABLES_LOG:' --log-level debug
iptables -t nat -I POSTROUTING -j LOG --log-prefix 'IPTABLES_LOG:' --log-level debug

# iptables-save
iptables-save > /etc/sysconfig/iptables

# set iptables log 
mkdir -p $logdir
grep -q '^kern\.\*' /etc/rsyslog.conf &&
  sed -i "s#^kern\.\*.*#kern.* $logdir/access.log#" /etc/rsyslog.conf ||
    echo "kern.* $logdir/access.log" >>/etc/rsyslog.conf
/etc/init.d/rsyslog restart

cat >$logdir/logrotate.sh<<EOF
#!/bin/bash
# log rotate
/bin/mv $logdir/access.log{,.\$(/bin/date +%Y%m%d)} 
/etc/init.d/rsyslog reload
/bin/find $logdir -type f -mtime $logsavedays -exec rm -f {} \; 
exit 0
EOF

chmod u+x $logdir/logrotate.sh
grep -q "$logdir/logrotate.sh" /var/spool/cron/root || echo "0 0 * * * $logdir/logrotate.sh" >>/var/spool/cron/root


# --------------------------- redsocks.service ------------------
((redsocks_tcp_port--))
((redsocks_udp_port--))

cat > redsocks2.service <<EOF
#!/bin/bash

. /etc/init.d/functions

start(){
  /etc/init.d/iptables start
  ps aux|egrep -v "grep|\$0" |grep -q redsocks2 && { 
    echo -n "redsocks2 already started";failure;echo;} || {
      $prefix_dir/redsocks2 -c $prefix_dir/redsocks.conf && { echo -n "redsocks2 started";success;echo;}
  }
}

stop(){
  /etc/init.d/iptables stop
  killall redsocks2 2>/dev/null && { echo -n "redsocks2 stopped.";success;echo;} || {
    echo -n "redsocks2 already stopped.";failure;echo;}
}

status(){
  ps axu|egrep -v "grep|\$0" |grep -q redsocks2 && 
    echo "redsocks2 is running..."||
      echo "redsocks2 has stopped."
  iptables -t nat -nvL|egrep -q "REDIRECT.*$redsocks_tcp_port" && 
    echo "iptables for tcp redirect is ok" || 
      echo "iptables for tcp redirect is err"
  iptables -t mangle -nvL|egrep -q "TPROXY.*$redsocks_udp_port" && 
    echo "iptables for udp redirect is ok" || 
      echo "iptables for udp redirect is err"
}

case \$1 in 
  start) start
      ;;
  stop) stop
      ;;
  restart) stop;start
      ;;
  status) status
      ;;
  *) echo "Usage:\$0 <start|stop|restart|status>"
      ;;
esac

exit 0

EOF

chmod u+x redsocks2.service

echo "SETUP SUCCESS!
Use $prefix_dir/redsocks2.service to manage the server:
$prefix_dir/redsocks2.service <start|stop|restart|status>
"

exit 0

通过iptables实现负载均衡(RR模式)

#!/usr/bin/env bash
# implement load balance by iptables (rr)
# should setup by root 
# 2017/7/21

# be safe
set -u

# env
export PATH="/sbin:/usr/sbin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin"

# usage
[ "$#" -ne 1 ] && { echo "Usage:./$0 <iplist_file>";exit 1;}


# var
port=1080
iplist=$1
protocal=tcp
basedir=/usr/local/iptables-lb
logdir=$basedir/log
logsavedays=30

# enable supports forward 
sed -i 's/^net.ipv4.ip_forward.*$/net.ipv4.ip_forward  = 1/' /etc/sysctl.conf
sysctl -q -p

# set iptables policy
iptables -t nat -F 
iptables -F

[ -f /etc/sysconfig/iptables.lbbak ] || cp /etc/sysconfig/iptables{,.lbbak}

linenu=1
while read ip;do
  echo "iptables -t nat -A PREROUTING -p $protocal --dport $port -m statistic --mode nth --every $linenu --packet 0 -j DNAT --to-destination $ip"
  ((linenu++))
done < $iplist|sort -k15 -nr|bash

iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -p $protocal --dport $port -j LOG --log-prefix 'IPTABLES_FORWARD_LOG:' --log-level debug
iptables-save >/etc/sysconfig/iptables

/etc/init.d/iptables restart

# set iptables log
mkdir -p $logdir
grep -q '^kern\.\*' /etc/rsyslog.conf &&
  sed -i "s#^kern\.\*.*#kern.* $logdir/access.log#" /etc/rsyslog.conf ||
    echo "kern.* $logdir/access.log" >>/etc/rsyslog.conf 
/etc/init.d/rsyslog restart

cat >$logdir/logrotate.sh<<EOF
#!/bin/bash
# log rotate
/bin/mv $logdir/access.log{,.\$(/bin/date +%Y%m%d_%H%M%S)} 
/etc/init.d/rsyslog reload
/bin/find $logdir -type f -mtime $logsavedays -exec rm -f {} \; 
exit 0
EOF

chmod u+x $logdir/logrotate.sh
grep -q "$logdir/logrotate.sh" /var/spool/cron/root || echo "0 * * * * $logdir/logrotate.sh" >>/var/spool/cron/root

# ip pool servers live detect
cat >$basedir/ip_pool_probe.sh <<EOF
#!/bin/bash
# ip pool live detect

rootdir=\$(cd \$(dirname \$0) && pwd)
cd \$rootdir
>fail_ip.txt >probe.log

while sleep 3;do
while read ip;do
  if nc -4vzw 2 \$ip $port &>/dev/null;then
    grep -q \$ip fail_ip.txt && {
      eval \$(grep "PREROUTING.*--to-destination" /etc/sysconfig/iptables|head -1|sed -r "s/[ /t]*$//;s/^/iptables -t nat /;s/ [0-9.]+$/ \$ip/")
      sed -i "/\$ip/d" fail_ip.txt
      echo "[\$(date +%F" "%T)]: \$ip:$port recover" >>probe.log
    }
  else
    grep -q \$ip fail_ip.txt && continue
    eval \$(grep "\--to-destination \$ip" /etc/sysconfig/iptables |sed 's/^-A/iptables -t nat -D/')
    echo \$ip >>fail_ip.txt
    echo "[\$(date +%F" "%T)]: \$ip:$port not connect" >>probe.log
  fi
done < <(grep "PREROUTING.*--to-destination" /etc/sysconfig/iptables|awk '{print \$NF}')
done

exit 0
EOF

chmod u+x $basedir/ip_pool_probe.sh  
killall ip_pool_probe.sh &>/dev/null
($basedir/ip_pool_probe.sh &)

[ -f $basedir/$(basename $0) ] || cp ./$0 $iplist $basedir 

echo "SUCCESS: IPTABLES-LB SETUP COMPLETE!"


exit 0

关于代理的详细介绍

代理的作用

  1. 用于CDN缓存技术,静态内容或动态内容的加速服务(反向代理)
  2. 服务端负载均衡,包括web服务或其他tcp或udp服务(反向代理)
  3. 隐藏真实服务端地址,保障服务端安全(反向代理)
  4. 隐藏客户端IP(正向代理)
  5. 访问受限网站(正向代理)
  6. 通过缩短路径加速访问目标服务(正向代理)
  7. 公司网关旁路控制,比如防火墙用途、客户端访问授权、客户端上网行为控制(透明代理)
  8. 缓存服务,比如部分运营商部署缓存服务,为本网用户提供加速服务并节省网间结算费用(透明代理)
  9. 用户主动配置,需要使电脑所有应用全部使用代理方式访问外网(VPN代理)

代理的种类

1. 反向代理

客户端把反向代理服务器当作是真正的目标服务器去请求数据,客户端并不知道目标服务器是否是代理。反向代理服务器收到请求后,再作为客户端去真正的服务端请求数据,然后把响应的内容在本地缓存或不缓存,同时响应给客户端。
实现反向代理的软件,比如nginx的ngx_http_proxy_module模块和ngx_stream_proxy_module模块等等。

2. 正向代理(一般所说的代理就是指的正向代理)

正向代理包括http代理、https代理、socket5代理。

  1. http代理
    客户端若通过http代理访问网站,如果访问的是http网站,客户端和http代理服务器之间、http代理服务器和目标服务器之间的通讯都是http协议;如果访问的是https网站,客户端和http代理服务器之间的通讯也是http协议,而http代理服务器和目标服务器之间则是https协议。由于现在的http代理都支持CONNECT请求,所以通过http代理也可以访问https网站。只有访问https网站才会使用CONNECT方法。
    一般我们常用的代理工具基本都是http代理,比如fiddler、goagent、squid等。
    http代理是应用层的代理,只支持http/https协议代理。

  2. https代理
    https代理和http代理的唯一区别就是客户端和https代理服务器之间的通讯也是https协议。
    需要在https代理服务器上配置证书。
    本地浏览器设置,添加证书到客户端的受信任的根证书:
    以Windows下Chrome浏览器为例,将服务器上的公钥 publickey.pem 下载至本地,重命名至 publickey.crt ,在Chrome中依次点击 “设置” – “显示高级设置” – “HTTP/SSL” – “管理证书”,在“受信任的根证书颁发机构”选项卡中“导入”这个crt证书就完成了。
    代理客户端配置,比如chrome的扩展插件SwitchyOmega:
    将本地的代理客户端指向 https://<你的服务器IP或主机名>:4128 ,这里的IP或主机名和生成公钥时的 Common Name 一致,端口为stunnel的端口。如果有配置HTTP认证的话,需要在客户端中配置对应的用户名和密码。
    https代理是应用层的代理,只支持http/https协议代理。

  3. socks代理
    socks代理在TCP/IP协议栈的传输层上运行,对应OSI模型的话就是会话层。与应用层代理不同,socks代理只是简单的传递数据包,并不关心是何种应用协议,所以比应用层代理要快不少,并且更加通用。
    常用的socks代理有socks4和socks5两种。socks4代理只支持tcp协议,而socks5代理不但tcp和udp协议都支持,并且还支持各种身份验证的安全机制,同时还它还采用地址解析方案(addressing scheme)来支持服务端域名解析(比如说浏览器配置了使用socks5代理,那么访问的网站的域名解析工作也是在socks5代理服务器上解析的)和IPV6。
    可以说socks5的出现缓解了各种具体应用协议需要专门设计代理协议的困难局面,不过并不是凡是基于TCP/IP协议的应用软件,都可以无条件通过socks5服务器进行通讯,前提提交是应用软件本身具有socks5的接口,才能利用socks5代理服务器。
    一个支持socks5协议的应用软件,通常具有2种运行状态:①直接通讯状态 ②socks5通讯状态。
    socks5代理通常使用1080端口。
    sock5协议本身没有加入加密策略,所以是明文传输,不过可以使用Socks5+Stunnel5来实现客户端到代理之间的加密传输。

  4. ShadowSocks代理
    Shadowsocks 是一种安全的 socks5 代理,也就是加密的socks5代理,基于多种加密方式,所以客户端到代理服务器之间的数据传输是加密的。
    shadowsocks安装和使用需要服务端和客户端。使用方式是客户端安装完成后启动在本地监听,其他要使用代理的应用通过各自的socks5接口来配置监听在本地的ip和端口,一般是127.0.0.1:1080。
    服务端有很多实现版本,最早是python,目前已停止维护,还有libev(c)、go、nodejs(已停止维护)等。
    客户端也比较全,包括windows、mac、ios、android、路由器(基于openWRT)。

  5. SSH代理
    SSH(Secure Shell, 安全外壳协议)是一种加密通道,这里说的SSH代理,是指使用SSH加上socks代理的方式组合成为一种加密代理。
    使用方式是在本地安装ssh客户端工具,ssh连接远程服务器,并在用户本地监听端口,然后在需要使用代理的应用,比如浏览器将代理配置为socks:127.0.0.1:1080即可。

  6. VPN代理
    VPN(Virtual Private Network),虚拟专用网。VPN的主要功能是在公网上建立私有网络,进行加密通讯。一般用于企业数据中心之间的内网安全互通,或者员工在公共网络上安全访问公司数据中心资源使用。
    VPN的实现方式主要有:
    PPTP/L2TP,工作在2层
    IPSec,工作在3层
    MPLS,结合2层和3层
    SSL VPN,工作在7层
    在这里主要说的是作为全局代理来使用。拨通VPN后,相当于接入了另外一个网络,整个电脑对外传输的数据都要通过这个网络进行,自然上网使用的公网IP也是另外网络的,实现了代理功能。
    另外客户端到VPN代理之间是加密传输的,可以防止访问行为被截获。

  7. NAT代理
    NAT代理其实不算是严格意义上的代理了,纯网络方式实现更换用户上网IP。之前做过的一个NAT代理方案:
    拨VPN(用户端)+(VPN设备+iptables TEE模块)+ssh隧道+分散在各地的数台NAT服务器(iptables实现nat)

3. 透明代理

透明代理本质上就是正向代理,上述所说的正向代理都需要客户端主动配置代理IP和端口或认证信息才能使用,而透明代理对用户是透明的,也就是说用户本地不需要做任何配置,用户可能就不知道有代理的存在。比如一些公司的上网行为管理软件、个别小运营商部署的缓存系统等都属于透明代理。
透明代理的实现一般是由网关防火墙的重定向(或流量镜像的方式)策略将用户的请求交给正向代理服务器处理来实现。

 

防止上网行为被监控的几种方法

  1. 只访问https网站
    访问https网站,由于http应用层内容全部被加密,所以可以避免被监控到访问的具体内容,但是访问了哪些网站还是可以被监控到的,因为域名解析是在用户本地进行的,且不是加密的,所以通过公司的本地递归DNS还是可以收集和分析你访问的域名信息。

  2. 使用https代理
    通过https代理就可以解决我们访问http网站也不被监控到了,因为客户端和https代理之间也是走的https协议。但是还是没有解决DNS解析被监控的问题,因为会先进行DNS解析拿到目标网站IP地址,再走https代理。

  3. shadowsocks、Socks5+Stunnel5的代理方案、SSH代理
    使用这3种方案既能解决访问网站内容不被监控到,又能解决访问的域名不被监控到,因为域名解析也交给代理去做了。
    除了访问网址之外,支持socks5的应用都可以使用。

  4. vpn代理
    终极方案,使用VPN代理的方式,你的电脑上的所有应用的所有数据传输都不会被监控到。能被监控到的只是你和这个VPN地址之间有传输数据的行为和传输数据量而已。

注意:
如果使用http代理或者不加密的socks5代理,那么访问https网站也不再安全了。
当然如果你的电脑上存在公司的监控插件(比如自动截屏),通过什么代理都是徒劳的。

关于访问劫持

劫持的分类与原理简单介绍

1. 路由劫持(也有人叫做http劫持)

在运营商机房的近用户端路由器上接入一个分光器,将访问流量分光到一台服务器用于数据采集与分析,这台服务器的作用是分析访问流量特征,将访问条目的访问频次和大小进行统计,对于满足条件的TOP N链接会标记为强制缓存,这样用户再访问这些链接的时候,将会被这台服务器提前响应(由于这台服务器距离用户更近,真正的CP内容服务器的响应将会被用户端抛弃),给用户一个新的下载链接(302重定向方式),用户会无感知的访问运营商的缓存服务器(正向代理方式)。

2.域名劫持

  • 在运营商本地DNS上代替授权DNS给出伪造的解析记录。
  • 分光方式提前响应DNS解析记录,由于维护成本低,方便快捷,基本上用的这种方式,也叫DNS投毒。

域名劫持通过以上方式的一种将域名权威解析IP变更为运营商的缓存服务器IP(缓存方式为正向代理)来实现劫持。

 

劫持的原因

  • 二级运营商(一般指非电信和联通的其他宽带运营商 )和电信联通的互联带宽结算费用严重不对等,二级运营商通常要为出网带宽向电信或者联通支付巨额的费用(1Gb带宽40万到100万不等),通过劫持缓存大流量文件,节省出网带宽,同时增强本网用户体验(在劫持不出现问题的情况下)。

  • 不少宽带运营商为了向宽带用户推广大宽带产品,通常会劫持一些通用的测速软件的测速链接,以提高测速效果,给用户大带宽的假象。

  • 页面内强制嵌入广告、更换渠道推广文件,以获取非法利益。

  • 工信部的区域宽带提速项目,比如2015年的工信部西南三省宽带提速项目。

另外,绝大部分劫持现象出现在二级运营商,一般运营商不会自己做劫持项目,而是会外包给第三方公司去做,比如世纪互联、网宿、华为等等,做这种项目的公司还是比较多的。

 

针对劫持的有效处理方法

1.被动处理模式

  • 分析出劫持过程,判断劫持IP的归属运营商,如果CP和劫持运营商有关系往来,比如租用了运营商的机房、有其他的合作交流等,可以直接联系运营商接口人说明情况,提供劫持证据,一般都能很快的得到解决;如果CP没有劫持运营商的联系方式,可整理劫持证据,发邮件投诉CERT,解决时间上可能会稍慢,但一定会得到解决。
  • 很多劫持都是由用户发现并投诉到CP的,CP可让用户同步投诉到自己的宽带运营商,如果没有效果,可在当地的通管局官网上投诉,一般都会得到解决。

2. 主动处理模式,建立防劫持机制

  • 通过https方式绕过运营商劫持,对于页面图片类等小文件特别适合,可以考虑全站部署,但是对于大文件下载,https会可能降低性能,可以有选择性的部署。

  • 分析路由劫持的特点(对相同URL的访问量达到阈值才会劫持),通过客户端和服务端的配合,使用户下载相同文件的文件名每次都唯一,可有效绕过运营商的劫持策略。鉴权模式。

  • 可采用https_dns方式代替用户localdns做域名解析,有效防止域名劫持并可做到更精确的调度。适用于app或PC的端产品,不适用于浏览器。