CentOS7使用FirewallD管理防火墙

FirewallD 提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具,它拥有运行时配置和永久配置选项。CentOS 7中防火墙是一个非常的强大的功能,本文主要介绍FirewallD常用管理命令。

安装firewalld
Centos7自带FirewallD防火墙工具,如果你的系统是最小化安装的,可能就需要自己动手安装firewalld服务。

yum install firewalld firewall-config

运行和停止firewalld

systemctl是CentOS7的服务管理工具中主要的工具,它融合之前service和chkconfig的功能于一体。我们使用systemctl命令来控制firewalld。

启动防火墙:

systemctl start firewalld.service

关闭防火墙:

systemctl stop firewalld.service

重启防火墙:

systemctl restart firewalld.service

开机时启动防火墙:

systemctl enable firewalld.service

开机时禁用防火墙:

systemctl disable firewalld.service

查看防火墙运行状态:

systemctl status firewalld

配置firewalld-cmd管理防火墙端口
我们使用firewalld的字符界面管理工具firewall-cmd很方便就可以管理firewalld。

显示防火墙状态:

firewall-cmd --state

显示防火墙状态:

firewall-cmd --state

添加80端口,允许访问80端口,并永久生效:

firewall-cmd --zone=public --add-port=80/tcp --permanent

添加服务,允许https访问,并永久生效:

firewall-cmd --zone=public --add-service=https --permanent

移除80端口:

firewall-cmd --zone=public --remove-port=80/tcp --permanent

重新载入使配置生效:

firewall-cmd --reload

查看开放的端口:

firewall-cmd --list-ports

当然,你也可以到/etc/firewalld/zones/目录下直接修改xml配置文件。
习惯用centos7以前版本的伙伴都喜欢用iptable来管理防火墙,设置在使用CentOS7后还把系统自带的firewalld服务弃用,转而用老版本的iptable,可我觉得firewalld很好用啊,简单又实在,好东西为什么不用呢。

Linux系统/run/systemd空间不足问题解决

之前说Debian8直接升级到Debian9,发现升级完成之后遇到一个问题,就是升级到Debian9之后,在/run/systemd出现可用空间不足问题,连个Nginx都不能启动,于是花了点时间解决了下。

报错详情:

Failed to reload daemon: Refusing to reload, not enough space available on /run/systemd. Currently, 10.5M are free, but a safety buffer of 16.0M is enforced.
Processing triggers for systemd (232-25+deb9u3) ...
Failed to reload daemon: Refusing to reload, not enough space available on /run/systemd. Currently, 10.5M are free, but a safety buffer of 16.0M is enforced.

df -h一下,发现这个目录确实空间不多:

root@elsenow-virmach-128:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             47M     0   47M   0% /dev
tmpfs            12M  880K   11M   8% /run
/dev/vda1       9.7G  1.9G  7.4G  21% /
tmpfs            58M     0   58M   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            58M     0   58M   0% /sys/fs/cgroup
tmpfs            12M     0   12M   0% /run/user/0

很明显,是提示/run/systemd空间不足,我们只需要想办法给这个目录增加空间就行,一开始我还以为会很麻烦,没想到最后也就一行配置的事情,不多说,直接上代码:

vim /etc/fstab

tmpfs /run tmpfs nosuid,noexec,size=18M,nr_inodes=4096 0 0

也就是到/etc/fstab增加一行就行了。增加之后,保存,重启,问题就解决了。

Ubuntu 18.04 rc.local systemd设置

ubuntu18.04不再使用initd管理系统,改用systemd。

然而systemd很难用,改变太大,跟之前的完全不同。

使用systemd设置开机启动
为了像以前一样,在/etc/rc.local中设置开机启动程序,需要以下几步:

1、systemd默认读取/etc/systemd/system下的配置文件,该目录下的文件会链接/lib/systemd/system/下的文件。一般系统安装完/lib/systemd/system/下会有rc-local.service文件,即我们需要的配置文件。
链接过来:

ln -fs /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service  
cd /etc/systemd/system/  
cat rc-local.service  

rc-local.service内容

#  SPDX-License-Identifier: LGPL-2.1+  
#  
#  This file is part of systemd.  
#  
#  systemd is free software; you can redistribute it and/or modify it  
#  under the terms of the GNU Lesser General Public License as published by  
#  the Free Software Foundation; either version 2.1 of the License, or  
#  (at your option) any later version.  

# This unit gets pulled automatically into multi-user.target by  
# systemd-rc-local-generator if /etc/rc.local is executable.  
[Unit]  
Description=/etc/rc.local Compatibility  
Documentation=man:systemd-rc-local-generator(8)  
ConditionFileIsExecutable=/etc/rc.local  
After=network.target  

[Service]  
Type=forking  
ExecStart=/etc/rc.local start  
TimeoutSec=0  
RemainAfterExit=yes  
GuessMainPID=no  

[Install]  
WantedBy=multi-user.target  
Alias=rc-local.service  

1) [Unit] 区块:启动顺序与依赖关系。

2) [Service] 区块:启动行为,如何启动,启动类型。

3) [Install] 区块,定义如何安装这个配置文件,即怎样做到开机启动。

2、创建/etc/rc.local文件

touch /etc/rc.local  

3、赋可执行权限

chmod 755 /etc/rc.local  

4、编辑rc.local,添加需要开机启动的任务

#!/bin/bash  

echo "test rc " > /var/test.log  

5、执行reboot重启系统,然后查看test.log

systemd 的网络管理

0. 简介

systemd 是 freedesktop 的项目,官网 https://www.freedesktop.org/wiki/Software/systemd/ ,项目源码在 github 上发布,可以在 https://github.com/systemd/systemd 查看所有版本更新、 Bug Fix 和版本对应的文档等。
systemd-networkd 是 systemd 默认提供的网络管理服务,可以完全管理以太网,对于无线网卡,还需要其他服务支持,比如管理 Wi-Fi 的 [email protected] ,管理 PPP 的 [email protected]
管理网卡前,应该确保各网卡的驱动都已经正常加载,systemd 的 systemd-modules-load.service 负责在系统启动时静态加载内核模块。它会从以下路径搜索可用的配置文件:

/etc/modules-load.d/*.conf
/run/modules-load.d/*.conf
/usr/lib/modules-load.d/*.conf

配置文件的内容就是一个内核模块名称的列表,可以用井号 # 或者分号 ; 注释单个模块。

1. 基本配置

我的系统中,systemd 的版本是 216 ,有两个以太网卡和一个 Wi-Fi 网卡,先查看一下网卡列表,再查看 systemd-networkd.service 的状态:

~# networkctl list
IDX LINK             TYPE               OPERATIONAL SETUP     
1 lo               loopback           carrier     unmanaged 
2 wlp1s0           wlan               off         unmanaged 
3 enp0s20f6        ether              routable    configured
4 enp0s20f7        ether              no-carrier  configured
4 links listed.
~# systemctl status systemd-networkd 
a—? systemd-networkd.service - Network Service
Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled)
Active: active (running) since Fri 2018-04-27 17:49:22 UTC; 24min ago
    Docs: man:systemd-networkd.service(8)
Main PID: 260 (systemd-network)
Status: "Processing requests..."
CGroup: /system.slice/systemd-networkd.service
        a””a”€260 /lib/systemd/systemd-networkd

Apr 27 17:49:21 quark systemd[1]: Starting Network Service...
Apr 27 17:49:22 quark systemd-networkd[260]: lo              : gained carrier
Apr 27 17:49:22 quark systemd[1]: Started Network Service.
Apr 27 17:49:22 quark systemd-networkd[260]: eth1            : renamed to enp0s20f7
Apr 27 17:49:22 quark systemd-networkd[260]: eth0            : renamed to enp0s20f6
Apr 27 17:49:23 quark systemd-networkd[260]: enp0s20f6       : gained carrier
Apr 27 17:49:23 quark systemd-networkd[260]: enp0s20f7       : gained carrier
Apr 27 17:49:25 quark systemd-networkd[260]: enp0s20f6       : lost carrier
Apr 27 17:49:26 quark systemd-networkd[260]: enp0s20f7       : lost carrier

sytemd-network.service 的配置文件可以位于 /usr/lib/systemd/network/ 或者 /etc/systemd/network/ 目录下,后者具有最高优先级。配置文件有三种类型:

  • .network 文件,设置网卡的 IP 等各项属性
  • .netdev 文件,新建一个虚拟网卡
  • .link 文件,每当一个网卡出现时,udev 都会查找与它同名的 .link 文件

这几类文件都遵循下面的规则:

  • 各选项的值都支持星号 * 通配符
  • 当 [Match] 段内的条件都匹配时,后面的配置项才会被激活
  • 如果 [Match] 段为空,表示后面的配置项在任何情况下都可用
  • 无论配置文件在哪个目录,都会统一安装字典顺序进行加载
  • 同名文件可以相互替换

如果要给 enp0s20f6 配置一个静态 IP ,可以在 /etc/systemd/network/ 目录下新建一个 eth0.network 文件,内容如下:

[Match]
Name=enp0s20f6  # 匹配名为 enp0s20f6 的网卡
[Network]
DHCP=none    # 关闭 DHCP 客户端,
Address=192.168.5.242/24  # 设置 IP 和子网掩码
Gateway=192.168.5.50   # 设置网关,这项设置会将该网卡添加到缺省路由
DNS=8.8.8.8  # 设置 DNS 

如果要使用 DHCP 自动获取 IP ,也将 DHCP 设为如下值:

  • v4 ,只接受 ipv4 的 IP
  • v6 ,只接受 ipv6 的 IP
  • both ,同时接受 ipv4 和 ipv6 格式的 IP

启动 DHCP 客户端后,Gateway 和 DNS 也会自动获取,有时我们不希望这样,可以在配置文件中添加一个 [DHCP] 段,做如下设置:

[DHCP]
UseDNS=false # 不使用 DHCP 分配的 DNS ,默认值是 true
UseRoutes=false # 不会将本网卡设为缺省路由,默认值是 true 

在这里会出现一个 Bug ,就是 UseRoutes 设置无效,高版本中已经解决,解决方案在 https://github.com/systemd/systemd/pull/3075 。

2. Wi-Fi 配置

Wi-Fi 连接还是使用 wpa_supplicant 程序,systemd 提供了 [email protected] 管理整个流程,然后再用 systemd-networkd.service 配置 IP 等。
[email protected] 的内容:

[Unit]
Description=WPA supplicant daemon (interface-specific version)
Requires=sys-subsystem-net-devices-%i.device
After=sys-subsystem-net-devices-%i.device

# NetworkManager users will probably want the dbus version instead.

[Service]
Type=simple
ExecStart=/usr/sbin/wpa_supplicant -c/etc/wpa_supplicant/wpa_supplicant-%I.conf -i%I

[Install]
Alias=multi-user.target.wants/wpa_supplicant@%i.service

这是 service 模板,启动时在 @ 符号之后加入 Wi-Fi 网卡的名称使其实例实例化,这个名词还会关联到 wpa_supplicant 的配置文件,我们先在 /etc/ 下新建一个 wpa_supplicant 目录,然后新建一个 wpa_supplicant-wlp1s0.conf 文件,内容如下:

ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
update_config=1
eapol_version=1
ap_scan=1
fast_reauth=1

用 wpa_passphrase 添加无线路由器配置:

~# sudo wpa_passphrase [essid] [password] >> /etc/wpa_supplicant/wpa_supplicant-wlp1s0.conf
在 /etc/systemd/network/ 目录下添加配置文件 wireless.network ,内容如下:
[Match]
Name=wlp1s0
[Network]
DHCP=yes

最后重启各项服务:

~# systemctl restart systemd-networkd
~# systemctl restart wpa_supplicant@wlp1s0
~# systemctl restart systemd-resolved

3. 3G/4G 配置

依然使用 pppd 进行 3G/4G 拨号,systemd 提供了 [email protected] 服务管理 pppd 。首先在 /etc/ppp/peers/ 下建好 ppp 拨号文件 me909s ,然后启动服务:

~# systemctl start ppp@me909s 

4. 关闭 IPv6

向内核参数加入 ipv6.disable=1 可以完全关闭 IPv6 功能。此外,只加入 ipv6.disable_ipv6=1 内核参数可以保留 IPv6 功能,但不会向网卡分配 IPv6 地址,做法是:

~# echo 1 > /proc/sys/net/ipv6/conf/enp0s20f6/disable_ipv6

5. ssh server

目前流行的启动 ssh server 的方式是调用 sshd.socket :

~# systemctl start sshd.socket

旧有的 sshd.service 模式会在后台保持一个 sshd 的守护进程,每当有 ssh 连接要建立时,就创建一个新进程,比较适合 SSH 下有大量流量的系统;
新的 sshd.socket 方式也是在每次要建立新的ssh连接时生成一个守护进程的实例,不过监听端口则是交给了 systemd 来完成,意味着没有 ssh 连接的时候,也不会有 sshd 守护进程运行,大部分情况下,使用 sshd.socket 服务更为合适。这也与 MacOS 下的行为相一致,默认只监听端口,有连接时才创建进程。
另外,通过使用 .socket 文件来管理需要监听端口的服务,可以直接通过 systemctl 来查看一些网络相关的信息,如监听的端口、目前已经接受的连接数、目前正连接的连接数等。

基于 Keepalived + HAproxy 的 RabbitMQ 高可用配置实践

本文使用的高可用架构是 Keepalived + HAproxy,用 HAproxy 来做 RabbitMQ 负载均衡和高可用,用 Keepalived 来保证 HAproxy 的高可用。

RabbitMQ 集群的安装过程这里不再赘述,可以参考 https://blog.csdn.net/WoogeYu/article/details/51119101。

这里使用的三节点集群的安装方式,规划如下:

组件 IP 端口

RabbitMQ 主 192.168.151.7 5672
RabbitMQ 从 192.168.151.18 5672
RabbitMQ 从 192.168.151.19 5672
HAproxy 主 192.168.151.18
HAproxy 从 192.168.151.19
Keepalived 主 192.168.151.18
Keepalived 从 192.168.151.19
VIP 192.168.151.108

RabbitMQ 集群安装

在 192.168.151.7、192.168.151.18、192.168.151.19 三个节点上分别安装配置。

安装

yum -y install rabbitmq-server
service rabbitmq-server start

配置

rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
set_permissions -p / admin ‘.*’ ‘.*’ ‘.*’
rabbitmqctl set_permissions -p / admin ‘.*’ ‘.*’ ‘.*’

rabbitmq-plugins enable rabbitmq_management

局域网配置
分别在三个节点的 /etc/hosts 下设置相同的配置信息

192.168.151.7 HRB-PCRP1-M-BCCLM-CTL7
192.168.151.18 HRB-PCRP1-M-BCCLM-CTL18
192.168.151.19 HRB-PCRP1-M-BCCLM-CTL19

设置不同节点间同一认证的 Erlang Cookie
采用从主节点 copy 的方式保持 Cookie 的一致性。

# scp /var/lib/rabbitmq/.erlang.cookie 192.168.151.18:/var/lib/rabbitmq
# scp /var/lib/rabbitmq/.erlang.cookie 192.168.151.19:/var/lib/rabbitmq12

使用 -detached 运行各节点

rabbitmqctl stop
rabbitmq-server -detached

查看各节点的状态

rabbitmqctl cluster_status

创建并部署集群,以 192.168.151.7 节点为例:

# rabbitmqctl stop_app
# rabbitmqctl reset
# rabbitmqctl join_cluster rabbit@HRB-PCRP1-M-BCCLM-CTL7
# rabbitmqctl start_app

查看集群状态

# rabbitmqctl cluster_status
Cluster status of node ‘rabbit@HRB-PCRP1-M-BCCLM-CTL7’ …
[{nodes,[{disc,[‘rabbit@HRB-PCRP1-M-BCCLM-CTL18’,
‘rabbit@HRB-PCRP1-M-BCCLM-CTL19’,
‘rabbit@HRB-PCRP1-M-BCCLM-CTL7’]}]},
{running_nodes,[‘rabbit@HRB-PCRP1-M-BCCLM-CTL18’,
‘rabbit@HRB-PCRP1-M-BCCLM-CTL19’,
‘rabbit@HRB-PCRP1-M-BCCLM-CTL7’]},
{cluster_name,<<“rabbit@HRB-PCRP1-M-BCCLM-CTL7”>>},
{partitions,[]},
{alarms,[{‘rabbit@HRB-PCRP1-M-BCCLM-CTL18’,[]},
{‘rabbit@HRB-PCRP1-M-BCCLM-CTL19’,[]},
{‘rabbit@HRB-PCRP1-M-BCCLM-CTL7’,[]}]}]

RabbitMQ 集群至此安装完成。可以通过访问各节点的 http://192.168.151.7:15672/ 管理页面查看 RabbitMQ 状态。用户名密码使用之前配置的 admin/admin。

Keepalived 监控 192.168.151.18、192.168.151.19 上的 HAproxy,利用 Keepalived 的 VIP 漂移技术,若两台服务器上的 HAprox 都工作正常,则 VIP 与优先级别高的服务器(主服务器)绑定,当主服务器当掉时,则与从服务器绑定,而 VIP 则是暴露给外部访问的 IP;HAproxy 利用 Keepalived 生产的 VIP 对多台 RabbitMQ 进行读负载均衡。

下面对上面的 RabbitMQ 集群进行高可用配置,HAproxy 和 Keepalived 的安装方法这里不再赘述。

高可用架构 Keepalived + HAproxy

未分类

其中 Keepalived 来控制 HAproxy 的高可用,HAproxy 的作用是控制下层应用的负载均衡,同时可以用来保证下层应用的高可用。

HAproxy

HAproxy 是一个七层的负载均衡高度器,和 nginx 是属于一个层次上的,而 lvs 是一个四层的负载均衡高度器,它最多只能工作在 TCP/IP 协议栈上,所以对于代理转发,HAproxy 做的可以比 lvs 更细腻。

HAProxy 提供高可用性、负载均衡以及基于 TCP 和 HTTP 应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大的 web 站点,这些站点通常又需要会话保持或七层处理。HAProxy 运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进您当前的架构中,同时可以保护你的 web 服务器不被暴露到网络上。

HAproxy 配置

这里仅列出了主要内容。

HAProxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择部分作为配置。

#global :参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改
#defaults:配置默认参数的,这些参数可以被利用配置到frontend,backend,listen组件
#frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的 backend(可动态选择)。
#backend :后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器。
#listen :Frontend和Backend的组合体。

listen rabbitmq
bind 192.168.151.108:5673
balance roundrobin
mode tcp
option tcplog
option tcpka
bind-process 7
timeout client 15s
timeout connect 3s
timeout server 15s
server HRB-PCRP1-M-BCCLM-CTL7 192.168.151.7:5672 check inter 5000 rise 2 fall 3
server HRB-PCRP1-M-BCCLM-CTL18 192.168.151.18:5672 check inter 5000 rise 2 fall 3
server HRB-PCRP1-M-BCCLM-CTL19 192.168.151.19:5672 check inter 5000 rise 2 fall 3
# weight – 调节服务器的负重
# check – 允许对该服务器进行健康检查
# inter – 设置连续的两次健康检查之间的时间,单位为毫秒(ms),默认值 2000(ms)
# rise – 指定多少次连续成功的健康检查后,可认定该服务器处于可操作状态,默认值 2
# fall – 指定多少次不成功的健康检查后,认为服务器为当掉状态,默认值 3
# maxconn – 指定可被发送到该服务器的最大并发连接数

# 配置haproxy web监控,查看统计信息
listen private_monitoring :8100
mode http
option httplog
stats enable
#设置haproxy监控地址为http://localhost:8100/stats
stats uri /stats
stats refresh 5s

这里使用了一个 listen 块来同时实现前端和后端,也可以由前端(frontend)和后端(backend)配置。

最后我们打开 http://192.168.151.18:8100/stats,看一下监控页面,如果显示出正常就表明已经将 HAProxy 负载均衡配置好了!

未分类

注意点

启动 HAproxy 时可能会出现 cannot bind socket 的异常,这是因为 HAproxy 配置中使用了 VIP,但此时还没有启动 Keepalived,那么就还没有 VIP 绑定。

这时需要在 /etc/sysctl.conf 文件中配置如下内容:

net.ipv4.ip_nonlocal_bind = 1 # 意思是启动haproxy的时候,允许忽视VIP的存在
net.ipv4.ip_forward = 1 # 打开内核的转发功能

然后运行 sysctl –p 使其生效。

Keepalived

Keepalived 的作用是检测服务器的健康状态,在所有可能出现单点故障的地方为其提供高可用。如果有一台服务器死机,或工作出现故障,Keepalived 将检测到,并将有故障的服务器从系统中剔除,当服务器工作正常后 Keepalived 自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器。

这里使用的实现方式是单活方式,即主节点的 HAproxy 正常运行,备节点的会被停止。当主节点的出现故障时,备节点的 HAproxy 会自动启动。当主节点的恢复后,备节点的会自动停止。

当然 Keepalived 的高可用控制不止这一种,也可以有其他配置方式。

Keepalived 主节点配置

vrrp_script chk_haproxy {
script “service haproxy status” # 服务探测,返回0说明服务是正常的
interval 1 # 每隔1秒探测一次
weight -2 # 不正常时,权重-1,即haproxy上线,权重加2;下线,权重减2
}

vrrp_instance haproxy {
state MASTER # 主机为MASTER,备机为BACKUP
interface bond0 # 监测网络端口,用ipconfig查看
virtual_router_id 108 # 主备机必须相同
priority 100 # 主备机取不同的优先级,主机要大。
advert_int 1 # VRRP Multicast广播周期秒数
authentication {
auth_type PASS # VRRP认证方式
auth_pass 1234 # VRRP口令 主备机密码必须相同
}

track_script { # 调用haproxy进程检测脚本,备节点不配置
chk_haproxy
}
track_interface {
bond0
}
virtual_ipaddress { # VIP 漂移地址 即集群IP地址
192.168.151.108/25 dev bond0
}
}

Keepalived 备节点

vrrp_instance haproxy {
state BACKUP
interface bond0
virtual_router_id 108
priority 99
advert_int 1
authentication {
auth_type PASS
auth_pass 1234
}
track_interface {
bond0
}
virtual_ipaddress {
192.168.151.108
}
notify_master “/etc/keepalived/notify.sh master” # 当前节点成为master时,通知脚本执行任务,一般用于启动某服务
notify_backup “/etc/keepalived/notify.sh backup” # 当前节点成为backup时,通知脚本执行任务,一般用于关闭某服务

}

notify.sh 脚本
放在 /etc/keepalived/ 目录下,并赋予可执行权限。

#!/bin/bash

case “$1” in
master)
notify master
service haproxy start
exit 0
;;
backup)
notify backup
service haproxy stop
exit 0
;;
fault)
notify fault
service haproxy stop
exit 0
;;
*)
echo ‘Usage: `basename $0` {master|backup|fault}’
exit 1
;;
esac

Keepalived 执行过程
MASTER – 初始 priority 为 100,BACKUP – 初始 priority 为 99

模拟 MASTER 产生故障:

当检测到 chk_haproxy 执行结果为 down 时,priority 每次减少 2,变为 98;低于 BACKUP 的 priority;
此时 MASTER 变成 BACKUP;
同时 BACKUP 变成 MASTER,同时执行 notify_master 的脚本文件(启动haproxy);
模拟 MASTER 故障恢复:

当 MASTER 节点的 HAproxy 恢复后,原 MASTER 的优先级又变为 100,高于原 BACKUP 的 priority;
此时原 MASTER 由 BACKUP 又抢占成了 MASTER;
同时原 BACKUP 由 MASTER 又变了 BACKUP,同时执行 notify_backup 的脚本文件(关闭haproxy);

Ubuntu下RabbitMQ的安装与配置

最近在研究RabbitMQ,本文简单记录了如何搭建与配置一个RabbitMQ服务器。

安装RabbitMQ

rabbitmq-server是可以在Ubuntu系统与Debian系统中使用的RabbitMQ服务器。在Ubuntu标准的repositories中,其实包含了rabbitmq-server,但是标准仓库中的版本往往非常的老旧,直接安装的话会得到的可能不是你想要的版本,所以想安装新版本,我们需要一些额外的工作。这里主要介绍了Ubuntu下通过apt-get的方法安装最新版本,如果想了解更多的安装方法,可以看这里

安装前提

由于RabbitMQ需要基于Erlang/OTP,所以在安装RabbitMQ之前需要先安装Erlang/OTP。同样的,在Ubuntu标准的repositories中,Erlang/OTP的版本很老,推荐不要直接安装在Ubuntu标准的repositories中Erlang/OTP,而是安装新版本。

安装Erlang

添加地址

首先执行下面两个命令,添加Erlang自己的仓库地址到你本地。

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb
sudo dpkg -i erlang-solutions_1.0_all.deb

或者你可以手动添加仓库地址至本地。 添加下面代码至你本地/etc/apt/sources.list中,注意把下面的{distribution}(包括大括号)替换成你自己系统的distribution。

deb https://packages.erlang-solutions.com/ubuntu {distribution} contrib

如果不知道自己系统的distribution是什么,可以输入lsb_release -c查看,我自己的系统是Ubuntu16.04,对应的distribution是xenial,所以我添加进/etc/apt/sources.list的命令是

deb https://packages.erlang-solutions.com/ubuntu xenial contrib

下一步用下面的命令来添加Erlang公钥

wget https://packages.erlang-solutions.com/ubuntu/erlang_solutions.asc
sudo apt-key add erlang_solutions.asc

开始安装Erlang

用下面的命令刷新本地apt-get仓库的缓存,然后安装Erlang。

sudo apt-get update
sudo apt-get install erlang

至此,Erlang安装完毕,如果想了解更多Erlang/OTP的安装方法,可以看这里

安装rabbitmq-server

添加rabbitmq仓库地址

同样的下面的像上文所说的一样将下面的{distribution}(包括大括号)替换成你自己系统的distribution。

echo "deb https://dl.bintray.com/rabbitmq/debian {distribution} main" | sudo tee /etc/apt/sources.list.d/bintray.rabbitmq.list

添加rabbitmq仓库公钥

wget -O- https://dl.bintray.com/rabbitmq/Keys/rabbitmq-release-signing-key.asc | sudo apt-key add -

用下面的命令刷新本地apt-get仓库的缓存,然后安装rabbitmq-server。

sudo apt-get update
sudo apt-get install rabbitmq-server

至此rabbitmq-server安装完毕。

运行与配置RabbitMQ

运行RabbitMQ

在RabbitMQ安装包安装完后,服务器默认是会在后台通过一个没有特权的用户rabbitmq来运行的,想要手动启动或者停止重启服务器,只需要像系统中别的启动命令一样就可以了

service rabbitmq-server start

常用端口

以下是官网上常用端口的介绍:

  • 4369: epmd, a peer discovery service used by RabbitMQ nodes and CLI tools
    5672, 5671: used by AMQP 0-9-1 and 1.0 clients without and with TLS

  • 25672: used for inter-node and CLI tools communication (Erlang distribution server port) and is allocated from a dynamic range (limited to a single port by default, computed as AMQP port + 20000). See networking guide for details.

  • 35672-35682: used by CLI tools (Erlang distribution client ports) for communication with nodes and is allocated from a dynamic range (computed as Erlang dist port + 10000 through dist port + 10010). See networking guide for details.

  • 15672: HTTP API clients and rabbitmqadmin (only if the management plugin is enabled)

  • 61613, 61614: STOMP clients without and with TLS (only if the STOMP plugin is enabled)

  • 1883, 8883: (MQTT clients without and with TLS, if the MQTT plugin is enabled

  • 15674: STOMP-over-WebSockets clients (only if the Web STOMP plugin is enabled)

  • 15675: MQTT-over-WebSockets clients (only if the Web MQTT plugin is enabled)

其中5672, 5671为消息队列常用的端口,15672为网页可视化管理所用的端口。

开启网页可视化管理

开启网页可视化管理很简单,首先需要开启RabbitMQ可视化管理插件,通过如下命令开启

“`
rabbitmq-plugins enable rabbitmq_management
““

然后访问http://server-name:15672/可以进入管理页面,默认账号密码都为guest,里面可以管理像创建用户,维护队列之类的功能,非常好用。 详细信息可以看https://www.rabbitmq.com/management.html

CentOS 6.9/7通过yum安装指定版本的Nginx

说明:通过yum好处其实很多,环境变量不用配置,配置文件放在大家都熟悉的地方,通过rpm -ql nginx可以知道全部文件的地方等等。

Nginx(1.12.2)

一、安装和配置

1、安装

# rpm -ivh http://nginx.org/packages/centos/6/x86_64/RPMS/nginx-1.12.2-1.el6.ngx.x86_64.rpm

备注:其实根据上面这个网址(http://nginx.org/packages/)可以进去其nginx官方的的包管理列表,选择合适的系统和包

2、启动

# nginx
// 验证是否启动成功
# curl http://127.0.0.1:80
// 正常会返回html代码

3、设置开机启动服务

# chkconfig nginx on

4、服务常用操作

// 服务状态
# service nginx status
// 服务启动
# service nginx start
// 服务停止
# service nginx stop
// 服务重启
# service nginx restart

CentOS 7:

1、安装

# rpm -ivh http://nginx.org/packages/centos/7/x86_64/RPMS/nginx-1.12.2-1.el7_4.ngx.x86_64.rpm

2、启动

# systemctl start nginx
// 验证是否启动成功
# curl http://127.0.0.1:80
// 正常会返回html代码

3、设置开机启动服务

# systemctl enable nginx

4、服务常用操作

// 服务状态
# systemctl status nginx
// 服务启动
# systemctl start nginx
// 服务停止
# systemctl stop nginx
// 服务重启
# systemctl restart nginx

CentOS 7.x安装搭建Zabbix3.0环境

1、安装数据库mariadb

[root@node1 ~]# yum install -y mariadb mariadb-server
[root@node1 ~]# systemctl start mariadb
[root@node1 ~]# systemctl enable mariadb
[root@node1 ~]# vi /etc/my.cnf
[root@node1 ~]# cat /etc/my.cnf
[mysqld]
character-set-server=utf8
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[root@node1 ~]#

2、下载(Choose your platform for Zabbix server)

https://www.zabbix.com/

未分类

未分类

未分类

3、Install and configure Zabbix server

(1)Install Repository with MySQL database

[root@node1 ~]# rpm -i http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
warning: /var/tmp/rpm-tmp.IcrMTU: Header V4 DSA/SHA1 Signature, key ID 79ea5ed4: NOKEY

(2)Install Zabbix server, frontend, agent

[root@node1 ~]# yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent
...
Installed:
  zabbix-agent.x86_64 0:3.0.16-1.el7          zabbix-server-mysql.x86_64 0:3.0.16-1.el7          zabbix-web-mysql.noarch 0:3.0.16-1.el7         

Dependency Installed:
  OpenIPMI-libs.x86_64 0:2.0.19-15.el7         OpenIPMI-modalias.x86_64 0:2.0.19-15.el7        apr.x86_64 0:1.4.8-3.el7_4.1                     
  apr-util.x86_64 0:1.5.2-6.el7                dejavu-fonts-common.noarch 0:2.33-6.el7         dejavu-sans-fonts.noarch 0:2.33-6.el7            
  fping.x86_64 0:3.10-4.el7                    httpd.x86_64 0:2.4.6-67.el7.centos.6            httpd-tools.x86_64 0:2.4.6-67.el7.centos.6       
  iksemel.x86_64 0:1.4-6.el7                   libXpm.x86_64 0:3.5.12-1.el7                    libtool-ltdl.x86_64 0:2.4.2-22.el7_3             
  libxslt.x86_64 0:1.1.28-5.el7                libzip.x86_64 0:0.10.1-8.el7                    mailcap.noarch 0:2.1.41-2.el7                    
  mariadb-libs.x86_64 1:5.5.56-2.el7           net-snmp-libs.x86_64 1:5.7.2-28.el7_4.1         php.x86_64 0:5.4.16-43.el7_4.1                   
  php-bcmath.x86_64 0:5.4.16-43.el7_4.1        php-cli.x86_64 0:5.4.16-43.el7_4.1              php-common.x86_64 0:5.4.16-43.el7_4.1            
  php-gd.x86_64 0:5.4.16-43.el7_4.1            php-ldap.x86_64 0:5.4.16-43.el7_4.1             php-mbstring.x86_64 0:5.4.16-43.el7_4.1          
  php-mysql.x86_64 0:5.4.16-43.el7_4.1         php-pdo.x86_64 0:5.4.16-43.el7_4.1              php-xml.x86_64 0:5.4.16-43.el7_4.1               
  t1lib.x86_64 0:5.1.2-14.el7                  unixODBC.x86_64 0:2.3.1-11.el7                  zabbix-web.noarch 0:3.0.16-1.el7                 

Complete!
[root@node1 ~]#

(3)Create initial database

[root@node1 ~]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 2
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
Query OK, 1 row affected (0.00 sec)

MariaDB [(none)]> grant all privileges on zabbix.* to zabbix@localhost identified by 'zabbix';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> quit
Bye
[root@node1 ~]# 

Import initial schema and data. You will be prompted to enter your newly created password.

[root@node1 ~]# zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix
Enter password: 
[root@node1 ~]# mysql -uzabbix -pzabbix
Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 6
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| zabbix             |
+--------------------+
2 rows in set (0.01 sec)

MariaDB [(none)]> use zabbix;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [zabbix]> 

(4)Configure the database for Zabbix server

[root@node1 ~]# vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix

(5)Configure PHP for Zabbix frontend

[root@node1 ~]# vi /etc/php.ini
max_execution_time = 600
max_input_time = 600
memory_limit = 256M
post_max_size = 32M
upload_max_filesize = 16M
date.timezone = Asia/Shanghai

(6)Start Zabbix server and agent processes

[root@node1 ~]# systemctl restart zabbix-server zabbix-agent httpd
[root@node1 ~]# systemctl enable zabbix-server zabbix-agent httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-server.service to /usr/lib/systemd/system/zabbix-server.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/zabbix-agent.service to /usr/lib/systemd/system/zabbix-agent.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@node1 ~]# 

4、Configure Zabbix frontend

未分类

https://www.zabbix.com/documentation/3.0/manual/installation/install#installing_frontend

http://node1/zabbix/

未分类

未分类

未分类

未分类

未分类

未分类

未分类

未分类

临时解决 LDAP 导致 GitLab Members Blocked 问题

类似 GitLab 上 Members Blocked 状态如下图所示,(当然由于用户离职或者其他原因账户注销导致的 Blocked 不在本次谈论范围内)

未分类

这里要提一下背景,公司 GitLab 系统是统一使用 LDAP 邮箱认证,中间有一次邮箱的后缀归属更改,比如用户 zhangsan1 原账户邮箱为 [email protected],更改后账户邮箱为 [email protected],切换后,两个邮箱后缀的用户都可以正常使用 LDAP 认证,这就导致了上边问题的出现。zhangsan1 账户已经使用过 GitLab,其信息已经存储在 GitLab 数据库中,登录 Gitlab 时 LDAP 也是可以认证成功的,切换后,新的邮箱账户 [email protected] 登录以后, GitLab 又存储了一次该账户信息,但是不知道为什么新账户信息中用户名称变成了 zhangsan11 (莫非是 GitLab 查询数据库已存在 zhangsan1 账户,就会自动尾数追加 1 么?有待考证!),这就导致了与本地 git 账户不统一而 Clone 不了代码问题的出现。

好了,既然大概知道了原因,那么接下来就需要想办法解决掉这个问题。我们知道,GitLab 使用 PostgreSQL 数据库存储用户等相关数据,那么在不删除账户信息的原则上,尝试以下临时解决方案:

修改 PostgreSQL 数据库用户表 zhangsan1( [email protected]) 用户名为其他名称,然后登录 GitLab 在个人设置页更新 username,将 zhangsan11 修改为 zhangsan1,看是否可行。
修改 PostgreSQL 数据库用户表 zhangsan1( [email protected]) 用户名为其他名称,同时强制修改 zhangsan11( [email protected]) 用户名为 zhangsan1。
接下来,我们来验证一下方案一,是否可行。首先,登录 GitLab 所在服务器,查看 GitLab 服务(这里我是使用 Docker 启动的 GitLab 服务),并进入到容器内部。

# 查看 gitlab docker 容器服务
$ docker ps
CONTAINER ID        IMAGE                                                COMMAND             CREATED             STATUS                 PORTS                                                 NAMES
0a06dfd99823        <Domain_Name>/gitlab_ce/gitlab-ce:10.6.0-ce.0        "/assets/wrapper"   5 weeks ago         Up 5 weeks (healthy)   443/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8000->80/tcp   omnibus_gitlab

# 进入 gitlab 容器
$ docker exec -it 0a06dfd99823 /bin/bash
root@git:/#

接下来,查看一下 GitLab 数据库 PostgreSQL 的配置文件,看下相关的配置信息,一般来说,GitLab 服务会专门创建一个系统用户来管理该数据库服务。

# 查看 postgresql database 配置文件
root@git:/# cat /var/opt/gitlab/gitlab-rails/etc/database.yml
# This file is managed by gitlab-ctl. Manual changes will be
# erased! To change the contents below, edit /etc/gitlab/gitlab.rb
# and run `sudo gitlab-ctl reconfigure`.

production:
  adapter: postgresql
  encoding: unicode
  collation:
  database: gitlabhq_production        # 数据库名称
  pool: 10                             # 池子数
  username: "gitlab"                   # 用户名
  password:
  host: "/var/opt/gitlab/postgresql"   # 主机地址
  port: 5432                           # 端口号
  socket:
  sslmode:
  sslrootcert:
  sslca:
  load_balancing: {"hosts":[]}
  prepared_statements: false
  statements_limit: 1000
  fdw:

我们可以看到 username: “gitlab,那么查看下容器内当前系统有哪些跟 gitlab 相关的用户。

# 查看 /etc/passwd 文件里边 gitlab 对应的系统用户
root@git:/# cat /etc/passwd | grep 'gitlab-'
gitlab-www:x:999:999::/var/opt/gitlab/nginx:/bin/false
gitlab-redis:x:997:997::/var/opt/gitlab/redis:/bin/false
gitlab-psql:x:996:996::/var/opt/gitlab/postgresql:/bin/sh
gitlab-prometheus:x:992:992::/var/opt/gitlab/prometheus:/bin/sh
gitlab-consul:x:991:991::/var/opt/gitlab/consul:/bin/sh

可以看到 gitlab-psql 账户就是我们要使用的用户,接下来就切换到该用户,并连接到 gitlabhq_production 数据库。

# 切换到 gitlab-psql 用户登录
root@git:/# su - gitlab-psql

# 连接到 gitlabhq_production 库
$ psql -h /var/opt/gitlab/postgresql -d gitlabhq_production
psql (9.6.8)
Type "help" for help.

# 查看命令行帮助命令
gitlabhq_production=# h
Available help:
  ABORT                            COMMENT                          DECLARE                          EXECUTE
  ALTER AGGREGATE                  COMMIT                           DELETE                           EXPLAIN
  ALTER COLLATION                  COMMIT PREPARED                  DISCARD                          FETCH
  ALTER CONVERSION                 COPY                             DO                               GRANT
  ALTER DATABASE                   CREATE ACCESS METHOD             DROP ACCESS METHOD               IMPORT FOREIGN SCHEMA
  ALTER DEFAULT PRIVILEGES         CREATE AGGREGATE                 DROP AGGREGATE                   INSERT
  ......

# l 列举所有的数据库列表,相当于 mysql 的 show databases
# 因为连接时指定了 -d gitlabhq_production,默认进去的就是 gitlabhq_production 数据库,不需要切换。
gitlabhq_production=# l
                                         List of databases
        Name         |    Owner    | Encoding | Collate |  Ctype  |        Access privileges
---------------------+-------------+----------+---------+---------+---------------------------------
 gitlabhq_production | gitlab      | UTF8     | C.UTF-8 | C.UTF-8 |
 postgres            | gitlab-psql | UTF8     | C.UTF-8 | C.UTF-8 |
 template0           | gitlab-psql | UTF8     | C.UTF-8 | C.UTF-8 | =c/"gitlab-psql"               +
                     |             |          |         |         | "gitlab-psql"=CTc/"gitlab-psql"
 template1           | gitlab-psql | UTF8     | C.UTF-8 | C.UTF-8 | "gitlab-psql"=CTc/"gitlab-psql"+
                     |             |          |         |         | =c/"gitlab-psql"
(4 rows)

# 列举当前数据库所有表,相当于 mysql 的 show tables
gitlabhq_production=# dt
                         List of relations
 Schema |                   Name                   | Type  | Owner
--------+------------------------------------------+-------+--------
 public | abuse_reports                            | table | gitlab
 public | appearances                              | table | gitlab
 public | application_settings                     | table | gitlab
 public | audit_events                             | table | gitlab
 public | award_emoji                              | table | gitlab
 public | badges                                   | table | gitlab
 public | boards                                   | table | gitlab
 ......

# 查看单表结构,相当于 desc tblname, show columns from tbname
gitlabhq_production=# d users
                                                      Table "public.users"
                    Column                    |            Type             |                     Modifiers
----------------------------------------------+-----------------------------+----------------------------------------------------
 id                                           | integer                     | not null default nextval('users_id_seq'::regclass)
 email                                        | character varying(510)      | not null default ''::character varying
 encrypted_password                           | character varying(510)      | not null default ''::character varying
 reset_password_token                         | character varying(510)      | default NULL::character varying
 reset_password_sent_at                       | timestamp with time zone    |
 remember_created_at                          | timestamp with time zone    |
 sign_in_count                                | integer                     | default 0
 current_sign_in_at                           | timestamp with time zone    |
 last_sign_in_at                              | timestamp with time zone    |
 current_sign_in_ip                           | character varying(510)      | default NULL::character varying
 last_sign_in_ip                              | character varying(510)      | default NULL::character varying
 created_at                                   | timestamp with time zone    |
 updated_at                                   | timestamp with time zone    |
 name                                         | character varying(510)      | default NULL::character varying
 admin                                        | boolean                     | not null default false
 ......

# 退出 psql
gitlabhq_production-# q

这里详细的 PostgreSQL 操作命令就不在描述了,具体可以参考 PostgreSQL Docs 官网文档说明。这里着重看下 users 表,这里面存储的就是所有的用户信息,接下来,我们可以查看验证一下 zhangsan1 和 zhangsan11 用户信息。

# users 表查看用户信息
gitlabhq_production=# SELECT id,email,name,username FROM users WHERE username='zhangsan1';
 id |          email       |   name   | username
----+----------------------+----------+----------
 92 | [email protected] | 张三 | zhangsan1
(1 row)

gitlabhq_production=# SELECT id,email,name,username FROM users WHERE username='zhangsan11';
  id  |          email        |   name   | username
------+-----------------------+----------+----------
 2877 | [email protected] | 张三 | zhangsan11
(1 row)

果然如我们所料,存在两个账户,接下来修改 zhangsan1 用户名为 zhangsan1222。

gitlabhq_production=# UPDATE users SET username = 'zhangsan1222' WHERE id = 92;
(1 row)

修改完毕后,登录 GitLab 点击 “Setting” —> “User Settings” —> “Account” —> “Change username” —> Path 输入框修改用户名为 zhangsan1 —> 点击 “Update username” 执行更新操作。

未分类

不过很遗憾,修改失败,提示消息为 Username change failed – Username has already been taken,修改的用户名已存在。。。 上边我们不是已经在数据库将 zhangsan1 改成了 zhangsan1222 了吗?

未分类

初步怀疑可能是 GitLab 缓存时效性问题,不知重启是否可以解决 (有待考证)。不过线上 GitLab 正在运行,暂时还没法立刻重启,怕影响用户使用,那就只能尝试方案二啦,强制将 zhangsan11 用户名修改为 zhangsan1。

gitlabhq_production=# UPDATE users SET username = 'zhangsan1' WHERE id = 2877;
(1 row)

修改完毕,用户退出并重新登录 GitLab,就会发现账户名称已经修改过来啦,本地 Clone 也是没有问题的,当然以上只是简单的临时处理下,直接去线上服务器修改数据库数据,该方式比较暴力,不太友好,建议大家如果修改 GitLab 数据库,可以提前备份数据库,然后在 database 配置中开启客户端连接 IP,用本地客户端工具连接,那样比较直观方便。

手把手教你CentOS 7.x下安装网络流量实时监控工具iftop的两种方法

在类Unix系统中可以使用top查看系统资源,进程,内存占用等信息,查看网络状态可以使用netstat、nmap等工具,若要查看实时的网络流量,监控TCP/IP连接,反向解析IP,显示端口信息等,则可以使用iftop,关于centos上安装iftop有两种方法,一种是直接yum安装,一种是自己编译安装,下面我们一起来看下吧!

yum方式安装比较简单,直接以下命令即可:

yum -y install iftop

一般情况下这样就可以安装好了,但是有的小伙伴会遇到以下问题:

# yum install iftop //用命令直接安装

Loaded plugins: fastestmirror  

Loading mirror speeds from cached hostfile

 * base: mirrors.skyshe.cn  

 * extras: centos.ustc.edu.cn  

 * updates: mirrors.skyshe.cn  

Setting up Install Process  

No package iftop available. //没有可用的安装包  

Error: Nothing to do //什么都没干  

出现这种情况,我们就需要自己下载iftop,然后解压,配置,编译安装了,

我们先去iftop的官网上下载,官网链接:http://www.ex-parrot.com/pdw/iftop/download/,选择最新版本(当前最新版iftop-1.0pre4.tar.gz),

开始之前,我们先安装iftop所需的依赖软件,

# yum install -y flex byacc libpcap ncurses-devel libpcap-devel //先要安装必需的软件  

接下来就可以创建目录并下载、配置、编译安装了,

# mkdir iftop  

# cd iftop/ 

# wget http://www.ex-parrot.com/pdw/iftop/download/iftop-1.0pre4.tar.gz //下载

# tar zxvf iftop-1.0pre4.tar.gz //解压

# cd iftop-1.0pre4  

# ./configure //配置  

# make && make install //编译安装  

OK,安装完成,关于iftop的使用命令,大家自行百度、谷歌一下,一搜一大把,下面以一个示例来简单说明下:

iftop -i netcard -B -n

netcard是网卡名称,可以通过ifconfig命令查看得到,- i netcard是指定网卡,-B是以byte显示网速,默认是以bit显示的,-n是直接显示IP而不是显示主机名。