「是谁来自山川湖海,却囿于昼夜、厨房与爱」
回忆起回忆本身,原本就是一件很复杂的事情,实际上自己早该为此做做总结。梳理一下思路,谈谈我们是如何解决这个问题的。这样你就可以放心的把细节忘掉,来给更美好的回忆腾地方了。
为何要这样做?
先简单介绍一下背景:
一个拥有 20~30 人的小组织,各种设备(PC、笔记本、手机、平板)加起来大约有 40~50 部,然而没有足够的预算去购置诸如 H3C、Cisco 之类的专业路由。还要顺带解决一下科学上网问题,毕竟没了 Google 的程序员或者说只能在局域网里转悠的程序员,人生是不完整的。要是访问国外的某些站点还能够加速一下,那就更好了。
#要如何做?
路由方面,现有的解决方案有几种:
- 以 Router OS 为代表的现成的软路由发行版
- 一些专业的企业级路由
- X86 老机器改造
恰好能利用上一些闲置的旧机器,最后选择了最后一种方案,也就是使用老机器进行改造,这些机器普遍硬件配置:CPU 是老版的 Pentium 系列,内存单条 256 MB,后成功拆分另一台机器,成功升级至 512 MB 。硬盘则是 150 GB ,后来在 JD 上入了张千兆网卡,加上原有的一张,也就成功的组建了双网卡。
那么关键的问题来了,小团体的科学上网该选取哪种方案?
现有的方案很多,相比之下,利弊并存。而大部分都是个人用户的解决方案,而又如何部署在网关?
(罗列名称以及相关原理在此就不在赘述)
最后我们选择了使用 Shadowsocks + iptable 软路由的方案。
将要面临什么问题?
- 国内 DNS 服务器的缓存污染
- 访问 IP 黑名单中的站点
- 端口封锁
- Wall 会利用深度包检测(Deep packet inspection),针对 OpenVPN,SSH,shadowsocks 等进行封锁
- 多次更换端口后可能会被封锁 IP
- 关键字封锁
- 针对所有 HTTPS 连接进行可能的随机中断
- 电信运营商到国外服务器的高丢包率,该如何进行国际网络线路的优化
着手解决
安装相关 Linux 发行版
- 采用的是 Ubuntu Server 14.10 版,安装时也可以将自己日后可能需要的组件选上
- 更换对自己来说最方便的软件源,同时升级部分软件包
- 根据千兆网卡的相关说明,安装该网卡的驱动
配置阶段
先简单说明一下网络拓扑结构
大体的过程如图所示,接下来开始准备配置网卡并分配相关地址:
- 配置
/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-server
将INTERFACES=""
配置为对应内网网卡 - 配置
/etc/dhcp/dhcpd.conf
更新 DHCP 服务器相关参数:
- 配置 DHCP 网卡
1 | subnet 192.168.2.0 netmask 255.255.255.0 { |
- 重新启动 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:
- NAT 搭建软路由
iptables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -j SNAT --to-source [外网 eth0 IP]
- 建立 shadowsocks 规则链,对服务器 IP 放行
iptables -t nat -N SHADOWSOCKS
iptables -t nat -A SHADOWSOCKS -d [服务器 IP] -j RETURN
- 局域网 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
- TCP 导向 shadowsocks 链
iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports [Shadowsock本地端口]
iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
- 过滤中国 IP 地址,具体地址信息可从 APNIC 获取。
iptables -t nat -I SHADOWSOCKS -d [中国 IP] -j RETURN
之后开启 ss-tunnel
、ss-redir
相关服务即可
(必要时可以输出日志,以备后续分析,如果觉得长时间积累后日志文件体积很大,开启时打入 /dev/null
黑洞即可)
大体过程如上,可以将全部流程制成 Shell 脚本,开机运行即可。
后续优化
后续优化,主要将围绕这几点进行:
- 高丢包率,该如何进行国际网络线路的优化
- Shadowsocks 服务端优化:
- 加密算法的选择
- 内核参数优化
- 安装第三方加速模块
- 因 IP 问题,部分国内网站可能提示的”不在此地区提供服务”
- 服务器被封锁 IP
高丢包率,该如何进行国际网络线路的优化
测试证明,国内不同种类、不同地区的运营商,丢包以及延迟情况均不同,即使是同种运营商,不同地区也不尽相同(例:上海)。15 年国内电信的国际出口普遍不容乐观,备受诟病。以陕西电信为例,夜间高峰时段,与 DigitalOcean SFO 服务器 建立连接延迟普遍 450~500 ms,2016 年则有所改善,维持在 190~280 ms。
- 电信用户可以通过 CN2 网络架设 Haproxy 代理转发流量(有资源,有能力)
- BGP 机房(阿里云等)架设 Haproxy 代理转发流量
- 无可利用资源的用户可通过第三方付费服务(例:Vxtrans),接入中国电信的 CN2 网络
Shadowsocks 服务端优化
- 调节内核参数,可参考 sysctl 以及官方文档建议
- 更换内核 TCP 拥塞算法,可参考 TCP 拥塞控制算法适用性分析
- 关于加密算法的选择,可参考 rc4-md5 与 aes-256-cfb 各自的优劣
- 第三方加速模块如锐速(现已无免费版)、netspeeder(开源)、FinalSpeed(开源)等
关于部分国内网站可能提示的”不在此地区提供服务”
- 部分国内的 IP 不够完善,可通过相关网络工具查询其 AS 的 Announcement,手动添加至 iptable 的中国 IP 列表
关于服务器被封锁 IP
相信有经验的人可以感觉出,近年来 GFW DPI 的能力已经变得愈发强大,如果不幸被 Block 掉服务器,只能更换 IP
- 服务端部署调优后务必建立好快照(snapshot),更换 IP 后,可通过快照进行快速部署
- 更换 IP 并部署完毕之后,注意更改 shadowsocks 服务端配置文件中的 IP