您好,欢迎来到 ELI5 系列的最后一部分。到目前为止,我们已经通过“什么是网络”、“什么是TCP/IP模型?”和“什么是端口?”等问题学习了计算机网络的基础知识。我们已经涵盖了大多数重要的网络术语,但还有很多东西。但是,让我们把它们留到以后的文章中:)
在最后一部分中,我们不会解释新的网络术语,而是使用它们来构建一些东西!
相关教程
linux程序设计与安全开发教程
-
恶意软件开发
-
-
-
windows网络安全防火墙与虚拟网卡(更新完成)
-
-
windows文件过滤(更新完成)
-
-
USB过滤(更新完成)
-
-
游戏安全(更新中)
-
-
ios逆向
-
-
windbg
-
-
还有很多免费教程(限学员)
-
-
-
更多详细内容添加作者微信
-
-
在使用之前,我们有两个简单的实践:游戏服务器(Minecraft)和Web服务器(Flask)。我们将共同使用我们迄今为止学到的网络基础知识来构建、配置和运行这些服务器。
请注意,这不是关于如何在云上部署Minecraft或Web服务器的完整教程。此处显示的所有内容仅用于学习目的。
建议遵循更好/适当的教程,了解如何在考虑生产的情况下实际部署它们。
如果您想返回前面的部分,可以使用下面的链接进行操作。如果你已经准备好了,那么让我们开始玩得开心吧!
设置
我使用的设置与前几部分基本相同。但是,我稍微更改了图表以更好地适应本文。
我有两个本地设备:一个是我的Macbook,另一个是我的路由器。我已使用 IP 地址 176.42.19.184 连接到 Internet。
在另一端,我有一个云服务器(托管在 Oracle 的服务器场上)。它连接到高级交换机路由器。
大多数服务器场使用高级交换机或智能集线器将网络数据包路由到服务器(也充当防火墙)。
服务器规格为:
CPU: Ampere® Altra™ (2 OCPU) @ 3.0 GHz (virtio)
RAM: 16GiB (virtio)
OS: Ubuntu Server 22.04 LTS (aarch64)
*No display avaliable. Only SSH connections.
您可以使用 Oracle 的 Always-Free 资源获得相同的服务器。更多信息可以在下面的官方网站上找到。
# You can get an Always-Free Server on the cloud
https://www.oracle.com/cloud/free/
我的世界
说到流行游戏,没有什么能比得上老式的 Minecraft!每个人都知道它,并且可能一生中玩过一次。这是一款关于创造力的游戏,您可以在其中设计、制作和建造一个充满冒险的无尽世界。哦,它也是有史以来最畅销的游戏,没什么大不了的。
它在全球售出约 2.38 亿份(击败排名第二的 GTA V /w 1.7 亿份)。
由于Minecraft非常受欢迎,并且拥有最活跃的在线社区之一,因此建立和托管自己的Minecraft服务器是一个非常好且有用的做法。与你的好友一起,你可以在你部署的服务器上玩。(多亏了你的网络技能z!
此外,您可以使用 Forge 等工具在自己的服务器上安装自定义模组!(只要您有足够的 RAM)
先决条件(允许端口号 25565)
首先,我们应该在服务器端做一些准备。
在云(例如 Oracle、Azure、Google、AWS)上创建 Linux 计算机后,需要配置一些网络设置。或者更具体地说,防火墙设置,以便可以从 Internet 访问 Minecraft 服务器。
为了让服务器数据包“通过”防火墙,我们需要添加防火墙/安全“规则”。(还记得防火墙吗?规则(对于 Minecraft)是允许任何使用端口号 25565 的传入/传出数据包 (UDP&TCP)。
以下是您需要添加到防火墙的规则。
Firewall/Security Rule 1. Allow UDP connections from 0.0.0.0/0 (anyone) to access port 25565
Firewall/Security Rule 2. Allow TCP connections from 0.0.0.0/0 (anyone) to access port 25565
根据您的云服务器(在本例中为 Oracle),您需要配置两个不同的防火墙。
-
网络安全组(来自网页)Network Security Group (from the web page)
-
Linux 防火墙(来自操作系统终端)
让我们学习如何同时做到这两点。
网络安全组
大多数云计算机使用额外的防火墙来提高其网络安全性。从下面的列表中可以看出,每个云服务提供商都使用不同的术语和方法来配置其防火墙。
Amazon Web Services: Security Groups -> [Inbound] Security Rule
Azure: Network Security Group -> [Inbound] Security Rule
Google Cloud: Virtual Private Network -> Firewall -> [Create] Firewall Rule
Oracle Cloud: Virtual Cloud Network -> Security List -> [Add] Ingress Rule
可以在云服务提供的网站上找到有关防火墙/安全设置的详细信息。
在本文中,我将仅解释 Oracle 的防火墙设置。但是,这里的大多数解释也可以应用于其他云服务提供商。
首先,打开用于 Linux 计算机的“子网”配置页面。(您可以使用搜索面板)
打开默认安全列表(或创建一个新列表,没关系)。
添加两个入口规则(TCP 和 UDP)以允许端口号 255565 (Minecraft) 通过防火墙。一个规则用于 TCP,另一个规则用于 UDP 连接。您需要为它们添加相同的规则。
完成这些操作后,您的云防火墙设置终于设置好了!
Linux 防火墙
正如我们从上一篇文章中看到的,Linux 也有一个我们可以使用的防火墙。根据您的计算机(和 Linux 发行版),您可能启用或未启用它。
我们通常会使用“ufw”命令工具来配置防火墙。但是,Oracle Cloud 不太喜欢它。我试图设置它,但惨遭失败。
我决定使用“firewalld”而不是“ufw”,这是配置 Linux 防火墙的另一种方法。此外,它还能与 Oracle 云完美配合。
运行以下命令以允许端口 25565 用于 UDP 和 TCP 连接。
# Install and enable 'firewalld' (so that it is open at OS launch)
$ sudo apt install firewalld
$ sudo systemctl enable firewalld
# Allow port 25565 for both UDP & TCP
$ sudo firewall-cmd --permanent --zone=public --add-port=25565/udp
$ sudo firewall-cmd --permanent --zone=public --add-port=25565/tcp
# Reload the firewall rules
$ sudo firewall-cmd --reload
欢呼!我们已经成功地调整了防火墙设置,以允许端口号25565(Minecraft服务器)的网络数据包。
nmap
虽然,我们已将防火墙设置设置为打开端口号 25565,但我们必须确保它正常工作。当然,我们可以在实际运行服务器时检查它,但这不是一个好的做法。您应该始终测试您的设置。
对于测试,我们将使用一种工具,我们将使用一种名为网络映射(nmap)的工具。通过使用“nmap”,我们可以使用其 IP 地址扫描服务器/机器上的开放端口。
您可以使用以下命令安装并使用“nmap”扫描特定端口。
# Install 'nmap'
$ sudo apt install nmap
# Scan for port 25565
$ sudo nmap -p80,443 <SERVER_IP_ADDRESS>
我们得到了结果,端口“关闭”了?现在,查看“状态”列。它显示“已关闭”,因为端口 25565 上没有程序“侦听”(Minecraft 服务器尚未运行),因此它显示状态为“已关闭”。
如果端口确实已关闭(这意味着我们无法使用它),那么它将在结果中显示为“已过滤”。这意味着防火墙会“过滤”我们的数据包以获取该端口号。
简而言之,端口号 25565 是开放的,我们可以随心所欲地使用它!
完成所有这些防火墙配置后,云计算机现在可以使用端口 25565。耶!!。目前,我们已经完成了防火墙设置。让我们切换到Minecraft服务器本身。
先决条件(安装 Java)
Minecraft和服务器是用Java编写的,为此,我们需要在我们的机器上安装Java。
在 Linux 中,您有两种安装 Java 的选项。您可以 a) 安装 OpenJDK 或 b) 安装官方 Oracle JDK。在这里,在本文中,我们将使用选项 a。(选择使用哪个选项并不重要)
# Update the 'apt' sources list
$ sudo apt update
# Install OpenJDK 17 or newer (I choose 19)
$ sudo apt install openjdk-19-jre-headless
# Check if it is installed correctly
$ java --version
服务器设置
我们现在可以安装服务器了!首先,让我们选择一个位置来安装服务器并将“更改目录”到其中。
# I choose my 'home' directory
$ mkdir ~/Minecraft_Server
# Change directory into the Minecraft_Server
$ cd ~/Minecraft_Server
从Mojang的官方网站下载Minecraft服务器文件。您可以选择所需的任何版本。我将使用 1.19.3,因为它是撰写本文时的最新版本。
您可以通过右键单击突出显示的绿色文本“minecraft_server.1.19.3”来复制下载链接。
# Copy the download link from the Mojang's website
https://www.minecraft.net/en-us/download/server
# Download the server
$ wget https://piston-data.mojang.com/v1/objects/c9df48efed58511cdd0213c56b9013a7b5c9ac1f/server.jar
现在,您可以直接从命令行启动服务器。但是,我将向您展示一个更好的方法:启动脚本。
转到这个由bluely&aber创建的美丽网站。在这里,您可以选择您的机器设置并根据需要自定义服务器。这样,您的Minecraft服务器将得到适当的优化,并希望可以无延迟地运行。
# You can use this website for a better server script
https://startmc.sh
您可以使用非常简单的 UI 来生成启动脚本。您要做的是输入服务器文件名(在我们的例子中是server.jar),选择脚本类型为“基本(Shell 脚本)”,指定您希望服务器拥有的 RAM(在我的情况下是 4096M)并从其中一种标志类型中进行选择(除非您有 12GB+ RAM,否则哪一种无关紧要)。
这是我们将使用的开始脚本。
#!/bin/bash
JAVA="java"
JAR="server.jar"
RAM="4096M"
FLAGS="-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 -XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 -XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 -Daikars.new.flags=true -Dusing.aikars.flags=https://mcflags.emc.gs"
echo "Starting server..."
${JAVA} -Xmx${RAM} -Xms${RAM} ${FLAGS} -jar ${JAR} --nogui
现在我们有了脚本,让我们用它来启动我们的服务器。首先,创建一个名为“start.sh”的文件。
# Create a new file
$ touch start.sh
将启动脚本复制到我们之前生成的这个文件中。此外,我们需要授予“执行权限”,以便 Linux 可以实际执行它。
# Open the file using 'nano' (you can also use vim)
$ nano start.sh
# Copy the script into the file
# Hit CTRL+S to save and CTRL+X to exit
# Give the 'execution' permission
$ sudo chmod +x start.sh
一切都差不多准备好了。让我们执行脚本,看看会发生什么。
# Start the server
$ ./start.sh
哦不。。。服务器不工作。发生了什么事?好吧,如果我们仔细查看日志,我们可以看到我们需要接受 Mojang 的 EULA 才能实际启动服务器。
我们可以通过打开“eula.txt”并将变量从“false”更改为“true”来接受 EULA。这样,我们将接受Mojang的EULA。
# Open the 'eula.txt'
$ nano eula.txt
# Change the line 'eula=false' to 'eula=true'
# Hit CTRL+S to save and CTRL+X to exit
好的,让我们再次运行启动脚本。
# Start the server (for real this time)
$ ./start.sh
一切都准备好了,我们现在应该可以加入我们的新服务器了!让我们试一试。
Web 服务器 (/w Flask)
目前,我们的云机器上运行着一个游戏服务器,我们几乎可以从世界任何地方连接到它。现在,让我们尝试部署一个实际的 Web 服务器,好吗?
让我们承认这一点。我在上一篇文章中编写的 Web 应用程序有点糟糕。它只能将“Hello”打印到服务器控制台,仅此而已。我们甚至可以称它为Web“应用程序”吗?我们应该尝试部署一个更现实的 Web 应用程序。
幸运的是,我很幸运地找到了一个名为“flask-example”的 Git-Hub 项目。顾名思义,它是一个使用 Flask 框架编写的简约 Web 应用程序。您可以从下面的链接中亲自查看
flask-example: A minimal web app developed with Flask framework.
https://github.com/XD-DENG/flask-example
该项目的 README 文件将此应用程序解释为:
A minimal web app developed with Flask framework.
The main purpose is to introduce how to implement the essential elements in web application with Flask, including
* URL Building
* Authentication with Sessions
* Template & Template Inheritance
* Error Handling
* Integrating with Bootstrap
* Interaction with Database (SQLite)
* Invoking static resources
如您所见,客观上它是我们可以使用的更好的Web应用程序。
请注意,我们这样做只是为了学习目的。我们实际上不是在部署,而是在运行一个 Web 服务器。
项目作者“邓晓东”很好心地让我在这篇文章中使用这个项目。我最大的感谢和敬意......
好的,让我们开始工作吧!
先决条件(允许端口号 80)Prerequisites (Allow Port Number 80)
就像我们在Minecraft服务器上所做的那样,我们需要在防火墙上添加防火墙/安全规则,以便[HTTP]数据包可以“通过”防火墙。规则是允许任何使用端口号 80 的传入/传出数据包(仅限 TCP)。
请记住,HTTP 协议使用端口号 80,HTTPS 使用端口号 443。
以下是您需要添加到防火墙的规则。
Firewall/Security Rule 1. Allow TCP connections from 0.0.0.0/0 (anyone) to access port 80
您可以按照上一节“先决条件(允许端口 25565)”中的相同步骤进行操作。但是,您需要允许端口 80,而不是 25565。返回到该部分,并在配置防火墙/安全规则后返回此处。
你做到了吗?好的,让我们继续。
就像我们之前所做的那样,我们应该使用“nmap”测试端口号 80。
# Scan for port number 80 (HTTP)
$ sudo nmap -p80 <SERVER_IP_ADDRESS>
之后,您的云机器现在可以使用端口号 80!我们已经完成了防火墙/安全设置。让我们继续前进
先决条件 (Python3)
Flask 是一个用 Python 编写的 Web 框架。为了完成这项工作,我们需要先设置 Python。幸运的是,Ubuntu Server 22.04 安装了 Python(版本 3.x)。
大多数其他 Linux 发行版也安装了 Python(版本 3)。
但是,如果您的发行版没有“python3”,您仍然可以安装它。
# Install python3
$ sudo apt install python3
先决条件 (pip)
好的,我们已经安装了python3(感谢Ubuntu)。现在我们需要一个名为“pip”的特殊包管理器。我们将很快使用这个包来实际安装“Flask”框架。
以下命令安装 python3 包“pip”。
# Install 'pip'
$ sudo apt install python3-pip
# Check if 'pip' is installed correctly
$ python3 -m pip --version
安装
基础工作现已完成。让我们安装我们的“烧瓶示例”应用程序!
首先,我们需要使用“git”命令下载项目。
# Clone the git repository
$ git clone --depth 1 https://github.com/XD-DENG/flask-example.git
其次,我们需要将目录更改为“flask-example”并安装它的 python3 要求。这将安装必要的 python3 包,包括期待已久的 Flask 框架!
# Change directory into 'flask-example'
$ cd flask-example
# Install the required python3 packages
$ sudo python3 -m pip install -r requirements.txt
重要的旁注:在撰写本文时(2023 年 1 月 31 日),“requirements.txt”文件安装了 Flask 版本 1.1.2。但是,当我们启动应用程序时,这会导致一些问题。
我将就此联系项目作者。幸运的是,修复相当容易。
我们需要将 Flask 版本“升级”到 2.0 或更高版本。您可以按照以下命令操作。
# Upgrade the 'flask' package to the latest version
$ sudo python3 -m pip install flask --upgrade
测试
在部署应用程序本身之前,让我们先测试一下,看看它是否有效。按照以下命令运行应用程序。
# Run the web application in development mode
$ python3 app.py
让我们使用 Web 浏览器来访问它。在浏览器中键入您的云机器公共 IP。
您可以尝试使用默认用户之一登录。让我们尝试使用密码为“admin”的用户名“admin”。
结束语
恭维!我们一起使用从 ELI5 系列中获得的网络信息构建了两台服务器。通过一点点工作,您实际上可以将它们部署到您自己的项目中。
原文始发于微信公众号(安全狗的自我修养):Linux 网络 ELI5 — 第 4 部分,Minecraft 和 Web 服务器
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论