内网穿透 - 搭建CS2、L4D2服务器(FRP)
KOFXIII
编辑于 2025年04月13日 22:47
收录于文集
共5篇

前言 1

        目前反恐精英2(CS2)和求生之路2(L4D2)均支持使用内网穿透技术(但CS:GO不支持),而开源项目frp从0.52.0版本开始,配置文件格式从 .ini 转为了 .toml ,因此更新一篇专栏分享如何使用frp实现内网穿透

【备注】国内部分地区需使用加速器或代理才能访问github网站

【frp在Github上的网址】https://github.com/fatedier/frp

【frp最新版本下载网址】https://github.com/fatedier/frp/releases

【frp客户端配置示例】https://github.com/fatedier/frp/blob/dev/conf/frpc_full_example.toml

【frp服务端配置示例】https://github.com/fatedier/frp/blob/dev/conf/frps_full_example.toml

【2024-04-09 更新本专栏】无语了,刚发现frp作者提供了很详细、很详细、很详细的中文使用文档……有需求的请直接去看官方文档吧,里面详细介绍了frp的各种用途,网址:https://gofrp.org/zh-cn/docs/examples/

前言 2

        以CS2游戏为例,某个玩家产生的游戏数据会直接发送到V社的官方服务器,然后官方服务器将数据处理后再同步给游戏内的各玩家,正常情况下,玩家在游戏内的延迟会控制在40ms以内,游戏体验也比较好。而利用私人云服务器进行内网穿透后,信息的传递过程就多出来两个环节,如下图所示

使用内网穿透后的游戏服务器

        举个例子:当玩家A在游戏内开枪后,游戏数据按①②③④顺序传输后,玩家B才能看到玩家A的击杀提示,那么游戏延迟就是16+17+17+20=70ms,在加上其他的网络不确定因素,延迟就在85ms左右,对FPS游戏来说延迟就比较大了。当然图中的延迟数据只是假设值,需要根据自己的实际网络状态来测算

        想搭建游戏服务器,又没有公网ip,可以考虑买一个带公网ip的云服务器,然后如上图所示进行内网穿透,最终完成自己的私人游戏服务器,那么问题来了,为什么不直接在云服务器上搭建游戏服务器?此外还有一些专业的、收费的内网穿透软件(例如:樱花frp、natapp),还有异地组网软件(例如:蒲公英、Parsec、ZeroTier),还有未来将会普及的ipv6……似乎每一个都比frp的效果好……因此,本专栏所述方法只适合学习技术,没有太大的实用价值

准备工作

① 一台安装Linux系统的带公网ip的云服务器,作为frp服务端。假设是debian12系统,公网ip为123.1.2.34

② 一台安装Linux系统或Windows系统的电脑作为游戏服务器,同时作为frp客户端。假设是debian12系统,已配置好CS2游戏服务器,没有公网ip,局域网ip为192.168.1.33

③ 一台安装Windows系统的普通电脑,作为玩家玩CS2的设备,也可作为测试设备

④ 从github下载最新的linux版frp软件,云服务器大多属于x86架构,因此按下图所示选择版本

frp版本选择

无论是windows还是linux版frp,都是下载后先解压

然后自己新建 frps 和 frpc 两个文件夹

将解压得到的 frps frps.toml 放到frps文件夹里

再将解压得到的 frpcfrpc.toml 放到frpc文件夹里

最后把 frps 文件夹传输到云服务器的Debian12系统里(frp服务端)

把 frpc 文件夹传输到CS2服务器所在的Debian12系统里(frp客户端)

两个文件夹均可放在Debian12系统普通用户的home目录里,只要自己能记住文件路径就行

配置 frp 服务端

【步骤 1】

编辑 frps.toml文件,将其修改为以下内容(#代表注释内容,可以不写)

代码块
JavaScript
自动换行
复制代码
# frp服务端开放用来监听的端口
bindPort = 7000

# 设置token以提高安全性
auth.method = "token"
auth.token = "abc456good"

# frp网页版管理地址和端口
# 随便找个能联网的浏览器,网址格式 http://公网ip:7500
webServer.port = 7500
webServer.addr = "0.0.0.0"

# frp网页版管理员账户名和密码
webServer.user = "admin"
webServer.password = "pwd1234hello"
复制成功

上述配置中的端口号、用户名、密码都可以按自己喜好进行修改

【步骤 2】

打开云服务器的控制台页面,在安全组(也可能叫防火墙)规则里开放7000端口的tcp协议,还要开放7500端口的tcp协议。然后再开放 6100/udp 和 6200/tcp 两个端口,因为后续配置frpc客户端时可能会用到

如果debian系统开启了ufw防火墙,同理也要开放这两个端口(或者直接关闭ufw防火墙)

代码块
JavaScript
自动换行
复制代码
# debian系统内查询ufw防火墙的状态
sudo ufw status
# 如果提示 command not found 或 Status: inactive
# 分别代表未安装ufw 和 未启用ufw,那就可以跳过以下开放端口的命令了

# 开放7000端口的tcp协议
sudo ufw allow 7000/tcp
# 开放7500端口的tcp协议
sudo ufw allow 7500/tcp

# 删除某端口和协议,以7000/tcp为例
sudo ufw delete 7000/tcp

# 无论新增或删除,修改后都要重启ufw防火墙使之生效
sudo ufw reload

# 可以直接关闭ufw防火墙,也就代表开放所有端口和协议
sudo ufw disable
# 开启ufw防火墙
sudo ufw enable
复制成功

【步骤 3】

打开frps文件夹,找到frps程序,赋予它可执行权限

代码块
JavaScript
自动换行
复制代码
chmod +x frps
复制成功

【步骤 4】

还是在frps这个文件夹里,运行frps程序

代码块
JavaScript
自动换行
复制代码
./frps -c frps.toml
复制成功

frp服务器成功运行

【步骤 5】

键盘上同时按 Ctrl C 可关闭 frps 程序

也可在网上搜索教程实现 frps 程序随着debian系统开机自启动

配置 frp 客户端

【步骤 1】

编辑 frpc.toml 文件,将其修改为以下内容(#代表注释内容,可以不写)

代码块
JavaScript
自动换行
复制代码
# 指定frp服务端的公网ip和监听端口
serverAddr = "123.1.2.34"
serverPort = 7000
# token要与frp服务端保持一致
auth.token = "abc456good"

# 创建一个用于CS2或L4D2的代理
[[proxies]]
# 给这个代理起个自己喜欢的名字
name = "steam-frp"
# 指定此代理使用udp协议
type = "udp"
# 指定游戏服务器的局域网ip和端口
# CS2和L4D2服务器默认使用27015端口,也可修改成其他端口
localIp = "192.168.1.33"
localPort = 27015
# 注意!注意!注意!
# 对于L4D2这种老游戏,localIP不要写127.0.0.1,要写你的局域网ip
# 注意!注意!注意!
# 指定使用frp服务端的6100端口来转发frp客户端27015端口的数据
remotePort = 6100
复制成功

再强调一下:对于L4D2这种老游戏,localIP不要写127.0.0.1,要写你的局域网ip

如果还想代理frp客户端的ssh服务(默认22端口),可以将以下内容添加进 frpc.toml

代码块
JavaScript
自动换行
复制代码
[[proxies]]
name = "ssh-frp"
type = "tcp"
localIp = "192.168.1.33"
localPort = 22
remotePort = 6200
复制成功

【步骤 2】

与frp服务端相同,需要开放上述配置文件中涉及到的端口和协议(云服务器的安全组要开放6100/udp 和 6200/tcp。不过我们自己安装在物理机的linux系统是没有安全组的,如果发现debian系统的ufw防火墙未安装或处于未启用状态,那就不用管它了,直接进入步骤 3

【步骤 3】

打开frpc文件夹,找到frps程序,赋予它可执行权限

代码块
JavaScript
自动换行
复制代码
chmod +x frpc
复制成功

【步骤 4】

还是在frpc这个文件夹里,运行frps程序

代码块
JavaScript
自动换行
复制代码
./frpc -c frpc.toml
复制成功

frp客户端成功运行

【步骤 5】

随便找个能联网的浏览器,输入网页版frp管理页面,网址格式为 http://公网ip:7500

输入账户名和密码,就可以看到已开启的两个端口代理信息了

网页版frp管理页面

【步骤 6】

键盘上同时按 Ctrl 和 C 可关闭 frpc 程序

也可在网上搜索教程实现 frpc 程序随着debian系统开机自启动

【补充 1】

如果你是用windows系统来搭建CS2或L4D2服务器的,那可以仿照Debian的步骤,把windows版的 frpc.exe 和 frpc.toml 放到windows系统里,编辑好 frpc.toml 文件。然后使用windows自带的CMD命令行或PowerShell来运行 frpc.exe 程序

但是不确定windows自带的防火墙会不会阻止frp要代理的端口

通过CMD运行frpc.exe程序

【补充 2】

如果你不会用windows系统搭建CS2服务器,那么有更简单的方法,先运行CS2游戏,然后在练习模式创建一个本地房间。(2024年4月26日CS2更新后,玩家可从大厅邀请朋友一起游玩本地地图,这其实也算是CS2官方提供的一种内网穿透服务,至于求生之路2也是一样,可以通过官方大厅来实现本地联机),如果你比较叛逆,就是不想用官方提供的这个联机功能,只想用自己搞的内网穿透来实现联机,就可以运行frpc.exe客户端,再将你的云服务器ip和代理端口告诉别人,他们就能以局域网的方式加入到你的练习房间

代码块
JavaScript
自动换行
复制代码
# 在CS2游戏内控制台查询本地练习房间的局域网ip和端口号,以下是控制台查询命令
status
复制成功

查到局域网ip和端口号后,就可以把它填到 frpc.toml 文件的对应位置(其实也不用修改,默认的 localIp 和 localPort 也就是游戏服务器的默认值)

其实,无论是自己搞的内网穿透实现联机,还是官方提供是联机服务,都是无法使用插件的,这也是我们自建游戏服务器的重要原因

【补充3】

对于在校住宿的学生而言,可能就是同宿舍几个人一起玩CS2或L4D2,一般来说连上同一个路由器或校园网就能组成局域网,再不济找个手机开热点也行(对求生之路2来说甚至不需要连接外网,即手机关闭数据网络以节省流量,也是可以的),然后大家在游戏内的控制台用connect命令加局域网ip即可实现联机,唯一的缺点是不能使用插件

但换个角度,网上也有使用windows系统来搭建私人游戏服务器的教程,只要电脑配置够强大,同一台windows电脑既可以是游戏端又可以充当服务器,这样插件的问题也能解决了

测试内网穿透是否成功

根据 frpc.toml 文件里配置的 remotePort = 6100 ,并且已知云服务器的公网ip为123.1.2.34,则需要打开CS2游戏和游戏内的控制台,输入连接服务器的命令

代码块
JavaScript
自动换行
复制代码
connect 123.1.2.34:6100
复制成功

如果你的CS2服务器有设置连接密码,还要加上密码

代码块
JavaScript
自动换行
复制代码
connect 123.1.2.34:6100;password CS2服务器密码
复制成功

同时,找个浏览器打开网页版frp管理页面,左侧点开 UDP 选项可以查看已用流量等信息

代理端口的统计信息