Linux 内外网通过隧道反向连接

lixf6 · 2022年01月16日 · 最后由 lixf6 回复于 2022年01月18日 · 2187 次阅读

@TOC

业务背景

外网的机器需要访问内网,正常情况下无法访问,需要通过 autossh 建立隧道从而建立连接。

过程

假设 A 是内网,B 是公网
1、确保 A 能通过 ssh 连接上 B 机器

ssh root@B_ip

备注,这里需要通过公钥和私钥进行连接
查看 A 机的公钥
A 机操作:

[root@wk1 ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EA#######balilia#######balilia

将 A 的公钥放置到 B 机,vim 插入模式复制上面的公钥保存
B 机操作:

[root@iZwz9ir35kqtndn7ojffvpZ ~]# vim .ssh/authorized_keys

然后通过 ssh root@B_ip 确保能连接上,连接成功效果见下
A 机操作:

[root@wk1 ~]# ssh root@B_ip

Welcome to Alibaba Cloud Elastic Compute Service !

Activate the web console with: systemctl enable --now cockpit.socke

2、通过 autossh 连接

centos 安装 autossh

yum install autossh

建立端口映射连接,这里使用的目的是使得 B 机的 19394 映射到 A 机的 22 端口,也就是当访问公网 B 对应的端口 19394,相当于访问 A 机 22 端口

[root@wk1 ~]# autossh -M0 -fNR 19394:127.0.0.1:22 root@B_ip

3、确认端口映射成功
B 机操作

[root@iZwz9ir35kqtndn7ojffvpZ ~]# netstat -platn | grep LISTEN          
tcp        0      0 127.0.0.1:19394         0.0.0.0:*               LISTEN      27534/sshd: root  

开放给外网使用(不只是 127.0.0.1)

B 机操作:
增加以下配置

[root@iZwz9ir35kqtndn7ojffvpZ mitm]# vim /etc/ssh/sshd_config
Match User root
  GatewayPorts yes

在这里插入图片描述
重启 ssh 配置使得其生效

[root@iZwz9ir35kqtndn7ojffvpZ mitm]# service sshd restart
Redirecting to /bin/systemctl restart sshd.service

重新杀掉 autossh 进程及重新创建 autossh 进程
A 机操作:

[root@wk1 ~]# ps -ef | grep autossh
root     115591      1  0 15:44 ?        00:00:00 autossh -M0 -NR  8080:0.0.0.0:8080 root@B_ip
root     121208 114250  0 15:45 pts/7    00:00:00 grep --color=auto autossh
[root@wk1 ~]# kill 115591
[root@wk1 ~]# autossh -M0 -fNR 0.0.0.0:8080:0.0.0.0:8080 root@B_ip

然后去 B 机查看,发现已经是对 0.0.0.0 开放
B 机操作:

[root@iZwz9ir35kqtndn7ojffvpZ mitm]# netstat -anplt | grep LISTEN
tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      1943/sshd: root

查看 A 机:

[root@wk1 ~]# ps -ef | grep autossh
root      31418    419  0 09:01 pts/5    00:00:00 grep --color=auto autossh
root     120499      1  0 9月01 ?       00:00:01 autossh -M 19393 -NR  0.0.0.0:8080:0.0.0.0:8080 root@8.135.10.27

本人实际使用主要是通过 B 机的 8080 端口-->A 机的 8080 端口
然后 A 机配置容器端口映射到宿主机 A,即

docker run --rm -itd  -v /var/docker/mitm:/var/app -p 8080:8080 --name python-mitm python:latest

怎么判断有没有映射成功
方法一:直接浏览器输入 B_ip:8080,效果反馈如图,可以对比访问不成功时 B_ip:12324(会一直转圈,没那么快响应)
在这里插入图片描述

方法二、容器里面启动的 8080 服务,当外面访问成功时会一直产生日志

参考:
https://199604.com/1485
http://www.huangwenchao.com.cn/2016/10/ssh-reverse-tunnel.html
https://www.cnblogs.com/kwongtai/p/6903420.html

最佳回复

v** 会经常断全身(最长应该是 12 个小时),没办法做到一直运行

共收到 3 条回复 时间 点赞

不明觉历

这个场景用 V*i 是不是更正规一些?看起来有点像是一些暴露内网端口给公网访问的招,容易有安全风险。

v** 会经常断全身(最长应该是 12 个小时),没办法做到一直运行

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册