
先说结论如果你的VPS只有IPv6公网地址、或者想给一群已经在用IPv6的朋友开一个幻兽帕鲁Palworld房间这个方案完全可行。我自己在Ubuntu 22.04上实测跑通了“IPv6端口转发 帕鲁服务端”的组合把一台没有公网IPv4的小机器变成了几个朋友能稳定连入的私服。这篇文章会把从系统准备、服务端部署到IPv6端口转发、联机排障的完整过程都捋一遍顺便把那些文档里不会写的坑也一并说清楚。适合谁看手头有IPv6-only服务器、或者家宽只有IPv6公网IP、又不想额外花钱买IPv4公网资源的玩家和运维新手。看完你可以完整复现一条部署链路Ubuntu环境下安装SteamCMD、部署Palworld Dedicated Server、用socat做IPv6到本机服务端口的转发、解决玩家加不进来的常见问题。需要先弄明白的是帕鲁服务端默认监听的是IPv4协议栈。如果你的机器恰好没有IPv4地址玩家从公网用IPv6地址来访问时流量根本到不了服务进程。这时候就得靠IPv6端口转发把流量引到服务上。这跟我们以前常说的路由器端口转发是两码事它做的不是改NAT映射而是纯协议层的中转在IPv6端口上接收数据包解包后再封装成IPv4数据包交给本机的帕鲁服务进程。整个链路听起来复杂实际操作其实比我预想中简单。1. 项目思路为什么用IPv6搭帕鲁私服1.1 帕鲁服务端与网络基础幻兽帕鲁的专用服务器本质上是一个面向多人联机的服务端程序核心交互端口是UDP 8211玩家通过Steam联机协议来发现和连接服务器。服务端本体对机器要求不算高2核4G的VPS就能带几个朋友玩但网络链路必须稳否则最容易出现的就是“服务器列表能看到、一进游戏就掉线”这种鬼问题。这里有一个底层逻辑需要先想清楚绝大多数普通玩家的客户端是IPv4单栈只能访问IPv4地址。如果你的服务器没有公网IPv4地址那只有纯IPv6网络的玩家才能直连。所以这个方案最务实的场景是开服的人所在的网络环境是IPv6单栈一起玩的伙伴也都有IPv6网络比如不少高校校园网、部分家宽现在已经默认分配了IPv6全球单播地址。我在规划时也考虑过混合方案服务器上同时保留IPv4和IPv6双栈IPv4玩家走IPv4入口IPv6玩家走IPv6转发入口。但手上这台机器只有IPv6地址所以重点只能放在IPv6这条链路。如果你的机器是双栈这篇文章的socat转发部分依然适用还可以顺带做一层过渡方案。1.2 IPv4与IPv6方案对比选型阶段我认真对比了几条路各有各的坑直接申请公网IPv4多数云厂商的IPv4公网地址现在都要单独购买而且价格不便宜家宽宽带想要公网IPv4更是不容易基本别想。用内网穿透工具确实能绕开IPv4地址不足的问题但延迟普遍偏高带宽受限多人联机时画面卡顿、操作延迟非常明显免费隧道还不稳定跑个十几分钟就断。用IPv6公网地址现在很多主机商默认赠送IPv6地址家宽也普遍下发IPv6全球单播地址网络路径通常是直连的延迟低、带宽足而且不需要额外花钱。对比下来在不额外花钱的前提下IPv6方案的综合体验是最好的。缺点也客观存在一部分老设备、老路由器对IPv6支持不好导致部分玩家明明有宽带却拿不到IPv6地址。所以在开服之前最好先让一起玩的朋友都确认一下自己有没有IPv6网络环境。1.3 整体工作流程规划我最终敲定的链路是玩家客户端IPv6公网→ 服务器IPv6地址:8211 → socat监听IPv6端口 → 转成IPv4 127.0.0.1:8211 → 帕鲁服务端IPv4监听这套链路的核心是让socat当一个“协议转换器”用。它监听服务器的IPv6地址收到IPv6入站数据包后解包然后重新封装成IPv4数据包发往本机的帕鲁服务进程。玩家在Steam或游戏内添加服务器时填服务器的IPv6地址加端口就行。后面内容就沿着这条链路一步步展开先把服务器环境和IPv6网络配好再装帕鲁服务端然后写socat转发规则最后做联机测试和问题排查。2. 部署前的服务器准备与IPv6配置2.1 系统环境与依赖安装我使用的是Ubuntu 22.04 LTS云主机默认分配了一个IPv6公网地址。拿到机器后的第一步是更新系统并安装常用依赖apt update apt upgrade -y apt install -y curl wget tar lib32gcc-s1 lib32stdc6 socat ca-certificateslib32gcc-s1和lib32stdc6这两个32位库是SteamCMD运行时必需的缺了之后运行steamcmd大概率会报error while loading shared libraries或者libcurl.so之类的问题。socat是后面做IPv6端口转发的核心工具必须装。我习惯新建一个普通用户来跑服务端而不是直接用root避免万一服务被入侵时权限过大useradd -m -s /bin/bash steam su - steam如果你已经用root操作了一段时间后面涉及服务端文件时记得用chown -R steam:steam把目录属主改过来否则服务端可能因为写不了存档而启动失败。2.2 确认IPv6地址并规划端口服务器重启后第一件事就是用ip命令确认IPv6地址是否正常ip -6 addr show正常情况下能看到类似inet6 2409:xxxx:xxxx:xxxx::1/64 scope global的一行。注意看scope global这说明是可用于公网访问的全球单播地址。如果只看到scope link那说明只有链路本地地址无法对外提供访问需要去主机商控制台或路由器上开启IPv6。网络连通性也可以顺手测一下ping -6 2400:3200::1有回包说明服务器IPv6出网正常。很多人会忽略这一步结果数据包根本出不去后面socat再怎么写都没用。端口规划上帕鲁默认端口是8211UDP。我另外配了27015Steam查询端口UDP和25575RCON管理端口TCP。大部分情况下至少要放通这三个端口否则玩家能看到服务器但进不去或者管理员没法远程执行命令。2.3 防火墙放通IPv6流量Ubuntu默认可能带ufw也可能只装了iptables。这里特别提醒一句如果你之前只配过IPv4防火墙规则IPv6流量是完全没放行的玩家从IPv6进来会被直接丢弃。使用ufw的话直接对IPv6放行ufw allow 8211/udp ufw allow 27015/udp ufw allow 25575/tcp ufw reload如果是纯iptables管理那就用ip6tablesip6tables -I INPUT -p udp --dport 8211 -j ACCEPT ip6tables -I INPUT -p udp --dport 27015 -j ACCEPT ip6tables -I INPUT -p tcp --dport 25575 -j ACCEPT我踩过的一个大坑是云控制台的安全组控制台里只放通了IPv4规则IPv6的流量全部被安全组拦截了。这个每个厂商的控制台界面不一样但基本都有“协议、端口、源地址”这几个维度记得把IPv6规则一并加上。否则你服务器内部防火墙全放通了玩家依然连不进来。注意安全组和系统防火墙是两道关卡必须同时放行。很多人在本地curl自测没问题但玩家从外网进不来问题往往就出在云控制台安全组漏配了IPv6条目。3. 帕鲁服务端安装与配置解析3.1 用SteamCMD拉取服务端文件我建议在/home/steam目录下操作。先下载Linux版SteamCMDmkdir -p /home/steam/steamcmd cd /home/steam/steamcmd wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz tar zxvf steamcmd_linux.tar.gz如果wget被墙或下载超时可以换curl重试。解压后先执行一次初始化并登录匿名账号./steamcmd.sh login anonymous quit这一步会生成SteamCMD自身的运行文件。接着匿名下载帕鲁服务端AppID是2394010./steamcmd.sh login anonymous app_update 2394010 validate quit服务端文件默认会下载到/home/steam/steamcmd/steamapps/common/PalServer。整个下载包接近1GB具体耗时看带宽。如果中途断网重新执行上面这条命令即可断点续传不用删除已有文件。3.2 服务端配置文件逐项解析帕鲁服务端最核心的配置在Pal/Saved/Config/LinuxServer/PalWorldSettings.ini首次启动服务端后会自动生成。如果你启动后目录里没有这个文件可以先手动创建Pal/Saved/Config/LinuxServer/目录再启动一次。配置文件里的项非常多我挑常用的几个说明[/Script/Pal.PalGameWorldSettings] OptionSettings(DifficultyNone,DayTimeSpeedRate1.000000, NightTimeSpeedRate1.000000, ServerNameMy Palworld IPv6 Server, ServerDescriptionIPv6 only, ServerPassword123456, PublicPort8211, PublicIP2409:xxxx:xxxx:xxxx::1, RCONEnabledTrue, RCONPort25575, AdminPasswordadmin123, DeathPenaltyNone, bIsPublicFalse, MaxPlayers8, )几个关键点PublicIP填服务器的IPv6地址可以让Steam服务器列表正确显示连接地址。bIsPublic我设为False私服不需要进公网列表好友通过历史记录或直连IP进服即可。如果你想让路人搜到可以设True但IPv6-only的服务器进了公网列表大部分人也连不上没意义。ServerPassword按需设置。设置了密码后所有进服玩家都要在游戏内输入适合只给熟人玩。MaxPlayers不建议拉太高服务器内存有限4G内存的机器跑到8人已经压力很大了。修改配置后必须重启服务端才能生效。3.3 用systemd托管服务进程手动用nohup启动进程很容易遇到“进程悄悄退出没人管”的情况。我直接写了一个systemd服务[Unit] DescriptionPalworld Dedicated Server Afternetwork-online.target [Service] Typesimple Usersteam Groupsteam WorkingDirectory/home/steam/steamcmd/steamapps/common/PalServer ExecStart/home/steam/steamcmd/steamapps/common/PalServer/PalServer.sh -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS Restarton-failure RestartSec5 [Install] WantedBymulti-user.target保存到/etc/systemd/system/palworld.service后执行systemctl daemon-reload systemctl enable --now palworld注意启动参数里的-useperfthreads、-NoAsyncLoadingThread、-UseMultithreadForDS是官方社区推荐的性能参数能明显降低CPU开销。服务端首次启动会生成配置文件和存档目录看到日志输出Server Initialization Complete时说明已经就绪。查看日志可以用journalctl -u palworld -f如果服务起不来优先排查目录属主和lib32库是否装齐。4. IPv6端口转发的核心实现4.1 socat与转发原理选型帕鲁服务端默认监听IPv4当你的机器没有IPv4地址时服务端启动后实际上只会监听127.0.0.1:8211或0.0.0.0:8211。用ss命令可以确认ss -ulpn | grep 8211如果看到*:8211或127.0.0.1:8211说明服务进程跑在IPv4上。此时玩家通过IPv6地址访问数据包到了服务器网卡却没人接收表现出来就是“无法连接”。socat是一个万能socket工具可以把一个地址上的流量完整转给另一个地址。它和NAT的差别在于socat是应用层进程收包再发包会消耗一定CPU但它能在IPv6和IPv4之间做协议转换这是传统NAT路由器做不到的。socat还有一层优势它不挑上层协议TCP、UDP都能转甚至Unix Socket都能转。4.2 TCP与UDP转发完整配置帕鲁联机主要用UDP 8211所以先做UDP转发socat UDP6-LISTEN:8211,reuseaddr,fork UDP4:127.0.0.1:8211命令含义拆开看UDP6-LISTEN:8211表示在IPv6的8211端口上监听UDPreuseaddr允许端口复用避免重启时端口占用报错fork表示收到数据包后fork一个子进程去处理这样才能支持多个玩家并发连接UDP4:127.0.0.1:8211表示把数据包转发到IPv4的127.0.0.1的8211端口。多加的两个端口也顺手做了socat UDP6-LISTEN:27015,reuseaddr,fork UDP4:127.0.0.1:27015 socat TCP6-LISTEN:25575,reuseaddr,fork TCP4:127.0.0.1:25575玩家要把这三个端口都通了才能获得完整体验8211负责游戏数据27015负责Steam服务器列表查询25575负责管理员RCON远程命令。有同学会问为什么要写fork其实很简单socat默认只处理一个连接就退出不加fork的话第一个人连上了第二个人就进不来了。多人联机时必须加。为了开机自启和进程守护我同样写成systemd服务。不过一个Service只跑一条ExecStart想同时转发多个端口就得分别写多个service或者用一个shell脚本把所有socat命令都装进去。我在部署时是写了一个/home/steam/start-socat.sh#!/bin/bash /usr/bin/socat UDP6-LISTEN:8211,reuseaddr,fork UDP4:127.0.0.1:8211 /usr/bin/socat UDP6-LISTEN:27015,reuseaddr,fork UDP4:127.0.0.1:27015 /usr/bin/socat TCP6-LISTEN:25575,reuseaddr,fork TCP4:127.0.0.1:25575 wait脚本记得加执行权限chmod x /home/steam/start-socat.sh。然后写systemd服务[Unit] Descriptionsocat IPv6 to IPv4 forwarding Afternetwork-online.target [Service] Typesimple Userroot ExecStart/home/steam/start-socat.sh Restartalways RestartSec3 [Install] WantedBymulti-user.target保存到/etc/systemd/system/socat-forward.service后同样执行systemctl enable --now socat-forward。注意socat转发进程如果用root跑监听低端口没问题如果用steam用户跑也必须保证steam用户对日志和脚本目录有读权限。实际部署中我直接用root跑socat省事也少踩权限坑。4.3 静态IPv6地址与稳定性保障IPv6地址有可能会变化。如果主机商分配的是DHCPv6或有状态地址VPS重启后IPv6地址可能就变了到时候socat监听的是旧地址、配置文件里PublicIP也是旧地址玩家自然连不上。稳妥的做法有两条在主机商控制台确认是否支持静态IPv6。大多数云厂商默认会分配静态IPv6前缀重启不会变。如果发现地址变了需要同步修改socat监听地址、帕鲁配置里的PublicIP、防火墙规则三处一起改。否则可能出现“socat监听了新地址、防火墙只放行了旧地址”这种状态排查起来非常头疼。socat本身的稳定性我实测下来非常好跑半个月没崩过。真正的风险点都在周边配置上地址变化只是其中一个另一个是服务端进程退出了但socat还在玩家连上来会秒掉这时候会发现游戏内提示连接中断。我的习惯是重启socat前先确认帕鲁服务端是活的systemctl status palworld systemctl restart socat-forward5. 联机测试、常见问题与优化建议5.1 客户端联机测试与验证方法部署完成后在服务器本地先验证转发是否正常。可以用nc或者nc6测试端口连通性不过UDP端口用nc测并不直观最简单可靠的方法还是直接用游戏客户端连接。方式一Steam界面里选择“查看→服务器→收藏夹→添加服务器”填写[2409:xxxx:xxxx:xxxx::1]:8211。IPv6地址带端口必须用方括号包住地址否则解析会出错。方式二游戏内多人联机界面直接填IP:端口。这个各版本界面略有差异但基本都是“加入多人游戏专用服务器”里填地址。玩家本机的IPv6连通性一定要先确认。让玩家访问网络检测站点测试一下是否拿到IPv6地址如果显示没有IPv6那无论如何都连不上你的服务器。这个问题在部署初期经常被忽略以为是服务器配置有问题实际是玩家端网络压根不支持IPv6。5.2 常见连接问题速查以下是我实操中遇到最多的问题和排查方法整理成表格方便对照现象主要原因排查命令/操作游戏内提示无法连接防火墙或安全组未放行IPv6 8211检查ufw、ip6tables、云控制台安全组能ping通但进不了服务端socat进程没起来或参数错误ps aux | grep socat查看服务日志加服务器列表不显示bIsPublicFalse且没有手动收藏用收藏夹添加填IPv6地址进入游戏后频繁掉线UDP被限速或socat并发处理不足查看服务端日志确认socat是否有报错其他玩家加不进玩家本机没有IPv6网络让玩家用网络检测站测试IPv6Steam查询端口超时27015端口没有转发或防火墙没放行检查socat和防火墙规则排查的时候我有个习惯先从玩家本机网络查起再查服务器防火墙最后查socat是否存在。三条链路按顺序走一遍大部分问题十分钟内能定位。5.3 性能调优与安全加固经验帕鲁服务端吃内存比较多4G内存的VPS跑久了容易卡。几个实测有效的调整建议启动参数务必加上-useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS对CPU占用改善非常明显。配置文件里MaxPlayers调小一点。8人已经是4G内存机器的舒适上限再多就容易出现地图加载慢、怪物延迟的情况。查看占用时如果发现内存一直涨多半是地图区块缓存可以定期重启一下服务端释放或者增加swap空间。安全方面IPv6服务器暴露在公网建议不开放RCON或者设置高强度RCON管理密码。RCON是明文传输的管理通道暴露在公网上风险不小。用ufw限制管理端口只允许你个人的IP访问。比如只允许自己的IPv6地址访问25575。定期更新服务端。帕鲁官方一直在修bug和安全漏洞更新命令很简单cd /home/steam/steamcmd ./steamcmd.sh login anonymous app_update 2394010 validate quit systemctl restart palworld最后再说一说备份。存档文件在Pal/Saved/SaveGames/0/目录下建议写一个cron定时压缩备份我实际用的脚本如下0 3 * * * tar -czf /backup/palworld_$(date \%Y\%m\%d).tar.gz /home/steam/steamcmd/steamapps/common/PalServer/Pal/Saved多人服务器档万一没了才是最崩溃的备份这个操作一定要提前做别等崩了才想起来。部署完这套方案之后我的真实体会是socat做IPv6到IPv4的端口转发本质上解决的是“服务只认IPv4、网络只给IPv6”这个矛盾。如果你手里正好是台IPv6-only的机器想在Ubuntu上跑帕鲁私服这条链路是目前最轻量也最可靠的办法。整个过程中最容易被忽视的两个坑一个是云安全组对IPv6的放行另一个是玩家端自己也得有IPv6网络。这两点确认了整个方案基本就成功了一大半。最后再分享一个小技巧如果某天你发现socat做过端口转发之后Steam服务器列表还是不显示服务器试试把socat和帕鲁服务端的启动顺序调整一下——先起帕鲁服务端再起socatsocat启动时解析本机目标地址会更稳定有时候顺序反了确实会影响UDP回包路径。当然如果只是熟人间联机直接游戏内收藏服务器填入IPv6地址绕开Steam列表反而更快更省心。