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

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

问题

当内部客户端通过特定端口连接到该服务器时,如何为任何给定的服务自动启动服务器上的出站 SSH 连接?(不仅仅是服务器上的 sshd,而且仅当出站 ssh 连接尚未启动时)。


预期解决方案摘要

客户端向服务器发送一个数据包 ---> 服务器看到它来自给定的 IP 范围 --> 服务器检查出站 ssh 连接是否已在运行 --> 服务器发现它未运行并建立连接 --> 客户端数据包通过出站 ssh 连接流向远端


其他考虑因素

sshdForceCommand几乎可以完美地解决这个问题,只是问题是要求解决方案在客户端连接到时启动出站 ssh 连接(如果它尚不存在)任何服务器上的服务。(几乎完美,因为即使ForceCommand解决方案可以启动连接,对于这个特定问题,它也没有办法检查是否存在连接,如果连接已经存在,则不运行命令。此外,如上所述,问题是要求在客户端连接到时启动出站 ssh 连接任何服务,而不仅仅是 sshd)。


研究

关于该主题的研究表明,需要一个脚本来使用 iptables 记录以前从未见过的连接-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

评论:这是解决几乎相同问题的独特方法。不确定解决方案的有效性。

相关内容