关键字
Windows,防火墙,WSL,Docker,Postgresql
背景环境
公司网络环境比较复杂,有些时候需要关闭一些本地服务,特别是数据库,Redis等。我为了隔离环境,恰好使用的Win11系统支持WSL2(比WSL更高效,占用更少的资源),所以我就把Postgresql,Redis等服务全在WSL中的Docker启动。
然后我想关闭这些环境时,只需要停止WSL的服务就行了。
但是,内网同事需要使用我的Postgresql,我就需要把我的Postgresql暴露出来。
原因分析
可行性分析:WSL和宿主机在同一局域网内。在Windows上开启5432端口,然后把访问转发到WSL上。
解决过程
查看WSL的IP
在宿主机的Windows PowerShell中,输入:
shell
$wsl_ip = (wsl -e hostname -I).Trim()
echo $wsl_ip
# 输出:172.23.35.45 172.17.0.1
可以看到有两个ip地址:
- 172.23.35.45 - 这是WSL2虚拟机的实际IP地址,用于与主机(Windows)通信
- 172.17.0.1 - 这是Docker默认网桥的IP地址(如果你安装了Docker)
也可以在WSL中通过命令行查看IP。
在docker中启动Postgresql(省略)
测试宿主机是否直接访问Postgresql服务
在宿主机的Windows PowerShell中,输入:
shell
Test-NetConnection -ComputerName 127.0.0.1 -Port 5432
必须要能访问。
设置端口转发
创建Powershelll脚本 wsl_port_forward.psl
shell
netsh interface portproxy reset
# 设置端口转发
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=5432 connectaddress=172.23.35.45 connectport=5432
# 查看端口代理
netsh interface portproxy show all
# 代理结果
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
0.0.0.0 5432 172.23.35.45 5432
测试内网是否可以访问?
在宿主机的Windows PowerShell中,输入:
10.18.148.140为内网IP
shell
Test-NetConnection -ComputerName 10.18.148.140 -Port 5432
如果成功,那就成功了。
如果不成功,就要排查宿主机的Windows防火墙问题。
排查宿主机的Windows防火墙
可以先简单临时关闭防火墙,Powershell:
shell
# 临时关闭防火墙:
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False
# 再次测试
Test-NetConnection -ComputerName 10.18.148.140 -Port 5432
# 开启防火墙
Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled True
如果测试成功,那么就是Windows防火墙的问题。
配置Windows防火墙的入站规则
理解入站:
关键概念 | 入站规则(Inbound) | 出站规则(Outbound) |
---|---|---|
作用 | 控制外部设备访问本机的流量 | 控制本机访问外部设备的流量 |
场景 | 内网设备访问 Windows 的 5432 端口 | 不需要配置(除非 PostgreSQL 主动向外连接) |
如何区分,别人访问你,就是入站,你要访问别人就是出站。
打开防火墙设置:
(1) 搜索并打开 高级安全 Windows Defender 防火墙。
(2) 选择 入站规则(Inbound Rules) → 右侧点击 新建规则。
配置规则:
(1) 规则类型:端口 → 下一步。
(2) 协议和端口:选择 TCP,输入 特定端口:5432 → 下一步。
(3) 操作:允许连接 → 下一步。
(4) 配置文件:勾选 域、专用、公用(根据你的网络环境选择)→ 下一步。
(5) 名称:填写 PostgreSQL 5432 入站 → 完成。
总结
比较常用的场景,记录一下。
个人博客:qinyangx.top