使用ssh+华为云服务器实现内网穿透

举报
┈┾醉意流年っ 发表于 2019/11/07 12:20:05 2019/11/07
【摘要】 用 ssh 访问一台主机,如果和主机在一个局域网中或者主机拥有公网 IP,就可以使用 ssh 命令直接连接主机的 IP 地址,但是大部分公司和家庭内部都是局域网,并不能给局域网内的每一台主机都分配一个公网 IP,这时候就需要进行内网穿透,才能从外部连接到局域网内的主机。什么是内网穿透简单来说内网穿透就是实现不同局域网内的主机间的通信,通俗点讲,当你在宿舍写代码,想访问机房里的服务,但是机房没...

用 ssh 访问一台主机,如果和主机在一个局域网中或者主机拥有公网 IP,就可以使用 ssh 命令直接连接主机的 IP 地址,但是大部分公司和家庭内部都是局域网,并不能给局域网内的每一台主机都分配一个公网 IP,这时候就需要进行内网穿透,才能从外部连接到局域网内的主机。

什么是内网穿透

简单来说内网穿透就是实现不同局域网内的主机间的通信,通俗点讲,当你在宿舍写代码,想访问机房里的服务,但是机房没有外网IP,所有的web服务都是通过内网发布的(192.168.xx.xx等),那你在宿舍就无法访问到这些服务,可你又不想去机房,那么应该怎么办呢?内网穿透就可以帮你解决这个困境。通过内网穿透,你用宿舍的网络就可以访问到机房的web服务。
或者是你用宿舍的网络,可以SSH访问机房的服务器(服务器没有公网IP)。又或者时你你的闲置手机挂了个Termux,想从其他地方远程访问。

具体步骤

1.在服务器上安装ssh-server

1
2
apt-get install openssh-server
#linux云服务器默认已经安装,这里就跳过

2. 在客户端上连接到服务器,并进行映射

1
2
3
4
ssh -R <server_port>:<local_ip>:<local_port> user@server_ip
# ssh -R 8888:127.0.0.1:8022 chenbao@115.28.***.187
#将本地的local_ip:local_port 映射到 server 的server_port
#ssh将会在服务器上监听server_por 并将消息转发到 local_ip:local_port

图片说明

这里我用我手机termux手机示范

3.检查连接状态

1
2
3
netstat -l | grep :8888
#netstat -l | grep :server_port
#可以看到服务器端已经监听了8888端口,但是监听的是localhost的8888 ,只能实现服务器本地访问

图片说明

3.1 内部访问测试

图片说明
我映射的是termux上的8022端口(ssh服务)
在服务器上用ssh连接到termux的ssh服务进行测试 , 能成功连接,说明映射成功

4.实现服务器公网访问

4.1 方案一 在服务器端建立一个正向转发

1
2
3
#连接到服务器上 略
#建立任意ip(0.0.0.0)到 localhost(127.0.0.1) 的正向代理
ssh -L 0.0.0.0:8889:127.0.0.0.1:8888 chenbao@localhost

图片说明

图片说明

1
#再次查看连接情况 0.0.0.0:8889已经监听,这时即可使用服务器公网ip进行访问?(你可能需要在华为云服务器控制台开放需要映射到公网的端口)

4.2 修改sshd配置文件,为了避免与主sshd服务冲突,建议新建一个配置文件

1
2
3
4
5
6
7
8
#将默认配置的有效项 复制到 ~/sshd_config 中
grep "^[^#]" /etc/ssh/sshd_config > ~/sshd_config
#修改~/sshd_config 更改端口,添加选项 GatewayPorts yes (允许直接映射到全局(0.0.0.0))
vim  ~/sshd_config
添加
Port 8882
GatewayPorts yes
#建议注释Subsystem行

图片说明

启动新的sshd服务
1
2
3
/usr/sbin/sshd -f /etc/ssh/sshd_config
#如果提示权限不够 就 sudo /usr/sbin/sshd -f /etc/ssh/sshd_config
#如果没有找不到error: Could not load host key: /etc/ssh/ssh_host_ed25519_key 就先 ssh-keygen -A

5.其他

5.1使客户端的ssh在后台运行

带参数 -N(不执行远程命令. 用于转发端口) -f(在执行命令前退至后台)

5.2 共享给其他人时保证安全性

1.在服务器上新建一个普通用户 onlynat
2.手写一个shell(误)

1
2
3
4
5
6
7
8
9
#include <iostream>
using std::string;
using std::cin;
int main()
{
    string tmp;
    while(cin>>tmp);
    return 0;
}
  1. 编译上述代码,并将这个程序设置为onlynat的she'l'l

  2. 编辑~/sshd_config 添加行 AllowUsers onlynat

  3. 重启sshd_cinfig 这时 onlynat 就只能使用手写的shell,而无法执行任何命令了


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。