我有两台机器,客户端和服务器。
客户端(位于企业防火墙之后)使用以下命令打开一个到服务器的反向SSH隧道,该服务器具有可公开访问的IP地址:
ssh -nNT -R0:localhost:2222 [email protected]
在OpenSSH 5.3+中,在-R之后出现的0意味着“select一个可用的端口”,而不是明确地要求一个端口。 我这样做的原因是因为我不想select一个已经在使用的端口。 事实上,实际上有很多客户需要build立类似的隧道。
现在的问题是服务器不知道哪个客户端是哪个。 如果我们想连接回这些客户端(通过本地主机),那么我们如何知道哪个端口是指哪个客户端?
我知道,ssh在上述方式使用时将端口号报告给命令行。 不过,我也想用autossh来保持会话的活跃。 autossh通过fork / exec运行它的subprocess,据推测,实际的ssh命令的输出在以太网中丢失了。
此外,我想不出任何其他方式从客户端获得远程端口。 因此,我想知道是否有一种方法来确定服务器上的这个端口。
我有一个想法是以某种方式使用/ etc / sshrc,这应该是一个为每个连接运行的脚本。 但是,我不知道如何得到相关的信息(也许是特定的sshd进程处理该连接的PID)我想要一些指针。
谢谢!
VPN不会更合适吗? OpenVPN是非常简单的configuration。 这里是一个示例configuration和一些指导您通过证书创build过程的链接:
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
然后创build一个新文件/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
然后为每个要连接的用户创build一个密钥,并在ccd目录中创buildconfiguration文件
./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]文件提供给最终用户并使用以下configuration文件
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
如果每个客户端都有不同的用户名,则可以使用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@
您可以改变临时端口范围(Linux的/proc/sys/net/ipv4/ip_local_port_range ),然后使用该范围之外的静态分配的端口。
我想和你一样的设置,我把SSH服务器的日志级别增加到DEBUG,并在日志中显示客户端的本地端口是什么
例如:
客户端命令: ssh -N -R0:127.0.0.1:5522 [email protected]
服务器日志:
Jun 30 11:28:59 debsid sshd[27577]: debug1: Local forwarding listening on 127.0.0.1 port 35391
你会看到端口号
您应该能够从以下输出中提取相关信息:
lsof -i tcp
以root身份运行。