【1】补充 Linux 命令
1 | # 关机 |
wg-quick up/down hk
curl ip.gs 用 curl 访问 ip.gs 这个网站,查看当前公网 IP 地址
sudo mysql -u root 使用 root 权限打开 mysql 命令行
sudo 以超级用户的身份执行命令
grep 文本搜索工具,在文件里找出包含指定内容的行
1 | grep 要找的内容 在哪个文件里找 |
【2】Linux 下的文件目录:
/etc 系统配置文件
/home 普通用户的个人目录 —–> C:\Users
/root root 用户的个人目录 ——> Administrator 的目录
/var/log 日志 —–> C:\Windows\Logs
/opt 第三方/自行部署的软件 ——> C:\Program Files
/user/bin 命令和程序 —–> C:\Windows\System32
/tem 临时文件 ——> C:\Windows\Temp
/opt 放自己部署的应用
网络配置放 /etc :
/etc/netplan/50-cloud-init.yaml
【3】用 Navicat 连接数据库
执行:用来查看数据库配置
1 | sudo grep DB_ /opt/inkwell-blog/backend/.env |
查询结果分析:
- DB_HOST=127.0.0.1 主机
- DB_PORT=3306 端口号
- DB_NAME=inkwell_blog 用哪个数据库(名称)
- DB_USER=inkwell 用哪个账号(账户)
- DB_PASSWORD=xxx 密码
127.0.0.1 :意思是在我自己的这台电脑上(localhost),谁用它,它就指谁自己
由于我的 inkwell-blog 项目和 mysql 数据库在同一台虚拟机里面,程序要连接数据库时,host 写 127.0.0.1 就是直接找本机的mysql 数据库
Navicat 装在你的 Windows 电脑上,它发起连接时,数据库在”对面那台电脑”(虚拟机)上。所以对 Navicat 来说:
| .env 里的值 | Navicat 里填什么 |
|---|---|
| DB_HOST=127.0.0.1 | 主机:192.168.3.180 |
| DB_PORT=3306 | 端口:3306 |
| DB_USER=inkwell | 用户名:inkwell |
| DB_PASSWORD=xxx | 密码:xxx |
| DB_NAME=inkwell_blog | 连接时不填,连上后点开这个库 |
【4】SSH 隧道连接方式
- 「SSH」页的主机:填 192.168.3.180 —— 这一步是 Windows 去找 Linux 虚拟机建隧道,站在 Windows 的角度,对方是虚拟机
- 「常规」页的主机:填 127.0.0.1 —— 隧道建好后,连接请求是从 Linux 虚拟机”内部”发向 MySQL 的,站在 Linux 的角度,MySQL 就在自己这台机器上,所以填127.0.0.1
私钥文件地址:
Windows:C:\Users\你的用户名.ssh\
Linux:~/.ssh/ root 用户就是 /root/.ssh/,普通用户是 /home/用户名/.ssh/
/root/.ssh/有三个文件:
id_ed25519 + id_ed25519.pub:虚拟机自己作为客户端、去连别的服务器时用的
authorized_keys:这个文件里存着”被允许用公钥登录 root 的公钥列表”。
在 Windows 上生成密钥对:
1 | ssh-keygen -t ed25519 |
然后把公钥在虚拟机里追加到 /root/.ssh/authorized_keys 文件末尾
1 | # 生成时指定文件名 |
| Navicat 的位置 | SSH 页 | 常规 页 |
|---|---|---|
| 连的是什么 | Navicat 连接 Linux | MySQL 软件 |
| 填哪种账号 | Linux 系统账号 | MySQL 数据库账号 |
| 具体填什么 | root | inkwell |
常见端口号:
22 :SSH 服务——管”远程登录这台电脑”的
3306 :MySQL 服务——管”数据库查询”的
8000 :(博客后端)
80 窗口:(nginx)
网页服务(HTTP)默认 80,加密的(HTTPS)默认 443
【5】疑惑?
既然用SSH隧道连接了,那为什么常规页还需要填密码呢?用SSH隧道连接的目的不就是为了不填密码吗?
SSH 隧道做的事情仅仅是:在你Windows 和虚拟机的 3306 端口之间,修一条加密的专用通道。数据从这条通道里走过去,别人偷看不到,防火墙也拦不住——但通道的终点依然是 MySQL 这个软件本身。
MySQL 收到连接请求后,需要填写数据库账号和密码,才能连接上
不用 SSH 隧道,直连 MySQL 需要满足的条件:
- MySQL 要对外开放 3306 端口(bind-address = 0.0.0.0)
- 防火墙要放行 3306
- 数据库账号要允许远程登录(比如 inkwell@%)
- 数据库密码在网络上明文传输的风险(MySQL 8 默认加密,好些,但端口暴露本身就是攻击面)
正式的服务器出于安全,这些都是关掉的:3306 对外封死,账号只允许 localhost。这时 SSH 隧道是唯一入口——它只需要开放 22 一个端口,有密钥就能进,不用记 Linux 密码,传输全程加密。
不用SSH隧道的方式,直接输密码也能连接的原因:
MySQL 监听了 0.0.0.0:3306(bind-address = 0.0.0.0),表示任何连接都可以,而不是只听本机(127.0.0.1)
防火墙没拦 3306 端口——虚拟机的 ufw 是关闭状态,iptables 也是全放行,外部包能顺利到达 3306。
数据库账号允许远程登录——inkwell 账号主机部分是 %(inkwell@%),表示”从任何 IP 来都可以”;如果是 inkwell@localhost,远程来了就会拒绝。
可以在 Linux 下查看相应的内容:
1 | # MySQL 监听地址(bind-address) |
可以用这三个命令排查连不上数据库的问题:
| 层面 | 命令 | 看什么 |
|---|---|---|
| 软件层面 | sudo ss -tlnp | grep 3306 | 监听的是 0.0.0.0 还是 127.0.0.1 |
| 系统防火墙 | sudo ufw status | active 还是 inactive |
| 数据库账号是否允许远程 | sudo mysql -u root -e “SELECT user,host FROM mysql.user;” | host 是 % 还是 localhost |
输出如下:
bind-address = 0.0.0.0 —— 经典 MySQL 协议,监听 3306 端口
mysqlx-bind-address = 127.0.0.1 —— X 协议(MySQL X Plugin),监听 33060 端口
1 | root@linux-server:~# grep -r bind-address /etc/mysql/ |
输出如下:
host 列的 % = 允许从任何 IP 连接;如果是 localhost 就只允许本机
1 | root@linux-server:~# sudo mysql -u root -e "SELECT user, host, plugin FROM mysql.user;" |
【6】netplan 网络配置工具
/etc/netplan/50-cloud-init.yaml 配置文件
dhcp4: true :自动获取 IP
1 | # 查看当前系统所有的路由规则 |
与网络相关的常用命令:
1 | # 显示网卡本身的信息:IP 地址、MAC 地址等 |
Nginx 负责接收浏览器发来的网页访问请求,管理网页进出服务器的数据。
1 | ping 192.168.3.1 # 测网关通不通 |