2020实现ssh公网外联和外网远程穿透以及内网穿透防火墙


 自己的电脑为A端 这里演示的IP为192.168.0.142 系统是Windows

 服务器也就需要做中间人转发的为B端,演示IP为192.168.0.121 和192.168.224.121

 目标机也就是我们需要连接的为C端,演示IP192.168.224.193 系统是Ubuntu

 根据三台机的网络结构!A端192.168.0.142 ping 目标C端192.168.224.193因为线段不同结果如下 系统是Kali

 无法连接,下面测试连接B端服务192.168.0.121和192.168.224.121

 接通了192.168.0.121 再连接192.168.224.121试试

 

我们发现C端目标可以连接服务B端的192.168.224.121,这么来我们的思路就清晰很多了。服务B端其实就是来帮助A端与C端之间的交互,
正确来说。是B端与C端之间的交互。完成了B端与C端的交互,任何能连接192.168.0.121 B端的客户端都能连接192.168.224.193 C端
B端 kali 输入下面命令与C端建立交互
ssh -CNL *:444:192.168.224.193:54321 -f root@localhost -p22222
-g 允许远程客户端连接到本地端口 -f 转后台 -C 压缩算法类似gzip  -N 不执行远程命令  
-L正向代理 代理服务转发*通配符则是不限制IP:转发端口:目标C端IP:目标C端口  登录中间服务B端 -p登录B端口
OK现在我们就用A端去访问B端把C端的内容反馈给A端. 我依旧是访问B端的192.168.0.121 但端口不再是22222  改为444

这样我们就通过192.168.0.121的444端口转发192.168.224.193的54321端口。

 这样我们就突破了局域网防火墙访问到了192.168.224.193 IP地址

ssh -CNL *:8080:192.168.224.193:80 -f root@192.168.0.121 -p22222
使用前先配置好客户C端的http服务,这样建议apache2做测试 systemctl start apache2.service 开启服务
这里改成了8080访问 客户C端的80端口
netstat -ano |findstr ":8080"

 

成功正向代理

 


 

现在我们温馨下正向代理,因为逆向代理也会用到正向,只不过多一个交互罢了。
回顾下 A端192.168.0.142Windows系统  B端192.168.224.121 192.168.0.121Kali系统  C端目标192.168.224.193 Ubuntu系统
宏观构图 先用C端与B端建立反向链接,再从B端与刚刚C端在B端建立的端口转发基础上,再建立一层正向代理就实现前面正向代理的效果,
但这种支持远程访问也就是外网。
ssh -gCNR 8888:localhost:54321 -f root@192.168.224.121 -p22222

首先我们到目标C端 Ubuntu系统添加逆向代理 

-R(逆向代理) 54321是ssh端口号默认是22,这里我改了. localhost既本地IP192.168.224.193
建立一个8888开放端口在192.168.224.121里既B端服务端。后面就跟正向一样登录B端SSH服务,22222既SSH别称号

ssh -gCNL *:12345:localhost:8888 -f localhost -p22222
到了这里就是正向连接了,12345为提供给外网任意访问目标C端的转发端口。则12345转发刚刚逆向的8888端口
现在我们就可以在外网访问服务端所代理的内网目标机器C端了
ssh test@192.168.0.121 -p12345

在windows或手机端termux里输入

 外网也能登录到内网了

 



 sudo apt-get install autossh 

先安装autossh 

autossh -M 8889:9000 -gCNR 8888:localhost:54321 -f root@192.168.224.121 -p22222
-M 8889:9000意思是什么呢?建立正向8889至9000端口去监视 8888端口是否断开,如果端口则重新连接
让程序自动启动,当然自启脚本或执行命令行的方式有很多种如crontab啦.profile .bashrc等等各种文件
感兴趣可以了解我之前的自启笔记:https://www.cnblogs.com/eternalnight/p/13905048.html
 


  C端操作目标192.168.224.193 Ubuntu操作:

su root
apt-get update &&apt-get install openssh-client openssh-server autossh  -y >/dev/null
ssh-keygen
vim /etc/ssh/sshd_config

 我这目标机的SSH端口设是54321

 

这两个是允许root登录 允许图形转发

systemctl restart ssh.service

重启服务

mkdir -p /script &&touch /script/autossh1.sh &&chmod 755 /script/autossh1.sh
echo '#!/usr/bin/bash' >>/script/autossh1.sh
echo 'autossh -M 8889:9000 -gCNR 8888:localhost:54321 -f root@192.168.224.121 -p22222' >>/script/autossh1.sh
ssh root@192.168.224.121 -p22222 'mkdir -p ~/.ssh &&cat >>~/.ssh/authorized_keys' <~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

记住这些操作都是建立在root用户的,如果你只想普通用户执行,请自行调整。

crontab -e

选择自己习惯的编辑器,保存退出

echo '@reboot root bash /script/autossh1.sh' >>/etc/crontab
systemctl enable ssh.service
systemctl enable cron.service

B端服务器192.168.0.121 192.168.224.121操作:

su root
apt-get update &&apt-get install openssh-client openssh-server autossh  -y >/dev/null
ssh-keygen

跟C端配置差不多

vim /etc/ssh/sshd_config

多一个GatewayPorts是允许转发的设置,这里的SSH端口号为22222

systemctl restart ssh.service
mkdir -p /script &&touch /script/autossh2.sh &&chmod 755 /script/autossh2.sh
echo '#!/usr/bin/bash' >>/script/autossh2.sh
echo 'autossh -M 12346:12347 -gCNL *:12345:localhost:8888 -f localhost -p22222' >>/script/autossh2.sh
ssh root@localhost -p8888 'mkdir -p ~/.ssh &&cat >>~/.ssh/authorized_keys' <~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

这里大致相同,唯一不同的是我们在ssh里直接用本地IP的8888端口.

crontab -e
echo '@reboot root bash /script/autossh2.sh' >>/etc/crontab
systemctl enable ssh.service
systemctl enable cron.service
reboot

先重启B端,完了再重启C端

A端操作 WINDOWS 连接目标C端

WINDOWS是不自带SSH,有几种方式可以下载安装。
  1. 到SSH官方下载openssh Dos命令行连接 http://www.mls-software.com/opensshd.html
  2. MinGW:命令行安装
  3. putty图形ssh连接
因为们只是连接服务端,所以我们WINDOWS只下载客户端就行了。演示是用第一种.打开cmd
ssh-keygen -t rsa

目录在 C:\Users\Administrator\.ssh  Dos连ssh-copy-id都没 语法也跟bash不同所以我们用逆向的方法来实现免密码
我安装的openssh位置在C:\Program Files\OpenSSH\etc
cd /d C:\Program Files\OpenSSH\etc
vim sshd_config

任意编辑器都可以编辑,我这里用的是vim 就这三个需要填写,保存退出.

sc start opensshd

打开ssh服务端口是4444,也可以用net start opensshd打开

netsh interface ip show address name="以太网"

不填name=。。。也可以如果你是用wifi的就不用填

net user admin admin123 /add

我们先添加一个提供外来的账号

net localgroup administrators admin /add

提管理权限

runas /user:Administrator cmd

切换管理员用户并调用cmd

net user administrator admin123

修改管理员密码

这个错误是因为你的ssh之前已经记录了公钥指纹,现在匹对发现不同,解决办法如下。
    echo "" >C:\Users\Administrator\.ssh\known_hosts 
现在重新连接,如果没有错误就忽略
接下来我们需要把公钥复制到目标C端,有几种方式提供给linux与windows之间交互

第一种交互数据 sftp

sftp -P 12345 root@192.168.0.121

与ftp区别在于加密式

cd /root/.ssh

要绝对地址 pwd 看当前目录在linux中 ls 目录中文件和目录

get -r id_rsa.pub C:/users/Administrator/

把目标的公钥放到 我们的目录下再执行下面命令就可以完成交互,我对windows与linux交互不是很了解,所以只能简单粗暴。
linux 与linux之间交互比较简单,一条命令就可以完成。再打开一个cmd
type id_rsa.pub >>.ssh/authorized_keys

回到sftp里,把A端的公钥上传到C端
put -r  C:/Users/Administrator/.ssh/id_rsa.pub /root/

先连接C端把公钥放到authorized_keys里

ssh root@192.168.0.121 -p12345
cat ~/id_rsa.pub >>~/.ssh/authorized_keys
  • 第二种交互数据 scp
scp  -P12345 .ssh/1.txt root@192.168.0.121:~/.ssh/

 


没有服务器就先拿内网做实验,服务B端:

ssh -N -D 2121 root@192.168.0.121 -p22222
-D动态转发 跳板端口,类似socks1080那样,可以proxychains代理。也可以浏览器代理实现简易VPN

 


 

C端Ubuntu的脚本配置

mkdir -p /script &&touch /script/autossh3.sh &&chmod 755 /script/autossh3.sh
vim /script/autossh3.sh

建立脚本目录,和文件并修改权限。把下面的脚本复制粘贴后修改部分IP信息就可以了。

#!/bin/bash
main() {
    localIP="localhost" #本地转发IP
    localPort="54321" #本地转发端口
    outputPort="8888" #监控生成跳板端口
    targetIP="192.168.224.121" #即跳板
    targetUser=("root" "admin" "administrator") #按上面格式添加用户
    targetPort="22222" #跳板端口
    
    dataDir='/script/data'
    scriptDir='/script'
    dataFile='sshlog.txt'
    date=`date +%Y-%m-%d_%H:%M`
    countSSH=`ps -aux |grep -i "\-gCNR" |awk '{print $2}' |wc -l`
    countSSH=$[countSSH-1]
    pidSSH=`ps -aux |grep -i "\-gCNR" |awk '{print $2}' |head -n$countSSH`
    result=""
    if (( $countSSH < 1 )); then
        ssh -gCNR $outputPort:$localIP:$localPort -f ${targetUser[0]}@$targetIP -p$targetPort >>/dev/null
        #targetUser[0]这里是root,如果按上面设置[1]就是admin修改这个数字就可以
        if (( $? == 0 )); then
            result="已经成功链接${targetIP}并输出${outputPort}"
        else
            result="无法正常链接!!!请检查${targetIP}和${targetPort}端口,是否能正常链接。"
        fi
    else
        result="已经有了链接PID是:`echo $pidSSH`"
    fi  
    if [ ! -d ${scriptDir} ] || [ ! -d ${dataDir} ]; then
        mkdir -p $scriptDir && mkdir -p $dataDir && touch ${dataDir}/${dataFile}
        chmod +x ${dataDir}/${dataFile}
        echo "test Dir"
    fi  
    if [ `cat ${dataDir}/${dataFile} |wc -l` -gt 100 ]; then
        echo "" >${dataDir}/${dataFile} #当日志大于100时就会清0
    fi

    echo -e "时间:${date}\x20执行结果:${result}" >>${dataDir}/${dataFile} #输出脚本执行结果到 /script/data/sshlog.txt
}
main "$@"
exit 0
View Code

这是我根据这个连接做的一个脚本,需要修改的内容我会截图出来,已经有中文注释很容易理解,如果你有上面的学习经验,就更容易了。

ssh root@192.168.224.121 -p22222 'mkdir -p ~/.ssh &&cat >>~/.ssh/authorized_keys' <~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys

这些脚本都需要配备无密码登录,否则就会卡住,下面命令把公钥发送到服务B端,可无密码登录。

crontab -e
echo '*/5 * * * * root bash /script/autossh3.sh' >>/etc/crontab
systemctl enable ssh.service
systemctl enable cron.service
systemctl restart cron.service

B端Kali的脚本配置

mkdir -p /script &&touch /script/autossh3.sh &&chmod 755 /script/autossh4.sh
vim /script/autossh4.sh
#!/bin/bash
main() {
    localIP="localhost" #本地转发IP
    localPort="8888" #本地转发端口
    outputPort="12345" #监控生成跳板端口
    targetIP="192.168.224.121" #即跳板
    targetUser=("root" "admin" "administrator") #按上面格式添加用户
    targetPort="22222" #跳板端口
    
    dataDir='/script/data'
    scriptDir='/script'
    dataFile='sshlog.txt'
    date=`date +%Y-%m-%d_%H:%M`
    countSSH=`ps -aux |grep -i "\-gCNR" |awk '{print $2}' |wc -l`
    countSSH=$[countSSH-1]
    pidSSH=`ps -aux |grep -i "\-gCNR" |awk '{print $2}' |head -n$countSSH`
    result=""

    if (( $countSSH < 1 )); then
        ssh -gCNL *:$outputPort:$localIP:$localPort -f ${targetUser[0]}@$targetIP -p$targetPort >>/dev/null
        #targetUser[0]这里是root,如果按上面设置[1]就是admin修改这个数字就可以
        if (( $? == 0 )); then
            result="已经成功链接${targetIP}并输出${outputPort}"
        else
            result="无法正常链接!!!请检查${targetIP}和${targetPort}端口,是否能正常链接。"
        fi
    else
        result="已经有了链接PID是:`echo $pidSSH`"
    fi  
    if [ ! -d ${scriptDir} ] || [ ! -d ${dataDir} ]; then
        mkdir -p $scriptDir && mkdir -p $dataDir && touch ${dataDir}/${dataFile}
        chmod +x ${dataDir}/${dataFile}
        echo "test Dir"
    fi  
    if [ `cat ${dataDir}/${dataFile} |wc -l` -gt 100 ]; then
        echo "" >${dataDir}/${dataFile} #当日志大于100时就会清0
    fi
    echo -e "时间:${date}\x20执行结果:${result}" >>${dataDir}/${dataFile} #输出脚本执行结果到 /script/data/sshlog.txt
}
main "$@"
exit 0
View Code
ssh root@localhost -p8888 'mkdir -p ~/.ssh &&cat >>~/.ssh/authorized_keys' <~/.ssh/id_rsa.pub
cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
crontab -e
echo '*/5 * * * * root bash /script/autossh3.sh' >>/etc/crontab
systemctl enable ssh.service
systemctl enable cron.service
systemctl restart cron.service
 
以上全部内容都是建立在你有公网云服务器的远程搭建
如果没有公网服务器的情况下,你是无法连接的,推荐用通过以下方式配置公网。
ngrok   Sunny-ngrok   zerotier  魔法隧道(http://mofasuidao.cn/暂时没有测试,不推荐使用)


 Zerotier 免费强烈推荐

由于时间缘故,本人熬夜加更比较疲惫,暂时就不测试了!!!!!!!
下次有机会再补上

 Sunny-Ngrok 国内可用 付费10元/月约

官方网https://www.ngrok.cc/ 先注册账号  这里必须说明这个隧道是有官方监控流量的,
如果用于政治视频那些。。。。是会有被封的风险,可以用来测试,或者做微服务器.
测试用的是LINUX
./sunny clientid 隧道id
开通隧道,这里说明下 sunny美国免费隧道是会被强的,香港10元但是也可能出现连不上
如果你是经常国内用的话,广州的【自定义域名是需要腾讯云或阿里云备份的】

购买完域名,如果你是为了绑定网站就选http类型,如果你是为了ssh连接就选tcp,我测试的是tcp ssh远程转发连接
域名可以后面绑定,也可以用他们送的域名.  把隧道IP复制
./sunny clientid 隧道id

单隧道,多隧道则 ./sunny clientid 隧道id,隧道id

 这个转发方式与我们测试的是一样的,不要随便泄露域名否则承担风险

就这么实现了公网登录了。。。如果你想搭建VPN,就选择香港服务器,当然我没测试过这好不好用所以自行选择。
你也可以用手机移动网络随时连接,但要保持你的服务B端的KALI保持开机和运行服务,我们有了公网隧道就可以配置上面一开你所学的,SSH正向转发,或者反向隧道转发。设我的域名为xxx.com就把192.168.0.121 22222端口改为xxx.com 10023端口就可以了.

ngrok 国外需要科学访问

ngrok 官方网https://ngrok.com/docs 

重要的话说三遍,需要科技。。服务器是在国外
  • Linux 64位amd下载方式,还是比较建议到官方网去找连接
先注册账号https://dashboard.ngrok.com/signup 建议用github登录如果你在墙内

wget https://bin.equinox.io/c/4VmDzA7iaHb/ngrok-stable-linux-amd64.zip
unzip ngrok-stable-linux-amd64.zip
./ngrok authtoken 1jtlh0XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ngrok auth config
 

./ngrok tcp 22222
我这里的SSH是22222,如果你的是22就改成22就行. 

 

执行成功后,公网网址就会显示出来。复制就能连接了

配置自启脚本

cp sunny /usr/bin/

这样我们到任何个目录都能用了

mkdir -p /script &&touch /script/autosunny.sh &&chmod 755 /script/autosunny.sh
vim /script/autosunny.sh

创建脚本文件

#!/usr/bin/bash
main (){
countSunny=`ps -aux |grep -i "sunny clientid" |wc -l`
if (( countSunny < 2 )); then
    sunny clientid xxx2572xxxxx  #修改后面xxx2572xxxxx改成自己的隧道ID 或多个ID
fi
}
main "$@"
exit 0
由于这几天都在忙着编辑这个和工作繁忙,就不详细去编辑这个脚本了,如果想细节可以参考之前的脚本,拿来修改即可。

 

大概能启动就好如果要挂掉服务就输入: ps -aux |grep -i "sunny clientid"|awk '{print $2}' |xargs kill -9
echo '*/5 * * * * root bash /usr/bin/sunny' >>/etc/crontab

每5分钟检测一次

远程开机


 

所有都各就各位了,如果我们配置的是公司服务器,难免会考虑远程开机和节能这一措施,分两种流行市面上。
  1. 网线其他电脑进行呼唤,当然如果你有几台公网服务器可以考虑。
  2. 电话拨号远程开机,但是费用方面也较为昂贵(比较推荐)

 

自己到淘宝或京东购买,然后在主机上安装硬件后就可以了。一般搜索 开机棒,远程开机卡 等就可以了

 

 

 


TO THE END

 

 

 

 

posted @ 2020-11-06 15:18  握着玫瑰的屠夫  阅读(1522)  评论(0编辑  收藏  举报