自己动手,丰衣足食。通过Shadowsocks和OpenWrt打开世界之窗

Posted by ColasDAD on 26 Aug, 2022

本条信息旨在记录如何通过VPS上安装Shadowsocks-libev自建server,然后在OpenWrt路由器上安装配置client,从而实现世界漫游的低成本最佳实践。

一、安装VPS

1. VPS服务商选择

VPS是Virtual Private Server(虚拟专用服务器)的简称,是现在互联网上常见的低成本建立互联网服务器的方式,服务器的配置和线路好坏直接影响客户端的访问效率。 如果是做Shadowsocks代理服务器,其配置要求并不高,只要有1CPU,512M,10GB硬盘以上基本就足够了,最重要的是选择网络。 选择网络3要素,线路、时延、带宽,线路好坏影响最为直接,一步到位推荐选择走CN2GIA骨干网的VPS。 时延建议找VPS提供商的相同机房的机器通过ping命令来进行评估,测试不仅要考虑返回时间最短,还应考虑LOST丢包是否严重。 现阶段带宽30Mbps以上基本足够,此带宽已经可以满足4K 60FPS流媒体的要求。 最后VPS的服务器IP地址及类型也很关键,VPS的IP就是未来你经过代理后的访问互联网服务的IP,很多互联网服务商是按IP地址来区分地域进行服务的,并且会限定部分地址不能使用其服务,如Netflix。 所以请考虑好自身需求后按需选择,同时IP应尽量是原生IP而非广播IP。现阶段美国地区满足上述要求的VPS费用主流在500元一年左右。

2.VPS初装优化

VPS服务商选择好后即可购买相应的服务器,在服务器安装时会要求选择操作系统版本,想简单的推荐选择Debian 10。 但为了维护本系统管理员的操作习惯,我选择CentOS 7的Linux作为操作系统,下文都是基于此系统进行说明。 VPS准备好后即可开始服务器的初装优化,命令见下,#注释下皆为可执行的命令,如有遗漏请自行Google补:

#系统管理员开机第一要务,改root密码为复杂密码
passwd
#系统管理员开机第二要务,设置防火墙(这里不讨论通过VPS服务商提供的WEB配置防火墙,但思路相同)
#查看CentOS 7自带的firewalld防火墙是否启动
firewall-cmd --state
#如未启动通过下一条命令启动
systemctl start firewalld.service
#参考下一条命令配置指定的地址段才能远程访问服务器,包含ssh和未来的所有核心服务,减少服务被探测和攻击的风险。
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="20.17.0.0/18" accept"
#在上一条命令配置妥当的情况下,建议在防火墙上关闭默认的ssh服务。
firewall-cmd --permanent --remove-service=ssh
#重新加载,生效已配置的规则
firewall-cmd --reload
#检查已经生效的规则,如有不对的请及时修改并reload
firewall-cmd --list-all
#安装wget软件
yum -y install wget
#更新操作系统及已安装软件
yum -y update
#通过Teddysun的一键sh脚本安装Google BBR优化网络,此脚本执行完时会让选择是否重启服务器,可先选NO,完成后续优化后再重启。
wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh | bash bbr.sh
#Teddysun的BBR脚本未更新kernel-headers,需手动处理。
yum remove kernel-headers
yum --enablerepo=elrepo-kernel -y install kernel-ml-headers
#查看当前内核
uname -r
#查看系统已安装的可用内核
cat /boot/grub2/grub.cfg |grep menuentry
#修改开机时默认使用的内核,推荐使用5.x.x以上最新的内核
grub2-set-default 'CentOS Linux (5.3.11-1.el7.elrepo.x86_64) 7 (Core)'
#创建启动内核配置
grub2-mkconfig -o /boot/grub2/grub.cfggrub2-mkconfig -o /boot/grub2/grub.cfg
#开启TCP Fast Open功能
echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
sysctl -p
#优化完成重启服务器
reboot
#完成重启后查看系统安装了哪些内核包
rpm -qa |grep kernel
#使用yum remove 或rpm -e 删除无用内核,不能是当前使用的
yum -y remove kernel-3.10.0-1062.18.1.el7.x86_64

完成以上基本的服务器优化和安全设置就完成了,除此之外可以进阶关闭不必要的服务,完善安全配置等,最后记得定期yum -y update升级系统及软件。

3.VPS安装配置Shadowsocks-libev Server端

通过Teddysun的一键sh脚本安装Shadowsocks-libev建立服务。此脚本有4种版本的Shadowsocks服务端,认准使用Shadowsocks-libev即可,其它已黄; password密码自行设置,不要太简单; port端口建议8080、8880、2052、2082、2086、2095(HTTP)和2053、2083、2087、2096、8443(HTTPS)中任选,传统的80和443请留给真实的HTTP服务使用,选择上述端口是为了兼容Cloudflare的CDN,以备不时之需; cipher加密方式请选择chacha20-ietf-poly1305,实践为非硬件加速下速度最快最安全的,因Shadowsocks-libev使用的加解密库是libsodium,暂时只有部分x86下才支持AES硬件加速,如果硬件条件满足可以选择aes-128-gcm; simple-obfs混淆功能推荐安装并使用,混淆模式建议tls,因CN2 GIA线路基本已屏蔽普通HTTP请求,另外此一键脚本中不含v2ray-plugin的安装,可在github上自行下载,但v2ray-plugin在simple-obfs能使用时不建议使用,因为其消耗的资源更大并且会造成连接时延的增加,simple-obfs虽已不再更新,但在能用时就是最佳选择。

#下载安装脚本
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh | bash shadowsocks-all.sh

Shadowsocks-libev安装完毕后可参考下面红色部分客户化/etc/shadowsocks-libev/config.json文件,增加或修改参数”fast_open”为true,启用TCP Fast Open,降低网络时延,但是在部分运营商NAT的网络环境下(比如中国移不动),建议仍然使用false。

{
  "server":"0.0.0.0",
  "server_port":8080,
  "password":"XXXXXXX",
  "timeout":30,
  "user":"nobody",
  "method":"chacha20-ietf-poly1305",
  "fast_open":true,
  "nameserver":"8.8.8.8",
  "mode":"tcp_and_udp",
  "plugin":"obfs-server",
  "plugin_opts":"obfs=tls"
}

#完成所有配置后可以重启Shadowsocks-libev服务
service shadowsocks-libev restart

至此服务器的安装告一段落。


二、安装OpenWrt路由器

1. OpenWrt路由器选择

OpenWrt是一个基于Linux的嵌入式设备固件,相对原厂固件,OpenWrt开源,并且可扩展性很强,能够定制和实现更多的功能。 因此国内外有不少基于OpenWrt二次开发的固件,如KoolShare和Lean等;同时不少厂商也基于此开发了自己的路由器产品,如GL.iNet和NanoPi等。 但是作为一个系统管理员,怎么能过多的任人摆布,选择原版OpenWrt是最干净、最稳定、最安全的选择。 能直接刷官方编译好原版OpenWrt固件的路由器可以上OpenWrt官网中“Download a firmware image for your device”进行查询,注意要选择“Unsupported Functions”为空的设备,保证固件能够全面支持硬件的功能。 根据自建的VPS的带宽,对于不超过60Mbps的,可以考虑采用MIPS架构MT7621AT芯片的无线路由即可同时满足功耗、性能和无线连接的需求,性价比较高,采购价格不超100元。 对于更高带宽的需求则要考虑软路由+WIFI AP的形式来实现。不同路由器的刷机方法请参阅OpenWrt官网中相关说明或Google,本文不再展开。

2. OpenWrt软件安装

原版OpenWrt安装好后首先使用ssh登入管理终端进行安装和配置。

#更新软件安装列表
opkg update
#OpenWrt内建的wget不支持TLS,无法下载HTTPS网站上的软件包,因此还要安装完整版的wget和CA证书软件
opkg install luci wget ca-certificates
#使用下面命令查询你的路由器硬件架构信息并记录下来
opkg print-architecture | tail -1 | awk '{print $2}'
#使用以下命令下载并添加第三方包签名
wget http://openwrt-dist.sourceforge.net/packages/openwrt-dist.pub
opkg-key add openwrt-dist.pub
rm -f openwrt-dist.pub
#使用以下命令在/etc/opkg/customfeeds.conf中添加第三方包获取地址
echo "src/gz openwrt_dist http://openwrt-dist.sourceforge.net/packages/base/`opkg print-architecture | tail -1 | awk '{print $2}'`" >> /etc/opkg/customfeeds.conf
echo "src/gz openwrt_dist_luci http://openwrt-dist.sourceforge.net/packages/luci" >> /etc/opkg/customfeeds.conf
#再次更新软件安装列表并安装相关软件
opkg update
opkg install luci-i18n-base-zh-cn
opkg install iptables-mod-tproxy
opkg install kmod-ipt-nat
opkg install ChinaDNS
opkg install luci-app-chinadns
opkg install dns-forwarder
opkg install luci-app-dns-forwarder
opkg install shadowsocks-libev
opkg install luci-app-shadowsocks
opkg install simple-obfs
#如使用的是19.07以上版本的OpenWrt还需要安装luci兼容包,否则shadowsocks-libev的WEB配置页面会显示异常
opkg install luci-compat
#开启路由器TCP Fast Open功能
echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
sysctl -p
#获取一份IP地址列表进行直连设置,清单内的IP不通过SS进行转发,并将自动更新加入系统定时任务,每天3:00自动执行,CN|HK|MO|TW|JP|SG这里设置了中国、香港、澳门、台湾、日本、新加坡,大家可以根据自己需要进行调整。
wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | egrep "CN|HK|MO" | awk -F\| '/ipv4/ { printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > /etc/chinadns_chnroute.txt
touch /etc/crontabs/root
chmod 600 /etc/crontabs/root
echo "0 3 * * * wget -O- 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | egrep \"CN|HK|MO\" | awk -F\| '/ipv4/ { printf(\"%s/%d\n\", \$4, 32-log(\$5)/log(2)) }' > /etc/chinadns_chnroute.txt" >> /etc/crontabs/root
#获取一份我自建的国内CDN地址列表,做后续DNS解析优化用
wget --no-check-certificate https://colasdad.top/upload/Shadowsocks-dnsmasq-china-list.conf -O /etc/dnsmasq-china-list.conf

至此路由器的安装告一段落。

3. OpenWrt配置

软件安装好后就可以轻松的通过WEB方式登录OpenWrt管理页面luci进行管理配置了,普通的配置项本文不再进行讨论,这里只专注于Shadowsocks的相关配置。

登录Luci,指向“服务”,此时应该能够看到“影梭”、“DNS转发”和“ChinaDNS”三个选项。 其中“ChinaDNS”功能是不需要启动和使用的,因为传统UDP转发DNS请求会被阻拦,其功能改由走TLS的“DNS转发”替代,安装这个功能单纯是为了使用其集成于“影梭”中的ip分流功能。

DNS转发服务配置,点击进入“DNS转发”,勾选“启用”框,“监听端口”配置5302,“监听地址”配置0.0.0.0,“上游 DNS”配置8.8.8.8(Google的DNS,可根据个人喜好和线路情况替换境外的DNS服务器地址),完成后点击“保存并应用”生效配置,参考下图。

Shadowsocks客户端配置,点击进入“影梭”菜单,进入“访问控制”选项卡,“外网区域”中“被忽略IP列表”配置ChinaDNS路由表,ChinaDNS路由表即/etc/chinadns_chnroute.txt文件,文件中列明了中国大陆主要IP地址段,如有不足可以在“额外被忽略IP”中按照自己的需要添加不需要通过代理访问的IP地址,比如223.5.5.5,119.29.29.29等。 以上配置是为了让国内的流量直连而不经过代理,实现合理分流和国内资源的顺利访问,比如爱奇艺视频是不允许在境外地址播放的。其它配置可以使用默认设置,非特殊需求不用修改。完成后点击“保存并应用”生效配置,参考下图。

“影梭”菜单中,进入“服务器管理”选项卡,添加服务器配置,各项参数应与VPS服务器端的配置相对应。“插件参数”中“obfs-host”的配置信息为混淆功能HTTP头中服务器的域名,建议填写真实信息,域名可以找免费的域名提供商申请,如No-IP等,申请真实的域名可以更好的做好伪装,并且为后续申请真实TLS证书,切换v2ray-plugin插件做准备。 完成后点击“保存并应用”生效配置,参考下图。

影梭”菜单中,进入“常规设置”选项卡,“主服务器”选择已配置好的服务器信息,“UDP服务器”选择与主服务器相同,完成后点击“保存并应用”生效配置,参考下图。

路由器内建Dnsmasq配置,指向“网络”菜单,点击“DHCP/DNS”菜单,进入Dnsmasq设置。 进入“高级设置”选项卡,“额外的 SERVERS 文件”处设置/etc/dnsmasq-china-list.conf,通过该文件可以指定特定域名使用国内的DNS进行解析,避免CDN返回国外IP,造成访问国内互联网服务却绕道国外;“DNS 查询缓存的大小”设置为最大值10000,让dnsmasq缓存DNS解析记录,减少联机DNS查询,提高响应。完成后点击“保存并应用”生效配置,参考下图。

进入“HOSTS 和解析文件”选项卡,勾选“忽略解析文件”,完成后点击“保存并应用”生效配置,参考下图。

进入“常规设置”选项卡,“DNS 转发”设置为127.0.0.1#5302,将即dnsmasq提供的DNS解析转发到经dns-forwarder加密转发后的域名解析服务,保证域名解析不受影响和阻断。完成后点击“保存并应用”生效配置,参考下图。

路由器DHCP Server配置,指向“网络”,点击“接口”,编辑LAN网络,进入“DHCP 服务器”——“高级设置”选项卡,“DHCP 选项”配置为6,192.168.2.1(与路由器的LAN口所设置的IPv4 地址保持一致),让访问路由器的设备通过DHCP获取到的DNS服务器为路由器dnsmasq所提供的健康DNS服务,参考下图。同时LAN和WAN接口下常规设置中的“使用自定义的 DNS 服务器”也建议设置为127.0.0.1,让路由器本身也访问dnsmasq所提供的健康DNS服务,而非宽带提供商所提供的DNS服务。完成后点击“保存并应用”生效配置。

Shadowsocks-DHCP.png

至此路由器的配置告一段落,任何设备通过连接此路由器,就可以正常访问全世界。后续一些伪装防御招数,如安装Nginx做HTTP服务前置做好服务隐藏,换v2ray-plugin走真正HTTPS而非混淆,使用CDN套壳避免被BAN等就暂时就不讨论了,实用即王道,没必要一位追求极致,在没有受到影响之前,安心享受生活吧。

世界之大,自由看见


   跨境    DIY   

 Share on: Twitter / Facebook / Google+ / Email