【1】补充 Linux 命令

1
2
3
4
5
6
7
8
# 关机
shutdown -h now

# 重启
reboot

# 修改密码
passwd

wg-quick up/down hk

curl ip.gs 用 curl 访问 ip.gs 这个网站,查看当前公网 IP 地址

sudo mysql -u root 使用 root 权限打开 mysql 命令行

sudo 以超级用户的身份执行命令

grep 文本搜索工具,在文件里找出包含指定内容的行

1
2
3
grep 要找的内容 在哪个文件里找
# 例如
sudo grep DB_ /opt/inkwell-blog/backend/.env

【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
2
# 生成时指定文件名
ssh-keygen -t ed25519 -f ~/.ssh/navicat_vm
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
2
3
4
5
6
7
8
9
10
11
12
13
14
# MySQL 监听地址(bind-address)
grep -r bind-address /etc/mysql/

# 查看实际监听的地址:
sudo ss -tlnp | grep 3306

# 查看防火墙状态
sudo ufw status

# 以管理员权限,列出防火墙中负责"进站流量"这条规则链的所有规则,并用数字形式显示。
sudo iptables -L INPUT -n

# 直接执行后面的 sql 并退出
sudo mysql -u root -e "SELECT user, host, plugin FROM mysql.user;"

可以用这三个命令排查连不上数据库的问题:

层面 命令 看什么
软件层面 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
2
3
root@linux-server:~# grep -r bind-address /etc/mysql/
/etc/mysql/mysql.conf.d/mysqld.cnf:bind-address = 0.0.0.0
/etc/mysql/mysql.conf.d/mysqld.cnf:mysqlx-bind-address = 127.0.0.1

输出如下:

host 列的 % = 允许从任何 IP 连接;如果是 localhost 就只允许本机

1
2
root@linux-server:~# sudo mysql -u root -e "SELECT user, host, plugin FROM mysql.user;"
inkwell % caching_sha2_password

【6】netplan 网络配置工具

/etc/netplan/50-cloud-init.yaml 配置文件

dhcp4: true :自动获取 IP

1
2
3
4
5
# 查看当前系统所有的路由规则
ip route

# 输出如下:默认网关和网卡
default via 192.168.3.1 dev ens33

与网络相关的常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# 显示网卡本身的信息:IP 地址、MAC 地址等
ip addr

# 数据包该往哪里发、查看网关、网卡
ip route

# 测试是两台机器是否能通
ping IP/域名

# 追踪数据包经过了哪些节点
# traceroute IP(需要安装)
# tracepath 192.168.3.107(可直接用)
# tracert 192.168.3.180(Windows系统)

# 测试端口通不通
telnet IP 端口(Windows需要下载)
telnet 192.168.3.107 80
Test-NetConnection 192.168.3.180 -Port 80(Windows系统)

# netplan yaml 修改后,让网络配置生效(不用重启虚拟机)
netplan apply

# 解析域名,查看IP
nslookup 域名

#查看防火墙状态
ufw status

# 查看本机正在监听的 TCP/UDP 端口,同时显示是哪个程序占用了端口。
ss -tulnp

# 查看 nginx 服务当前运行状态
systemctl status nginx

# 查看网络配置文件
cat /etc/netplan/50-cloud-init.yaml

Nginx 负责接收浏览器发来的网页访问请求,管理网页进出服务器的数据。

1
2
ping 192.168.3.1       # 测网关通不通
ping www.baidu.com # 测 DNS 和外网通不通