反向 SSH 隧道:如何将我的端口号发送到服务器?

反向 SSH 隧道:如何将我的端口号发送到服务器?

我有两台机器,客户端和服务器。

客户端(位于公司防火墙后面)使用以下命令打开到具有可公开访问的 IP 地址的服务器的反向 SSH 隧道:

ssh-nNT-R0:本地主机:2222[电子邮件保护]

在 OpenSSH 5.3+ 中,0紧跟在后面的表示-R“选择一个可用端口”,而不是明确要求一个端口。我这样做的原因是我不想选择一个已经在使用的端口。事实上,实际上有很多客户端需要设置类似的隧道。

此时的问题是服务器不知道哪个客户端是哪个。如果我们想连接回其中一个客户端(通过 localhost),那么我们如何知道哪个端口指向哪个客户端?

我知道 ssh 以上述方式使用时会向命令行报告端口号。但是,我还想使用 autossh 来保持会话处于活动状态。autossh 大概通过 fork/exec 运行其子进程,因此实际 ssh 命令的输出会丢失在以太中。

此外,我想不出任何其他方法从客户端获取远程端口。因此,我想知道是否有办法在服务器上确定此端口。

我有一个想法,就是以某种方式使用 /etc/sshrc,据说这是一个针对每个连接运行的脚本。但是,我不知道如何在这里获取相关信息(也许是处理该连接的特定 sshd 进程的 PID?)我希望得到一些指点。

谢谢!

答案1

VPN 不是更合适吗?OpenVPN 配置起来非常简单。下面是示例配置和一些链接,可指导您完成证书创建过程:

apt-get install openvpn
mkdir /etc/openvpn/easy-rsa
mkdir -p /etc/openvpn/ccd/client_server
touch /etc/openvpn/ipp.txt
cp -a /usr/share/doc/openvpn/examples/easy-rsa/2.0/* /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
source ./vars
./clean-all
./build-ca 
./build-dh
./build-key-server server
cd /etc/openvpn/easy-rsa/keys
openssl pkcs12 -export -out server.p12 -inkey server.key -in server.crt -certfile ca.crt

然后创建一个新文件/etc/openvpn/client_server.conf并将以下内容放入其中,SERVER_IP_ADDRESS根据需要更改

local SERVER_IP_ADDRESS
port 8443
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
pkcs12 /etc/openvpn/easy-rsa/keys/server.p12
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
ifconfig-pool-persist /etc/openvpn/ipp.txt
server 192.168.100.0 255.255.255.0
client-config-dir /etc/openvpn/ccd/client_server
ccd-exclusive
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
verb 3
reneg-sec 0

然后为每个要连接的用户构建一个密钥,并在 ccd 目录中创建配置文件

./build-key-pkcs12 [email protected]
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/[email protected]

IP 地址必须适合 /30 子网(请参阅http://www.subnet-calculator.com/cidr.php),因为每个连接只有 2 个可用地址(服务器和客户端)。因此,您的下一个可用客户端 IP 将是 192.168.100.6,依此类推。

这样,每个连接用户现在都有静态 IP。

然后将文件提供给最终用户并使用以下配置文件the [email protected]

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 [email protected]
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0

答案2

如果每个客户端都有不同的用户名,您可以使用它netstat来找出该用户的sshd进程正在监听哪个端口。例如:

% sudo netstat -tlpn | grep 'sshd: mgorven@'
tcp        0      0 127.0.0.1:22220         0.0.0.0:*               LISTEN      5293/sshd: mgorven@
tcp        0      0 127.0.0.1:5120          0.0.0.0:*               LISTEN      5293/sshd: mgorven@

答案3

您可以更改临时端口范围(/proc/sys/net/ipv4/ip_local_port_range对于 Linux),然后使用该范围之外的静态分配的端口。

答案4

您应该能够从输出中提取相关信息:

lsof -i tcp

以 root 身份运行。

相关内容