跳至内容
返回

通过代理打通本地和开发环境

发布于:  at  05:32 下午

企业内部的开发环境一般部署在特定主机上,当我们本地开发功能时,往往需要连接开发环境进行调试,而代理被广泛应用于这一场景。下面通过我使用代理访问开发环境的三个案例,来介绍如何使用代理来自由地访问所需资源。

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-proxycorkscrew 等工具可以通过代理进行 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 、代理使用和代理搭建的相关实践,有了这些方法可以让我们配置更趁手的开发环境,大大提高开发效率。



上一篇
巨人的 20 个工具
下一篇
为什么用 iptables 封禁 k8s NodePort 不生效