第五篇企业Linux安全运维命令、工具工欲善其事,必先利其器"工欲善其事,必先利其器.
"这句名言出自《论语》.
孔子告诉子贡,一个做手工或工艺的人,要想把工作完成,并做得完善,应该先把工具准备好.
在企业Linux安全运维工作中,其实有很多捷径.
这包括掌握一些核心的理念、框架和方法,以及充分地利用现有的开源工具、命令,来灵活、方便、高效地进行运维工作,这样就能提高工作效率.
第18章终极挑战:企业Linux内核构建本章导读500强企业在企业级Linux应用过程中的一个非常典型和重要的操作就是进行Linux内核重构,也就是根据实际的应用需求进行内核定制、裁剪等工作,这是一个非常具有挑战性和专业性的工作,也可以称为一种"终极挑战",当前众多的大型企业都有自己的Linux平台工程师和专业人员来进行该项工作.
基于此原因,本章将对企业级Linux内核配置、编译、安装等细节性的问题进行详细介绍.
18.
1企业级Linux内核简介安装企业级Linux之后,需要重新配置并建立新的Linux内核.
企业级Linux自带了一个预置的内核,简化了安装过程.
然而这个内核可能无法正确配置所有的系统功能.
因此可能需要通过配置和构建新内核来创建一个针对系统及其特定需求的定制内核.
定制内核通常比一般内核要小.
但是,编译和维护定制的内核需要大量的时间和工作.
有时候,并不需要构建新内核,只是需要动态改变已安装内核的许多方面.
有两种方式可以完成相关改变:一是可使用启动命令加上特定参数,二是修改/etc/sysctl.
conf文件.
当系统引导时,sysctl命令会读取此文件.
也可以将引导命令行使用的相同参数添加到/boot/grub/grub.
conf或其符号链接/etc/grub.
conf中.
例如,acpi=off可禁止启动acpid(高级配置和电源接口守护进程).
系统运行时,sysctl工具可以修改内核参数.
此实用工具利用了/proc/sys设施,它用于定义sysctl可以修改的参数.
执行sysctl-a命令会显示一个完整的sysctl参数清单.
下面给出了显示和更改domainname内核参数的例子.
这个例子中不需要双引号,但必须引用任何字符,否则会被shell解释掉.
当改变参数时,必须具有root权限.
#sysctlkernel.
domainnamekernel.
domainname=tcorp.
com$su-c'sysctl-wkernel.
domainname="example.
com"'kernel.
domainname=example.
com$sysctlkernel.
domainnamekernel.
domainname=example.
com当构建新内核时,手边需要第一张安装光盘或DVD.
当构建新Linux内核来安装新版本或更改现有版本的配置时,确保手边有第一张安装光盘或DVD.
这样即使完全破坏了系统软件,上述磁盘也可以让你重新启动系统.
有无可用的CD/DVD意味着慌乱一阵和完全崩溃之间的差异.
在可以开始构建新内核之前,必须下载、安装和预备源代码.
此外,还需要建立一个配置文件,描述想要建立的新内核.
本章将介绍完成这些任务所需要的步骤.
18.
2下载、安装和预备内核源代码本节介绍如何下载内核源代码到本地系统上.
如果要下载企业级Linux尚未定制(补丁)的代码,请访问kernel.
org/pub.
它还包括预备和安装内核源代码.
在完成下载、安装、预备内核源代码之后,需要配置和编译Linux内核.
18.
2.
1先决条件安装如下软件包:rpmdevtoolsyum-utils(随默认系统安装)ncurses-devel(使用makemenuconfig配置内核)libglade2-devel(使用makegconfig配置内核)值得注意的是:编译内核需要大量磁盘空间.
在编译内核之前,确保有足够的磁盘空间.
编译一个默认内核大约需要3.
5GB空间.
在要编译内核的文件系统上,必须有足够的磁盘空间.
18.
2.
2下载源代码在下载所需的软件包之后,会运行rpmdev-setuptree.
此实用程序设置了一个SRPM构建环境,包括主目录下的rpmbuild目录层次结构:$rpmdev-setuptree$lsrpmbuildBUILDRPMSSOURCESSPECSSRPMS编译内核后,rpmdev-setuptree创建的5个目录包含如下文件:BUILD中拥有编译内核的结果,RPMS中拥有编译的RPM文件,SOURCES中拥有源代码和补丁文件,SPECS中拥有内核的规范文件,SRPMS中如果有的话,则是源RPM文件.
除了安装软件包和安装内核(最后一步)外,不需要也不应该使用root权限来配置或构建内核.
内核的README文件指出:"不要过度使用root.
"当必须使用root权限时,可使用su–c构建、定制和安装内核部分.
当并不想使用root权限时,这种做法也有助于防止使用root权限.
它还提供了一个更好的记录,用于审查shell历史中出现的问题.
要为RHEL内核下载源代码,可在浏览器或FTP客户端中输入ftp://ftp.
redhat.
com/pub/redhat/linux/enterprise,并选择想要的RHEL版本,通过链接直接进入SRPMS目录.
对于RHEL6的服务器内核,可进入:ftp://ftp.
redhat.
com/pub/redhat/linux/enterprise/6Server/en/os/SRPMS从SRPMS页面搜索或向下滚动,直到找到kernel*src.
rpm文件.
这时可以单击和下载内核源代码的RPM文件.
通常情况下,要下载最新版本.
这将有一个与kernel-2.
6.
32-71.
18.
1.
el6.
src.
rpm类似名字的内核.
src表明软件包包含的源文件.
另外,如果有RedHat网络账户,可以从rhn.
redhat.
com下载内核源代码RPM文件.
本节例子中所示的Sam,其主目录是/home/sam(~sam),使用kernel-2.
6.
35.
11-83.
fc14内核.
构建内核时,你可能工作在主目录中,使用的内核名称也可能不同于Sam的内核名称.
此时只要遵循例子进行必要的替换就可以了.
18.
2.
3安装源代码当内核源代码RPM包文件位于主目录时,运行yumbuilddep可下载和安装需要构建源代码包(依赖)的软件包.
因为使用安装包,所以必须具有root权限.
在下面的例子可使用用户名和正在使用的内核名称替换sam和2.
6.
35.
11-83.
fc14,来指定RPM文件在系统中的位置.
$su-c'yum-builddep~sam/kernel-2.
6.
38.
2-9.
fc18.
src.
rpm'password:Loadedplugins:langpacks,presto,refresh-packagekitAddingen_UStolanguagelistGettingrequirementsforkernel-2.
6.
38.
2-9.
fc18.
src…Install29Package(s)Totaldownloadsize:26MInstalledsize:77MIsthisok[y/N]:y.
.
.
Complete!
最后,以非特权用户角色在主目录中工作时,可使用RPM在主目录下的rpmbuild目录中安装内核源代码:$rpm-Uvhkernel-2.
6.
38.
2-9.
fc18.
src.
rpm1:kernelwarning:usermockbuilddoesnotexist-usingrootwarning:groupmockbuilddoesnotexist-usingrootwarning:usermockbuilddoesnotexist-usingroot…1:kernel100%]用户可以忽略上述错误,它们都是一些关于不存在的组和用户的错误.
18.
2.
4预备源代码可以运行程序前的最后一步是预备源代码.
预备过程会解开压缩文件和适用的补丁.
下面使用rpmbuild–bp命令预备源代码:$cd/home/sam/rpmbuild/SPECS$rpmbuild-bp--target$(arch)kernel.
specBuildingtargetplatforms:i686Buildingfortargeti686Executing(%prep):/bin/sh-e/var/tmp/rpm-tmp.
SJXxg1+umask022+cd/home/sam/rpmbuild/BUILD…如果rpmbuild找不到它需要预备代码的包,会显示如下消息:error:Failedbuilddependencies:elfutils-libelf-develisneededbykernel-2.
6.
32-71.
18.
1.
el6.
i686zlib-develisneededbykernel-2.
6.
32-71.
18.
1.
el6.
i686binutils-develisneededbykernel-2.
6.
32-71.
18.
1.
el6.
i686在这种情况下,安装所需的软件包(可能需要安装与例子中不同的包):$su-c'yuminstallelfutils-libelf-develzlib-develbinutils-devel'安装软件包后,再次使用前面的rpmbuild命令.
在本地系统上安装和预备好内核源代码后,就可以配置、编译并安装它.
18.
3源代码配置和编译Linux内核按上节所述安装和预备源代码后,Sam的源代码在/home/sam/rpmbuild/BUILD/kernel-2.
6.
38.
fc15/linux-2.
6.
38.
i686目录,其内核规范文件在/home/sam/rpmbuild/SPECS.
程序源代码将在具有类似名称的目录(~/rpmbuild/BUILD/kernel*/linux*),而内核规范文件则在~/rpmbuild/SPECS目录.
本节的大部分工作是在源代码所在的目录(linux*)中做的.
在SPECS目录中标记和安装内核.
18.
3.
1标记内核为了防止覆盖现有的内核文件,并确定内核的各种汇编版本,可以改变kernel.
spec文件中的buildid变量,这个变量的初始值为.
local.
无论给这个变量赋什么值都需要将其放置在内核名称和发行号的末尾,以便确定内核.
可以此字符串中应用到内核的补丁标记来帮助人们追查发生的问题.
使用cd可把目录切换到~/rpmbuild/SPECS,此时编辑kernel.
spec,并改变行中的local即可:#%definebuildid.
local要标识正在构建的内核值,还必须删除前导哈希标记(#)、哈希标记后面的空格以及%和define之间的空格:%definebuildid.
sam110418100018.
3.
2.
config:配置内核在编译代码并创建Linux内核之前,必须做出决定,并指定想要的内核支持哪些功能.
可以按以下两种方式之一来配置内核支持大多数功能:把该功能构建到内核中或指定该功能作为可加载的内核模块.
在决定采用方法之前,必须权衡内核的大小,以及加载模块所花费的时间.
要使内核尽可能小,同时又最大限度地减少模块的加载时间.
~/rpmbuild/BUILD/kernel*/linux*目录中的.
config文件控制新内核支持哪些特性,以及如何支持.
下一节提供了取代现有自定义内核的指令.
"自定义内核"介绍了当.
config文件不存在时如何创建它的默认版本,以及当它存在时如何进行编辑.
如果已经配置了一个定制的内核,可能需要用类似配置(新内核)来替换它.
每个内核都可能有新的配置选项,这也说明为什么使用旧的.
config文件编译新内核是不好的做法.
本节将介绍如何升级现有的.
config文件,所以该文件中将包含新内核的新选项,并保持旧选项的现有配置.
上述工作可在~/rpmbuild/BUILD/kernel*/linux*目录下完成.
系统为运行在/boot下的本地系统内核保存了配置文件的副本.
下面的命令将会把此文件复制到工作目录中的.
config:$pwd/home/sam/rpmbuild/BUILD/kernel-2.
6.
38.
fc15/linux-2.
6.
38.
i686$cp/boot/config-$(uname-r).
config在此命令中,shell执行uname-r并使用命令替换,以该命令的输出取代$(uname-r),这也是在本地系统上运行内核发行版的名称.
接下来使用命令makeoldconfig加新内核选项可修补.
config文件,这些选项在旧内核中并不存在.
该命令显示了每个内核选项在新、旧内核中是相同的,并以旧内核同样的设置方式自动设置新内核选项的状态.
当发现一个选项只出现在新内核中,而不在旧内核中时,该命令就会停止,然后会显示类似[N/y/](NEW)的提示,同时显示可能的响应,并表明此选项是新的.
提示符显示大写字母的默认响应,可以输入此字母(大写或小写),然后按回车键,或只按回车键来响应.
在这个例子中,Tickless系统选项是新的,且默认响应是Y,包括新内核的选项.
要选择一个非默认响应(n表示no,不包括选项,m意味着包括作为模块的选项),必须输入该字母,然后按回车键.
输入""然后按回车键来显示有关选项的更多信息.
$makeoldconfigscripts/kconfig/conf–oldconfigKconfig**LinuxKernelConfiguration***Codematurityleveloptions*Promptfordevelopmentand/orincompletecode/drivers(EXPERIMENTAL)[Y/n/]y**Generalsetup*Localversion-appendtokernelrelease(LOCALVERSION)[]Automaticallyappendversioninformationtoversionstring(LOCALVERSION_AUTO)[N/y/]n…**Processortypeandfeatures*TicklessSystem(DynamicTicks)(NO_HZ)[Y/n/](NEW)Thisoptionenablesaticklesssystem:timerinterruptswillonlytriggeronanas-neededbasisbothwhenthesystemisbusyandwhenthesystemisidle.
TicklessSystem(DynamicTicks)(NO_HZ)[Y/n/](NEW)RETURNHighResolutionTimerSupport(HIGH_RES_TIMERS)[Y/n/]ySymmetricmulti-processingsupport(SMP)[Y/n/]ySubarchitectureType>1.
PC-compatible(X86_PC)2.
AMDElan(X86_ELAN)…##configurationwrittento.
config#18.
3.
3定制内核~/rpmbuild/BUILD/kernel*/linux*目录和configs子目录为各种处理器、多处理器和配置提供示例配置文件.
在开始之前你可能想看看这些文件,或使用其中之一作为模板.
要使用这些文件之一,将它复制到.
config.
可以使用三个标准命令之一,建立配置Linux内核的.
config文件:$makeconfig$makemenuconfig$makegconfig下面需要为所需的软件包列表运行所有这些命令,而不是这些命令中的第一个.
如果.
config文件不在工作目录中,这些命令将首先创建与本地系统运行内核相匹配的.
config文件,然后修改该配置.
只有本地运行内核的配置文件位于/boot/config-$(uname-r)中,该命令才可以设置这个.
config文件.
如果想使用与现有内核类似的配置,需要建立一个新的内核,相关内容请参阅前一节.
makeconfig命令是三个命令中最简单的一个,它使用文本接口,且不需要额外的软件.
相对来说,使用配置界面是最难的.
makemenuconfig命令使用伪图形界面,同时还显示文本界面.
makegconfig命令使用GTK+(www.
gtk.
org),并显示图形界面.
每个命令都会提出相同问题,产生相同结果,并给予相同答复.
第一个和第二个命令工作在基于字符的环境下,第三个命令则工作在图形环境下.
对于使用GUI工作的很多管理员来说,第三种方法是最容易使用的.
makegconfig命令显示了Linux内核配置窗口,可以查看三种配置:单一的、分割的或完整的视图.
通过单击工具栏中save(保存)图标右侧的三个图标之一可以选择视图.
图18-1显示了分割视图.
在这种视图中,左框架显示选项,右上角列出了每个选项的功能.
右下角的视图描述突出显示的选项或功能.
图18-2则显示了完整视图.
图18-1Linux内核配置窗口,分割视图图18-2Linux内核配置窗口,完整视图在所有视图的最右侧是N、M、Y和Value四列.
如果未使用那行的功能,N出现在N列.
M列中的M意味着该功能是作为一个模块包含的.
Y列中的Y意味着该功能被编译在内核中.
下划线在这些列的任何地方,意味着出现在该列的值是有效的功能(例如,下划线在M表示该功能可以作为一个模块包含其中,虽然它现在还没有包含进去).
Value列中包含该功能的值(N、M或Y).
在任何视图中,都可以双击功能旁边的复选框和单选按钮,选择或取消该功能.
一个空的复选框、单选按钮表示该功能被禁用,打钩表示它将被编译进内核,减号意味着它被编译成一个模块.
突出显示一个选择后,也可以按M代表模块,N代表不包括以及Y代表编译进内核.
选择Options→ShowAllOptions菜单命令,以显示所有选项和功能.
下面介绍检查选项并标记想要配置进新内核的功能.
在配置过程的任何时间都可以把当前定义的配置存储到一个文件中,从文件加载配置,保存更改退出或不保存更改退出.
操作选项位于菜单栏的File中.
完成后,选择File→Save菜单命令并关闭窗口.
18.
3.
4清理源代码树在生成.
config文件之后,编译或重新编译内核之前,可使用以下命令清除所有潜在的陈旧的*.
o文件的源代码树:$makecleanCLEANarch/x86/boot/compressedCLEANarch/x86/bootCLEAN/home/sam/rpmbuild/BUILD/kernel-2.
6.
38.
fc15/linux-2.
6.
38.
i686CLEANarch/x86/kernel/acpi/realmodeCLEANarch/x86/kernel/cpu.
.
.
CLEANDocumentation/watchdog/srcCLEAN.
tmp_versionsCLEANvmlinuxSystem.
map.
tmp_kallsyms3.
o.
tmp_kallsyms3.
S.
.
.
当编译内核时,此命令确保正确应用所使用的任何编号方案.
18.
3.
5复制配置文件在编译内核之前,必须把要使用的.
config文件复制到用于编译内核的目录,这个文件必须有一个与本地系统上使用内核对应的名称,例如,config-i686-generic:$cp.
config~/rpmbuild/SOURCES/config-$(arch)-generic18.
3.
6编译内核映像文件和可加载模块接下来的命令将编译内核和模块.
编译内核可能需要几个小时以上,实际取决于所用系统的性能.
$pwd/home/sam/rpmbuild/SPECS$rpmbuild-bb--target$(arch)kernel.
specBuildingtargetplatforms:i686Buildingfortargeti686Executing(%prep):/bin/sh-e/var/tmp/rpm-tmp.
JoAIFx+umask022+cd/home/sam/rpmbuild/BUILD…Wrote:/home/sam/rpmbuild/RPMS/i686/kernel-debug-devel-2.
6.
38.
2-9.
sam1…fc18.
i686.
rpmWrote:/home/sam/rpmbuild/RPMS/i686/kernel-debug-debuginfo-2.
6.
38.
2-9.
s…fc18.
i686.
rpmExecuting(%clean):/bin/sh-e/var/tmp/rpm-tmp.
gZcEvK+umask022+cd/home/sam/rpmbuild/BUILD+cdkernel-2.
6.
38.
fc15+rm-rf/home/sam/rpmbuild/BUILDROOT/kernel-2.
6.
38.
2-9.
sam1104181000.
fc18.
i386+exit018.
3.
7使用可加载内核模块可加载内核模块(有时也被称为模块或可加载模块)是一个对象文件(内核的一部分),它是在运行时被链接到内核的.
几乎在任何时间,都可以从正在运行的内核中插入或删除模块(正在使用的模块除外).
这种能力使内核具有灵活性,也使得内核在任何给定的时间都尽可能小.
模块是处理一些内核功能的很好的方法,包括非持续使用的驱动程序(如磁带驱动器).
模块文件名以.
ko结束,并存储在/lib/modules的子目录中.
在企业级Linux中,内核模块会与前一节中解释的内核一起被编译.
表18-1列出了一些可用的工具来帮助使用模块.
相关选项和更多信息请参阅相应的手册页.
表18-1使用模块的工具工具/程序功能depmod兼容模块的依赖关系insmod在运行的内核中加载模块lsmod列出所有已加载模块的信息modinfo列出有关模块的信息modprobe关于模块的加载、卸载和报告.
当加载一个模块,它也将加载依赖关系rmmod从正在运行的内核中卸载模块18.
4安装内核、模块和相关文件下一步必须以root权限执行,需要复制已编译的内核、模块和相关文件到适当的目录,这个目录通常是/boot和/lib/modules的一个子目录.
当把分区挂载在/boot时,文件都保存在该分区的根目录(/boot)中.
因为已经创建了一个RPM包,所以安装这些文件是很容易的.
下面的命令将从Sam主目录的rpmbuild目录层次结构安装新内核文件到正确的目录:$su-c'rpm-ivh--force~sam/rpmbuild/RPMS/i686/kernel-2.
6.
38.
2-9.
sam1104181000.
fc18.
i686.
rpm'Password:Preparing.
100%]1:kernel100%]以这种方式安装内核可以更新grub.
confGRUB配置文件以包含新内核.
通过单击屏幕右上角的用户名并选择ShutDown,然后选择Restart,就可以重新启动系统.
如果在控制台上工作,可按CONTROL-ALT-DEL.
还可以从控制台、基于字符的终端或终端仿真器使用reboot命令.
当系统重新启动后,可以使用uname验证加载的新内核:$uname–r2.
6.
38.
2-9.
sam1104181000.
fc18.
i68618.
5Linux系统故障处理在进行内核编译、裁剪或者是启动Linux系统的过程中,可能会遇到形形色色的问题,是频繁地重新启动机器,还是重新安装系统呢其实,这些都是比较笨的办法,在Linux系统中,有很多办法可以挽救崩溃的系统.
下面将给出在实际使用中最为典型的四种场景,来一一介绍如何成功挽救崩溃的系统.
18.
5.
1修复文件系统虽然在引导过程中会自动检查文件系统,但如果出了问题不能自动修复,将不得不手动检查.
默认情况下,fsck在开机时不能自动修复文件系统,需要让Linux进入单用户模式,这样就可以手动运行fsck.
如果有必要,可以显式启动系统到单用户模式.
不要挂载除根以外的任何Linux自动挂载设备.
值得注意的是:在运行fsck之前要备份严重损坏的文件系统(当一个文件系统严重损坏而试图修复它时),fsck有时会使情况变得更糟.
在这种情况下,在试图修复它之前,通过从损坏的文件系统中复制可读数据,就有可能恢复更多的数据.
当损坏的文件系统保存了重要数据时,在试图使用fsck修复它之前,先使用dd对系统做一个完整的二进制备份.
在单用户模式下执行mount命令,以确保要检查的本地文件系统没有被挂载.
然后在这些文件系统上运行fsck,根据需要对其进行修复.
请注意告知被修复(并能识别)的任何普通文件或目录的所有者,这些文件可能会不完整或不正确.
在每个文件系统中为丢失的文件查找lost+found目录.
成功后运行fsck,如果系统自动进入单用户模式,输入exit从单用户shell退出,并恢复引导该系统,否则执行reboot命令.
如果文件不正确或完全丢失,则必须从文件系统的备份副本中重建它们.
18.
5.
2重新安装MBR当Windows安装覆盖了MBR时,有必要重新安装它,从安装DVD引导系统,并选择Rescueinstalledsystem.
然后挂载系统映像并在适当的设备上运行grub-install:#chroot/mnt/sysimage#grub-install/dev/sda18.
5.
3当系统无法引导时当系统无法从硬盘引导时,引导系统到挽救已安装系统或到单用户/挽救模式.
如果系统启动,在硬盘的根文件系统上运行fsck,并尝试再次从硬盘引导.
如果系统仍然无法启动,可能需要重新安装主引导记录.
当一切都不行时,在安装过程中执行"升级"到Linux的目前版本.
Fedora/RHEL系统可以执行一个非破坏性的升级,并可以在此过程中修复部分损坏内容.
18.
5.
4挽救已安装的系统当挽救已安装系统时,可以修复一个不能正常引导的系统:更改或替换配置文件、使用fsck检查并修复分区、重写引导信息以及更多.
为了挽救已安装系统,从网络引导CD或安装DVD引导系统,并从"欢迎"菜单中选择Rescueinstalledsystem.
当系统要求指定要使用的语言和键盘时,随后就会显示挽救画面,如图18-3所示.
图18-3挽救画面挽救画面首先会询问是否要设置网络接口.
如果想从局域网上的其他系统中复制文件或从互联网上下载文件,这个接口是必需的.
选择设置该网络接口时,需要决定是否让DHCP自动配置网络连接还是手动提供接口的IP地址和网络掩码以及网关和DNS服务器的IP地址.
如果挽救过程发现已有Linux安装,可以选择将其挂载到/mnt/sysimage下,选择只读模式.
随着现有安装的挂载,一旦系统显示shell提示符(类似于bash-4.
2#),可以执行chroot/mnt/sysimage命令以访问现有安装,就如同它已经被正常引导了一样,现有安装的根目录为/(根).
如果选择不挂载现有安装,则使用挂载在标准位置(/bin、/usr/bin等)的标准工具运行挽救系统.
可以从本地安装修复或挂载分区.
当从挽救shell退出后,系统将重新启动.
如果想从硬盘引导,需要取出CD或DVD.
我们在选择虚拟主机和云服务器的时候,是不是经常有看到有的线路是BGP线路,比如前几天有看到服务商有国际BGP线路和国内BGP线路。这个BGP线路和其他服务线路有什么不同呢?所谓的BGP线路机房,就是在不同的运营商之间通过技术手段时间各个网络的兼容速度最佳,但是IP地址还是一个。正常情况下,我们看到的某个服务商提供的IP地址,在电信和联通移动速度是不同的,有的电信速度不错,有的是移动速度好。但是如果...
今天9月10日是教师节,我们今天有没有让孩子带礼物和花送给老师?我们这边不允许带礼物进学校,直接有校长在门口遇到有带礼物的直接拦截下来。今天有看到Friendhosting最近推出了教师节优惠,VPS全场45折,全球多机房可选,有需要的可以看看。Friendhosting是一家成立于2009年的保加利亚主机商,主要提供销售VPS和独立服务器出租业务,数据中心分布在:荷兰、保加利亚、立陶宛、捷克、乌...
EdgeNat 商家在之前也有分享过几次活动,主要提供香港和韩国的VPS主机,分别在沙田和首尔LG机房,服务器均为自营硬件,电信CN2线路,移动联通BGP直连,其中VPS主机基于KVM架构,宿主机采用四路E5处理器、raid10+BBU固态硬盘!最高可以提供500Gbps DDoS防御。这次开年活动中有提供七折优惠的韩国独立服务器,原生IP地址CN2线路。第一、优惠券活动EdgeNat优惠码(限月...