如何解决linux下的代理访问

起因

想在 linux 上安装 helm,结果网速巨慢,于是想给服务器配个代理

代理安装

  1. 配置pip源

    1
    2
    3
    4
    5
    cat > /root/.pip/pip.conf << eof
    [global]
    trusted-host = pypi.douban.com
    index-url = http://pypi.douban.com/simple
    eof
  2. pip升个级

    1
    yum install python3 -y && pip3 install --upgrade pip
  3. 安装ss

    1
    pip install shadowsocks
  4. 创建ss-local配置文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    mkdir /etc/ss
    cat > /etc/ss/ss.json << eof
    {
    "server":"ss 服务端 ip",
    "server_port":"ss 服务端端口",
    "local_address": "127.0.0.1",
    "local_port":1080,
    "password":"ss 服务端密码",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": false,
    "workers": 1
    }
    eof
  5. 创建ss service

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    cat > /etc/systemd/system/ss.service << eof
    [Unit]
    Description=ss
    [Service]
    TimeoutStartSec=0
    Restart=always
    RestartSec=30
    ExecStart=/usr/local/bin/sslocal -c /etc/ss/ss.json start
    ExecStop=/usr/bin/killall sslocal
    [Install]
    WantedBy=multi-user.target
    eof

    # 如果没有 killall ,则执行
    yum install psmisc -y
  6. 自启动ss service

    1
    2
    3
    4
    5
    6
    7
    systemctl daemon-reload
    systemctl enable ss.service
    systemctl start ss.service
    systemctl status ss

    # 到此为止,已经可以使用 ss 代理了,验证一下
    curl --socks5 127.0.0.1:1080 http://httpbin.org/ip
  7. 安装privoxy (为了使用 http 代理)

    1
    yum install privoxy -y
  8. 增加 privoxy 的配置文件

    1
    2
    3
    # 增加一条转发规则
    echo 'forward-socks5t / 127.0.0.1:1080 .' >> /etc/privoxy/config
    # 默认配置已经打开 listen-address 127.0.0.1:8118 (http代理端口)
  9. 启动 privoxy 代理

    1
    2
    3
    systemctl enable privoxy
    systemctl restart privoxy
    systemctl status privoxy
  10. 安装 proxychains-ng (为了支持单个进程的代理)

    1
    2
    3
    4
    5
    6
    7
    yum install -y git
    export http_proxy=http://127.0.0.1:8118; export https_proxy=https://127.0.0.1:8118; # 解决 git 慢的问题
    git clone --depth=1 https://github.com/rofl0r/proxychains-ng
    yum install gcc -y
    cd proxychains-ng
    ./configure --prefix=/usr --sysconfdir=/etc
    make && make install && make install-config
  11. 修改 proxychains 配置

    1
    2
    vim /etc/proxychains.conf
    # 把最后一行的 socks4 127.0.0.1 9050 改成 socks5 127.0.0.1 1080
  12. 起个别名

    1
    ln -s /usr/bin/proxychains4 /usr/bin/proxy
  13. 测试一下

    1
    proxy curl www.google.com

自此以后,如果没法访问一些资源,则使用:
proxy + 要执行的命令

如果想在整个终端中使用 http 代理,则: (这是 privoxy 带来的)

1
2
export http_proxy=127.0.0.1:8118
export https_proxy=127.0.0.1:8118

以下,终于可以不受限制地安装helm了。。。

1
2
3
4
5
6
#helm安装
wget https://get.helm.sh/helm-v3.2.4-linux-amd64.tar.gz

tar -zxvf helm-v3.2.4-linux-amd64.tar.gz

mv linux-amd64/helm /usr/local/bin/helm

相关的程序也可以看下: polipo

其他 ss 问题

  1. 如果希望使用多级 ss (一台机器 作为 另一台机器的 中转 ss)

    • 能够使用 ssh, 则参照 反穿技术哪家强
    • 能够使用 ss-tunnel,则 ① 中转机启动 ss-local (假设本地代理端口为 50000) ② 中转机启动 ss-server ③ 使用 ss-tunnel -l 1080 -b 127.0.0.1 -L 127.0.0.1:50000 (监听本地 1080)。这种方案 和 ssh 的方案本质一样,都是转发本地端口到远端端口。
    • 仅能使用 ss-local,则 ① 中转机启动 ss-local, 用于连接到上位ss ② 中转机启动 ss-server, 用于承接 PC 上的连接 ③ 使用 proxy ssserver
    • 如果中转机上使用的 ss-local , 那么任何能提供 认证 能力的 tunnel,都能满足需求,比如 gostnpsclash
    • 最简单的方式,是直接用 iptables 转发即可,直接使用 iptables -t nat -A PREROUTING -4 -p tcp --dport 50000 -j DNAT --to-destination xxx.xxx.xxx.xx:50001 即可 (本地 50000 转发到 上位 ss 的 50001)
      ps: 使用 iptables 有两个坑要注意下,① 要配置 内核参数允许转发 net.ipv4.ip_forward = 1 ② 要设置出网 ip 替换 iptables -t nat -A POSTROUTING -4 -p tcp --dport 50001 -j MASQUERADE,否则回包的地址就错了

      注意,server 端要配置 /etc/ssh/sshd_config 的 GatewayPorts yes,允许包的转发

  2. 如果想用 ss 作为全局代理,可以使用 redsocks + iptables 的方案。

  3. ssh 其实非常强大, 我们完全可以不用 ss-server 作为代理,直接使用 ssh -D 1080 user@host, 就能做到同样的事情。

  4. 调试网络的过程中,有几个很好用的工具

    • ss 查看 socket 相关信息,和 netstat 有重合的部分
    • netstat 查看 socket 相关信息、路由信息
    • ip 查看或修改 路由、网卡
    • ifconfig 网卡信息查看及配置
    • tcpdump tcp 抓包工具 tcpdump
    • telnet 远程登录
    • nc socket 转发 一些常用的linux命令记录
    • iptables iptables 管理工具
    • ipvsadm ipvs 管理工具
    • dig / nslookup dns 查询
    • curl 支持多种应用层协议的工具
  5. 希望 ss 有认证、流量计费能力,可以结合 RADIUS ,具体可以参考: http://ss5.sourceforge.net/configuration.htm

  6. ssserver 在使用 vpn 的场景下会有一个问题 => 连接到 ssserver 的 client 无法访问 vpn 后面的服务。这预计是由于 ssserver 收到包之后,直接从网关转出去了,而没有重新走 routes (具体原因待探究)。 在测试这个问题时,发现使用 clash 在同样场景下是可以访问 vpn 后面的服务的。 clash 是一个更丰富、更强大的代理工具,可以认为是 代理 + 代理的代理,并且配备了 DNS-server,这在一些有特殊 DNS resolve 需求的场景下就非常好用了。

  7. clash 是一个聚合型的代理客户端,可以参考 clash 非官方wiki ,桌面端可以搜索 clashx,web ui 可以查看 yacd ,clash 也同样可以作为 http / sock5 代理节点。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!