企业内部的开发环境一般部署在特定主机上,当我们本地开发功能时,往往需要连接开发环境进行调试,而代理被广泛应用于这一场景。下面通过我使用代理访问开发环境的三个案例,来介绍如何使用代理来自由地访问所需资源。
1. 使用 ssh 动态转发作为代理
如果通过 VPN 或企业内网可以 ssh 直连主机,那么我们可以利用 ssh 的动态转发功能来作为代理:
ssh -fND localhost:1080 user@host_ip
该命令将在本地的 1080 端口起一个 SOCKS 代理,访问该端口的请求将被 ssh 连接转发至目标主机。需要注意的是,使用该功能需要目标主机的 ssh 配置文件 /etc/ssh/sshd_config 中打开了 AllowTcpForwarding 开关:
AllowTcpForwarding yes
有了代理之后,很多支持代理的命令行工具就能访问内部资源了,例如:
# curl: 通过参数支持
curl -x localhost:1080 ip:port
# kubectl: 通过 http_proxy, https_proxy 环境变量支持
export http_proxy=localhost:1080 https_proxy=localhost:1080
kubectl get node
对于不支持代理的命令行工具,可以使用 proxychain 来令其使用代理:
proxychains4 telnet targethost.com
对于桌面应用,可以使用 Proxifier 来设置全局代理规则,使 IDE 和数据库客户端等软件访问对应资源时使用代理。
2. 通过代理进行 ssh 连接
如果由于防火墙的限制,无法 ssh 直连主机(例如没有 22 端口的权限),但是能访问主机上的某个代理,那么我们就能利用该代理 ssh 直连主机。
ssh 命令支持 ProxyCommand 参数,该参数可调用外部命令来处理网络连接,使用 connect-proxy 或 corkscrew 等工具可以通过代理进行 ssh 连接,例如:
# connect-proxy
ssh user@host_ip -o ProxyCommand='connect -H proxy_ip:proxy_port %h %p'
或者也可以使用前面提到的 proxychain 工具:
proxychains4 ssh user@host_ip
3. 无 root 权限搭建代理
如果可以访问主机,但主机的 ssh 配置文件 /etc/ssh/sshd_config 中关闭了 AllowTcpForwarding 开关,并且我们没有 root 权限来打开这个开关,那么就无法使用 ssh 的动态转发来作为代理。
此时,我们需要自行搭建代理。使用 Go 来搭建代理服务是个不错的选择,因为 Go 编译的二进制可以无依赖地运行在其他环境。使用 go-socks5 库可以很方便地实现一个 SOCKS 代理:
package main
import (
"github.com/things-go/go-socks5"
)
func main() {
if err := socks5.NewServer().ListenAndServe("tcp", ":1080"); err != nil {
panic(err)
}
}
编译之后在主机上运行,便在 1080 端口便起了一个 SOCKS 代理:
go build -o proxy main.go
./proxy
总结
开发过程中少不了与代理打交道,本文介绍了 ssh 、代理使用和代理搭建的相关实践,有了这些方法可以让我们配置更趁手的开发环境,大大提高开发效率。