笔者实验室购买了一台服务器, 但是没有无线网卡, 所以没有办法正常上网. 之前采用的办法是通过 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 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 上,进入解压后的 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
就可以了
修改 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 表示关闭
如果要使用一台公网服务器同时为多台服务器配置内网穿透, 只需要启动一次 frps, 然后分别在不同的客户机启动 frpc
唯一需要修改的地方就是 proxies 中的 name
和 remotePort
, 改为不同的名字和端口号即可, 连接时指定对应的端口号即可选择不同的服务器
客户端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
上述方式可以做到连接, 但是并不安全, 因为将主机端口直接暴露给网络
现在其他服务器的做法:主要目标是不能把内网机器的端口直接暴露出去,基于这个原则这样设置
这个跳板机不需要是另一台服务器, 可以是本机(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