
前几天朋友群里喊我搭一个幻兽帕鲁私服我手上正好有台吃灰的Ubuntu小主机就顺手接了这个活儿。真正动手之后发现最麻烦的不是装服务端而是怎么让外网的朋友连进来——家里宽带没有公网IPv4却分到了稳定的公网IPv6所以整个方案最后就落到了“Ubuntu服务器 幻兽帕鲁服务端 IPv6端口转发”这条链路上。折腾完回头一看踩的坑比预想多但跑通之后那个成就感也是真上头。这篇实战记录送给想搭私服、又卡在网络接入这一关的朋友从环境准备到转发配置再到问题排查一步不落全写清楚。1. 方案设计为什么绕不开IPv6端口转发1.1 没有公网IPv4IPv6几乎是唯一白嫖通道很多家庭宽带的实际情况是光猫拨号拿到的地址是10.x.x.x或者100.64.x.x这种内网段想在路由器上做端口映射把私服暴露出去结果外网根本访问不到。但IPv6不太一样运营商一般都会给用户分配一段全局可路由地址路由器下面每台设备都能拿到一个公网IPv6地址。这就意味着只要私服这台Ubuntu主机有IPv6地址理论上互联网上任何有IPv6的玩家都能直接寻址到它。那为什么还需要“端口转发”呢这里有个非常典型的坑帕鲁服务端是基于UE引擎的程序默认绑定的是0.0.0.0也就是IPv4地址同时很多家庭网络环境里外部流量到达的是IPv6而服务端进程只监听IPv4。两边协议栈对不上外网IPv6玩家自然连不进来。所以需要在这台Ubuntu上加一层“IPv6入口端口 → 本机IPv4端口”的转换这就是端口转发的核心价值。另外还有一种场景也离不开转发玩家那边如果只有IPv4网络不少商业宽带和移动网络仍然不分配IPv6而你家里服务器只有IPv6双方连不上。这时候就需要一台同时拥有公网IPv4和IPv6的中转机器把IPv4玩家的流量转成IPv6后送进家庭服务器。这个方案在后面的排查章节里我会重点展开。1.2 整条访问链路到底长什么样把方案画成链路其实特别好理解客户端到服务器的数据流是这样的幻兽帕鲁客户端 → 玩家本机网络 → 公网IPv6路由 → Ubuntu服务器IPv6地址 → 本机端口转发进程 → 帕鲁服务端IPv4端口每一步都可能断掉。最麻烦的不是第一步也不是最后一步而是中间那段“IPv6地址到IPv4监听端口”的转换。很多教程直接让你关闭防火墙那是治标不治本外面通了你本机的socat没拉起来照样连不上。我建议按这条链路逐段检查哪段不通就处理哪段后面所有配置都是围绕这条链路的完整性来做的。1.3 端口转发不是只转一个端口幻兽帕鲁私服不止一个端口需要对外开放。游戏主端口是8211/UDP这是玩家连接服务器必须要通的如果你开了RCON远程管理功能还需要放行25575/TCP想让服务器在Steam的服务器列表里能被搜到还需要转发27015/UDP这个Steam查询端口。很多人只转了8211结果游戏能进但列表刷不到就是这个原因。安全边界也要注意。端口转发配置得当的话你完全不需要把SSH的22端口暴露到公网只开放上面这几个游戏相关端口即可。这样即使有人扫描你的服务器也看不到SSH服务攻击面小了很多。2. 环境准备与帕鲁服务端部署2.1 Ubuntu服务器基础环境配置我这次用的是Ubuntu 22.04 LTS系统干净、软件包新、社区资料多遇到问题容易搜到答案。系统装好后先做三件事更新软件源、配置swap交换分区、校准系统时间。sudo apt update sudo apt upgrade -y sudo timedatectl set-ntp true时间同步这个点特别容易被忽略。Steam服务端和客户端建立会话时有时间校验逻辑服务器时间偏差过大玩家连进来容易报“会话验证失败”之类的错误。Ubuntu默认开了chrony或systemd-timesyncd这行命令确保NTP生效即可。然后是swap。帕鲁服务端跑起来后内存占用很容易到3-4GB如果你和我一样用的是8GB以下内存的小主机不开swap的话进程随时可能被内核OOM杀掉表现就是服务器莫名其妙消失。我的做法是开4GB swapsudo fallocate -l 4G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile echo /swapfile none swap sw 0 0 | sudo tee -a /etc/fstab2.2 用SteamCMD安装帕鲁专用服务器帕鲁服务端不是直接从官网下的而是通过SteamCMD这个命令行工具来拉取。先装依赖再下载SteamCMDsudo apt install -y lib32gcc-s1 wget tar mkdir -p ~/steamcmd cd ~/steamcmd wget https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz tar -xzf steamcmd_linux.tar.gz如果wget下载很慢多试几次或者稍后再试国内访问这个CDN有时候不稳定。下载完成后用匿名账号登录并拉取帕鲁专用服务器端。幻兽帕鲁的专用服务器在Steam里的AppID是2394010./steamcmd.sh force_install_dir ~/palworld login anonymous app_update 2394010 validate quit这里有几个细节值得注意。第一强烈建议创建一个普通用户来跑服务端不要用root。我建了一个叫palworld的用户专门负责SteamCMD和服务端进程。第二命令里的validate参数会校验文件完整性如果服务端启动异常加上这个参数重新拉一遍能解决很多莫名其妙的问题。第三磁盘空间建议预留30GB以上服务端本体加存档会慢慢涨。2.3 配置文件与systemd常驻服务端首次启动后会在~/palworld/Pal/Saved/Config/LinuxServer/目录下生成配置文件PalWorldSettings.ini。不过更省事的做法是直接把同目录DefaultPalWorldSettings.ini里的内容复制过来再改cp ~/palworld/DefaultPalWorldSettings.ini ~/palworld/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini配置项里比较关键的有这几个ServerName私服名称朋友在Steam列表里搜这个。ServerPort默认8211不用改。ServerPassword建议设置私服给熟人玩加个密码能挡住大量路人。AdminPassword管理员密码用来在游戏里执行管理命令。RCONEnabled设为True这样才能开启RCON远程管理。RCONPort默认25575。PublicIP留空即可让它自动识别。设置完之后用systemd把服务托管起来好处是崩溃自动重启、开机自启。我写的unit文件是这样的[Unit] DescriptionPalworld Dedicated Server Afternetwork-online.target [Service] Userpalworld WorkingDirectory/home/palworld/palworld ExecStart/home/palworld/palworld/PalServer.sh -port8211 -publiclobby -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS Restartalways RestartSec10 [Install] WantedBymulti-user.target启动参数里-publiclobby很关键不加的话Steam列表刷不到你的服务器。后面三个-useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS是针对UE引擎的多线程优化实测能明显降低开场卡顿和CPU单核占用。保存unit文件后sudo systemctl daemon-reload sudo systemctl enable palworld sudo systemctl start palworld启动后先不要急着让朋友连用ss -lunpt | grep 8211确认服务端确实在监听再看看日志有没有报错。没问题再进下一步的端口转发。3. 端口转发实操把IPv6流量导给帕鲁服务端3.1 socat方案最简单也最稳socat是个瑞士军刀级的网络工具支持IPv4/IPv6、TCP/UDP之间的双向转发配置一条命令就能跑起来。先安装sudo apt install -y socat然后就是核心命令。把IPv6的8211/UDP端口流量转发到本机IPv4的127.0.0.1:8211sudo socat UDP6-LISTEN:8211,reuseaddr,fork UDP4:127.0.0.1:8211拆开解释一下UDP6-LISTEN:8211表示监听IPv6地址上的8211 UDP端口reuseaddr允许端口在服务重启后快速复用fork让socat为每个新会话创建独立子进程避免一个连接阻塞后面所有连接UDP4:127.0.0.1:8211是转发目标指向本机帕鲁服务端监听的IPv4端口。如果你还开了RCONTCP端口也要对应转发一条sudo socat TCP6-LISTEN:25575,reuseaddr,fork TCP4:127.0.0.1:25575Steam查询端口27015/UDP同理。三条socat命令一执行不含糊地说链路已经通了80%。剩下的问题是怎么让它开机自启、崩溃自动拉起。我给它也配了systemd服务[Unit] DescriptionSocat IPv6 to IPv4 Forward for Palworld Afternetwork-online.target Wantsnetwork-online.target [Service] ExecStart/usr/bin/socat UDP6-LISTEN:8211,reuseaddr,fork UDP4:127.0.0.1:8211 ExecStart/usr/bin/socat TCP6-LISTEN:25575,reuseaddr,fork TCP4:127.0.0.1:25575 ExecStart/usr/bin/socat UDP6-LISTEN:27015,reuseaddr,fork UDP4:127.0.0.1:27015 Restartalways RestartSec5 [Install] WantedBymulti-user.target注意socat的unit文件里多个ExecStart是叠加启动的systemd会依次把三条命令都跑起来完全没问题。Restartalways配合RestartSec5socat进程即使意外挂掉5秒后也会自动恢复比裸跑命令省心太多。3.2 nginx stream模块方案备选如果服务器上本来就装了nginx也可以不额外引入socat进程直接用nginx的stream模块做IPv6监听转发。从nginx 1.9.13开始就支持UDP代理了。配置大概长这样stream { server { listen [::]:8211 udp; proxy_pass 127.0.0.1:8211; } server { listen [::]:25575; proxy_pass 127.0.0.1:25575; } }TCP和UDP都支持写法直观。但说实话如果只是为了帕鲁这一个游戏我更推荐socat配置更轻、故障域更小。nginx方案适合那种服务器上已经跑了一堆站点、不想再开新进程的场景。3.3 UFW防火墙IPv4和IPv6各有一套规则转发进程起来了还得确保Ubuntu自带的UFW防火墙放行对应端口。这里有个大坑必须提醒UFW的规则是IPv4和IPv6各维护一套的你只放行IPv4端口IPv6流量照样被拦在门外。sudo ufw allow 8211/udp sudo ufw allow 8211/tcp sudo ufw allow 25575/tcp sudo ufw allow 27015/udp执行完后检查一下/etc/default/ufw里的IPV6参数确认是IPV6yes。如果你之前手贱改成过noIPv6规则就全失效了socat监听正常但外部流量始终进不来这时候排查半天都找不到原因。放行端口后重启UFWsudo ufw reload sudo ufw status numbered看到规则里同时有v4和v6条目才算数。另外如果你的Ubuntu跑在云服务商平台上云控制台的安全组规则同样要放行这些端口本机防火墙只是第一层平台安全组是第二层两层都要过。4. 端口与参数对照别把私服端口搞混了4.1 帕鲁服务端端口清单我整理了一张表配置前先对着看一眼能少走很多弯路。端口协议用途是否需要转发8211UDP幻兽帕鲁游戏主端口玩家连接服务器用必须25575TCPRCON远程管理端口用于执行控制台命令建议开启27015UDPSteam服务器列表查询端口决定列表里能否搜到建议开启一个小白常踩的坑8211是UDP端口不是TCP。有人用telnet去测这个端口通不通怎么测都是失败于是怀疑服务端没起来其实UDP压根不吃telnet这一套。正确测法是进游戏客户端直接连或者用nc -u配合特定参数。我的习惯是先把游戏主端口8211转发调通确认玩家能进游戏了再去处理RCON和Steam列表的事。一口吃不成胖子网络排查也得一步一步来。4.2 IPv6地址在游戏里的正确填法这是整个私服搭建里最容易被忽略的细节。帕鲁客户端在“加入多人游戏专用服务器”的地址框里填IPv6地址必须用方括号把地址括起来再接冒号和端口[240e:xxxx:xxxx:xxxx::123]:8211如果你图省事填成240e:xxxx:xxxx:xxxx::123:8211客户端根本分不清最后的冒号后面是端口还是IPv6地址本身的一部分直接解析失败。这个格式问题在IPv4时代不存在换到IPv6后成了高频翻车点。还有一个问题私服玩家经常忘了自己网络是否支持IPv6。可以在浏览器访问IPv6测试站点确认一下如果显示没有IPv6地址后面再折腾也白搭得走双栈转发的方案。4.3 多开服务器时的端口规划想在一台Ubuntu上跑两个帕鲁服务器比如官方服加MOD测试服端口规划要提前做好。第二个实例的服务端端口设为8212RCON设为25576然后socat转发规则也多开一套sudo socat UDP6-LISTEN:8212,reuseaddr,fork UDP4:127.0.0.1:8212 sudo socat TCP6-LISTEN:25576,reuseaddr,fork TCP4:127.0.0.1:25576系统d的unit文件里也要叠加对应ExecStart行。多开的资源开销要心里有数每个实例占2-3GB内存8GB内存的机器跑两个实例会有点紧建议swap给足。5. 常见问题与排查实录5.1 玩家一直卡在“连接服务器”或转圈这是私服最常遇到的问题遇到后按下面顺序排查基本都能定位到原因。先看本机服务端是否在监听ss -lunpt | grep 8211如果没有任何输出说明帕鲁服务端没起来去看日志~/palworld/Pal/Saved/Logs/Pal.log。常见原因是内存不足、或者配置写错。确认服务端在监听后再查socat转发是否存活systemctl status socat-palworld如果socat挂了看是不是命令写错、端口被占。接着看防火墙规则sudo ufw status numbered确认8211/udp在名单里且v4和v6规则都有。最后让玩家测一下能不能ping6通你的服务器地址ping不通就说明网络路由层还没通转发做得再好也没用。5.2 socat跑着跑着就挂掉裸跑socat命令确实容易挂尤其是长时间没人连接后某些网络环境下会异常退出。解决办法就是我在前面写的systemd托管Restartalways加RestartSec5让进程挂了也能自动恢复。另外要注意的是socat的fork参数一定要开着。不开fork的话socat只能处理一个会话第一个玩家连接后占据端口后面的人全部超时。5.3 服务器的IPv6本来就是“伪公网”排查时我发现过一个隐蔽问题Ubuntu拿到的IPv6地址看起来是公网段但实际上是路由器配置错误内网设备拿到的地址是私有的ULA地址fc00::/7开头。这种地址在公网不可路由外网玩家当然连不进来。检查方法很简单ip -6 addr show看地址第一段如果是240e、2408、2409、2001这类开头的基本是公网地址如果是fc或fd开头的就是ULA私网地址需要去路由器上检查IPv6配置开启Native DHCPv6或让路由器正确下发光猫的前缀。5.4 IPv6能ping通但游戏就是连不上有一种诡异情况外网玩家说你的服务器地址能ping6通但游戏里连接一直超时。这里最大嫌疑是MTU最大传输单元问题。IPv6不走NAT端到端链路上如果某个中间设备MTU设置过小而你的服务器发的大包无法分片数据就会悄悄丢。我在帕鲁服务器上遇到过一次解决办法是把网卡的MTU从默认1500调低到1280或1400sudo ip link set dev eth0 mtu 1400这个值最好实际测不同运营商路径表现不一样。对多数家庭宽带来说1400是个比较保守且稳定的选择。调完MTU后让玩家重新连一下通常会有明显改善。5.5 纯IPv4玩家怎么连纯IPv6私服这个问题困扰了我很久。朋友家网络是纯IPv4而家里服务器只有IPv6两边协议栈对不上。最后的解法是找一台同时有公网IPv4和IPv6的双栈云主机做中转在它上面用socat把IPv4流量转成IPv6流量再送到家里服务器的IPv6地址sudo socat UDP4-LISTEN:8211,reuseaddr,fork UDP6:[240e:xxxx:xxxx:xxxx::123]:8211这条命令里的IPv6地址是你家里Ubuntu服务器的公网IPv6地址。转发成功后IPv4玩家在中转机的IP后加8211端口就能进游戏了。这种做法本质上是把IPv4流量“封装”成IPv6流量送出去整个过程对玩家完全透明。中转机带宽一定要足够。帕鲁这个游戏对带宽要求不高几个人联机场景下5Mbps上行足矣但UDP的稳定性很重要尽量选大厂机房、丢包率低的线路。5.6 存档备份的重要性很多人私服搭好之后就放飞了直到某天朋友误操作导致存档损坏或者服务器系统崩溃重装才追悔莫及。帕鲁存档目录在~/palworld/Pal/Saved/SaveGames我写了一个简单的cron任务每天凌晨3点压缩打包一次存档保留最近7天的版本0 3 * * * tar -czf /backup/palworld-$(date \%Y\%m\%d).tar.gz -C ~/palworld/Pal/Saved SaveGames find /backup -name *.tar.gz -mtime 7 -delete这行命令不复杂但关键时候能救命。朋友玩坏档、手滑删了角色存档恢复一下备份就能回到一天前的状态。整套折腾下来我个人最大的体会是别一上来就堆高深配置先把链路梳理清楚。帕鲁私服能不能连上看的就是“客户端 → 路由 → 防火墙 → 转发进程 → 服务端”这一条线上谁断了。先本机验证、再局域网验证、最后走公网IPv6验证问题很容易定位。另外socat这种转发方案不只适用于帕鲁以后你在这台Ubuntu上开MC服务器、泰拉瑞亚、或者任何只能绑IPv4的老程序都可以用同一套路暴露到IPv6公网。把这套配置吃透了后面能省很多事。