伟明部落格

利用策略路由制作Shadowsocks服务器端

发布于 2022-05-22 18:26:01

架构图

有两台机器,AliHongkong 和 AliShenzhen

AliHongkong是阿里云的服务器,在香港地区,能够访问国际互联网

AliHongkong的信息
公网IP: 8.210.252.214
有一张TAP网卡tap4用于与AliShenzhen组成隧道
tap4网卡的IP为 192.168.55.1/24
simpletun服务器端监听8066端口

AliShenzhen 是阿里云的服务器,在深圳地区,为位于内地的客户端转发流量到AliHongkong服务器。

AliShenzhen的信息
公网IP:120.25.1.215
有一张TAP网卡tap5用于与AliHongkong组成隧道
tap5网卡的IP为 192.168.55.2/24
Shadowsocks服务器端监听8067端口
Shadowsocks以ss用户身份运行

tap4与tap5搭建的隧道使用加密版的simpletun,代码位于simpletun

由于要在AliShenzhen上使用基于用户id的策略路由,所以其系统Linux内核版本要为4.10或以上。

之所以通过AliShenzhen进行中转,是因为AliHongkong与AliShenzhen之间的连接比较稳定。由于内地客户端与AliShenzhen连接是在内地区域完成的,要比内地客户端直接与AliHongkong连接要好(因为涉及到跨区)。

下面是AliHongkong上的操作

# 创建TAP网卡
ip tuntap add dev tap4 mode tap
ip link set tap4 up
ip addr add 192.168.55.1/24 dev tap4

# 启动隧道监听
nohup ./simpletun -i tap4 -p 8066 -a -d -s &

下面是AliShenzhen上的操作

# 创建TAP网卡
ip tuntap add dev tap5 mode tap
ip link set tap5 up
ip addr add 192.168.55.2/24 dev tap5

# 关闭rp_filter反向路由校验
# 查看rp_filter值,看哪些值不为0
sysctl -a | grep rp_filter

# 在/etc/sysctl.conf中,将不为0的值设置为0,例如
net.ipv4.conf.all.rp_filter = 0
# 使设置生效
sysctl -p

# 建立隧道
nohup ./simpletun -i tap5 -p 8066 -a -d -c 8.210.252.214 &

# 添加用户ss(查看到其用户ID为1000)
useradd ss

# 编辑/etc/iproute2/rt_tables,添加ss_except路由表和ss路由表
vim /etc/iproute2/rt_tables
# 将下面两行添加进去
54 ss_except
55 ss

# 添加路由规则
ip rule add uidrange 1000-1000 lookup ss # ss用户的程序默认使用ss表
ip rule add uidrange 1000-1000 sport 8067 lookup ss_except # ss用户的程序与Shadowsocks客户通信使用ss_except表,8067为Shadowsocks的监听端口

# 给这两个路由表添加条目
ip route add default via 192.168.55.1 table ss # ss默认走隧道网关
ip route add default via 172.25.111.253 table ss_except # ss_except用于与Shadowsocks通信,走回原先eth0的网关,这里的172.25.111.253是eth0的网关

# 查看规则列表
[root@iZwz9bb1tttdsmhn8zf74yZ ~]# ip rule list
0:  from all lookup local
32764:  from all uidrange 1000-1000 sport 8067 lookup ss_except
32765:  from all uidrange 1000-1000 lookup ss
32766:  from all lookup main
32767:  from all lookup default

然后,切到ss用户
su - ss
cd ~
mkdir ss
cd ss
# 下载Shadowsocks
wget https://github.com/shadowsocks/shadowsocks-go/releases/download/1.2.1/shadowsocks-server.tar.gz

# 编辑配置文件
vim config.json
# 配置如下内容
{
    "server":"127.0.0.1",
    "server_port":8067,
    "local_port":1080,
    "local_address":"127.0.0.1",
    "password":"d89f6ad9c645e74758043c",
    "method": "aes-256-cfb",
    "timeout":600
}

# 运行命令(会在当前目录下寻找config.json)
nohup ./shadowsocks-server > ss.log &

然后,就可以打开客户端连接Shadowsocks服务器端了。

更新于 2025-11-09 11:18:41