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


12

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

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

ssh -nNT -R0:localhost:2222 insecure@server.example.com

在OpenSSH 5.3+中,紧随其后的0发生是-R指“选择可用端口”,而不是显式调用它。我这样做的原因是因为我不想选择已经使用的端口。实际上,实际上有许多客户需要建立类似的隧道。

此时的问题是服务器不知道哪个客户端是哪个客户端。如果我们想通过本地主机连接回这些客户端之一,那么我们如何知道哪个端口指向哪个客户端?

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

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

我的一个想法是以某种方式使用/ etc / sshrc,它应该是为每个连接运行的脚本。但是,我不知道在这里如何获得相关信息(也许是处理该连接的特定sshd进程的PID?)。

谢谢!


2
VPN会更合适吗?OpenVPN的配置非常简单。
Ben Lessani-Sonassi 2012年

听起来不错。我对VPN不太了解。即使将客户端计算机配置为使用DHCP,这是否仍然可行?
汤姆(Tom)

1
是的,它在另一个TUN / TAP接口上运行,因此其他接口无关。
Ben Lessani-Sonassi 2012年

@sonassi,看起来这个VPN事情可以解决问题。谢谢(你的)信息。
汤姆(Tom)

(基于Debian / Ubuntu的),我已经添加了以下具体指导你通过与OpenVPN的VPN的过程答案
本Lessani - Sonassi

Answers:


4

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 user1@domain.com
echo "ifconfig-push 192.168.100.2 255.255.255.0" > /etc/openvpn/ccd/client_server/user1@domain.com

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

然后,每个连接的用户现在都有静态IP。

然后将the user1@domain.com.p12文件提供给最终用户并使用以下配置文件

client
dev tun
proto udp
remote SERVER_IP_ADDRESS 8443
pkcs12 user1@domain.com.p12
resolv-retry infinite
nobind
ns-cert-type server
comp-lzo
verb 3
reneg-sec 0

感谢您的详尽回答!不过,我确实有两个问题。A)为客户端的ifconfig-push行指定255.255.255.0似乎不起作用,但是如果我指定了第二个IP地址,它确实起作用。为什么是这样?B)这种方法是否意味着每个连接使用4个IP地址?
汤姆(Tom)

在某些Linux系统上,ifconfig-push行的语法不同。例如。ifconfig-push 192.168.100.2 192.168.100.3-我不知道为什么平台上会有所不同。是的,这意味着每个客户端使用4个IP(很浪费,但是野兽的性质)。
Ben Lessani-Sonassi 2012年

3

如果每个客户端都有不同的用户名,则可以使用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),然后使用该范围之外的静态分配端口。


无需为此更改临时范围。默认情况下,临时范围以61000结尾,因此在此之上有数千个可用端口号。我经常echo $[61002+RANDOM%4532]选择在该范围内的端口号。
kasperd

2

我想要像您一样的设置,将SSH服务器的日志级别提高到DEBUG,它在日志中显示客户端的本地端口是什么

例如:

客户端命令: ssh -N -R0:127.0.0.1:5522 connector@example.com

服务器日志:

Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391

在那里你看到端口号


0

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

lsof -i tcp

以root身份运行。


0

在服务器上运行此脚本:

sudo lsof -i -n | grep "sshd" | grep "(LISTEN)" | awk '{print $2}' | while read line; do sudo lsof -i -n | egrep $line | sed 3~3d | sed 's/.*->//' | sed 's/:......*(ESTABLISHED)//' | sed 's/.*://' | sed 's/(.*//' | sed 'N;s/\n/:/' 2>&1 ;done

您可能需要也可能不需要两个sudo。如果不删除,请删除。

PS-这是我不久前在其他地方找到的解决方案的修改版本。我认为它可能来自StackOverflow,但我找不到原始参考。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.