每周一坑-公司网络访问不了个别网站及elk写不进数据

每周一坑-公司网络访问不了个别网站及elk写不进数据
  今天这两个玩意搞了我一天。。。各占用我半天时间 = =
 
一、公司网络访问不了个别网站
  早上9点上完个洗手间,前台妹子急着说找我好久,说三个业主方的网站都打不开,要知道打不开被发现,轻则写报告,重则扣绩效。其实听她这样说,我非常淡定,如果只是一个打不开,我反而担心~~十有八九是公司网络问题,果然,用手机移动数据,三个网站如常打开。再用公司虚拟机(我们有台windows终端机在上面)打开,也正常打开。唯一不能打开的是,我们所有人的办公电脑,现象是白屏,不断加载直到打不开。倒是有这三个网站中的其中一个,等一段时间能打开,但是有些菜单页点不进去。当时有点怀疑是网站返回时间太长导致,后面确实验证我的猜测是对的。
  我首先ping网站,telnet网站80端口,没问题。然后找到TP-LINK客服,他叫我用笔记本,直连光猫看看能否打开网站,测试下来没问题,而且直连两个交换机也能打开。接着我怀疑是不是某个交换机,或者网线导致的,问了下公司硬件维修人员,叫清一下浏览器缓存,为了撇清他的问题,他叫我用那台测试笔记本,连上我办公电脑的网线,这时候三个网站竟然都能打开!!!(老实说,这个后面我都不知道原因。。)
  尝试改掉主路由器的两个wan口的DNS地址,无果。这时一个测试小伙给我说,周日早上的时候,想通过vpn连回公司网络,发现连不上,问我咋办。于是我强烈开始怀疑是不是周日凌晨的路由器自动清理功能导致的(设置这个是为了保持公司带宽下行速度快捷稳定,不然买的千兆带宽,用久了经常跌到200~300M,然后老板就会找我),因为上周没有听说这种情况。

   我当时挺绝望的,前台妹子说要发新闻,我说如果急着用而我又没找到问题原因的时候,可以用远程桌面连过去用着先。中午尝试终极大法:主路由器重启。好不容易熬到中午大家都去吃饭,我留了一会,先尝试主路由器的软重启(页面点击重启),再尝试主路由器的硬重启(拔电源),不行!!!想着吃完饭再回来搞,时间充足点,头脑也清醒点。回来再尝试重启电源,光猫也重启,不行。

  直到我去主路由器发现一个非常重要的线索:流量统计页面里,两个wan口的流量接收差别巨大:当时WAN2的接收总字节,只有30M左右,而WAN1,差不多有2G。

   再回想下为什么虚拟机的windows能打开网站,而办公电脑不行,是恰好虚拟机从WAN2出去的,办公电脑从WAN1出去,这就解释了为什么两个网站打不开(加载的文件图片奇多),而一个网站虽然能打开,但清单内容不能完全加载出来(比另外两个网站文件少点)。

  最后的解决方法:把WAN2的IP强制断开,重连,直到更新得到一个新的IP,问题即解决(不更新ip是无法解决的!

 

二、公司内网虚拟机写不进elk
  下午搞这个问题也搞很久~~~
  话说只有生产环境上有ELK环境,领导说最近要做埋点监控,想我部署个测试环境的ELK,然开发测试。我当时说线上没服务器可用了(其实挤挤还是有的),领导就叫我在内网搭一个。当时以为很顺利,无非在nginx日志所在的服务器上跑个filebeat,beat读取方式给到es上,最后kibana展示。
  然而被一个IP地址库的问题搞了一下午。
  首先设置nginx的日志格式是这样的:
map $http_x_forwarded_for  $real_remote_addr {
    ""    $remote_addr;
          ~^(?P<firstAddr>[0-9\.]+),?.*$ $firstAddr;
    }

        log_format test
       '{"@timestamp":"$time_iso8601",'
    '"host":"$hostname",'
    '"server_ip":"$server_addr",'
    '"client_ip":"$remote_addr",'
    '"xff":"$http_x_forwarded_for",'
    '"real_remote_addr":"$real_remote_addr",'
    '"domain":"$host",'
    '"url":"$uri",'
    '"referer":"$http_referer",'
    '"upstreamtime":"$upstream_response_time",'
    '"responsetime":"$request_time",'
    '"status":"$status",'
    '"size":"$body_bytes_sent",'
    '"protocol":"$server_protocol",'
    '"upstreamhost":"$upstream_addr",'
    '"file_dir":"$request_filename",'
    '"http_user_agent":"$http_user_agent"'
    '}';

   logstash配置文件如下(直接抄线上的,改了es地址而已):

 1 input {
 2       beats {
 3           port => 4555
 4           client_inactivity_timeout => 600
 5       }
 6 }
 7 
 8 filter {
 9       # 为了兼容中文路径,这里做了下数据替换
10      mutate {  
11           gsub => ["message", "\\x", "\\\x"]
12           gsub => ["message", ":-,", ":0,"]
13       }
14        json {
15             # 从数据中取出message
16             source => "message"
17             # 删除多余字段
18             remove_field => "message"
19             remove_field => "[beat][hostname]"
20             remove_field => "[beat][name]"
21             remove_field => "[beat][version]"
22             remove_field => "@version"
23             remove_field => "offset"
24             remove_field => "input_type"
25             remove_field => "tags"
26             remove_field => "type"
27             remove_field => "host"
28       }
29 
30         mutate {
31           convert => ["status", "integer"]
32           convert => ["size","integer"]
33           convert => ["upstreamtime", "float"]
34           convert => ["responsetime", "float"]
35       }
36 
37       geoip {
38             target => "geoip"
39             source => "real_remote_addr"
40             database => "/home/elk/elk5.2/logstash-5.2.1/config/GeoLite2-City.mmdb"
41 
42             add_field => [ "[geoip][location]", "%{[geoip][longitude]}" ]
43             add_field => [ "[geoip][location]", "%{[geoip][latitude]}" ]
44             
45             # 去掉显示 geoip 显示的多余信息
46             remove_field => ["[geoip][latitude]", "[geoip][longitude]", "[geoip][country_code]", "[geoip][country_code2]", "[geoip][c
47 ountry_code3]", "[geoip][timezone]", "[geoip][continent_code]", "[geoip][region_code]"]
48         }
49 
50         mutate {
51             convert => [ "size", "integer" ]
52             convert => [ "status", "integer" ]
53             convert => [ "responsetime", "float" ]
54             convert => [ "upstreamtime", "float" ]
55             convert => [ "[geoip][location]", "float" ]
56 
57             # 过滤 filebeat 没用的字段,这里过滤的字段要考虑好输出到es的,否则过滤了就没法做判断
58             remove_field => [ "ecs","agent","host","cloud","@version","input","logs_type" ]
59           }
60 
61          if "_geoip_lookup_failure" in [tags] { drop { } } 
62          useragent {
63            source => "http_user_agent"
64            target => "ua"
65            remove_field => [ "[ua][minor]","[ua][major]","[ua][build]","[ua][patch]","[ua][os_minor]","[ua][os_major]" ]
66         }
67      }
68 output {
69    #stdout { codec=> rubydebug }
70    elasticsearch {
71         hosts => ["es的ip:es的端口"]
72         index => "logstash-test"
73     }
74  }
View Code

 

  启动filebeat,启动logstash,没报错,但没成功写入es。。。开始问我的小可爱,它叫我检查防火墙或网络问题,查es集群配置、filebeat配置、es集群负载和filebeat日志。我给它纠正只是一个单机。filebeat日志倒是看到报错:ERR Failed to publish events caused by: write tcp  xxxx write: connection reset by peer
  说我这个错误通常是因为 Filebeat 无法将事件发送到远程的 Elasticsearch 或 Logstash 引起的,原因可能是网络问题、资源问题或配置问题等。我又调大虚拟机硬件配置,从2核6G,调成4核10G,排除资源配置不足问题。再一行行对照从线上抄过来的配置文件,确实有新发现,有一句配置被拆成两行了(嗯~~~vim这货,明明运行了:set paste再黏贴的)。心想原因应该就是这样,还是不行。logstash跑起来没有报错,filebeat也是。
  我开始做一些小实验。会不会是logstash读取插件没有成功安装导致的,尝试将beat读入改成纯文件方式(用的是上面格式的nginx日志),还是老样子   
  又开始问它,叫我检查logstash配置,网络问题、权限问题、还有文件过大也会这样。这里开始我决定不再依赖它,尝试动用我的侦查能力:

  记得以前直接读系统的/var/log/secure是行的,于是我改成文本方式读本机secure文件,刷刷刷的日志在屏幕打印出来了。

   会不会是本地这个ELK有问题,于是在线上用别人的elk测了,非常成功!!!!

  突然想到既然没有报错,那应该是写入的日志问题。再分析下线上和线下两个日志的不同点。real_remote_addr这个内置变量,借助logstash配置文件中的GeoLite2-City.mmdb库,用来分析访问来源地,而公司内网的ip,我模拟打开网站的时候,用的是公司局域网ip(192.168.0.x)这种,logstash配置文件中的GeoLite2-City.mmdb库压根不能辨别局域网ip的来源地,所以不能成功写入到es上,也确实就是这个原因!!!!

  我把公司局域网部署的应用从内网访问,借助反向代理映射到公网访问,这样nginx日志记录的真实客户端ip就是我公司路由器出口ip,而不再是192.168.0.x,这样这个ip地址库能分析来源地,能写入到es的索引里。

不能写入:  

能写入:

 

 
  
posted @ 2023-05-08 22:29  windysai  阅读(131)  评论(0编辑  收藏  举报