Rocky9安装Shadowsocks实现科学上网

系统环境

系统:Rocky Linux 9.3

背景

在一些软件的安装过程中,存在部分安装包和依赖在国外,又由于长城防火墙的拦截,导致下载非常缓慢,经常出现由于网络的原因导致安装失败的情况。为此可以借助一些科学上网的工具,使得服务器可以突破网络限制,实现流畅的访问外网,让服务器软件安装过程更加顺利。

我这里是通过安装 Shadowsocks,并设置可访问外网的服务器配置(需提前购买外网云服务,即:梯子,注册链接: https://azabudai.org/auth/register?code=tGfK 邀请码:tGfK ),再安装Privoxy,设置系统代理实现外网访问。

安装 PIP

# 更新系统软件包
dnf update -y

# 安装python
dnf install python39 -y

# 查看python安装版本
python3.9 --version

# 安装pip
dnf install python3.9-pip

# 查看pip3版本
pip3 --version

# 更新pip3安装版本
pip3 install --upgrade pip

# 查看pip3版本
pip3 --version

# 查看pip3帮助信息
pip3 --help

安装和配置 Shadowsocks

使用 pip3 安装 Shadowsocks

sudo pip3 install -y shadowsocks

配置 shadowsocks

新建配置文件夹和文件

sudo mkdir /etc/shadowsocks
sudo vim /etc/shadowsocks/shadowsocks.json
  • 配置内容如下:

    {
        "server": "替换成自己的服务器ip或域名",
        "local_address": "127.0.0.1",
        "local_port": 1080,
        "timeout": 300,
        "workers": 1,
        "server_port": 31558,
        "password": "替换成自己的服务器密码",
        "method": "rc4-md5",
        "plugin": ""
    }
  • 配置解析

    server:Shadowsocks 服务器地址
    server_port:Shadowsocks 服务器端口
    local_address:本地 Sock5 代理地址
    local_port:本地 Sock5 代理端口
    password:Shadowsocks 连接密码
    timeout:超时等待时间(秒)
    method:加密方式
    workers:工作线程数

启动脚本

创建启动脚本 /etc/systemd/system/shadowsocks.service

这里请确认你的 sslocal 的所在位置,自行修改脚本文件中的 /usr/local/bin/sslocal位置不对启动服务时会报 203 错误

确认 sslocal 所在路径

[root@localhost ~]# ls /usr/local/bin/sslocal
/usr/local/bin/sslocal

创建Shadowsocks启动脚本

sudo vim /etc/systemd/system/shadowsocks.service
  • 内容如下:

    [Unit]
    Description=Shadowsocks
      
    [Service]
    TimeoutStartSec=0
    ExecStart=/usr/local/bin/sslocal -c /etc/shadowsocks/shadowsocks.json
      
    [Install]
    WantedBy=multi-user.target

启动脚本授权

chmod 755 /usr/local/bin/sslocal

shadowsocks 启动命令

# 开机自启动
sudo systemctl enable shadowsocks.service
# 启动服务
sudo systemctl start shadowsocks.service
# 查看状态
sudo systemctl status shadowsocks.service
# 停止服务
sudo systemctl stop shadowsocks.service

启动 shadowsocks 发现错误

执行 sudo systemctl status shadowsocks.service 出现报错:

× shadowsocks.service - Shadowsocks
     Loaded: loaded (/etc/systemd/system/shadowsocks.service; enabled; preset: disabled)
     Active: failed (Result: exit-code) since Wed 2025-01-08 09:58:27 CST; 5s ago
   Duration: 70ms
    Process: 4756 ExecStart=/usr/local/bin/sslocal -c /etc/shadowsocks/shadowsocks.json (code=exited, status=1/FAILURE)
   Main PID: 4756 (code=exited, status=1/FAILURE)
        CPU: 66ms

Jan 08 09:58:27 localhost.localdomain sslocal[4756]:     load_openssl()
Jan 08 09:58:27 localhost.localdomain sslocal[4756]:   File "/usr/local/lib/python3.9/site-packages/shadowsocks/crypto/openssl.py", line 52, in load_openssl
Jan 08 09:58:27 localhost.localdomain sslocal[4756]:     libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)
Jan 08 09:58:27 localhost.localdomain sslocal[4756]:   File "/usr/lib64/python3.9/ctypes/__init__.py", line 387, in __getattr__
Jan 08 09:58:27 localhost.localdomain sslocal[4756]:     func = self.__getitem__(name)
Jan 08 09:58:27 localhost.localdomain sslocal[4756]:   File "/usr/lib64/python3.9/ctypes/__init__.py", line 392, in __getitem__
Jan 08 09:58:27 localhost.localdomain sslocal[4756]:     func = self._FuncPtr((name_or_ordinal, self))
Jan 08 09:58:27 localhost.localdomain sslocal[4756]: AttributeError: /lib64/libcrypto.so.3: undefined symbol: EVP_CIPHER_CTX_cleanup
Jan 08 09:58:27 localhost.localdomain systemd[1]: shadowsocks.service: Main process exited, code=exited, status=1/FAILURE
Jan 08 09:58:27 localhost.localdomain systemd[1]: shadowsocks.service: Failed with result 'exit-code'.
[root@localhost ~]# vim /usr/local/lib/python3.9/site-packages/shadowsocks/crypto/openssl.py

解决方式: 把所有的 EVP_CIPHER_CTX_cleanup 都改成 EVP_CIPHER_CTX_reset 就行。

# 替换文本内容
sudo sed -i 's/EVP_CIPHER_CTX_cleanup/EVP_CIPHER_CTX_reset/g' /usr/local/lib/python3.9/site-packages/shadowsocks/crypto/openssl.py

# 重启 shadowsockts
sudo systemctl restart shadowsocks.service

参考:https://www.yangyang.cloud/blog/2020/09/23/solved-shadowsocks-undefined-symbol/

参考:http://qiushao.net/2019/11/14/Linux/ubuntu-shadowsocks/

修改完之后,发现依然报错:

报错内容:

INFO: loading config from /etc/shadowsocks/shadowsocks.json
2025-01-08 10:18:44 INFO     loading libcrypto from libcrypto.so.3
Traceback (most recent call last):
  File "/usr/local/bin/sslocal", line 8, in <module>
    sys.exit(main())
  File "/usr/local/lib/python3.9/site-packages/shadowsocks/local.py", line 39, in main
    config = shell.get_config(True)
  File "/usr/local/lib/python3.9/site-packages/shadowsocks/shell.py", line 262, in get_config
    check_config(config, is_local)
  File "/usr/local/lib/python3.9/site-packages/shadowsocks/shell.py", line 124, in check_config
    encrypt.try_cipher(config['password'], config['method'])
  File "/usr/local/lib/python3.9/site-packages/shadowsocks/encrypt.py", line 44, in try_cipher
    Encryptor(key, method)
  File "/usr/local/lib/python3.9/site-packages/shadowsocks/encrypt.py", line 82, in __init__
    self.cipher = self.get_cipher(key, method, 1,
  File "/usr/local/lib/python3.9/site-packages/shadowsocks/encrypt.py", line 109, in get_cipher
    return m[2](method, key, iv, op)
  File "/usr/local/lib/python3.9/site-packages/shadowsocks/crypto/rc4_md5.py", line 33, in create_cipher
    return openssl.OpenSSLCrypto(b'rc4', rc4_key, b'', op)
  File "/usr/local/lib/python3.9/site-packages/shadowsocks/crypto/openssl.py", line 92, in __init__
    raise Exception('can not initialize cipher context')
Exception: can not initialize cipher context
Segmentation fault (core dumped)
  • 解决方式:开启 RC4-MD5 支持

    参考链接:https://blog.vinsonws.cn/2023/05/25/openssl-openssl3-%E5%A6%82%E4%BD%95%E5%BC%80%E5%90%AF-rc4-md5-%E6%94%AF%E6%8C%81/

    • 编辑 openssl.cnf

      vi /etc/ssl/openssl.cnf

      在 provider_sect 下添加 legacy = legacy_sect

      [provider_sect]
      legacy = legacy_sect

      然后,将

      [default_sect]
      # activate = 1

      替换为

      [default_sect]
      activate = 1
      [legacy_sect]
      activate = 1

      重新启动程序测试

      [root@localhost ~]# /usr/local/bin/sslocal -c /etc/shadowsocks/shadowsocks.json
      INFO: loading config from /etc/shadowsocks/shadowsocks.json
      2025-01-08 10:26:30 INFO     loading libcrypto from libcrypto.so.3
      2025-01-08 10:26:30 INFO     starting local at 127.0.0.1:1080

      启动 shadowsockts

      # 重启 shadowsockts
      sudo systemctl restart shadowsocks.service

安装和配置 Privoxy

安装 Privoxy

dnf install -y privoxy

修改 privoxy 配置

修改配置 
vim /etc/privoxy/config

# 搜索 forward-socks5t,将 forward-socks5t / 127.0.0.1:9050 . 取消注释并修改为
forward-socks5t / 127.0.0.1:1080 .  # 注意最后有个点

# 然后取消以下几行代码注释,本地网络不翻墙
forward         192.168.*.*/     .
forward            10.*.*.*/     .
forward           127.*.*.*/     .

forward           localhost/     .

启动 privoxy

# 设置开机自启
systemctl enable privoxy

# 启动privoxy(这一步需要在读取配置文件之前执行))
systemctl start privoxy

# 查看privoxy状态
systemctl status privoxy

# 停止
systemctl stop privoxy

privoxy 读取配置

privoxy /etc/privoxy/config

配置系统环境变量

修改 /etc/profile

vim /etc/profile

# 添加如下内容:
export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118
export all_proxy=http://127.0.0.1:8118

使配置生效

source /etc/profile

测试网络代理

# 测试wget下载谷歌首页
wget www.google.com

# 测试 curl
curl https://www.google.com

停止网络代理

不需要使用代理时停止网络代理,节约流量。

注释掉网络代理设置,并使环境变量生效

vim /etc/profile
# 注释掉网络代理环境变量
# export http_proxy=http://127.0.0.1:8118
# export https_proxy=http://127.0.0.1:8118
# export all_proxy=http://127.0.0.1:8118

# 使配置生效
source /etc/profile
unset http_proxy
unset https_proxy
unset all_proxy

参考


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 george_95@126.com