Packetbeat可以让您监视应用程序级协议(如HTTP和MySQL)以及DNS和其他服务的实时网络流量。
为此,您可以在客户端机器上配置称为shipper的代理,这些代理可以嗅探和解析网络通信,并将消息映射到事务。然后,这些shipper为每个操作生成记录,并将它们发送到Elasticearch或Logstash。一旦有了数据,就可以使用Kibana搜索、分析数据,以及将其可视化,以便对基础设施做出明智的决定或排除问题。
在本教程中,您将配置并使用Packetbeat和elk堆栈来收集基础设施指标并将其可视化。
因为我们计划使用Packetbeat将日志发送到ElasticSearch,所以我们首先加载Packetbeat索引模板,该模板将Elasticearch配置为以一种智能的方式分析传入的Packetbeat字段。
首先,登录到您的ELK服务器:
ssh sammy@your_elk_server_ip
登录后,将Packetbeat索引模板下载到您的主目录:
cd ~
curl -O https://raw.githubusercontent.com/elastic/beats/master/packetbeat/packetbeat.template-es2x.json
然后使用以下命令加载模板:
curl -XPUT 'http://localhost:9200/_template/packetbeat' -d@packetbeat.template-es2x.json
如果模板加载成功,您将看到输出。
Output
{"acknowledged":true}
现在您的elk服务器已经准备好接受Packetbeat中的数据了,让我们在客户端服务器上设置shipper。
要设置Packetbeatshipper,您需要将您在准备中创建的SSL证书转到客户端服务器。需要在客户端服务器和ELK服务器之间建立通信。
找到客户端服务器的IP地址。然后 在你的ELK服务器上 ,将ssl证书复制到客户端服务器。scp
指令:
scp /etc/pki/tls/certs/logstash-forwarder.crt sammy@your_client_server_private_ip_address:/tmp
提供密码后,确保证书副本成功。
现在,登录到您的 客户端服务器 :
ssh sammy@your_client_server_ip_address
登录后,将elk服务器的SSL证书复制到/etc/pki/tls/certs
目录:
sudo mkdir -p /etc/pki/tls/certs
sudo cp /tmp/logstash-forwarder.crt /etc/pki/tls/certs/
接下来,我们需要安装Packetbeat。在客户端服务器上,运行以下命令将Elasticearch公共GPG密钥导入rpm:
sudo rpm --import http://packages.elastic.co/GPG-KEY-elasticsearch
为Packetbeat创建和编辑一个新的存储库文件:
sudo vi /etc/yum.repos.d/elastic-beats.repo
将下列行添加到文件中:
/etc/yum.repos.d/elastic-beats.repo
[beats]
name=Elastic Beats Repository
baseurl=https://packages.elastic.co/beats/yum/el/$basearch
enabled=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
gpgcheck=1
然后保存文件并退出编辑器。
现在,安装Packetbeat包:
sudo yum update
sudo yum -y install packetbeat
Packetbeat现在已经安装好了,但需要在使用它之前进行配置。
Packetbeat需要知道记录的内容和发送数据的位置。让我们将其配置为连接到我们ELK服务器上的Logstash,并定义我们希望它监视的流量类型。我们将通过修改Packetbeat附带的默认配置文件来做到这一点。
在客户端服务器上,编辑Packetbeat配置文件:
sudo vi /etc/packetbeat/packetbeat.yml
注: Packetbeat的配置文件采用YAML格式,这意味着缩进是非常重要的!确保使用这些说明中指示的相同数量的空格。
在文件顶部附近,您将看到input
节,其中可以指定应该将哪些指标和统计信息发送到ELK服务器。我们将使用默认的输入设置,但可以随意更改它以满足您的需要。
选择要从其中捕获通信量的网络接口。在Linux上,Packetbeat支持捕获安装Packetbeat的服务器发送或接收的所有消息。为此,请使用any
作为装置:
packetbeat.yml
# Select the network interfaces to sniff the data. You can use the "any"
# keyword to sniff on all connected interfaces.
interfaces:
device: any
在protocols
部分中,配置Packetbeat可以找到每个协议的端口。 如果您使用任何非标准端口,请在此处添加。 否则,默认值应该没问题。
packetbeat.yml
protocols:
dns:
ports: [53]
include_authorities: true
include_additionals: true
http:
ports: [80, 8080, 8081, 5000, 8002]
memcache:
ports: [11211]
mysql:
ports: [3306]
pgsql:
ports: [5432]
redis:
ports: [6379]
thrift:
ports: [9090]
mongodb:
ports: [27017]
接下来,我们需要告诉Packetbeat将其数据发送到哪里。
在output
部分,找到以elasticsearch:
开头的行,它表示Elasticearch的输出部分。我们不打算使用这个部分,所以 删除或注释掉整个Elasticearch输出部分 ,直到这一行:#logstash:)
。
从这里开始删除:
packetbeat.yml
### Elasticsearch as output
elasticsearch:
# Array of hosts to connect to.
# Scheme and port can be left out and will be set to the default (http and 9200)
...
然后继续删除,直到您找到这一行:
packetbeat.yml
### Logstash as output
我们将不再将数据发送到ElasticSearch,而是将其发送到Logstash。因此,请查找注释的Logstash输出部分,它由以下行开始:#logstash:
。通过删除前面的#
,取消对该行的注释。然后取消评论hosts: ["localhost:5044"]
行并且将localhost
更改为ELK服务器的专用IP地址。配置文件的部分应该如下所示:
packetbeat.yml
### Logstash as output
logstash:
# The Logstash hosts
hosts: ["your_ELK_server_private_ip_address:5044"]
这会配置Packetbeat,使其连接到端口5044
上ELK服务器上的Logstash。该端口就是我们在准备中为Logstash输入指定的端口。
接下来,查找tls
节,并移除tls
前的注释。然后对certificate\_authorities
取消注释,并将其值更改为["/etc/pki/tls/certs/logstash-forwarder.crt"]
:
packetbeat.yml
tls:
# List of root certificates for HTTPS server verifications
certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
将Packetbeat配置成使用我们从ELK服务器复制的证书。否则,客户端将无法建立连接。
如果您想要再次检查您的配置文件,请将您的配置文件与本例进行比较,该示例忽略了大多数不必要的注释,以提高可读性:
packetbeat.yml
############################# Sniffer #########################################
interfaces:
device: any
############################# Protocols #######################################
protocols:
dns:
ports: [53]
include_authorities: true
include_additionals: true
http:
ports: [80, 8080, 8081, 5000, 8002]
memcache:
ports: [11211]
mysql:
ports: [3306]
pgsql:
ports: [5432]
redis:
ports: [6379]
thrift:
ports: [9090]
mongodb:
ports: [27017]
############################# Output ##########################################
output:
### Logstash as output
logstash:
hosts: ["your_ELK_server_private_ip_address:5044"]
tls:
certificate_authorities: ["/etc/pki/tls/certs/logstash-forwarder.crt"]
############################# Logging #########################################
logging:
files:
rotateeverybytes: 10485760 # = 10MB
查看配置后,保存文件并退出文本编辑器。
现在启动Packetbeat,将您的更改放在适当的位置:
sudo systemctl start packetbeat
并在服务器重新启动时配置Packetbeat:
sudo systemctl enable packetbeat
对要监视的任何其他服务器重复此部分。
Packetbeat现在应该可以监听网络流量并将其发送给Logstash。让我们看看它是否有效。
此时,客户端服务器上的Packetbeat应该将网络流量的日志发送到ELK服务器上的Logstash。Logstash应该在一个名为packetbeat-YYYY.MM.DD
的带日期戳的索引中将Packetbeat数据加载到Elasticsearch中。让我们在客户端机器上创建一个简单的HTTP请求,并在ELK服务器上的Elasticsearch中查找该请求,从而测试它是否有效。
在客户端服务器上,使用curl
向http://www.elastic.co
提出请求。
curl http://www.elastic.co/ > /dev/null
然后,在您的ELK服务器上,通过使用以下命令查询Packetbeat索引来验证Elasticsearch确实正在接收数据:
curl -XGET 'http://localhost:9200/packetbeat-*/_search?pretty'
您应该看到一堆如下所示的输出:
{
"hits" : {
"total" : 3,
"max_score" : 1.0,
"hits" : [ {
"_index" : "packetbeat-2016.11.13",
"_type" : "dns",
"_id" : "AVheUqX0CSBq6gd6x-Oj",
"_score" : 1.0,
"_source" : {
"direction" : "out",
"server" : "",
"responsetime" : 49,
"resource" : "www.elastic.co",
"dns" : {
"additionals_count" : 0,
"answers" : [ {
"class" : "IN",
"data" : "2406:da00:ff00::6b16:f086",
"name" : "www.elastic.co",
"ttl" : 59,
"type" : "AAAA"
}, {
"class" : "IN",
"data" : "2406:da00:ff00::b849:ab0e",
"name" : "www.elastic.co",
"ttl" : 59,
"type" : "AAAA"
}, {
"class" : "IN",
"data" : "2406:da00:ff00::ccec:d96c",
"name" : "www.elastic.co",
"ttl" : 59,
"type" : "AAAA"
} ],
"answers_count" : 3,
"authorities_count" : 0,
"flags" : {
"authoritative" : false,
"recursion_allowed" : true,
"recursion_desired" : true,
"truncated_response" : false
},
"id" : 26078,
"op_code" : "QUERY",
"question" : {
"class" : "IN",
"name" : "www.elastic.co",
"type" : "AAAA"
},
"response_code" : "NOERROR"
},
"method" : "QUERY",
"count" : 1,
"client_ip" : "your_client_server_ip",
"proc" : "",
"transport" : "udp",
"status" : "OK",
"ip" : "8.8.8.8",
"client_port" : 52505,
"client_server" : "",
"port" : 53,
"@timestamp" : "2016-11-13T15:33:43.500Z",
"type" : "dns",
"query" : "class IN, type AAAA, www.elastic.co",
"client_proc" : "",
"beat" : {
"hostname" : "your_client_server_hostname",
"name" : "your_client_server_hostname"
},
"bytes_in" : 32,
"bytes_out" : 116,
"@version" : "1",
"host" : "your_client_server_hostname",
"tags" : [ "beats_input_raw_event" ]
}
...
...
} ]
}
}
如果输出显示0次总点击量,ElasticSearch将不会在搜索的索引下加载任何Packetbeat数据,您应该在几秒钟后再试一次,因为获取数据可能需要很短的时间。如果等待后仍未看到任何结果,请检查设置中是否存在错误。确保您已将Packetbeat的配置文件指向您所传输的证书,因为如果路径不正确,这将失败。
一旦收到预期的输出,就可以继续下一步,学习如何使用Kibana查看网络流量的一些图表。
当您在要收集系统统计信息的所有服务器上完成Packetbeat的设置后,让我们看看Kibana。
在Web浏览器中,转到您的ELK服务器的域名或公共IP地址。输入您的ELK服务器的凭据后,您应该看到您的Kibana发现页。
注 :当您为Kibana配置用户时,您已经在准备中配置了这些凭据。
单击 Settings 页顶部的选项卡。现在,从位于接口左侧的 Index Patterns菜单选择Packetbeat -* ,并将其设置为默认索引:
然后在屏幕顶部选择Discover查看此数据。您将在屏幕上看到以下内容:
在这里,您可以通过对可用字段进行筛选来查看您的各个Packetbeat项。您可以单击这些字段来添加它们,或者使用聚合(计数、和、最小、最大值、中值等)将它们可视化。
Kibana还提供了广泛的可视化,您可以使用这些可视化来分析数据。单击在屏幕顶部的 Visualize 选项卡列出可视化或打开保存的可视化。
接下来,让我们看看我们在本教程开始时加载的示例Packetbeat仪表板。单击位于屏幕顶部的 Dashboard 选项卡,然后在屏幕的右侧单击 Load Saved Dashboard 图标。您将看到作为分页建议的仪表板过滤器列表:
从建议清单上选择 Packetbeat-Dashboard 。由于索引中只有少数几个web请求作为文档,所以 对于DB、Cache、RPC事务或其他结果仪表板将显示 No results found。
但是,如果向下滚动,您将看到从您安装的Packetbeat客户端服务器中收集到的各种指标。
在这里,您可以根据索引数据创建图表。例如,您可以创建一个图表,显示基于响应时间的HTTP查询分解,这有助于跟踪来自Web应用程序的缓慢响应。您可以通过使用子聚合来查找每个代码的响应时间、访问的域以及更多的内容,从而进一步深入下去。
现在您的系统指标已经通过ElasticSearch和Logstash进行了集中,并且您使用Kibana可视化它们,您应该能够一目了然地看到您的服务器。从这里开始,您可能需要调查其他托运人,包括Filebeat,Topbeat等。
更多Linux教程请前往腾讯云+社区学习更多知识。 参考文献:《How To Gather Infrastructure Metrics with Packetbeat and ELK on CentOS 7》
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。