想法产生

主机一般都放在宿舍内的,想要从其他地方访问宿舍内的服务器非常的不方便,但是又奈何宿舍宽带很难申请公网IP,所以才会想到用内网穿透的方式实现对宿舍内主机的访问。

notes

  1. 宿舍内都是局域网,连接到的校园网wifi或者宽带分配的IP都会随着重新连接产生变动,所以在此会使用到DDns技术。ddns就是把一个动态变化的IP地址和一个不变的域名绑定在一起,直接访问这个域名就可以实现访问到这个变化的IP地址的作用。
  2. 花生壳免费版会赠送一个域名,可以直接实现内网穿透,比较简便;
  3. frp适合有一个公网IP,然后通过公网IP的转发实现内网穿透。

在此之前,请确保已经安装openssh-server!!!

花生壳实现

大致流程

  1. 在花生壳官网上面下载linux版本的客户端;
  2. 安装完成之后在终端中输入:
sudo phddns start
sudo phddns enable
sudo phddns status

然后会出现一个SN码,这个SN码就相当于这个主机的ID,然后在花生壳官网上使用SN码进行登录,密码默认是admin

通过sn登录之后再绑定到注册的花生壳帐号上;再到花生壳内网穿透界面去添加映射,内网地址填127.0.0.1或者是自己的局域网地址好像我都实验成功过。

都设置好之后可以在映射旁边又一个诊断按钮,可以看是否成功了。

在进行ssh连接的时候只需要ssh -o 12345 your_name@xxxxxx.xx就行了;

12345是你的映射上的外网端口,your_name是你的内网的用户名,xxxx.xx是你的域名

可能会出现的问题

首先请查看官方文档

第一步的内网服务和花生壳服务器连接不上

你可以phddns status检查一下他是OFFLINE还是ONLINE的状态,遇到OFFLINE就需要重启服务

等到他变成ONLINE之后,在检查花生壳网站上的最右上角的头像,鼠标悬浮就能看到有一个状态,状态若是离线,但是phddns又是ONLINE,就退出重新登录一下就好了。

同时可以看看左边边栏上有一个设备管理。

frp实现

访问frp的github仓库releases页面:https://github.com/fatedier/frp/releases

frp的官方文档:https://gofrp.org/zh-cn/docs/overview/

通过 SSH 访问内网机器

步骤

  1. 在具有公网 IP 的机器上部署 frps

    部署 frps 并编辑 frps.toml 文件。以下是简化的配置,其中设置了 frp 服务器用于接收客户端连接的端口:

    bindPort = 7000
    log_file = /var/log/frps.log
    

    在frps中添加上日志文件的位置/var/log/frps.log,方便查看。

    这里还支持dashboard,prometheus监控等功能。 参考配置:https://cloud.tencent.com/developer/article/1837482

    [common]
    # frp监听的端口,默认是7000,可以改成其他的
    bind_port = 7000
    # 授权码,请改成更复杂的
    token = 52010  # 这个token之后在客户端会用到
    
    # frp管理后台端口,请按自己需求更改
    dashboard_port = 7500
    # frp管理后台用户名和密码,请改成自己的
    dashboard_user = admin
    dashboard_pwd = admin
    enable_prometheus = true
    
    # frp日志配置
    log_file = /var/log/frps.log
    log_level = info
    log_max_days = 3
    
  2. 在需要被访问的内网机器上部署 frpc

    部署 frpc 并编辑 frpc.toml 文件,假设 frps 所在服务器的公网 IP 地址为 x.x.x.x。以下是示例配置:

    serverAddr = "x.x.x.x"
    serverPort = 7000
    
    [[proxies]]
    name = "ssh"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 22
    remotePort = 6000
    
    • localIPlocalPort 配置为需要从公网访问的内网服务的地址和端口。
    • remotePort 表示在 frp 服务端监听的端口,访问此端口的流量将被转发到本地服务的相应端口。
  3. 启动 frps 和 frpc

​ 在客户端上要用sudo ./frpc -c frpc.toml,如果不使用sudo代码会出现一些错误。

​ 可以使用systemd对frps进行管理:

sudo mkdir -p /etc/frp
sudo cp frps.toml /etc/frp
sudo cp frps /usr/bin
sudo cp systemd/frps.service /usr/lib/systemd/system/
sudo systemctl enable frps
sudo systemctl start frps

记得放开防火墙和安全组对应的端口(remotePort, serverPort, dashboard_port)

参考配置:

# 客户端配置
[common]
server_addr = 服务器ip
server_port = 7000 # 与frps.ini的bind_port一致
token = 52010  # 与frps.ini的token一致

# 配置ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000  # 这个自定义,之后再ssh连接的时候要用

# 配置http服务,可用于小程序开发、远程调试等,如果没有可以不写下面的
[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
subdomain = test.hijk.pw  # web域名
remote_port = 自定义的远程服务器端口,例如8080
  1. 通过 SSH 访问内网机器

    使用以下命令通过 SSH 访问内网机器,假设用户名为 test:

    ssh -o Port=6000 test@x.x.x.x
    

    frp 将请求发送到 x.x.x.x:6000 的流量转发到内网机器的 22 端口。

    注意是服务器的用户名和IP地址。

参考文章:https://www.cnblogs.com/betterquan/p/11966303.html