网络通信

笔者实验室购买了一台服务器, 但是没有无线网卡, 所以没有办法正常上网. 之前采用的办法是通过 USB 数据线连接手机热点, 但是需要人到机房内, 很不方便, 现在希望可以远程访问该服务器

无线网卡

首先解决网络通信的问题. 已知机房内并没有交换机和网线接口, 并不能通过网线连接的方式访问公网, 因此采用购买无线网卡的方式, 最终的选择是 Tenda腾达 WiFi6免驱 usb无线网卡

腾达官网可以找到 linux 的驱动, 安装下载 Linux(Ubuntu)驱动(支持内核3.10~6.8), 根据解压后的安装 pdf 可知只需要

直接安装可能会报错, 因为该驱动需要高版本 gcc(12) 来安装, 首先安装 gcc-12

sudo apt install gcc-12
sudo dpkg -i <pkg-name>

成功安装网卡驱动, 然后将 USB 设备插入服务器即可搜索附近局域网

随身 WIFI

然后需要解决路由器的问题, 这里选择 华为智选 移动随身wifi mini随行无线网卡, 开通后即可在服务器上搜索并连接该 WIFI, 然后就可以正常访问公网了

内网穿透

但是现在服务器仅是可以访问公网, 但是并不能通过其他机器访问, 因此需要内网穿透, 即可以在公网上使用 ssh 访问某台内网服务器

为了达到这个目的, 需要准备如下三件东西:

选择 frp 来实现该功能, 在 frp releases 中下载最新版本并解压, 在 server 和 client 上都下载

wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz
tar xf frp_0.58.1_linux_amd64.tar.gz
sudo apt update
sudo apt install net-tools tmux openssh-client openssh-server

server 部分

首先在 server 上,进入解压后的 frp 文件夹. 默认 frp 的端口号是 7000, 首先查看一下这个端口号是否占用

netstat -tuln | grep :7000

如果没有输出说明没有占用, 否则修改 frps.toml 的端口(找一个空闲的)

bindPort = 7001

server 端默认会有输出日志, 所以在 tmux 中后台执行

tmux attach || tmux

进入 tmux 之后执行, 运行成功后使用 ctrl b + d 切换到后台进程

./frps -c ./frps.toml

再次进入只需要 tmux attach 就可以了

client 部分

修改 frpc.toml, 其中 serverAddr 是 server 的公网 IP,serverPort 和 刚刚 server 上的 bindPort 保持一致. 请保证 localPort 是 loc 上的 ssh 服务端端口号,此处填写 22 是因为 sshd 默认开放的端口就是 22. remotePort 是我们后面访问 server 时需要使用的转发端口

serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6001

在后台启动 frpc

./frpc -c ./frpc.toml

在你的 server 防火墙中,放行如下两个端口:bindPort,remotePort.在我的例子中,是 7000 和 6001 这两个端口. 检查一下防火墙是不是关闭了

sudo ufw status
# inactive 表示关闭

多 client

如果要使用一台公网服务器同时为多台服务器配置内网穿透, 只需要启动一次 frps, 然后分别在不同的客户机启动 frpc

唯一需要修改的地方就是 proxies 中的 nameremotePort, 改为不同的名字和端口号即可, 连接时指定对应的端口号即可选择不同的服务器

客户端1

serverAddr = "x.x.x.x"
serverPort = 7000

[[proxies]]
name = "ssh-1"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6001

客户端2

serverAddr = "x.x.x.x"
serverPort = 6000

[[proxies]]
name = "ssh-2"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6002

连接只需要使用

ssh client的用户名@server的公网IP -p 6001

跳板机

上述方式可以做到连接, 但是并不安全, 因为将主机端口直接暴露给网络

现在其他服务器的做法:主要目标是不能把内网机器的端口直接暴露出去,基于这个原则这样设置

  1. 可以在你 frps 运行所在的公网服务器,设置一个没有特权的账户
  1. frps 原本是把 ssh 监听端口设置为 127.0.0.1,而不是 0.0.0.0 ,这样机器的端口就不会直接暴露在公网,我们得先 ssh 连进 公网服务器没有特权的账户,再 ssh 进内网服务器
  1. 更进一步,把公网服务器没有特权的账户,设置为"不可登录,只可转发",这样就弄好了一个比较安全的跳板机

这个跳板机不需要是另一台服务器, 可以是本机(127.0.0.1)也可以是其他的一台机器

具体做法如下:

首先创建一个新用户 jmp, 不给 sudo 权限

sudo adduser jmp

在 jmp 中启动 frps

jmp $ ./frps -c frps.toml

修改 /etc/passwd, 禁用 jmp 的终端登录, 将 /bin/bash 改为 /bin/false

...
...
jmp:x:1001:1001:,,,:/home/jmp:/bin/false

修改 /etc/ssh/sshd_config, SSH 设置禁用密码登录, 必须通过公钥认证

PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM no

用户侧的 .ssh/config 配置

Host jump.global
    User jmp
    Port 22
    HostName <HOST-IP>
    
Host s1
    User lzx
    Port 6000
    HostName 127.0.0.1
    ProxyJump jump.global

开机自启

将 frpc frpc.toml 复制到 /usr/local/frp 目录下, 并修改权限

sudo chmod +x -R /usr/local/frp/*

创建 /etc/systemd/system/frpc.service

[Unit]
Description=frpc service
After=network.target syslog.target
Wants=network.target

[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.toml

[Install]
WantedBy=multi-user.target
sudo systemctl enable frpc
sudo systemctl daemon-reload
sudo systemctl status frpc

参考

zood