Lexsion 发布的文章

FRP内网穿透实现公网访问内网群晖

FRP内网穿透实现公网访问内网群晖

前言

frp是一个可用于内网穿透的高性能的反向代理应用,其支持 tcp, udp 协议。自从了解到NAS市场中存在有群晖这种东西后就非常想要体验一番,但无奈贫穷让我无法实现这个愿望。后来偶然间从马路上收废品的人手里几十元收了一台N230工控机,然后就开始了黑群晖的折腾之路。我在上面安装了DSM5.2系统,因为没有洗白,也就用不了群晖官方的工具外网访问;虽然路由器有公网IP,但是因为路由器不太稳,还在调整中,于是便决定先用frp实现内网穿透的方式实现外网访问。另一方面,此方法后期也可做为一种备用方式,以此避免单点故障。因本人水平有限,如有错漏,欢迎大家指出。

读懂实践本文,你可能需要在技能树中点亮以下技能:

  • 基本的网络知识;
  • 基本的Windows系统与Linux系统操作;
  • VPS服务器配置;

准备

  • 运行Windows电脑一台(其他系统也可,但具体某些操作可能有不同)
  • 一台有公网IP的Linux服务器(可以是VPS或独立服务器)
  • 一台运行DSM5.2系统的机器(其他版本系统思路相同,具体操作可能会不一样)
  • SSH客户端,我用的是Putty

警告
本文内容以及本人立场并不建议大家使用盗版的黑群晖系统。一方面,使用盗版直接损害厂方利益,不利于企业发展;另一方面,使用黑群晖系统稳定性较差,不利于使用者数据安全,亦不能享受群晖系统全部的功能。对群晖有需求的朋友如果有能力请购买正版设备!另,学习本文对您的各种设备造成的各种软硬件损坏,本人均不承担任何责任,请谨慎操作!

步骤:

  1. 规划端口
  2. 服务端配置
  3. 客户端配置

1. 规划端口

我们首先需要简单了解frp的工作方式,frp分为服务端和客户端。服务端运行于一台有公网IP的服务器上,以此实现为客户端提供公网访问的服务;客户端运行于内网的一台需要从外网穿透访问的设备上,其会向服务端建立连接。
在开始之前我们要规划端口的使用,在此需要确定如下内容:

  1. 服务端的侦听端口,即客户端向服务端建立连接时,服务端所提供的端口号,本文使用默认值7000;服务器做http代理时的端口号,我使用了8080;若端口与您服务器上已有服务冲突,或您希望使用其他端口,请自行修改;
  2. 客户端将要被内网穿透访问的服务有哪些,分别为其确认一个便于辨识的名称、原本使用的本地端口号、计划在frp服务器上暴露出的端口号,注意避免重复命名与端口冲突问题。
    本例将使用frp服务器的5022端口提供SSH服务,xx.lexsion.net:8080提供管理页面http代理。
  3. 为防止端口滥用问题,可为服务端配置白名单,比如我计划设置5000-5050,8080为frp服务端暴露端口。
  4. 为保证数据安全,我们需要为其设置一个Token,本例我们将其设为:12345678,请自行修改为一个复杂密码。

确认以上信息后我们需访问服务器管理页面,检查服务器运行是否正常。如服务器提供商有防火墙,需为以上确认的服务端需暴露出的端口设置规则放行。若您的服务器运行的系统有开启防火墙,请登陆系统后自行配置防火墙设置。若服务器有运行宝塔面板,需要在宝塔面板中配置开放需要的端口号,或直接关闭防火墙(不推荐)。

2. 服务端配置

  1. 使用SSH工具连接有公网IP的服务器,按步骤0中计划的端口配置防火墙规则。

  2. 运行arch命令显示服务器架构。根据自己服务器系统架构,访问frp项目的Release页获取最新版的软件包下载地址,下载并解压备用(请注意,随着软件更新,地址与文件名可能会与本例中命令不同,请自行修改)。本人服务器使用CentOS7.6,64位架构,相关命令信息如下,其他系统可能会有不同:

     [root@lHost ~]# arch
     x86_64
     [root@lHost ~]# wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz
     [root@lHost ~]# tar vxf frp_0.27.0_linux_amd64.tar.gz
  3. 进入解压出的文件夹,使用vi编辑器修改配置文件frps.ini并保存,内容如下:

     [common]
     # 服务端为客户端连接提供的端口号
     bind_port = 7000
     vhost_http_port = 8080
    
     # 认证密钥
     token = 12345678
    
     # 用于限制哪些端口可以用,如果不使用以下语句,将没有限制。
     allow_ports = 5000-5050,8080
  4. 使用以下命令创建相关目录,并将文件复制到对应的目录:

     cp frps /usr/bin/
     mkdir /etc/frp/
     cp frps.ini /etc/frp/
  5. 使用以下命令将 frps.service 文件复制到 /etc/systemd/system/ 目录:

     cp systemd/frps.service /etc/systemd/system/
  6. 使用以下命令启动frps服务:

     systemctl start frps
  • 使用以下命令将其添加到开机自动启动:

      systemctl enable frps
  • 使用以下命令输出运行状态。若一切正常,应能看到 Active: active (running) ...提示:

      systemctl status  frps

    若您后期需要某些调整,以下命令可能有用:

  • 使用以下命令可删除其开机自动启动:

      sudo systemctl disable frps
  • 使用以下命令可检查单元是否配置为自动启动:

      sudo systemctl is-enabled frps
  • 使用以下命令立即停止:

      sudo systemctl stop frps
  • 使用以下命令立即重启:

      sudo systemctl restart  frps
  • 使用以下命令重载配置:

      sudo systemctl reload  frps
  • 如果修改了frps.service文件,需使用以下命令重载systemd 系统配置:

      systemctl daemon-reload
  • 使用此命令显示系统状态:

      systemctl status
  • 使用以下命令输出激活的单元:

      systemctl
  • 使用以下命令输出运行失败的单元:

      systemctl --failed
  • 具体命令参考:systemd (简体中文)

3. 客户端配置

接下来我们在DSM系统上配置客户端。

  1. 打开浏览器,登陆DSM的Web管理页面。点击控制面板->高级模式->终端机和SNMP,勾选启用SSH功能,端口我这里保持默认的22端口,点击应用。

  2. 使用SSH客户端连接,我这里直接使用root账号和admin的密码登陆。

  3. 根据自己硬件与DSM系统,访问frp项目的Release页获取最新版的软件包下载地址,下载并解压备用(请注意,随着软件更新,地址与文件名可能会与本例中命令不同,请自行修改)。本人使用DSM5.2系统,64位架构,相关命令信息如下,其他系统可能会有不同:

     [root@lHost ~]# wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz
     [root@lHost ~]# tar vxf frp_0.27.0_linux_amd64.tar.gz
  4. 进入解压出的文件夹,使用vi编辑器修改配置文件frpc.ini并保存,内容如下:

     [common]
     # 以下填写服务端服务器的IP地址与端口号
     server_addr = XX.XX.XX.XX
     server_port = 7000
    
     # 验证的密钥,与服务端设置一致
     token = 12345678
    
     # []内可理解为一个连接的标签名;type定义连接类型(tcp、udp、http等);local_ip一般设为127.0.0.1;local_port定义服务在本地使用的端口号;remote_port定义在服务端对外提供服务的端口号
     [ssh]
     type = tcp
     local_ip = 127.0.0.1
     local_port = 22
     remote_port = 5022
    
     # custom_domains定义访问http代理的自定义域名,自定义域名需要在服务商处设置A记录解析到服务端的 IP
     [web]
     type = http
     local_port = 5000
     custom_domains = xx.lexsion.net
  5. 修改完成后通过以下命令创建工作目录,并将必要文件复制到目录中:

     mkdir /root/FRP/
     cp frpc /root/FRP/
     cp frpc.ini /root/FRP/
    1. 运行以下命令尝试启动frpc测试:
      ./frpc -c ./frpc.ini
  6. 此时我们可以尝试使用SSH客户端通过frp服务端的5022端口连接SSH服务;可以使用浏览器访问xx.lexsion.net:8080 打开服务端了(当然,你应该访问你自己的域名)。测试正常后按Ctrl+C退出程序。

  7. 使用以下命令备份rc文件,并将其通过vi编辑器打开,使用G键(Shift+g)让光标移动到最后一行:

     cp /etc/rc /etc/rc.back
     vi /etc/rc
  8. exit 0 行前加入一行,添加以下内容并保存:

     ./root/FRP/frpc -c ./root/FRP/frpc.ini
  9. 重启DSM后测试frp将正常运作。我们便可以通过预定端口访问对应的服务了。

参考:

  1. frp中文文档-GitHub
    https://github.com/fatedier/frp/blob/master/README_zh.md

为网页部分区域设置单独样式以指定特定区域文字超链接颜色

为网页部分区域设置单独样式以指定特定区域文字超链接颜色

前言:

本人在HTML语言与CSS方面没有任何系统的学习经验,本文只是对问题解决的记录,若有错漏请各位指正。几天前我在尝试将一Bootstrap模板修改为一个网站首页时遇到问题,我尝试为某个区域加上超链接后,其文字颜色产生变化,这与本人想要的页面整体风格冲突。遂作如下研究,以下内容这可能对有系统学习的人来说是常识,但我却费了一点劲。谨以此告诫大家:搞事情要量力而行,学习技术最好从基础学起。

操作:

首先,我了解到如果想修改整个网页超链为某个颜色,我们可以像下面一样在<style>标签中定义<a>标签的样式。

<html>
<head>
<style type="text/css">
a {color:#333}    /*通常状态颜色,该值是深灰色*/
a:hover{color:#F00}  /*鼠标经过链接时颜色,该值是红色*/
a:active{color:#30F}  /*鼠标点击链接时颜色,该值是蓝色*/
</style>
</head>

<body>
<a href="http://lexsion.net">Lexsion.NET</a>
</body>
</html>

以上代码中,a {color:#333} 将a标签常态颜色定义为一种深灰色,a:hover{color:#F00}定义了鼠标经过时的颜色,而a:active{color:#30F} 则定义了鼠标点击下去时的颜色。因为代码中没有其他限制,所以这些定义是应用于整个body的。
如此,将以上代码其保存为一个HTML文件后用浏览器打开,鼠标未经过时是黑色,鼠标放在上面时红色,点击时蓝色。

HTML语言中, <div> 元素表示区块的概念,这是一种添加结构的通用机制。使用 <div> 元素来组合块级元素,这样就可以使用样式对它们分别进行格式化。我们可以使用id=*NAME*来标注div,id 属性为一个元素分配一个唯一的名字。每个名字只能在被赋予的页面使用一次。于是我们可以使用如下代码完成我们的需求。

<html>
<head>
<!--以下语句前的 #test 表示该样式只对 id 为 test 的 div 生效-->
<style type="text/css">
#test a {color:#333}    /*通常状态颜色,该值是深灰色*/
#test a:link,a:visited{text-decoration:none}   /*此行定义链接以及点击后无下划线*/
</style>
</head>

<body>
<!--以下div的id命名为test-->
<div id="test">
    此行生效: <a href="http://lexsion.net">Lexsion.NET</a>
</div>

<!--以下div没有id-->
<div>
    此行不生效: <a href="http://lexsion.net">Lexsion.NET</a>
</div>
</body>
</html>

以上代码中,在代码片段a {color:#333}前添加的#test将该样式限定应用于 id 为test<div>中,因为样式不是应用于整个<body>,所以虽然例程代码中两个都是<a>标签,但其位于不同的<div>,而应用于此的样式是不一样的,所以最终两个链接外观是不一样的。
我们将以上代码保存为HTML文档并使用浏览器打开,可以发现第一行的链接相比较第二行的链接,颜色是深灰色,没有下划线,至此完成需求。

后记:

看完上文相信应该呢能对div和id用途有一定概念了,下面再来举一个栗子!大家应该见过某些网站会在部分区域设置一个效果,即很多小点飘来飘去,靠近的点会自动产生连接线,给人一种很高大上的感觉。这个效果可使用canvas-nest.js脚本实现,在GitHub上有这个开源项目,大家可以去项目页查看具体说明。

脚本的使用非常简单,只要脚本文件放在根目下,将下面的代码插入到 <body></body> 之间就可以了,强烈建议在 </body>标签上方。

<script type="text/javascript" src="canvas-nest.js"></script>

我们可以针对以下项目进行配置:

color: 线条颜色, 默认: '0,0,0' ;三个数字分别为(R,G,B),注意用,分割
pointColor: 交点颜色, 默认: '0,0,0' ;三个数字分别为(R,G,B),注意用,分割
opacity: 线条透明度(0~1), 默认: 0.5
count: 线条的总数量, 默认: 150
zIndex: 背景的z-index属性,css属性用于控制所在层的位置, 默认: -1

栗子:

<script type="text/javascript" color="0,0,255" opacity='0.7' zIndex="-2" count="99" src="canvas-nest.js"></script>

默认情况下,插入的代码会将此效果应用于整个页面。某些场景可能这并不是我们需要的,我们可能只需要将其应用于部分区域。这时我们就可以根据上文的原理来进行实现。以下代码为脚本中最终的实现,我们可以看到代码中绘制区域为body

(document.body, (f = document.getElementsByTagName("script"), {
        zIndex: (y = f[f.length - 1]).getAttribute("zIndex"),
        opacity: y.getAttribute("opacity"),
        color: y.getAttribute("color"),
        count: Number(y.getAttribute("count")) || 99
    }))

我们可以将其修改为一个id,比如cas,代码如下,我们修改后将其保存。

(document.getElementById("cas"), (f = document.getElementsByTagName("script"), {
        zIndex: (y = f[f.length - 1]).getAttribute("zIndex"),
        opacity: y.getAttribute("opacity"),
        color: y.getAttribute("color"),
        count: Number(y.getAttribute("count")) || 99
    }))

然后我们将canvas-nest.js文件丢入/js/目录,然后创建一个HTML文件,内容如下:

<html>
<head>
</head>
<body>
<div>此行生效:</div>
<!--以下div的id命名为cas-->
<div id="cas">
    <h1>Lexsion.NET</h1>
    <p>Test;Test;Test;Test;Test;Test;</p>
    <p>&nbsp;</p>
    </div>
<div>此行不生效:</div>
<!--以下div没有id-->
<div>
    <h1>Lexsion.NET</h1>
    <p>Test;Test;Test;Test;Test;Test;</p>
    <p>&nbsp;</p>
    </div>
<script type="text/javascript" color="70,145,215" opacity='0.7' zIndex="0" count="100" src="/js/canvas-nest.js"></script>
</body>
</html>

使用浏览器打开即可查看成果。

参考:

  1. 我想问下如何让一个div 引入···这个div生效 而不是全局-百度知道
    https://zhidao.baidu.com/question/1307037709807339499

  2. css怎么让文字设定超链接后文字颜色不变?--ZOL问答
    http://ask.zol.com.cn/x/5417141.html

  3. README-zh--canvas-nest.js
    https://github.com/hustcc/canvas-nest.js/blob/master/README-zh.md

  4. 网页粒子背景插件 -Canvas-nest.js 指定具体位置展示--CSDN
    https://blog.csdn.net/L1558198727/article/details/81121524

CentOS7新主机初步配置命令

CentOS7新主机初步配置命令

前言

购买自己的Linux主机后第一件事就是安装操作系统,再之后需要自己做一些配置。本文对CentOS7系统下此流程进行整理,主要用于记录备忘,以便于日后查阅。如有遗漏,欢迎大家留言补充。

目录

  1. SSH登陆并修改密码
  2. 修改SSH的登陆端口
  3. 修改系统欢迎信息
  4. 修改启动选择菜单等待时间
  5. 修改主机名(HostName)
  6. 配置Fail2Ban防止SSH爆破

1.SSH登陆并修改密码

将主机IP地址与SSH端口号输入SSH软件使用 用户名和密码登陆服务器,SSH的端口号默认为22端口,用户名一般应为root。如果是购买VPS,商家一般会告知IP地址、端口号以及用户名密码。
登陆一个新的主机时(或主机重装系统后),会对未知的信息进行警告,需选择接受才能正常连接。
通常我们使用root用户登陆后需要修改密码,使用以下命令修改密码,系统会提示要求输入新密码两次以确认修改,如下所示:

# passwd 
Changing password for user root. 
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.

2.修改SSH的登陆端口

在使用有公网IP的主机时,为了安全考虑,我们需要改掉默认的SSH端口。
使用 cp /etc/ssh/sshd_config /etc/ssh/sshd_config.old 命令备份配置文件 sshd_configsshd_config.old ,使用 vi /etc/ssh/sshd_config 命令打开SSH服务端配置文件,将 #Port 22# 号删除,按格式添加新行,内容为Port空格后跟自定义端口号。如下所示自定义端口为21748:

#
Port 22
Port 21748

使用以下命令重启SSH服务端使配置生效,正常情况此时端口22和端口21748应都能正常访问。

service sshd restart

使用 exit 命令退出SSH客户端,然后使用IP地址加新端口号尝试连接,如不成功,请检查防火墙设置以及是否自定义端口与其他应用冲突。
如果通过新端口连接正常,则记录自己修改的端口号已免忘记,重新使用 vi /etc/ssh/sshd_config 命令打开配置文件,如下所示,在 Port 22 行前添加 # 号注释本行并保存,停用22端口的使用。

#
#Port 22
Port 21748

运行 service sshd restart 使配置生效,这之后,将无法通过22端口连接SSH,此时我们可以删除防火墙规则中的22端口。

3.修改系统欢迎信息

某些系统在我们登陆后会显示一段欢迎信息。我们可以按我们自己的意愿进行修改。这些信息实际来自于文件 /etc/motd ,我们可以使用以下命令通过vim编辑器编辑此文件来修改欢迎信息。

vim /etc/motd

如果系统提示命令未找到,可尝试使用其他编辑器修改。例如: vi , nano 。

  • vim编辑器使用:按i键进入输入模式,编辑完后按ESC键退出编辑模式,输入进入命令模式,输入wq命令保存并退出。若没有vim编辑器或不习惯使用vim编辑器,可用其他编辑器替代,具体使用方法请自行通过搜索引擎查询。

    4.修改启动选择菜单等待时间

    在使用独立主机或自己的物理主机情况下,可能会遇到开机时的启动选择菜单等待时间较长需要修改的问题,此问题可通过修改 /boot/grub2/grub.cfg 文件解决。与上文类似,找到修改以下代码:

    terminal_output console
    if [ x$feature_timeout_style = xy ] ; then
      set timeout_style=menu
      set timeout=5(单位为秒,建议修改成1,修改完成下次开机等待时间就会生效)

    Fallback normal timeout code in case the timeout_style feature is

    unavailable.

5.修改主机名(HostName)

在CentOS7中,有三种定义的主机名:静态的(static),瞬态的(transient),和灵活的(pretty)。静态主机名也称为内核主机名,是系统在启动时从/etc/hostname自动初始化的主机名。瞬态主机名是在系统运行时临时分配的主机名,例如,通过DHCP或mDNS服务器分配。静态主机名和瞬态主机名都遵从作为互联网域名同样的字符限制规则。而另一方面,灵活主机名则允许使用自由形式(包括特殊/空白字符)的主机名,以展示给终端用户。
一般情况下主机名默认为 localhost 。但在管理的主机较多时,我们需要修改一个易于识别的主机名来标记每台主机。这样才能方便区分自己操作的主机。
在CentOS 7中,使用 hostnamectl 命令行工具查看或修改与主机名相关的配置。
不带参数输入命令查看主机名相关的设置,如果只查看静态、瞬态或灵活主机名,可分别使用 --static--transient--pretty 选项:

[root@localhost ~]# hostnamectl
Static hostname: localhost.localdomain
Pretty hostname: localhost.localdomain
        Icon name: computer-vm
        Chassis: vm
        Machine ID: b5f3ded389c742h9d3g41s87bt57ng28
        Boot ID: 5aa97h356hjg9v8jhng474m6r6k48w89
    Virtualization: kvm
Operating System: CentOS Linux 7 (Core)
    CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-957.10.1.el7.x86_64
    Architecture: x86-64

[root@localhost ~]# hostnamectl --static
localhost.localdomain

通过以下命令同时修改三个主机名:

hostnamectl set-hostname

如果只想修改特定的主机名(静态,瞬态或灵活),可以使用 --static--transient--pretty 选项。例如:使用以下命令修改灵活主机名为ahost:

[root@localhost ~]# hostnamectl --pretty set-hostname ahost

一旦修改了静态主机名,/etc/hostname 将被自动更新。然而, /etc/hosts 不会自动根据所做的修改自动修改,所以在修改主机名后一定要手动更新 /etc/hosts 。使用 vim /etc/hosts 命令通过vi编辑器打开host文件,在里面加入以下内容保存(此处以主机名为ahost为例):

127.0.0.1       ahost
::1             ahost

6.配置Fail2Ban防止SSH爆破

Fail2Ban是一种入侵防御软件框架,可以保护计算机服务器免受暴力攻击。它可以监视计算机的系统日志,通过匹配日志的错误信息执行相应的屏蔽动作。
CentOS7默认的防火墙管理工具是FirewallD,通过以下命令检查其运行状态,若提示running则表示正常运行。

firewall-cmd --state

如果提示未启动则可通过以下命令启用:

# 启动FirewallD
systemctl start firewalld

# 将FirewallD设置开机启动
systemctl enable firewalld.service

启用FirewallD后会禁止除设置的放行端口外的其他端口连接,因此需设置放行常用的端口,以免自己被防火墙阻挡。使用以下命令查看已经放行的端口:

firewall-cmd --zone=public --list-ports

以下是放行上文设置的SSH端口(21748)示例,供参考:

firewall-cmd --zone=public --add-port=21748/tcp --permanent
firewall-cmd --reload

通过以下命令获取FailedBan:

yum -y install epel-release
yum -y install fail2ban

fail2ban配置文件位于/etc/fail2ban,其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录。我们通过新建jail.local文件来覆盖fail2ban的一些默认规则以实现自定义配置。使用 vi /etc/fail2ban/jail.local 命令新建 jail.local 文件,内容如下。

[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5
banaction = firewallcmd-ipset
action = %(action_mwl)s

[sshd]
enabled = true
filter  = sshd
port    = 21748
action = %(action_mwl)s
logpath = /var/log/secure
  • ignoreip:IP白名单,可填写多个以 , 分隔

  • bantime:屏蔽时间,单位为秒(s)

  • findtime:时间范围

  • maxretry:最大次数

  • banaction:屏蔽动作,上面使用firewalld屏蔽接口

  • [sshd]:给人看的名称,可随便填写

  • filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则

  • port:对应的端口

  • action:采取的行动

  • logpath:需要监视的日志路径

以上配置意为如果同一个IP,在10分钟内,连续超过5次密码错误,则通过FirewallD接口将此IP ban掉。运行 systemctl start fail2ban 命令启动Fail2Ban。
使用另一台主机不断尝试使用错误密码连接SSH,你会发现连续错误超过5次后直接连不上,说明IP被ban。可以使用命令 fail2ban-client status sshd 查看被ban的IP地址。假设IP:10.0.0.8被sshd规则ban掉,使用命令 fail2ban-client set sshd unbanip 10.0.0.8 可以解除封锁。
确认配置没有问题,使用命令 systemctl enable fail2ban 为Fail2Ban设置开机启动,使用 systemctl status fail2ban 可查看服务状态。若需要停止Fail2Ban,可使用命令 systemctl stop fail2ban 停止其服务,使用命令 systemctl disable fail2ban 可取消开机启动。

参考

CentOS 7安装fail2ban + Firewalld防止爆破与CC攻击
https://www.xiaoz.me/archives/9831

FirewallD入门手册
https://www.linuxprobe.com/centos-firewalld.html

如何在CentOS 7上修改主机名
https://www.jianshu.com/p/39d7000dfa47

将CentOS6自带Python2.6升级到2.7版本

将CentOS6自带Python2.6升级到2.7版本

前言:

最近在自己的服务器上配置ServerStatus中文版,因某些服务器运行的CentOS6系统,发现其自带Python都是2.6版本,而ServerStatus要求使用Python2.7。于是就研究了一下如何手动升级Python版本。

Linux系统没有像Windows那样的注册表,所以软件的安装就非常的简单。Python的调用是通过一个链接实现。因为CentOS6内的yum不支持Python2.7,只能使用Python2.6,所以我们需要将原有的Python2.6保留。

操作步骤:

安装新版Python:

1.使用以下命令查看Python版本(注意V大写),我的回显信息是Python 2.6.6,所以继续。

    python -V

2.下载需要的 Python 版本,访问 Python 官方网站点击 Downloads->Source code 从出现的下载页获取 Python2.7.X 。比如我看到的 Python2.7 最新版本是 Python 2.7.16,下载地址是 https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tgz 。在地址前加上wget运行,以下载源代码。如下:

    wget https://www.python.org/ftp/python/2.7.16/Python-2.7.16.tgz

3.使用以下命令解压下载的源码文件,并进入解压出的文件夹:

    tar  vxf Python-2.7.16.tgz
    cd Python-2.7.16

4.运行以下命令编译源代码,并安装。Python2.7 将会被安装到 /usr/local/bin/ 目录。

    ./configure --prefix=/usr/local
    make && make install

5.运行以下命令让 Python2.7 输出版本信息,以此确认编译安装的 Python2.7 是否能够正常运行。

    /usr/local/bin/python2.7 -V

6.运行以下命令建立软连接,使系统默认的 python 指向 python2.7:

    mv /usr/bin/python /usr/bin/python2.6.6 
    ln -s /usr/local/bin/python2.7 /usr/bin/python

7.再次像最开始那样运行 python -V 命令检查是否配置正确,若配置正确,回显信息应为新版本号。
可运行以下命令安装 pip:

    wget https://bootstrap.pypa.io/get-pip.py -O - | python

至此系统中默认的 Python 已经从 Python2.6 替换为 Python2.7 ,但是这并没有结束,如果此时尝试运行 yum 命令,我们会收到错误提示,其大意为缺少 Python2.6.6 ,为此我们需要单独为 yum 指定使用之前的Python版本。

指定 yum 的 Python 版本:

1.运行以下命令使用vi编辑器打开文件 /usr/bin/yum ,若没有 vi 编辑器,或习惯使用其他编辑器,也可用其他编辑器替代。

    vi /usr/bin/yum

2.将文件最开始部分的:!/usr/bin/python 替换为:!/usr/bin/python2.6.6 ,完成编辑并保存。

  • vi编辑器使用:按i键进入输入模式,编辑完后按ESC键退出编辑模式,输入进入命令模式,输入wq命令保存并退出。

3.这时,我们再次运行 yum 命令即能够正常回显帮助信息。至此,我们便真正完成了 Python 的升级。

使用ServerStatus项目实现多服务器云监控

使用ServerStatus项目实现多服务器云监控

前言

相信很多爱折腾的人手里都有不止一个服务器,或者是VPS,或者是独立服务器。当手里的服务器数量较多时,管理上就会有些麻烦。最常见的需求就是快速的确定服务器的运行状态,比如:是否在线,CPU、内存、网络的占用。手动检查每台服务器获取这些信息是不现实的,所以我们就需要一个方案来实现这个需求。传统的企业方案包括Nagios、zabbix等实现繁琐,本人也不会(流下了没有技术的泪水)。有个方案叫linux-dash挺漂亮,貌似只能给单机做状态页,一台服务器的朋友可以考虑玩一下,但其不在本文讨论范围内。最终,我找到了ServerStatus中文版这个方案。

引用其作者的话:ServerStatus中文版是一个酷炫高逼格的云探针、云监控、服务器云监控、多服务器探针~。ServerStatus监控的数据较多,可提供网络状态、开机时间、负载、实时网速、流量统计、处理器、内存、硬盘、进程数、主机到三网(CU,CT,CM)每小时丢包率等数据,界面酷炫,数据一目了然。其主要由客户端与服务端构成,服务端要求运行在一个有网站空间的Linux系统上。客户端分为两个版本:一个是Linux版本,使用Python实现;一个是跨平台版本,使用Python配合psutil跨平台依赖库实现,该版本客户端可在Windows系统上部署。

读懂实践本文,你可能需要在技能树中点亮以下技能:

  • 会通过搜索引擎尝试解决遇到的问题;
  • 基本的Windows系统与Linux系统操作;
  • 会使用一款SSH客户端;

准备

  • 运行Windows电脑一台(其他系统也可,但具体某些操作可能不同)
  • VPS几台,运行Linux系统或Windows系统。KVM或OpenVZ架构均可;有钱人上独服也行
  • 一台Linux系统VPS(或独服),我使用的CentOS7
  • SSH客户端,我用的是Putty

操作警告:

  • 错误的操作可能导致服务器系统损坏,这意味着潜在的服务停止与数据损失风险,请注意对重要数据做好备份!本人及相关项目的作者等均不会对使用软件造成的损失负责,亦不会对您学习本文的操作负责。继续操作,请自行承担风险!
  • 本方案虽支持监控Windows主机,但本人使用效果并不好,存在频繁掉线问题。这并不能代表您使用时也会遇到此问题,但若您的基本需求为监测Windows主机,请慎重考虑本方案。

步骤

  • 1.统计各被检测主机信息
  • 2.配置服务端
  • 3.配置客户端

1.统计各被检测主机信息

想要做一个多服务器状态监测页,首先应确认自己有多少服务器需要监测,为每台服务器命名,准备好以下信息:

  • 连接用户名:每台客户端唯一的用户名,用于服务器确认是哪一台客户端。
  • 服务器名称:服务器的名称,给人看的名字,在监控页面上会以节点名称显示。
  • 服务器类型:用于标记主机类型,VPS一般填写虚拟化方式。
  • 服务器提供商:这个信息服务端配置文件中有填写位置,但ServerStatus中文版中作者未提供展示。
  • 服务器位置:用户标记服务器所属地理位置。
  • 连接密码:与用户名对应,提供服务端对客户端的认证。

2.配置服务端

选择一台Linux服务器作为服务端,一般要求网络较好,稳定性好,否则状态页挂了也是蛮丢人的。我使用的CentOS7系统,其他Linux系统应该也是可以的,但操作可能不一样,具体可以参考Github项目页Readme。

  1. 使用SSH客户端登陆服务器,并使用以下命令检查更新,期间出现y/n请输入y确认:

     yum update
  2. 使用以下命令检查Python版本(注意V为大写):

     python -V
    • 查看回显的版本信息是否为Python2.7或以上,若为Python2.6或更低,则需要升级Python版本。具体可使用搜索引擎搜索,本文暂不讨论。
    • 若提示命令不存在,则可能未安装Python或安装的Python已损坏,请尝试安装Python2.7。具体操作请自行搜索。
  3. 配置Web环境,使用LNMP,一般大家可以使用LNMP一键脚本实现,网上找一下很多。我因服务器还有它用,使用的宝塔面板,其一键安装脚本简单易用,安装宝塔后按照提示登陆管理页面,直接在图形界面下完成LNMP的配置。安装时间由服务器性能决定,一般时间较长,建议考虑冲杯咖啡,或可再开个SSH页面先去学习配置客户端。以下为宝塔面板一键脚本:

     yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh
  4. 宝塔面板下,LNMP配置完成后,打开网站选项,点击添加站点,如果有域名就填写域名(比如:uptime.xx.com),使用域名勿忘去服务商那里添加解析记录;没有就填写ip:端口,然后可将根目录改个好记的名字(比如:uptime),其他保持默认,点击创建。
    如使用一键LNMP方案,请参考其作者提供的使用说明添加网站。

  5. 使用git命令拉取项目代码,命令如下:

     git clone https://github.com/cppla/ServerStatus.git

    若提示-bash: git: command not found,则表示没有安装git,可尝试运行yum –y install git命令安装git。

  6. 使用cd ServerStatus命令进入文件夹。将 web 文件夹内的内容放到网站目录,不同 LNMP 方案可能不同,假设我的文件夹是/www/wwwroot/uptime,我使用命令 cp -r /web/* /www/wwwroot/uptime将 web 文件夹内的文件复制到/www/wwwroot/uptime内,如有提示是否覆盖,则输入y确定。

  7. 此时正常的话我们打开网站就能看到页面了,因为我们服务端没有运行,网页上有相关错误提示,无需理会。

  8. 使用cd server命令进入server文件夹,然后运行make命令编译,等待其编译成功。使用./sergate命令测试是否有错误,没有错误按Ctrl+C结束即可。有错误请检查35601端口是否被占用,若端口被占用请排除或使用参数--port=<端口号>更改端口号运行。

  9. 使用 vi config.json 命令修改config.json文件,需要注意username, password的值需要和对应的客户端对应一致。

     {"servers":
         [
             {
                 "username": "连接用户名",
                 "name": "服务器名称",
                 "type": "主机类型",
                 "host": "主机服务商",
                 "location": "主机地理位置",
                 "password": "与用户名对应的一个难被猜到的密码"
             },
         ]
     }       
    • vi编辑器使用:按i键进入输入模式,编辑完后按ESC键退出编辑模式,输入进入命令模式,输入wq命令保存并退出。若没有vi编辑器或不习惯使用vi编辑器,可用其他编辑器替代,具体使用方法请自行通过搜索引擎查询。

    创建/usr/local/share/ServerStaus/目录,将以上 server 文件夹放到此目录下。

  10. 使用以下格式命令尝试运行服务端,并打开网页看是否正常,若正常请按Ctrl+C退出:

     ./sergate --port=35601 --config=config.json --web-dir=/www/wwwroot/uptime

    以下为各参数对应功能:

     -h, --help            显示此帮助信息并退出
     -v, --verbose         详细输出模式
     -c, --config=<str>    指定配置文件
     -d, --web-dir=<str>   填写Web文件夹位置
     -b, --bind=<str>      Bind to address(看不懂,哪位大佬若看得懂请留言,谢)
     -p, --port=<int>      指定侦听的端口
  11. 使用vi /etc/systemd/system/sergate.service命令创建文件 /etc/systemd/system/sergate.service 填入以下内容保存并退出,需注意,ExecStart项目需要参考操作10自行确认:

     # /etc/systemd/system/sergate.service
    
     [Unit]
     Description=ServerStatus Master Server
     After=syslog.target
     After=network.target
    
     [Service]
     Type=simple
     WorkingDirectory=/usr/local/share/ServerStatus/server
     ExecStart=/usr/local/share/ServerStatus/server/sergate --config=config.json --port=35601 --web-dir=/www/wwwroot/uptime
     StandardOutput=syslog
     StandardError=syslog
     SyslogIdentifier=sergate
    
     [Install]
     WantedBy=multi-user.target
    • vi编辑器使用:按i键进入输入模式,编辑完后按ESC键退出编辑模式,输入进入命令模式,输入wq命令保存并退出。若没有vi编辑器或不习惯使用vi编辑器,可用其他编辑器替代,具体使用方法请自行通过搜索引擎查询。
  12. 创建sergate.service文件后,可使用systemctl start sergate运行服务,使用systemctl enable sergate命令将其加入开机启动。若有需要增减客户端,或其他原因需要停止服务,可使用systemctl stop sergate命令停止服务。如需要检查服务运行状态,可使用systemctl status sergate命令输出状态信息。

    请注意,此为Systemd启动方式,CentOS6不支持此方式,若您的系统不支持,请自行查找可用的方式启动。

3.配置客户端

服务端就绪后能看到监控页满屏的红色,不要慌,接下来配置客户端。客户端程序是用Python实现,在ServerStatus/clients目录下,它有两个版本,client-linux为普通Linux版,client-psutil为跨平台版,普通版不成功,请尝试换用跨平台版,Windows需要使用跨平台版。

使用Linux版本:

此处依然以CentOS7为例,其他系统会有不同,请自行摸索。

  1. 使用SSH客户端登陆服务器,并使用以下命令检查更新,期间出现y/n请输入y确认:

     yum update
  2. 使用以下命令检查Python版本(注意V为大写):

     python -V
    • 查看回显的版本信息是否为Python2.7或以上,若为Python2.6或更低,则需要升级Python版本。具体可使用搜索引擎搜索,本文暂不讨论。
    • 若提示命令不存在,则可能未安装Python或安装的Python已损坏,请尝试安装Python2.7。具体操作请自行搜索。
  3. 运行以下命令创建/usr/local/share/ServerStatus目录并进入该目录,直接从Github下载 client-linux.py 文件到此目录中。

     mkdir /usr/local/share/ServerStatus
     cd /usr/local/share/ServerStatus
     wget https://github.com/cppla/ServerStatus/raw/master/clients/client-linux.py
  4. 运行 vi client-linux.py 命令使用vi编辑器打开client-linux.py文件,根据自己需求修改以下部分内容并保存:

     SERVER = "<服务端地址>"
     PORT = <服务端设置的端口号>
     USER = "之前为本机定义的连接用户名"
     PASSWORD = "之前为本机定义的与用户名对应的一个难被猜到的密码"
    • vi编辑器使用:按i键进入输入模式,编辑完后按ESC键退出编辑模式,输入进入命令模式,输入wq命令保存并退出。若没有vi编辑器或不习惯使用vi编辑器,可用其他编辑器替代,具体使用方法请自行通过搜索引擎查询。
  5. 运行 chmod +x client-linux.py 命令为文件 client-linux.py 赋予可执行权限。使用以下命令运行客户端,检查状态页显示是否正常,若正常按Ctrl+C退出。

     ./client-linux.py
  6. 运行 vi /etc/systemd/system/serverstatus.service 命令使用vi编辑器在目录/etc/systemd/system/创建文件 serverstatus.service。填入以下内容保存并退出:

     #/etc/systemd/system/serverstatus.service
    
     [Unit]
     Description=ServerStatus Client
     Documentation=https://github.com/LexsionLee/ServerStatus
     After=network.target
    
     [Service]
     Type=simple
     IgnoreSIGPIPE=no
     ExecStart=/usr/local/share/ServerStatus/client-linux.py
     Restart=on-failure
    
     [Install]
     WantedBy=multi-user.target
  7. 创建serverstatus.service文件后,可使用systemctl start serverstatus.service命令运行服务,使用systemctl enable serverstatus.service命令将其加入开机启动。若要停止服务,可使用systemctl stop serverstatus.service命令停止服务。如需要检查服务运行状态,可使用systemctl status serverstatus.service命令输出状态信息。

至此,在CentOS7上配置客户端就完成了,若一切正常,我们就能在监控页面看到我们的客户端主机状态信息了。

使用psutil跨平台版本(For Windows)

此处以 Windows 7 为例讲述如何在 Windows 下配置ServerStatus的psutil跨平台版本客户端。

  1. 访问Python官方网站点击Downloads->Windows从出现的下载页获取Python2.7.X。请自行选择下载32位或64位版本。有网帖表示Python3可能不行,本人未作测试。

  2. 双击下载的.msi文件运行安装程序,安照提示安装,在功能自定义页面的 Add pytnon.exe to Path 处选择 Will installed on local hard drive ,点击Next安装,若出现UAC提醒请允许。安装完成后点击Finish退出安装程序。

  3. 按 Windows徽标键+R键 打开 “运行” 对话框,输入 cmd 按 Enter键 打开命令提示符。在命令提示符中输入以下命令安装psutil跨平台软件包:

     pip install psutil
  4. 访问ServerStatus中文版GitHub项目页,从
    clients目录下找到client-psutil.py文件页,点击Raw按钮直接下载文件。

  5. 将下载的client-psutil.py文件放到一个合适的目录。比如我在C盘下创建了一个文件夹 ServerStatus ,将其存在此。在此文件上右击,点击Edit with IDLE(亦可使用其他编辑器打开)。参考Linux版本配置小节中的说明填写配置信息保存并退出编辑器。

  6. 双击client-psutil.py文件运行,检查监控页是否正常显示,然后关闭窗口停止。

  7. 点击开始->所有程序->启动->右击->打开,创建一个ServerStatusClient.bat文件,填写运行client-psutil.py的代码,我的文件在C:\ServerStatus\下,参考如下:

     python C:\ServerStatus\client-psutil.py
    • 注意该操作可能被安全软件拦截,请在安全软件中设置例外。

此方法配置的客户端在启动时会一直显示一个终端窗口,关闭窗口后客户端即停止工作。强迫症患者慎用!如果希望没有窗口显示,请自行研究解决。

参考:

1:Cppla 大佬的 ServerStatus GitHub 页

2:BotoX 大佬的 ServerStatus GitHub 页

IPROUTE2之IP工具的学习笔记-替代net-tools实现常用网络命令

IPROUTE2之IP工具的学习笔记-替代net-tools实现常用网络命令

前言:

在Linux系统下,我们可能经常会使用ifconfig执行一些网络管理任务,该命令属于net-tools工具组,这是一个很多年前就停止维护的项目,已经有越来越多的人认识到,ifconfig在现代网络环境中已经不再是一个好的工具了,有些发行版的Linux系统已经默认不在包含它,当我们在没有net-tools工具的系统上尝试运行ifconfig时,会提示command not found。这中情况我们可以尝试安装net-tools以可以再次运行ifconfig,或者我们可以考虑学习一个新的工具。iproute2通常以一个名为iproute或iproute2的包形式发放,它由多个工具组成,其中最重要的工具是iptc,IP控制IPv4和IPv6配置,TC代表流量控制。本文即针对ip工具进行学习。该项目目前由Stephen Hemminger负责维护,其原始作者为 Alexey Kuznetsov,,他以在Linux内核中实现QoS而闻名。

获取工具:

与net-tools相反,iprouter2工具在越来越多的Linux发行版本中集成,我们尝试运行以下命令(注意大小写)查看ip实用程序的版本以此检查是否配置了该实用程序:

ip -V

正常回显信息为:

ip utility, iproute2-*******

若回显信息为:command not found,则表示没有配置该工具,如果需要,您可以安装该工具。使用以下命令可以在CentOS下安装iproute2.

yum install -y iproute

使用以下命令可以在Ubuntu下安装iproute2:

sudo apt-get update
sudo apt-get install iproute2

其他系统的配置方法大家可自行搜索相关资料。

命令语法:

我们常使用ifconfig命令大多由IP命令集取代,以下是其命令通用形式:

ip [OPTIONS] OBJECT [COMMAND [ARGUMENTS]]

OPTIONS:

OPTIONS(选项)是一组多值修饰符,它们影响ip实用程序的一般行为和输出。所有选项均以“ - ”字符开头,可以通过输入完整形式或其缩略形式实现。目前可以使用以下选项:

-V,-Version ---输出ip实用程序的版本号并退出。

-s,-stats,-statistics ---输出更多信息。
可以重复此选项以增加输出的详细级别。比如,我们可以观察ip -4 a , ip -4 -s a , ip -4 -s -s a 这三条命令输出信息的区别。通常,附加信息是设备或功能统计或值。在许多情况下,值输出应该与 /proc/ 目录的输出相同,其中值的名称与值本身没有直接关系。

-f[amily] { inet | inet6 | ipx | dnet | bridge | link } ---强制使用哪个协议族。
如果此选项不存在,则使用的协议族输出将从其他命令行参数中猜出。如果命令行的其余部分没有提供足够的信息来猜测协议族,则ip命令会回退到默认的inet协议族。链接是一个特殊的系列标识符,意味着不涉及网络协议。此选项有几个快捷方式,如下所示:
-4 | -6 | -I | -D | -B | -0 | 常用如下:
-4 ---IPv4快捷方式。
-6 ----IPv6快捷方式。
-0 ----链接的快捷方式。
例如,我们使用 ip -6 a 命令输出所有IPv6地址。

-o,-oneline ---通过用“\”字符替换任何换行符将输出内容格式化为单行。

OBJECT:

OBJECT(对象)是您希望操作或获取有关信息的对象类型。其包含:

{ link | address | addrlabel | route | rule | neighbour | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm |netns | l2tp | tcp_metrics | token }  

以下对其进行介绍:
link---物理或逻辑网络设备,亦可使用 l
address ---设备上的协议(IPv4或IPv6)地址,亦可使用 a , addr
addrlabel ---协议地址选择的标签配置。
route ---路由表条目。
rule---路由策略数据库中的规则。
neighbour --- ARP或NDISC缓存条目,亦可使用n
ntable --- neighbour缓存的操作。
tunnel--- IP隧道。
tuntap ---管理TUN/TAP设备。
maddress --- 多播地址。
mroute ---组播路由缓存条目。
mrule ---多播路由策略数据库中的规则。
monitor ---监视netlink信息。
xfrm ---管理IPSec策略。
netns ---管理网络命名空间。
l2tp ---通过IP隧道传输以太网(L2TPv3)。
tcp_metrics ---管理TCP Metrics。
token ---管理标记化的接口标识符。

所有对象的名称可以全部或缩写形式书写。例如: address 可以缩写为 addr 或只是 a 。但是,如果您在脚本中使用这些命令,则应该养成始终使用操作的完整规范的习惯。使用缩写使其易于在命令行上使用,但很难理解脚本中的逻辑。由于您可能不是唯一需要处理脚本的人,因此您应该努力使它们尽可能完整。

COMMAND:

COMMAND(命令)指定要对对象执行的操作。可能的操作集取决于对象类型。通常,可以是 adddeleteshowlist )对象。但某些对象不允许所有的这些操作或具有一些其他命令,help 命令适用于所有的 OBJECT,它可以打印出可用命令和参数语法约定的列表。
即我们可以使用以下命令列出address的命令语法:

ip address help

如果没有给出命令,则假定一些默认命令。通常它是 showlist ), 或者,如果无法列出此类的对象,则默认输出 help

ARGUMENTS:

ARGUMENTS(参数)是具体化命令的命令选项列表。参数取决于命令和对象。可以发出以下两种类型的参数:
--- flags - 缩写为单个关键字。
--- parameters - consisting of a keyword followed by a value.
每个命令都有一个默认参数,如果省略参数,则使用默认参数。例如:dev参数是ip link命令的默认值,因此ip link list eth0相当于ip link list dev eth0
正如我们上面提到的对象名称,所有关键字都可以用第一个或前几个唯一字母缩写。当交互式使用ip时,这些快捷方式很方便,但不建议在脚本中使用它们,请不要在报告错误或寻求帮助时使用它们。

退出状态

如果命令成功,则退出状态为0;如果存在语法错误,则退出状态为1。如果内核报告错误,则退出状态为2。

常用命令:

ip link-网络设备配置

ip link show ---查看设备属性。

此语句中,show可写为:list,lst,sh,ls,l 。其后可跟以下参数:
* dev NAME(默认值)--- NAME指定要显示的网络设备。
如果省略此参数,则该命令将列出所有设备。

* up ---仅显示正在运行的接口。
例如,使用以下命令列出lo的信息:

ip link show dev lo
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

冒号前面的数字是接口索引或ifindex,此编号唯一标识接口。如果查看cat / proc / net / dev的输出,您将看到网络设备的列出顺序与您在此处看到的编号相同。ifindex之后是接口名称(lo,eth0,venet0,sit0等)。接口名称在任何给定时刻也是唯一的,但接口可能会从列表中消失,例如卸载相应的驱动程序模块时,稍后将创建另一个具有相同名称的接口。此外,使用ip link set DEVICE name NEWNAME命令,系统管理员可以更改设备名称。
接口名称也可以有另一个名称或在“@”符号后附加关键字NONE。这表示此设备绑定到主/从设备关系中的另一个设备。因此,通过该设备发送的数据包被封装并通过主设备转发。如果名称为NONE,则主设备未知。
在接口名称之后,我们看到接口mtu(最大传输单元),它确定数据包的最大大小,该数据包可以通过该接口作为单个包发送。
qdisc(排队规则)显示在接口上使用哪种排队算法。特别的是,关键字noqueue意味着此接口不排队任何内容。关键字noop表示接口处于黑洞模式,其会立即丢弃送达的所有数据包。

以下这些信息都是尖括号内的选项。在尖括号内是汇总接口标志的位置。最常用的标志如下:

  • UP ---此设备已打开,准备接受数据包以传输到网络上,并且可能会从网络上的其他节点接收数据包。

  • LOOPBACK ---接口不与其他主机通信。通过它发送的所有数据包都将返回给发送方,并且可以接收退回的数据包。

  • BROADCAST ---此设备可以将数据包发送到共享相同物理链路的所有其他主机。示例:以太网

  • POINTOPOINT ---网络只有两端连接两个节点。发送到链路的所有数据包都将到达对等链路,并且所有收到的数据包都是由对等体发起的。
    如果既未设置LOOPBACK也未设置BROADCAST或POINTOPOINT,则假定接口是NBMA(非广播多路访问)链路。NBMA是最通用的设备类型,也是最复杂的设备类型,因为连接到NBMA链路的主机无法在没有其他手动提供的配置信息的情况下向任何其他主机发送信息。

  • MULTICAST ---一个标记接口多播的标志。广播是多播的一个特殊情况,其中多播组包含链路上的所有节点作为成员。请注意,软件不得将此标志的缺失解释为接口无法进行多播。根据定义,任何POINTOPOINT和BROADCAST链接都是多播的,因为我们可以直接访问所有链接邻居,从而直接访问它们的任何特定组。由于与传输相关的高成本,不建议在仅广播网络上使用高带宽多播传输,但不严格禁止这种使用。

  • PROMISC ---设备监听并向内核提供链路上的所有流量。这包括网络上通过收发器的每个数据包。通常,此模式仅存在于广播链路上,并由网桥和网络监控设备使用。

  • ALLMULTI ---设备接收在链路上漫游的所有多播数据包。组播路由器使用此模式。

  • NOARP ---这个标志与其他标志不同。它没有不变的值,其解释取决于所涉及的网络协议。通常,它表示设备不需要任何地址解析,并且软件或硬件知道如何在没有协议栈帮助的情况下传送数据包。

  • DYNAMIC ---是一个建议标志,将此接口标记为动态创建和销毁。

  • SLAVE ---此接口与其他接口绑定,以共享链路容量。

示例输出的第二行包含有关与设备关联的链路层地址的信息。第一个字定义接口硬件类型,然后确定地址的格式和语义,因此逻辑上是地址本身的一部分。站点和广播地址的默认格式(或点对点链接的对等地址)是由冒号分隔的十六进制字节序列。但是,某些链接类型可能会有自己的自然地址格式,这些格式在演示文稿中使用。IE:IP隧道的地址打印为点分四IP地址。虽然NBMA链路没有明确定义的广播或对等地址,但该字段可能包含有用的信息,例如广播中继的地址或ARP服务器的地址。

ip link set ---更改设备属性。

您可以使用ip link set 请求多个参数更改。如果您请求多个参数更改并且任何一个更改失败,则ip会在失败后立即中止,因此失败之前的参数更改已完成,并且不会在中止时撤消。这是使用ip命令使系统处于不可预测状态的唯一情况。解决方案是避免使用一个ip link set调用更改多个参数。根据需要使用尽可能多的单独 ip link set 命令来执行所需的操作。

参数:

  • dev NAME (default) --- NAME 指定操作的网络设备。
  • up / down --- 将设备状态更改为UP或DOWN。
  • arp on / arp off --- 更改设备上的NOARP标志状态。
    注意,如果设备已处于UP状态,则不允许此操作。由于ip utility和内核都不检查此情况,因此在设备运行时更改标志会产生非常不可预测的结果。最好将设备设置为关闭然后发出此命令。
  • multicast on / multicast off --- 更改设备上的MULTICAST标志。
  • dynamic on / dynamic off --- 更改设备上的DYNAMIC标志。
  • name NAME --- 更改设备名称。
    注意,如果设备正在运行或已配置某些地址,则不建议执行此操作。您会因在设备运行或已分配寻址时更改设备名称而导致破坏系统安全性并搞砸其他网络守护进程或程序。
  • txqueuelen NUMBER / txqlen NUMBER --- 更改设备的传输队列长度。
  • mtu NUMBER --- 更改设备的MTU。
  • address LLADDRESS --- 更改接口的站地址。
  • broadcast LLADDRESS, brd LLADDRESS or peer LLADDRESS --- 在POINTOPOINT接口的情况下更改链路层广播地址或对等地址。
    注意,对于大多数物理网络设备(以太网,令牌环等),更改链路层广播地址将破坏网络。如果你不明白这个操作到底做了什么,请不要使用这个参数。
  • ip命令不允许更改PROMISC或ALLMULTI标志,因为这些标志被认为是过时的,不应在管理上进行更改。

例子:
ip link set venet1 address 000000000001 --- 更改接口venet1的站地址(MAC地址)为000000000001。
ip link set venet1 up ---启动接口venet1。

ip link的其他命令还有ip link add (用于添加虚拟Link), ip link delete (用户删除虚拟Link),本文暂不讲述。具体可参考命令:ip link help,或可参考:IP Link - Linux Man Pages

ip address - 协议地址管理

缩略词: address, addr, a
可用命令: add, delete, flush, show (list)
地址是指连接到网络设备的协议(IP或IPv6)地址。每个设备必须至少有一个地址才能使用相应的协议。可以将多个不同的地址连接到一个设备。
ip addr命令允许您查看接口上的地址及其属性。您可以添加新地址并删除旧地址,而无需考虑任何排序。

ip address add ---添加新的协议地址。

参数:

  • dev NAME --- 我们添加地址的设备的名称。
  • local ADDRESS (default) --- 接口的地址。
    地址格式取决于协议。IPv4使用点分四组,IPv6使用由冒号分隔的十六进制半字序列。 ADDRESS后面可以跟一个斜杠和一个十进制数字,它以CIDR表示法编码网络前缀(子网掩码)长度。 如果未指定CIDR子网掩码表示法,则该命令假定指定了主机(/ 32掩码)地址。
  • peer ADDRESS--- pointopoint接口的远程端点的地址。同样,ADDRESS后面可能跟一个斜杠和十进制数字,编码网络前缀长度。如果指定了对等体地址则本地地址不能具有的网络前缀长度中的网络前缀与所述对等体相关联,而不是与本地地址。换句话说,在指定对等地址和本地地址时,只能将网络掩码分配给对等地址。
  • broadcast ADDRESS --- 接口上广播地址。
    可以使用特殊符号“+”和“ - ”代替指定广播地址。在这种情况下,广播地址由或设置所有接口主机位衍生的一个(+)或由所有接口主机位设置为零( - )。在IPv4网络的大多数现代实现中,您将需要使用(+)设置。与ifconfig不同,除非明确请求,否则ip命令不会设置广播地址。
  • label NAME --- 每个地址都可以用标签字符串标记。
    为了保持使用Linux-2.0净别名兼容性,这个字符串必须与设备的名称一致或必须用的设备名,后跟一个冒号前缀。(eth0:duh)
  • scope SCOPE_VALUE --- 此地址有效的区域范围。
    可用范围在以下文件中列出 /etc/iproute2/rt_scopes 。预定义的范围值为:
  • global --- 地址全局有效。
  • site --- (仅限IPv6)地址是本地站点,仅在此站点内有效。
  • link --- 地址是本地链接,仅在此设备上有效。
  • host --- 该地址仅在此主机内有效。

示例:
ip addr add 127.0.0.1/8 dev lo brd + scope host
--- 将通常的环回地址添加到环回设备。必须先启用该设备,然后才能显示此地址。

ip addr add 10.0.0.1/24 brd + dev eth0
--- 将地址长度为24(网络掩码255.255.255.0)的地址10.0.0.1和标准广播添加到接口eth0

ip address delete ---删除协议地址。

缩略:delete,del,d
参数:
参数与 ip addr add 的参数一致。设备名称是必需参数,其余是可选的。如果没有给出参数,则删除列出的第一个地址。

示例:
ip addr del 127.0.0.1/8 dev lo
--- 从loopback设备中删除环回地址。

Alexey states说:
"最好不要尝试重复这个实验 8-}"
删除接口eth0上的所有IPv4地址:

while ip -f inet addr del dev eth0; do
nothing
done

ip address show ---查看协议地址。

缩略:show,list,lst,sh,ls,l
参数:

  • dev NAME (default) --- 设备名称。
  • scope SCOPE_VAL --- 仅列出具有此范围的地址。
  • to PREFIX --- 仅列出与此前缀匹配的地址。
  • label PATTERN --- 仅列出标签与PATTERN匹配的地址。
    PATTERN是通常的shell regexp样式模式。
  • dynamic / permanent ---(仅限IPv6)仅列出stateless address configuration配置的地址,或仅列出永久(非动态)地址。
  • tentative --- (仅限IPv6)仅列出地址,但未通过重复地址检测。
  • deprecated --- 仅限IPv6)仅列出弃用的地址。
  • primary / secondary --- 仅列出主要(或次要)地址。
    示例:
    ip -4 a ls eth0 ---列出eth0上的IPv4地址。

ip address flush ---刷新协议地址。

参数:
此命令刷新由某些条件筛选的协议地址。此命令与show具有相同的参数。主要区别在于,如果没有给出参数,则此命令不会运行。否则你可能会错误地删除所有地址。此命令(以及下面描述的其他刷新命令)非常危险。如果你犯了一个错误,命令不会请求确认或跳过,它真的会完全的地清除你的所有地址。一定要注意!

使用选项-statistics,命令变得详细,并打印出已删除的地址数和处理轮数以刷新地址列表。如果给出-statistics选项两次,那么ip addr flush也会以完整格式转储所有已删除的地址,如ip addr list部分所述。

ip neighbor --- neighbor/arp 表管理。

neighbour table对象在共享相同物理链路的主机的协议地址和链路层地址之间建立绑定。 Neighbour对象条目组织成表。IPv4 Neighbour对象表在另一个名称下称为ARP table。这些命令允许您查看neighbour table绑定及其属性,添加新neighbour table条目以及删除旧neighbour table条目。
参数:add, change, replace, delete, flush and show (list)

ip neighbor add ---添加新neighbor条目

ip neighbor change ---改变现有条目

ip neighbor replace ---添加新的或更改现有条目

缩略:add, a; change, chg; replace, repl
这些命令可创建新neighbor记录或更新现有neighbor记录。

  • to ADDRESS (default) --- 邻居的协议地址。它是IPv4或IPv6地址。
  • dev NAME --- 此邻居所连接的接口。
  • lladdr LLADDRESS --- 邻居的链路层地址。LLADDRESS可以为null。
  • nud NUD_STATE --- 邻居条目的状态。nud是“Neighbor Unreachability Detection”的缩写。

此状态可以采用以下值之一:

  • permanent --- 邻居条目永远有效,只能通过管理方式删除。
  • noarp --- 邻居条目有效,不会尝试验证此条目,但可以在其生命周期到期时删除。
  • reachable --- 邻居条目有效,直到可达性超时到期。
  • stale --- 邻居条目有效,但可疑。如果条目有效且此命令未更改地址,则ip neighbor的此选项不会更改邻居状态。

示例:
ip neigh add 10.0.0.3 lladdr 000001 dev eth0 nud perm
---在设备eth0上为邻居10.0.0.3添加永久ARP条目。
ip neigh chg 10.0.0.3 dev eth0 nud reachable
---将其状态更改为可达。

ip neighbor delete ---删除neighbor条目。

缩略:delete,del,d。
此命令使neighbor条目失效。参数与ip neigh add相同,只有lladdr和nud被忽略。
示例:
ip neigh del 10.0.0.3 dev eth0
---在设备eth0上使邻居10.0.0.3的ARP条目无效。
删除的neighbor条目不会立即从表中消失; 如果它正在使用中,则它在最后一个客户端释放它之前不会被删除,否则它将在下一次垃圾收集期间被销毁。
警告!尝试删除或手动更改内核创建的noarp条目可能会导致不可预测的行为。更具体地说,即使在NOARP接口上,内核也可能开始尝试解析该地址,或者将地址更改为多播或广播。

ip neighbor show ---列出邻居条目。

缩略:show,list,sh,ls。
此命令显示neighbor表。
参数:

  • to ADDRESS (default) --- 前缀选择要列出的neighbours。
  • dev NAME --- 仅列出连接到此设备的邻居。
  • unused --- 仅列出邻居,现在没有使用。
  • nud NUD_STATE --- 仅列出此状态中的邻居条目。 NUD_STATE takes values listed below after the example or the special value all, which means all the states. 此选项可能不止一次出现。如果没有此选项,ip将列出除none和noarp之外的所有条目。

ip neighbor flush ---刷新邻居条目。

此命令刷新邻居表。可以选择条目以通过各种标准进行刷新。
此命令与show具有相同的参数。请注意,在没有给出参数时它将不会运行,并且要刷新的默认邻居状态不包括permanent或noarp。
使用选项-statistics,命令输出变得详细,并打印出删除的邻居数和刷新邻居表时的轮数。如果选项被给出两次,ip neigh flush也会以前一小节中描述的格式转储所有已删除的邻居。

ip route - 路由表管理。

缩写:route,ro,r。
此命令管理内核路由表中的路由条目。内核路由表将有关协议路径的信息保存到其他网络节点。
因本人才疏学浅,暂只列出相关命令。

ip route add ---添加新路由。

ip route change ---改变路线。

ip route replace ---更改路由或添加新路由。

ip route delete ----删除路由。

ip route show ---此命令格式允许查看路由表内容并查看由某些条件选择的路由。

ip route flush --- 允许组删除路由,此命令允许按某些条件选择刷新路由。

ip route get --- 获取路由路径。此命令获取到目标的单个路径,并在内核看到时准确打印其内容。

ip rule ---路由策略数据库管理。

缩写:rule,ru。
路由策略数据库控制路由选择算法的规则。
因特网中使用的经典路由算法仅基于分组的目的地地址做出路由决定,并且在理论上,但在实践中不在TOS字段上。在某些情况下,我们希望以不同方式路由数据包,这不仅取决于目标地址,还取决于其他数据包字段,例如源地址,IP协议,传输协议端口甚至数据包有效负载。此任务称为“策略路由(policy routing)”。
"policy routing" != "routing policy" (“策略路由”!=“路由策略”)
"policy routing" = "cunning routing" (“策略路由” = “灵活路由”)
"routing policy" = "routing tactics" or "routing plan" (“路由策略”=“路由策略”或“路由计划”)
因本人才疏学浅,暂只列出相关命令。

ip rule add ---插入新规则。

ip rule show --- 列出策略规则。

ip tunnel - ip隧道配置。

ip tunnel add - 创建隧道。

ip tunnel show - 列出隧道属性。

ip monitor和rtmon ---路由状态监控。

ip实用程序允许连续监视设备,地址和路由的状态。此选项具有不同的格式,因为命令监视器首先在命令行上,后跟对象列表。
ip monitor [ file FILE ] [ all OBJECT-LIST ]
OBJECT-LIST是我们要监视的对象类型列表。它可能包含链接,地址和路由。如果没有给出文件参数,则ip打开RTNETLINK,监听它并以前面部分中描述的格式转储状态更改。
如果给出了文件名,则ip不会侦听RTNETLINK,而是打开假定包含以二进制格式保存的RTNETLINK消息的文件并将其转储。可以使用实用程序rtmon生成此类历史文件。此实用程序具有类似于ip monitor的命令行语法。理想情况下,应在发出第一个网络配置命令之前启动rtmon。可以随时启动rtmon,因为它使用在启动时转储的系统状态快照预先填充历史记录。


正是如此,IPROUTE2的IP实用程序是Linux下用于执行高级IP网络操作的ifconfig和路由实用程序的替代品。虽然标准实用程序足以满足简单设置,但仍建议学习使用ip实用程序,以便熟悉其用法并能够充分利用此实用程序的强大功能。

参考:

  1. Wiki页
    https://wiki.linuxfoundation.org/networking/iproute2

  2. Linux手册页-systutorials
    https://www.systutorials.com/docs/linux/man/8-ip/

  3. IPROUTE2 Utility Suite Howto
    http://www.policyrouting.org/iproute2.doc.html

  4. IP Link - Linux Man Pages
    https://www.systutorials.com/docs/linux/man/8-ip-link/

  5. 试试Linux下的ip命令,ifconfig已经过时了
    https://linux.cn/article-3144-1.html

  6. linux网络工具iproute2的使用简介
    https://blog.csdn.net/astrotycoon/article/details/52317288

  7. 新的网络管理工具 ip 替代 ifconfig 零压力
    https://linuxstory.org/replacing-ifconfig-with-ip/