当内部客户端连接到该服务器时,如何在服务器上自动启动出站SSH连接

当内部客户端连接到特定端口上的服务器时,如何在服务器上自动启动出站SSH连接? (不只是sshd在服务器上,并且只有在出站ssh连接尚未启动时)。


预期解决scheme的总结

客户端发送一个数据包到服务器—>服务器看到它是从一个给定的IP范围 – >服务器检查是否出站SSH连接已经在运行 – >服务器发现它没有运行,并提出连接 – >客户端数据包stream通过出站ssh连接到远端


其他的考虑

sshd的ForceCommand几乎可以完美地工作,除了问题是要求一个解决scheme来启动一个出站ssh连接,如果它还不存在,当一个客户端连接到服务器上的任何服务。 (几乎是完美的,因为即使ForceCommand解决scheme可以启动一个连接,对于这个特定的问题,它没有办法检查一个已经存在的连接,如果连接已经存在,就不运行该命令。问题是当客户端连接到任何服务,而不仅仅是sshd时,要求出站ssh连接启动)。


研究

对这个话题的研究表明,需要一个脚本来使用-m state ! --state seen_reply通过iptableslogging前所未见的连接-m state ! --state seen_reply -m state ! --state seen_reply ,然后在后台检查日志,如果发现匹配,检查出站ssh连接是否已经启动,如果没有启动。

我迄今为止的研究发现了一个需要工作的示例脚本

 #######auto_ssh-script.sh ####### iptables rule logging all new incoming, unestablished, never before seen connections iptables -I INPUT -p tcp --sport 22 -m state --state NEW -m state ! --state ESTABLISHED -m state ! --state SEEN_REPLY -j LOG --log-prefix CONNECT #######background script --> read log and look for a match to string CONNECT cat /proc/kmsg | while read LOGGING do LOG='echo "$LOGGING" | grep 'CONNECT' ' if ["$LOG" = ' ' ] & UP= 'echo alxw | grep ssh ' if [ "UP" = ' '] then fi ssh -p 22 <user>@<somewhere-out-there>.com echo "Connected" done 

更新netcat也可以帮助。

从stackoverflow.com

 #!/bin/bash netcat -lk -p 12345 | while read line do match=$(echo $line | grep -c 'Keep-Alive') if [ $match -eq 1 ]; then echo "Here run whatever you want..." fi done 

还发现从stackoverflow.com另一个有用的片段以及 –

 #!/bin/bash ssh-auth() { # Start the SSH agent only if not running [[ -z $(ps | grep ssh-agent) ]] && echo $(ssh-agent) > /tmp/ssh-agent-data.sh # Identify the running SSH agent [[ -z $SSH_AGENT_PID ]] && source /tmp/ssh-agent-data.sh > /dev/null # Authenticate (change key path or make a symlink if needed) [[ -z $(ssh-add -l | grep "/home/$(whoami)/.ssh/id_rsa")]] && ssh-add } 

甚至更多来自stackoverflow.com

 #!/bin/bash REMOTEUSER=username REMOTEHOST=remotehost SSH_REMOTEPORT=22 SSH_LOCALPORT=10022 TUNNEL_REMOTEPORT=8080 TUNNEL_LOCALPORT=8080 createTunnel() { /usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:TUNNEL_REMOTEPORT $REMOTEUSER@$REMOTEHOST if [[ $? -eq 0 ]]; then echo Tunnel to $REMOTEHOST created successfully else echo An error occurred creating a tunnel to $REMOTEHOST RC was $? fi } ## Run the 'ls' command remotely. If it returns non-zero, then create a new connection /usr/bin/ssh -p $SSH_LOCALPORT $REMOTEUSER@localhost ls >/dev/null 2>&1 if [[ $? -ne 0 ]]; then echo Creating new tunnel connection createTunnel fi 

额外的研究

这也是从superuser.com –

https://superuser.com/questions/718978/automatic-ssh-tunnel

评论:这是一个独特的方式去解决几乎相同的问题。 解决scheme的有效性不确定。