网络访问之 Socks 代理

代理与转发是计算机网络中核心技术,它能将一端的信息转发到另一端,让彼此通过网络连接进行通信。

常用的代理转发技术有如下参考实现:

proxy-forward.jpg

本文对 Socks 代理展开说明,并使用经典软件 ss5 。

什么是 Socks 代理

Socks 是一种网络传输协议,主要用于客户端与外网服务器之间通讯的中间传递。

Socks 目前具有多个版本 Socks4/Socks4a/Sock5, Socks5 比 Socks4 和 Socks4a 多了认证鉴权、IPv6、UDP支持。

Socks 代理是相应的采用 Socks 协议的代理请求的服务器。

Socks 运行在传输层,只需要了解 IP 和端口,不会对应用层数据进行处理。由于运行在传输层协议,Socks 能代理大多数的上层协议。Socks代理比其他应用层代理要快得多,它通常绑定在代理服务器的1080端口上。

场景

  • 局域网内,只有一台可以访问互联网的机器,由这台机器进行代理访问互联网
  • 访问 Overlay 网络下 Kubernetes 中服务
  • 访问其他城市分公司内部的网络
  • 企业内网安全限制只提供代理访问 www 网络
  • 机房网复杂的网络限制下的服务访问
  • 还可以代理 SMPT、FTP、HTTP 等应用层协议

之前有什么方法

之前在访问一个网络中的服务时一般是搭建一个能联通两个网络的 nginx 服务,比如配置双网卡的方式。然后在 nginx 上添加 tcp 或 http 的代理来访问服务。例如:

upstream tcp9004 {
    server 1.1.1.1:8992;
}

server {
    listen 9004;
    proxy_pass tcp9004;
}

后来了解到 sshd 可以支持 Socks 代理访问一个网络,在代理节点上通过如下配置即可

echo 1 >/proc/sys/net/ipv4/ip_forward

vi /etc/ssh/sshd_config
AllowTcpForwarding yes 
GatewayPorts yes

systemctl restart sshd.service || service sshd restart

ssh -g -N -f -o ServerAliveInterval=60 -D 1080  root@127.0.0.1 

但是由于 sshd 提供代理时总是提示告警信息,而且性能也不是很好。直到后来了解到专业的 socks 代理软件 ss5,对其有一定的了解后感觉是个不错的选择,本文主要对 ss5 进行介绍说明。

下载安装软件

ss5 软件下载:https://nchc.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz

获取软件后,解压后查看 INSTALL 文件描述了软件的安装方法

  1. cd to the directory containing the ss5 source code
     and type:

        ./configure

  2. To compile ss5, type:

         make

  3. To install ss5, type:

        make install

但是在实际安装时会有软件包的依赖,例如在 CentOS7 系统需要安装以下依赖软件包

yum -y install gcc openldap-devel pam-devel openssl-devel make

Dockerfile 构建镜像

ss5 软件下载列表 中可以看出 ss5 支持的平台还是有限的,在不同的操作系统或 CPU 架构下安装 ss5 是有一定的难度的。

基于容器的方式选择稳定支持的发行版(如:Redhat/CentOS)进行安装打包,可以很方便的在不同的平台上进行移植,大大降低了多平台安装部署的复杂度。

以下是笔者使用的 Dockerfile ,可以根据需求进行调整修改,文件内容如下:

FROM centos:centos7

RUN  rm -f /etc/yum.repos.d/* && \
     curl http://mirrors.163.com/.help/CentOS7-Base-163.repo > /etc/yum.repos.d/CentOS7-Base-163.repo && \
     yum makecache && \
     yum -y install gcc openldap-devel pam-devel openssl-devel make && \
     yum clean all

ADD https://nchc.dl.sourceforge.net/project/ss5/ss5/3.8.9-8/ss5-3.8.9-8.tar.gz /

RUN tar xf ss5-3.8.9-8.tar.gz && cd   ss5-3.8.9 && \
    ./configure && make && make install && \
    echo 'auth    0.0.0.0/0       -        -' > /etc/opt/ss5/ss5.conf && \
    echo 'permit  -   0.0.0.0/0   -   0.0.0.0/0   -   -   -   -   -' >> /etc/opt/ss5/ss5.conf && \
    echo '#!/bin/sh -x' > /ss5-start.sh && \
    echo 'test -f /etc/sysconfig/ss5 && . /etc/sysconfig/ss5' >> /ss5-start.sh && \
    echo '/usr/sbin/ss5 -t $SS5_OPTS' >> /ss5-start.sh && \
    echo 'tail -f /var/log/ss5/ss5.log' >> /ss5-start.sh && chmod +x /ss5-start.sh

ENTRYPOINT ["/ss5-start.sh"]

执行命令构建

docker build -t cncfstack/ss5:v0.5 .

以上可以构建出一个 cncfstack/ss5:v0.5 的镜像,可以使用该镜像运行 ss5 容器服务,或者调整 tag 推送到镜像仓库(例如:harbor)。

配置编写

SS5 守护进程通常读取 /etc/opt/ss5/ss5.conf 中的配置文件。

配置文件包含以下部分部分:

  • variable and flags:变量和标记
  • authentication:身份验证
  • authorization:授权
  • bandwidth:带宽
  • proxy:代理
  • dump: 转存储
  • routing:路由
  • balancing: 负载均衡
  • miscellaneous:其他

每部分的详细配置可以参考: Configuration(配置)

简单的配置方式可以只需要配置 auth 和 permit 即可,例如:

# cat /etc/opt/ss5/ss5.conf
auth    0.0.0.0/0       -        -
permit  -   0.0.0.0/0   -   0.0.0.0/0   -   -   -   -   -

该配置没有开启 auth 认证功能,即任何人都可以不认证直接使用该代理服务器。

permit 的配置没有进行任何的权限限制,即客户端可以访问任何 ss5 服务器可以访问的服务。

注意:

该配置建议在可控的企业内网使用,请勿直接暴露到不安全的公网。

默认情况 ss5 是 root 用户启动的,如果需要使用其他用户启动服务,或者添加其他启动参数,可以通过修改配置 /etc/sysconfig/ss5 来支持:

# cat /etc/sysconfig/ss5
# Add startup option here
#SS5_OPTS=" -u root"

服务运行管理

原生的 ss5 软件包编译安装完成后,使用 /etc/init.d/ss5 来管理服务运行

test -f /etc/sysconfig/ss5 && . /etc/sysconfig/ss5
......
            daemon /usr/sbin/ss5 -t $SS5_OPTS

脚本的核心功能就是加载 /etc/sysconfig/ss5 文件,读取到 SS5_OPTS 环境变量用以启动 ss5 服务。

该服务脚本提供了对 ss5 服务的管理,如: start|stop|status|restart|reload

当使用容器运行时可以直接使用该命令启动 ss5 服务:

docker run -itd --restart=always --network host --name ss5  cncfstack/ss5:v0.5

该命令表示:以后台服务进程运行 ss5 容器服务,同时直接使用宿主机网络(host 网络)作为容器网络。由于 ss5 配置的默认,会监听宿主机所有 IP 地址的 1080 端口。

如果容器不想使用宿主机网络,或者 1080 端口已经被占用了的情况,可以使用 -p 添加端口映射;如果想修改 ss5 的配置文件,可以通过 -v 来挂载宿主机上的配置文件

docker run -itd --name ss5 \
           -p 1080:1080 \
           --restart=always \
           -v /data/ss5/configdir:/etc/opt/ss5/ \
           -v /data/ss5/sysconfig:/etc/sysconfig/ss5 \
           cncfstack/ss5:v0.5

两种不同的运行方式,第二种由于使用容器的网络,数据包经过 iptables 转发过程会一定的性能损耗,理论上 host 网络方案性能更好。

需要注意的是,客户端的请求交由 ss5 进行代理,这就要求 ss5 服务能够正常访问目标服务,这里常见的一个问题是域名无法解析。当目标访问服务是域名时,需要 ss5 服务器上的 DNS 或 hosts 能够正常解析该域名。

监控统计及运行时配置修改

ss5 服务在运行过程中如果添加或修改配置,需要重新加载配置或者重启 ss5 服务,这会导致已经建立的链接发生中断的情况。ss5 运行时配置 Server Manager 提供一种可以在 ss5 运行时直接修改配置的方法。

注意: Server Manager 修改配置是立刻生效的。 Server Manager 修改的配置不会自动化保存到文件中,为使配置固化保存,需要将配置的修改添加到配置文件中。

ss5srv 是一个命令行工具,用于查询或修改 ss5 在线配置。对 ss5 在线配置的更改立即生效,不需要重新加载。

查看运行数据或配置:

ss5srv show_connect
ss5srv show_bind
ss5srv show_udp
ss5srv list_method
ss5srv list_autho
ss5srv list_proxy
ss5srv list_route
ss5srv list_dump
ss5srv list_virtual
ss5srv list_bandwidth
ss5srv disp_authcache
ss5srv disp_authocache
ss5srv disp_virtualcache

修改运行时配置:

ss5srv add_bandwidth
ss5srv del_bandwidth
ss5srv add_method
ss5srv del_method

更详细的命令说明,请查看: http://www.zhaowenyu.com/ss5-doc/server-manager.html

代理配置

Windows 系统代理配置

Windows 系统的代理能够给整个系统内所有的应用提供代理功能,这在一些局域网内通过代理访问互联网的的场景效果很好。

windows-proxy-set

微信代理配置

对于大部分的应用,一般也会提供单独提供代理的配置使其能够访问互联网,例如微信:

wechart-proxy-set

Google 代理插件 SwitchyOmega

对于浏览器访问互联网比较常见,如果不想修改系统全局的代理配置,可以通过添加代理插件的访问目标网络。在 Chrome 浏览器中习惯使用 SwitchyOmega 这个代理插件。

插件获取地址: http://getcrx.cn/#/https://github.com/FelisCatus/SwitchyOmega/releases

switchOmega-proxy-set

总结

由于企业防火墙限制、IPv4 地址紧缺、不同机房网络隔离、VxLAN 下 VPC 网络的隔离、Overlay 网络中 Kubernetes 集群隔离等等原因导致客户端无法直接访问目标服务或网络。技术上可以通过搭建 VPN、配置路由等方式打通网络间的隔离情况,当然使用 Socks 代理也是一种解决方案,Sockts 代理的核心是通过一个节点代理访问目标服务或整个目标网络,不需要和目标服务或网络直接互通。

参考

http://ss5.sourceforge.net/ https://zh.wikipedia.org/wiki/SOCKS

Copyright © 温玉 2021 | 浙ICP备2020032454号 all right reserved,powered by Gitbook该文件修订时间: 2022-09-09 09:30:41

results matching ""

    No results matching ""