如何开启服务器的自定义端口?

1 背景

最近,和朋友一起玩mc,因为使用各种软件进行连接的效果都不是很理想,所以就想着干脆自己搭建一个mc的服务器,一是为了能够和朋友更方便和快乐的进行玩耍,二是正好借此机会检验一下自己的技术。

搭建mc服务器前面大部分的过程都十分顺利,一直到了最后一步,需要开启服务器的一个端口,向外部提供服务,无论怎么弄外部都无法对开启的端口进行访问(当时觉得十分纳闷服务器的端口分明就打开了呀?为什么外部就是无法访问呢?一度以为又是玄学),最后经过几个小时的“耐心”折腾终于解决了这个问题。

写这篇文章的目的就是为了记录开启服务器的一个自定义的端口,并能够让外部成功访问的一整个流程,因为在解决这个问题的过程中也在网上查找了大量的资料,发现很多朋友也和我遇到了同样的问题,但是网上都没有给出一个较为有效的解决方案,希望这篇文章能够帮助到有同样困惑的朋友们。

2 开始之前

在文章开始之间先介绍一下这篇文章后续内容用到的一些工具以及相应的版本号:

  • 服务器(腾讯云:轻量应用服务器 CPU: 2核 内存: 2GB)

  • 操作系统(CentOS Linux release 7.6.1810 (Core))

需要重点关注的是所使用的操作系统以及相应的版本号,因为对于不同的操作系统,或者相同操作系统的不同版本,可能对于后面要介绍的一些方法会存在较大的差别,所以需要特别关注。但是好在不管用的工具是什么,方法的思路是相同的,只要掌握了方法思路,工具仅仅就是工具而已。

3 正文部分

下面,正式开始进入这篇文章的主题,

3.1 防火墙(firewall)

想要开放服务器的指定端口,需要借助于服务器的防火墙。

3.1.1 检测防火墙状态

首先需要确定的是当前服务器防火墙的状态,如果服务器的防火墙是关闭的,需要将它打开。

1
systemctl status firewalld.service

如果提示Active: active (running)

1
2
3
4
5
6
7
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: active (running) since 六 2022-08-20 23:26:33 CST; 1 day 11h ago
Docs: man:firewalld(1)
Main PID: 6979 (firewalld)
CGroup: /system.slice/firewalld.service
└─6979 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

说明服务器防火墙正常运行,那么就直接进行下一步。

如果提示Active: inactive (dead)

1
2
3
4
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)

说明服务器防火墙处于关闭状态,那么需要开启服务器:

1
systemctl start firewalld.service
3.1.2 开启端口

通过ssh进入服务器,借助于服务器的防火墙的命令行客户端(firewall-cmd),可以开启服务器的指定端口。

下面以端口(2345)为例进行演示:

1
firewall-cmd --zone=public --add-port=2345/tcp --permanent
  • --zone=public:设置操作区域为public
  • --add-port:启用2345端口的TCP协议组合
  • --permanent:携带该参数表示永久配置,否则表示运行时配置

永久开启某个端口,需要重启防火墙才能让配置生效:

可以使用防火墙的命令行客户端(firewall-cmd),重新加载防火墙规则并保存状态信息。

1
firewall-cmd --reload

也可以使用systemd工具systemctl,重启防火墙

1
systemctl restart firewalld.service

接着,检查端口(2345)是否被成功开启:

1
firewall-cmd --zone=public --query-port=2345/tcp --permanent

如果,显示是yes说明端口(2345)被成功开启,否则,说明开启失败。

3.2 腾讯云服务器控制台

由于本文使用的是腾讯云的轻量应用服务器,所以除了通过上面的方式开启服务器的端口之外,还需要在腾讯云提供的控制台上开启相应的端口(2345),具体设置如下:

image-20220822141032700

3.3 启动端口对应的服务

网上很多“教如何开启服务器端口”的教程都是到了3.2节就戛然而止了。

你说这样有问题吗?其实没有太大问题,因为“懂得人都懂”。

但是很多人就以为完成了3.2这一步之后就已经算是成功开启端口了(在之前我也是这样认为的),外部就可以对端口进行正常访问了。

可是实际上只完成3.2这一步,外部并不能正常访问端口,因为想要让外部能正常访问,还需要启动端口所对应的服务,即:要有程序对端口进行监听,这样当外部对端口进行访问时,监听该端口的程序才能做出正常的反馈。

就拿搭建的mc服务器来说,需要启动mc服务器程序去监听前面打开的端口(2345),启动程序之后,通过netstat指令:

1
2
3
4
[root@VM-16-11-centos MineCraft]# netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::2345 :::* LISTEN 17954/java

可以查询端口和监听该端口所对应的程序,可以看到端口(2345)目前已经被PID为17954的java程序所监听。

到这一步,才算成功开启了服务器的端口(2345),并能够供外部进行正常的访问。

3.4 检测端口启动情况

可以在本地通过网络探测工具(nmap),去检测服务器相应端口的启动情况:

1
nmap -Pn IP地址 -p 端口号
  • -Pn:禁用主机检测
  • -p:指定端口号

如果显示端口状态(STATE)open

1
2
3
4
5
6
Starting Nmap 7.92 ( https://nmap.org ) at 2022-08-22 12:09 CST
Nmap scan report for 124.223.166.235
Host is up (0.050s latency).

PORT STATE SERVICE
2345/tcp open dbm

则说明服务器的端口(2345)已经成功开启。

4 总结

简单总结一下,其实现在回过头来冷静地、仔细地想,网上很多“教授开放服务器端口”的教程为什么到3.2节就结束也是有道理的。

因为服务器开放端口的目的就为了给外部提供某种服务,那既然要提供某种服务,自然需要相应的程序去监听和处理,

所以3.2节开放端口之后,启动端口想要给外部提供服务所对应的程序是一件十分自然的事情(“懂的人都懂”)

很多写教程的朋友可能都觉得这样事情不需要多提,但是对于小白(像我)可能当时就没有想到这点,惭愧,惭愧唔!

参考文献

[1] 搞它!!!Linux--深入介绍firewalld防火墙管理工具 - 腾讯云开发者社区-腾讯云