说明

记录下这次站点搭建本意还是为了给自己做过的事情做个笔记。

ss站点如何搭建,网上的其它地方也有很多很详细的说明,本文也提供不出更多更新的东西了。

只是中间遇到的几个波折很有意思,个人觉得有一点记录下来的价值。

搭建

服务器搭建在vultr的云服务器上,使用的操作系统是Ubuntu 24.04 LTS x64。

搭建服务使用的是秋水逸冰(Teddysun)的一键安装脚本。

1
2
3
wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh
chmod +x shadowsocks-all.sh
./shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log

提示的四种安装选项,选择了Shadowsocks-Python,没有什么特别的原因,只是以前用过SSR,想尝试一下新的东西。

Python安装报错

这是安装中出现的第一个问题。安装失败,出现了如下提示的报错。

[Error] Failed to install python,Please visit: https://teddysun.com/486.html and contact.

原因很简单,操作系统不认识python,只认识python3,安装包也一样,所以要对原本的脚本进行修改。

找到shadowsocks-all.sh这个文件,在文件里找到一个install_dependencies的部分,内容大概是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
install_dependencies(){
    if check_sys packageManager yum; then
        echo -e "[${green}Info${plain}] Checking the EPEL repository..."
        if [ ! -f /etc/yum.repos.d/epel.repo ]; then
            yum install -y epel-release > /dev/null 2>&1
        fi
        [ ! -f /etc/yum.repos.d/epel.repo ] && echo -e "[${red}Error${plain}] Install EPEL repository failed, please check it." && exit 1
        [ ! "$(command -v yum-config-manager)" ] && yum install -y yum-utils > /dev/null 2>&1
        [ x"$(yum-config-manager epel | grep -w enabled | awk '{print $3}')" != x'True' ] && yum-config-manager --enable epel > /dev/null 2>&1
        echo -e "[${green}Info${plain}] Checking the EPEL repository complete..."
       
        yum_depends=(
            unzip gzip openssl openssl-devel gcc python python-devel python-setuptools pcre pcre-devel libtool libevent
            autoconf automake make curl curl-devel zlib-devel perl perl-devel cpio expat-devel gettext-devel
            libev-devel c-ares-devel git qrencode
        )
        for depend in ${yum_depends[@]}; do
            error_detect_depends "yum -y install ${depend}"
        done
    elif check_sys packageManager apt; then
        apt_depends=(
            gettext build-essential unzip gzip python python-dev python-setuptools curl openssl libssl-dev
            autoconf automake libtool gcc make perl cpio libpcre3 libpcre3-dev zlib1g-dev libev-dev libc-ares-dev git qrencode
        )
        apt-get -y update
        for depend in ${apt_depends[@]}; do
            error_detect_depends "apt-get -y install ${depend}"
        done
    fi
}

把里面的python都修改成python3就可以了。

当然,我在这里还额外做了一点事情,我安装了Ubuntu提供的python-is-python3包,为的是减少脚本代码可能出现的错误。

1
sudo apt install python-is-python3

这一切都做好之后,使用上面说到的一键安装脚本里,第三行的那个命令,再执行一次。

安装成功。

运行错误

但安装成功不代表运行就能成功。

服务的脚本位于/etc/init.d/目录下,我安装的是ss-python,所以可以看到一个shadowsocks-python文件。

这里记录一下不同版本的文件的脚本命令和配置文件。

脚本命令:

1
2
3
4
5
6
7
8
9
10
11
Shadowsocks-Python 版:
/etc/init.d/shadowsocks-python start | stop | restart | status

ShadowsocksR 版:
/etc/init.d/shadowsocks-r start | stop | restart | status

Shadowsocks-Go 版:
/etc/init.d/shadowsocks-go start | stop | restart | status

Shadowsocks-libev 版:
/etc/init.d/shadowsocks-libev start | stop | restart | status

默认配置文件:

1
2
3
4
5
6
7
8
9
10
11
Shadowsocks-Python 版:
/etc/shadowsocks-python/config.json

ShadowsocksR 版:
/etc/shadowsocks-r/config.json

Shadowsocks-Go 版:
/etc/shadowsocks-go/config.json

Shadowsocks-libev 版:
/etc/shadowsocks-libev/config.json

使用/etc/init.d/shadowsocks-python status命令后,发现服务处于停止状态。

查看日志,可以看到报错记录信息。发现一个关键报错信息:

Because collections.MutableMapping is deprecated in python3.10, so you have to change the file where it is called to "collections.abc," which is the most current way to import MutableMapping.

出现这样的报错,是因为在较早的版本中,MutableMapping是通过collections导入的,而Python3.3之后,MutableMapping等抽象类基类已经被移动到collections.abc模块中,在Python3.10之后,直接从collections模块导入会被标记为弃用,引发警告,并且以后的Python版本中,collections里是没有MutableMapping的了。

简单来说,就是要改代码。

好在上文的报错信息里,我可以看到报错的文件是哪些,以及这些文件的存放路径。

找到出现问题的代码文件,发现头部的引用是import collections,于是在开头加入from collections.abc import MutableMapping

并且找到文件中使用了collections.MutableMapping的地方,改成MutableMapping

修改好文件之后,执行脚本重新启动命令重启服务,再次查看状态,发现成功启动。

端口开启

服务是启动了,却发现连不上。

使用ping和telnet分别检查,发现能ping通,telnet却打不开我们预先设置的端口。

那应该就是端口的问题了。

使用ufw命令,首先查看端口状态。

1
sudo ufw status

发现端口只有22是打开的,那就不奇怪了。

执行以下命令,把<ss-port>替换成之前配置的服务端口。

1
2
3
sudo ufw allow <ss-port>/tcp
sudo ufw allow <ss-port>/udp
sudo ufw reload

接下来再次进行测试,本地telnet也能正确打开远程端口了。

再尝试使用客户端连接,成功。

搞定!