场景需求分析
在跨国企业网络或云服务器架构中,经常遇到需要通过跳板机访问内网服务器的情况。如图所示:
Client → [Server A(公网)] → [Server B(内网)]
传统单级SSH隧道可以通过tsocks实现,但当需要多级跳转时(例如:Client → Server A → Server B → Server C),就需要更灵活的代理配置方案。
核心解决方案
通过修改tsocks配置和SSH隧道组合,实现多端口代理链:
# 第一级隧道(Server A)
ssh -fND 127.0.0.1:4000 user@serverA
# 第二级隧道(通过Server A连接Server B)
ssh -fND 127.0.0.1:4001 -o "ProxyCommand=nc -X 5 -x 127.0.0.1:4000 %h %p" user@serverB
多端口tsocks配置技巧
创建动态配置文件模板:
# /etc/tsocks.conf.template
server = 127.0.0.1
server_port = ${PORT}
使用时动态生成配置:
# 生成第一跳配置
sed "s/\${PORT}/4000/" /etc/tsocks.conf.template > /etc/tsocks.conf
tsocks ssh user@serverB
# 生成第二跳配置
sed "s/\${PORT}/4001/" /etc/tsocks.conf.template > /etc/tsocks.conf
tsocks ssh user@serverC
自动化脚本实现
创建多级连接管理脚本:
#!/bin/bash
# multissh.sh
case $1 in
"start")
ssh -fND 4000 user@serverA
ssh -fND 4001 -o "ProxyCommand=nc -X 5 -x 127.0.0.1:4000 %h %p" user@serverB
;;
"conn1")
sed "s/\${PORT}/4000/" /etc/tsocks.conf.template > /etc/tsocks.conf
tsocks ssh user@serverB
;;
"conn2")
sed "s/\${PORT}/4001/" /etc/tsocks.conf.template > /etc/tsocks.conf
tsocks ssh user@serverC
;;
"stop")
pkill -f "ssh -fND"
;;
esac
SCP文件传输方案
通过代理链传输文件:
# 通过第一跳传输
tsocks scp file.txt user@serverB:/path/
# 通过第二跳传输
tsocks scp file.txt user@serverC:/path/
常见问题排查
1. 端口冲突问题:
netstat -tulnp | grep ssh
2. 连接测试方法:
tsocks curl -v http://serverB:22
3. 权限问题解决:
chmod 600 /etc/tsocks.conf