公司里绝大多数主机已经禁止外网访问,仅保留一台主机设置socks
作为代理服务器。如下为对socks这一概念的学习整理
什么是socks
是OSI
模型下会话层的协议,位于表示层与传输层之间,作用是:
出现原因
RFC 1928 这里解释的已经很清楚
由于工作在会话层,传输层在它下面,所以它的适应场景就要比HTTP
代理灵活,可以代理更多类型的应用数据,日常开发最常用的那些工作在应用层的协议就不在话下了
配置
socks的配置比较简单,可以简单(这是最简单的情况)分为不能访问外网的客户端服务器和可以访问外网代理服务器(这两者之间内网可联通)
代理服务器设置
通过SSH
在本地启动一个 SOCKS
代理服务器
ssh -f -N -D 0.0.0.0:1080 localhost
在这种设置下,客户端通过这个代理发送的请求,都会通过本地机器的网络接口转发出去。启动后可以验证
netstat -tuln | grep 1080
tcp 0 0 0.0.0.0:1080 0.0.0.0:* LISTEN
客户端设置
对于大多数的企业软件来说,其本身自带proxy
设置,此时填入我们代理服务器的IP和开启的端口(一般是1080)即可(当然,如果做的更加精细些,可以加用户密码认证,这里自行查找命令参数),如idea
亦或是Dbvisualizer
一个curl的例子
之前使用如下命令一直无法运行curl
(192.168.1.36是代理服务器IP)
curl --socks5 192.168.1.36:1080 http://www.baidu.com
查找原因是curl
默认走的当前机器DNS
解析,当前机器无法访问外网,自然行不通。需要额外增加--socks5-hostname
,通过 SOCKS
代理服务器处理 DNS
解析,确保即使本地网络无法访问,依然能够成功解析目标网站的域名
curl --socks5-hostname 192.168.1.36:1080 http://www.baidu.com
当时在验证代理服务器的可用性时,这个问题让我卡了很久。若遇到类似的情况,比如其他命令需要通过代理访问外部网络,可以参考这个方法(其他命令可能有专属的参数表示)来解决 DNS 解析的问题
参考
- https://zh.wikipedia.org/zh-sg/SOCKS
- https://datatracker.ietf.org/doc/html/rfc1928
- https://www.freecodecamp.org/chinese/news/osi-model-networking-layers/