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

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

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

为何要这样做?

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

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

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

恰好能利用上一些闲置的旧机器,最后选择了最后一种方案,也就是使用老机器进行改造,这些机器普遍硬件配置:CPU 是老版的 Pentium 系列,内存单条 256 MB,后成功拆分另一台机器,成功升级至 512 MB 。硬盘则是 150 GB ,后来在 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 服务器相关参数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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

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

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