供小型化组织及团队的科学上网解决方案

此处输入图片的描述
「是谁来自山川湖海,却囿于昼夜、厨房与爱」

回忆起回忆本身,原本就是一件很复杂的事情,实际上自己早该为此做做总结。梳理一下思路,谈谈我们是如何解决这个问题的。这样你就可以放心的把细节忘掉,来给更美好的回忆腾地方了。

#为何要这样做?
先简单介绍一下背景:
一个拥有 20~30 人的小组织,各种设备(PC、笔记本、手机、平板)加起来大约有 40~50 部,然而没有足够的预算去购置诸如 H3C、Cisco 之类的专业路由。还要顺带解决一下科学上网问题,毕竟没了 Google 的程序员或者说只能在局域网里转悠的程序员,人生是不完整的。要是访问国外的某些站点还能够加速一下,那就更好了。

#要如何做?
路由方面,现有的解决方案有几种:

  • 以 Router OS 为代表的现成的软路由发行版
  • 一些专业的企业级路由
  • X86 老机器改造

恰好能利用上一些闲置的旧机器,最后选择了最后一种方案,也就是使用老机器进行改造,这些机器普遍硬件配置:CPU 是老版的 Pentium 系列,内存单条 256 MB,后成功拆分另一台机器,成功升级至 512 MB 。硬盘则是 150GB ,后来在 JD 上入了张千兆网卡,加上原有的一张,也就成功的组建了双网卡。
那么关键的问题来了,小团体的科学上网该选取哪种方案?
现有的方案很多,相比之下,利弊并存。而大部分都是个人用户的解决方案,而又如何部署在网关?
罗列名称以及相关原理在此就不在赘述
最后我们选择了使用 Shadowsocks + iptable 软路由的方案。

#将要面临什么问题?

  1. 国内 DNS 服务器的缓存污染
  2. 访问 IP 黑名单中的站点
  3. 端口封锁
  4. Wall 会利用深度包检测(Deep packet inspection),针对 OpenVPN,SSH,shadowsocks 等进行封锁
  5. 多次更换端口后可能会被封锁 IP
  6. 关键字封锁
  7. 针对所有 HTTPS 连接进行可能的随机中断
  8. 电信运营商到国外服务器的高丢包率,该如何进行国际网络线路的优化

#着手解决

##安装相关 Linux 发行版

  1. 采用的是 Ubuntu Server 14.10 版,安装时也可以将自己日后可能需要的组件选上
  2. 更换对自己来说最方便的软件源,同时升级部分软件包
  3. 根据千兆网卡的相关说明,安装该网卡的驱动

##配置阶段

###先简单说明一下网络拓扑结构

gateway_server

大体的过程如图所示,接下来开始准备配置网卡并分配相关地址:

  • 配置 /etc/network/interfaces 并按实际需求配置相关参数
  • 配置 /etc/sysctl.conf开启 IP 转发 net.ipv4.ip_forward = 1
  • 安装 DHCP 服务,sudo apt-get install isc-dhcp-server
  • 配置 DHCP:
    • 配置 DHCP 网卡 /etc/default/isc-dhcp-serverINTERFACES=""配置为对应内网网卡
    • 配置 /etc/dhcp/dhcpd.conf更新 DHCP 服务器相关参数:
subnet 192.168.2.0 netmask 255.255.255.0 {
    //当DHCP客户端主机启动网络时服务器能够分配给他的IP地址的范围
    range 192.168.2.60 192.168.2.240;
    //客户端能使用该IP地址的时间,以秒计算
    default-lease-time 86400;
    max-lease-time 86400;
    //客户端默认网关
    option routers 192.168.2.1;
    //不从一个网口向另一个网口转发 DHCP 请求
    option ip-forwarding off;
    //设置客户端广播地址和子网掩码
    option broadcast-address 192.168.2.255;
    option subnet-mask 255.255.255.0;
   //设置客户端DNS服务器,防止被上层的 DNS 污染强制使用 ss-tunnel 提供的 DNS
   option domain-name-servers 192.168.2.1;
   //设置客户端NTP服务器
   option nntp-server 192.168.2.1;
   //如果你为 Windows 客户端指定了一个WINS服务器,你必须在 dhcpd.conf 中加入以下选项
   option netbios-name-servers 192.168.2.1;
   }
  • 重新启动 DHCP 服务 service isc-dhcp-server restart

###针对 DNS 污染

此处输入图片的描述
针对 DNS 污染过程如图所示,接下来开始准备配置 Dnsmasq:

  • 安装 Dnsmasq sudo apt-get install dnsmasq
  • 配置 /etc/dnsmasq.conf 指定监听网卡为内网网卡 interface=eth1,创建配置文件目录,mkdir /etc/dnsmasq.d,同时指定 Dnsmasq 配置目录echo "conf-dir=/etc/dnsmasq.d" >> /etc/dnsmasq.conf
  • 参考 Github Dnsmasq-china-list 项目,配置国内域名解析 accelerated-domains.china.conf以及反 ISP DNS 劫持的 bogus-nxdomain.china.conf文件
  • 配置白名单外域名 DNS 查询方式,/etc/dnsmasq.d# echo "server=/#/[内网 eth1 网关地址]#[转发端口]" >gfwlist.conf

    (注:# 通配符代表泛匹配所有域名。Dnsmasq 匹配域名的特点是详细特征优先匹配,因此会先匹配
    accelerated-domains.china.conf上的域名,如果不匹配,再匹配这条规则:转发到本地端口进行域名查询。)

###针对流量转发

原理简述,利用 iptables 防火墙,首先通过 NAT 搭建软路由,之后制定相关规则,进行流量转发。

此处输入图片的描述

针对流量转发的过程如图所示,接下来开始准备配置 iptables:

  1. NAT 搭建软路由
    iptables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -t nat -A POSTROUTING -j SNAT --to-source [外网 eth0 IP]
  2. 建立 shadowsocks 规则链,对服务器 IP 放行
    iptables -t nat -N SHADOWSOCKS
    iptables -t nat -A SHADOWSOCKS -d [服务器 IP] -j RETURN
  3. 局域网 IP 放行
    iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN
    iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -p tcp -j RETURN
  4. TCP 导向 shadowsocks 链
    iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports [Shadowsock本地端口]
    iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
  5. 过滤中国 IP 地址,具体地址信息可从 APNIC 获取。
    iptables -t nat -I SHADOWSOCKS -d [中国 IP] -j RETURN

之后开启 ss-tunnelss-redir 相关服务即可
(必要时可以输出日志,以备后续分析,如果觉得长时间积累后日志文件体积很大,开启时打入 /dev/null 黑洞即可)
大体过程如上,可以将全部流程制成 shell 脚本,开机运行即可。

###后续优化
后续优化,主要将围绕这几点进行:

  • 高丢包率,该如何进行国际网络线路的优化
  • Shadowsocks 服务端优化:
    • 加密算法的选择
    • 内核参数优化
    • 安装第三方加速模块
  • 因 IP 问题,部分国内网站可能提示的”不在此地区提供服务”
  • 服务器被封锁 IP

####高丢包率,该如何进行国际网络线路的优化

测试证明,国内不同种类、不同地区的运营商,丢包以及延迟情况均不同,即使是同种运营商,不同地区也不尽相同(例:上海)。15 年国内电信的国际出口普遍不容乐观,备受诟病。以陕西电信为例,夜间高峰时段,与 DigitalOcean SFO 服务器 建立连接延迟普遍 450~500 ms,2016 年则有所改善,维持在 190~280 ms。

  • 电信用户可以通过 CN2 网络架设 Haproxy 代理转发流量(有资源,有能力)
  • BGP 机房(阿里云等)架设 Haproxy 代理转发流量
  • 无可利用资源的用户可通过第三方付费服务(例:Vxtrans),接入中国电信的 CN2 网络

####Shadowsocks 服务端优化

####关于部分国内网站可能提示的”不在此地区提供服务”

  • 部分国内的 IP 不够完善,可通过相关网络工具查询其 AS 的 Announcement,手动添加至 iptable 的中国 IP 列表

####关于服务器被封锁 IP

相信有经验的人可以感觉出,近年来 Wall DPI 的能力已经变得愈发强大,如果不幸被 Block 掉服务器,只能更换 IP

  • 服务端部署调优后务必建立好快照(snapshot),更换 IP 后,可通过快照进行快速部署
  • 更换 IP 并部署完毕之后,注意更改 shadowsocks 服务端配置文件中的 IP
无「民事行为能力」人慎点