SSH隧道多级跳转实战:基于tsocks实现多端口代理链配置


阅读 2 次

场景需求分析

在跨国企业网络或云服务器架构中,经常遇到需要通过跳板机访问内网服务器的情况。如图所示:

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