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试试
ssh -CNL *:444:192.168.224.193:54321 -f root@localhost -p22222
这样我们就通过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
netstat -ano |findstr ":8080"
ssh -gCNR 8888:localhost:54321 -f root@192.168.224.121 -p22222
首先我们到目标C端 Ubuntu系统添加逆向代理
ssh -gCNL *:12345:localhost:8888 -f localhost -p22222
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
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端
- 到SSH官方下载openssh Dos命令行连接 http://www.mls-software.com/opensshd.html
- MinGW:命令行安装
- putty图形ssh连接
ssh-keygen -t rsa
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
修改管理员密码
第一种交互数据 sftp
sftp -P 12345 root@192.168.0.121
与ftp区别在于加密式
cd /root/.ssh
要绝对地址 pwd 看当前目录在linux中 ls 目录中文件和目录
get -r id_rsa.pub C:/users/Administrator/
type id_rsa.pub >>.ssh/authorized_keys
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
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
这是我根据这个连接做的一个脚本,需要修改的内容我会截图出来,已经有中文注释很容易理解,如果你有上面的学习经验,就更容易了。
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
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
Zerotier 免费强烈推荐
Sunny-Ngrok 国内可用 付费10元/月约
./sunny clientid 隧道id
./sunny clientid 隧道id
单隧道,多隧道则 ./sunny clientid 隧道id,隧道id
这个转发方式与我们测试的是一样的,不要随便泄露域名否则承担风险
ngrok 国外需要科学访问
ngrok 官方网https://ngrok.com/docs
- Linux 64位amd下载方式,还是比较建议到官方网去找连接
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
配置自启脚本
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
echo '*/5 * * * * root bash /usr/bin/sunny' >>/etc/crontab
每5分钟检测一次
远程开机
-
网线其他电脑进行呼唤,当然如果你有几台公网服务器可以考虑。
-
电话拨号远程开机,但是费用方面也较为昂贵(比较推荐)
TO THE END