Bruce Boron

rookie0peng

结论

通过修改监听+防火墙,搞定。

现场

原来的 MySQL 端口监听情况:

1
2
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      159745/mysqld       
tcp 0 0 127.0.0.1:33060 0.0.0.0:* LISTEN 159745/mysqld

它说明 MySQL 仅监听本地回环地址 127.0.0.1,也就是说:

  • 只能在服务器本机上访问数据库;

  • 无法从 VPN 客户端(如 10.8.0.x 网段)连接数据库;

  • 你的 openvpn 虽然连通,但客户端连接 10.8.0.1:3306 会失败。

解决方法:修改 MySQL 配置文件

你需要让 MySQL 监听在 0.0.0.0(表示所有网卡,包括 VPN 内网)或指定 VPN 网卡的 IP(如 10.8.0.1)上。

1️⃣ 修改配置文件

文件路径通常是:

1
/etc/mysql/mysql.conf.d/mysqld.cnf        # Ubuntu/Debian

找到这一行:

1
bind-address = 127.0.0.1

改为:

1
bind-address = 0.0.0.0

然后重启 MySQL:

1
sudo systemctl restart mysql

2️⃣ 再次检查监听:

1
sudo ss -tulnp | grep 3306

希望看到类似:

1
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      xxxx/mysqld

或:

1
tcp        0      0 10.8.0.1:3306           0.0.0.0:*               LISTEN      xxxx/mysqld

3️⃣ ⚠️ 补充:记得放行防火墙和确认权限

修改监听后,别忘了:

  • 防火墙放行 3306 给 VPN 段(如:ufw allow from 10.8.0.0/24 to any port 3306);
  • 确保数据库用户有权从 10.8.% 段连接(创建 user@'10.8.%')。

系统版本号:Ubuntu 24.04.2 LTS

一、安装 OpenVPN 和 Easy-RSA

1
2
sudo apt update
sudo apt install openvpn easy-rsa -y

二、配置 CA 证书与密钥

Easy-RSA 是一个用于创建和管理 PKI (公钥基础设施)的工具集。

1、创建 Easy-RSA 工作目录

1
2
make-cadir ~/openvpn-ca
cd ~/openvpn-ca

2、初始化 PKI

1
./easyrsa init-pki

3、构建 CA(输入密码用于保护私钥)

1
./easyrsa build-ca

三、生成服务器端密钥和证书

1
2
./easyrsa gen-req server nopass
./easyrsa sign-req server server

会提示你确认签署请求。

四、生成 Diffie-Hellman 参数和 TLS 密钥

1
2
./easyrsa gen-dh
openvpn --genkey --secret ta.key

五、生成客户端证书(以 client1 为例)

1
2
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

六、配置 OpenVPN 服务器

1. 复制所需文件

1
sudo cp pki/ca.crt pki/issued/server.crt pki/private/server.key pki/dh.pem ta.key /etc/openvpn/

2. 创建配置文件

1
sudo nano /etc/openvpn/server.conf

3. 示例配置 server.conf:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA256
tls-auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
cipher AES-256-CBC
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1

七、启用并启动服务

1
2
sudo systemctl enable openvpn@server
sudo systemctl start openvpn@server

查看状态:

1
sudo systemctl status openvpn@server

八、开启 IP 转发和防火墙设置

1. 编辑 sysctl 配置文件

1
sudo nano /etc/sysctl.conf

取消以下行的注释:

1
net.ipv4.ip_forward=1

使配置生效:

1
sudo sysctl -p

2. 设置 UFW 防火墙(以 eth0 为主网卡为例)

1
2
3
sudo ufw allow 1194/udp
sudo ufw allow OpenSSH
sudo nano /etc/ufw/before.rules

在文件顶部添加:

1
2
3
4
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.8.0.0/8 -o eth0 -j MASQUERADE
COMMIT

启用 UFW 转发:

1
sudo nano /etc/default/ufw

找到:

1
DEFAULT_FORWARD_POLICY="DROP"

改为:

1
DEFAULT_FORWARD_POLICY="ACCEPT"

重启 UFW:

1
2
sudo ufw disable
sudo ufw enable

九、配置客户端

1.在客户端创建 .ovpn 文件(如 client1.ovpn):

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
client
dev tun
proto udp
remote <服务器公网IP> 1194
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA256
cipher AES-256-CBC
key-direction 1
verb 3

<ca>
# 内容来自 ca.crt
</ca>

<cert>
# 内容来自 client1.crt
</cert>

<key>
# 内容来自 client1.key
</key>

<tls-auth>
# 内容来自 ta.key
</tls-auth>

你可以使用 scp 或其他方式把证书和配置文件传给客户端。

十、测试连接

启动客户端,观察连接日志;

使用 ifconfig 或 ip a 确认 tun0 接口是否启用;

在服务器端查看连接日志:

1
tail -f /var/log/syslog

结论

最后确定笔者遇到的是数据库监听地址限制的问题,也就是本文的第 1 点,具体解决方案见下一篇文档。

✅ 排查顺序建议(数据库无法通过 VPN 访问)


🔹 1. 数据库监听地址限制(最常见)

很多数据库(如 MySQL、PostgreSQL)默认只监听 127.0.0.1,也就是说 只允许本机访问

你需要确认数据库是否监听在 0.0.0.0 或 VPN 内网 IP(如 10.8.0.1)上。

✅ MySQL 检查方法:

1
sudo netstat -tulnp | grep mysql

1
sudo ss -tulnp | grep 3306

默认只监听 127.0.0.1:3306 就是问题所在。

🔧 解决方法:

修改 MySQL 配置文件,路径可能是:

  • /etc/mysql/mysql.conf.d/mysqld.cnf
  • /etc/my.cnf

找到如下行:

1
bind-address = 127.0.0.1

改为:

1
bind-address = 0.0.0.0

然后重启服务:

1
sudo systemctl restart mysql

🔹 2. 数据库用户权限不足

数据库用户可能只允许从 localhost 登录,而不允许从 VPN 内网 IP 登录。

✅ MySQL 检查方法:

进入数据库:

1
mysql -u root -p

查看当前允许连接的用户:

1
SELECT user, host FROM mysql.user;

如果你看到类似:

1
user1 | localhost

你需要新增允许 VPN 内网连接的用户,例如:

1
2
3
CREATE USER 'user1'@'10.8.%' IDENTIFIED BY 'yourpassword';
GRANT ALL PRIVILEGES ON yourdb.* TO 'user1'@'10.8.%';
FLUSH PRIVILEGES;

🔹 3. 数据库端口未放行(针对 UFW、iptables、云安全组)

假如你 VPN 通了,但是数据库的端口(如 3306)仍然被防火墙阻断:

UFW:

1
sudo ufw allow from 10.8.0.0/24 to any port 3306

iptables:

1
sudo iptables -A INPUT -s 10.8.0.0/24 -p tcp --dport 3306 -j ACCEPT

云服务器:

请确认你的安全组 允许来自内网 IP(10.8.0.x)访问 3306 端口,或者将来源地址设置为 10.8.0.0/24


🔹 4. 连接方式不对(localhost vs IP)

确保你在客户端使用的是 VPN 分配的内网地址,例如:

1
mysql -h 10.8.0.1 -u user1 -p

不要用:

1
mysql -h localhost

🔹 5. SELinux / AppArmor 限制(部分系统)

如果你在 CentOS 或启用了 SELinux 的 Ubuntu 上,也可能会被安全策略限制。

可以尝试查看是否有数据库端口被限制:

1
sudo dmesg | grep DENIED

或用:

1
sudo aa-status

🧪 示例测试命令

从客户端 ping 和 telnet 数据库端口:

1
2
ping 10.8.0.1
telnet 10.8.0.1 3306

如果 ping 通但 telnet 不通,则多半是数据库未监听或端口未放行。


🔚 总结

问题分类 检查建议
数据库监听范围 修改 bind-address = 0.0.0.0
用户权限限制 增加 user@'10.8.%' 权限
防火墙端口限制 放行 330610.8.0.0/24 内网段
连接方式错误 10.8.0.1 作为 host 连接

一步一步排查连接失败原因

最后确定笔者遇到的是防火墙放行的问题,也就是本文的第 3 点。

🔹 1. 服务端是否真的在运行?

执行以下命令确认 OpenVPN 是否启动并监听:

1
sudo systemctl status openvpn-server@server

或者如果你是用 server.conf 方式启动的:

1
sudo systemctl status openvpn@server

没有启动的话执行:

1
sudo systemctl start openvpn@server

确认服务有没有报错启动失败:

1
sudo journalctl -xeu openvpn@server

🔹 2. 服务端监听端口是否开放?

ssnetstat 查看是否监听了你配置的端口(如 TCP 1194):

1
sudo ss -tnlp | grep 1194

输出应类似:

1
LISTEN  0  128  0.0.0.0:1194  0.0.0.0:*  users:(("openvpn",pid=1234,fd=3))

没有监听说明服务没启动或配置有误。


🔹 3. 防火墙或云安全组是否放行了 1194 端口?

在 Ubuntu 上,使用 UFW 检查规则:

1
sudo ufw status

确认是否放行了:

1
sudo ufw allow 1194/tcp

⚠️ 如果你用的是云服务器(比如 AWS、阿里云、腾讯云),还需要在控制台安全组中开放 1194 端口。


🔹 4. 客户端是否使用了正确的 IP 和端口?

客户端配置中必须准确写明服务器公网 IP 和协议端口:

1
2
remote YOUR_PUBLIC_IP 1194
proto tcp

你可以在客户端终端运行:

1
2
ping YOUR_PUBLIC_IP
telnet YOUR_PUBLIC_IP 1194

或使用 nc

1
nc -zv YOUR_PUBLIC_IP 1194

如果连不上,说明公网或防火墙有问题。


🔹 5. 服务端日志路径是否正确?

你的 server.conf 中:

1
2
log openvpn.log
status openvpn-status.log

这两个路径是相对路径(默认写入 /etc/openvpn/ 或服务的工作目录)。你可以改成绝对路径方便查找:

1
2
log /var/log/openvpn.log
status /var/log/openvpn-status.log

重启服务后查看日志:

1
sudo tail -f /var/log/openvpn.log

🔹 6. SELinux/AppArmor 是否限制了服务访问?

(适用于某些更安全的环境)

你可以查看系统日志是否出现阻止 openvpn 的信息:

1
dmesg | grep -i openvpn

🔹 7. 临时开启调试模式(手动启动)

你可以手动运行 OpenVPN 看是否输出日志:

1
sudo openvpn --config /etc/openvpn/server.conf

看是否有报错信息直接输出在终端。


前情提要

今天逛知乎时,突然看到有个文章,说有两种方法可以开通 GPT4。

  • 使用 Apple App Store 可以开通 GPT4,但是新用户没法开通,因为不开放这个入口了。
  • 使用 WildCard 可以开通 GPT4。

抱着试一试的心态,尝试了下 WildCard,真的开通成功了。

如何开通

注意:开卡需要支付一定的费用,并且需要支付一定的手续费,请一定考虑清楚。

接下来简单介绍一下使用 WildCard 开通 GPT4 的过程。

Read more »

在一个平平无奇的早上,我一边摸着鱼,一边整理着需求。

忽然,有个前同事发消息过来,说前领导找我要本司的部分产品设计方案产品研发流程

(是的,我都没有前领导的好友,前领导通过前同事联系的我。)

Read more »

走在去健身房的路上,突然一短发背着双肩包的男子走了过来。

男子:你好,可以借我十几块钱坐公交吗?我找工作把钱花光了。

我:啊?(我有点懵,为啥这么多人不问,偏偏问我。)

男子看我疑惑的的表情,又复述了一遍刚刚话。

男子:我找工作把钱花光了,可以借我十几块钱坐公交吗?

我:那个,前面100m就是地铁站,要不你去那找工作人员接济一下?

男子低着头往相反方向走了,脸上带着失望。

2020-10-03

国际化的定义各不相同。这是用于 W3C 国际化活动材料的高级工作定义。有些人使用其他术语(例如全球化)来指代同一概念。
国际化是产品、应用程序或文档内容的设计和开发,它可以为不同文化、地区或语言的目标受众轻松本地化。
国际化(Internationalization)通常用英文写成i18n,其中 18 是英文单词中i和n之间的字母数。[1]

本文主要基于java针对语言国际化进行阐述。

任何一个面向全世界的软件都会面临多语言国际化的问题,对于java web应用,要实现国际化功能,就是在数据展示给用户之前,替换成对应的语言。

Read more »

走在去健身房的路上,突然一短发背着双肩包的男子走了过来。

男子:你好,可以借我十几块钱坐公交吗?我找工作把钱花光了。

我:啊?(我有点懵,为啥这么多人不问,偏偏问我。)

男子看我疑惑的的表情,又复述了一遍刚刚话。

男子:我找工作把钱花光了,可以借我十几块钱坐公交吗?

Read more »

我在店里吃完肠粉,玩手机时,一小孩走了过来,盯着我的手机看了会。

小孩:叔叔,可以借我你的手机打个电话吗?

我:啊?

小孩:给我妈打个电话,可以吗?

我:哦,可以啊,给!

Read more »
0%