每天学习一个命令:perf 性能分析工具

Perf 全称Performance Event,是随着 Linux 2.6+ 一同发布的性能分析工具。通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。

安装

perf 工具在 linux-tools 下面,安装如下三个包即可

apt-get install linux-tools-common linux-tools-generic linux-tools-`uname -r`

Perf 能触发的事件分为三类:

  • hardware : 由 PMU 产生的事件,比如 cache-misses、cpu-cycles、instructions、branch-misses …等等,通常是当需要了解程序对硬件特性使用情况时使用
  • software : 是核心程序产生的事件,比如 context-switches、page-faults、cpu-clock、cpu-migrations …等等
  • tracepoint : 是核心中的静态 tracepoint 所触发的事件,这些 tracepoint 用來判断在程序执行时期核心的行为

使用

当通过非 root 用户执行 perf 时会遇到权限不足的错误,需要 sudo -i 切换到 root 用户来执行

打印出 perf 可触发的 event

perf list

实时显示当前系统的性能统计信息

perf top

通过概括精简的方式提供被调试程序运行的整体情况和汇总数据

perf stat ./test

perf 命令过于复杂,他有很多子命令集,更多的信息可以参考下面的链接。

reference


2017-02-02 linux , 监控 , 资源占用 , command , perf

Linux 下自动更新 Chrome

最近使用 Gmail 竟然告诉我“即将不支持此版本浏览器”,于是看了一样 Chrome 版本号 —- v52 , 感觉还很新啊,查了一下发现 Chrome 版本已经更新到了 v56。 但是 Linux 下 Chrome 不会自动更新, chrome://help/ 来查看也不会自动更新。所以搜索了一下,发现 Google 其实维护了自己的 Linux Repository

因为我是通过网站下载 GUI 安装的,所以没有自动更新的模块,添加 Chrome 的 source 即可。

添加 PPA 源

如果使用 PPA,则可以通过下面的命令,让 apt 每一次检查更新时将 Chrome 的更新带下来。

$ wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
$ sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
# 如果是 64 位系统,则使用如下命令
$ sudo sh -c 'echo "deb [amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'

如果已经安装过 Chrome,则使用如下命令更新:

$ sudo apt update
$ sudo apt install google-chrome-stable

2017-01-27 Linux , Chrome , Google , APT

每天学习一个命令: base64 编解码

Base64 是一种使用 64 个可打印的字符来表示二进制数据的方法,base64 中仅且包括字母 A-Za-z0-9+/ 共64个字符。Base64 通常处理文本数据,表示、传输、存储二进制数据。

Base64编码由来

有些网络传送渠道不支持所有字节,比如邮件发送,图像字节不可能全部都是可见字符,所以受到了很大限制。最好的解决办法就是在不改变传统协议的情况下,利用一种扩展方式来支持二进制文件的传送,把不可打印的字符用可打印字符来表示。 Base64 就是一种基于64个可打印字符来表示二进制数据的方法。

原理

Base64 索引中,64个字符使用 6 bit 位就可以全部表示,一个字节有 8 个bit位,所以在 Base64 编码中,使用3个传统字节(8bit位) 由4个 Base64 字符来表示,保证有效位数一致。

  • Base64 按照字符串长度,每3个 8 bit 组成一组,正对每组,获取每个字符的 ASCII 编码
  • 将 ASCII 码转成 8bit 的二进制,得到 3*8=24 bit 的字节
  • 将 24 bit 划分为 4 个 6bit 的字节,每个 6 bit 的字节前填两个高位0,得到4个 8bit 的字节
  • 将4个 8bit 字节转化成10进制,对照 Base64编码表,得到对应编码后的字符。

下面对 Tom 三个字符进行编码

            T           o           m
ASCII:      84          111         109
8bit字节:   01010100    01101111    01101101
6bit字节:   010101      000110      111101      101101
十进制:     21          6           61          45
对应编码:   V           G           9           t

因此 Tom 在 Base64 编码之后变成了 VG9t

要求:

  1. 要求被编码字符是8bit, 所以要在 ASCII 编码范围内, \u0000-\u00ff 中文就不行
  2. 编码字符长度不是3倍数事,用0代替,对应的输出字符为 =,所以实际 Base64 有65 中不同的字符。

因此 Base64 字符串只可能末尾出现一个或者两个 = ,中间是不可能出现 = 的。

使用

Base64编码主要用在传输、存储、表示二进制等领域,还可以用来加密,但是这种加密比较简单,只是一眼看上去不知道什么内容罢了,当然也可以对Base64的字符序列进行定制来进行加密。

简单字符串的加密,图片文件二进制的加密。

常用方式

格式:base64

从标准输入中读取数据,按Ctrl+D结束输入。将输入的内容编码为base64字符串输出。

示例一

[root@web ~]# base64 
hello 
Ctrl+D

aGVsbG8K
[root@web ~]#

[root@web ~]# 
[root@web ~]# base64 -d 
aGVsbG8K 
Ctrl+D hello
base64: invalid input 
[root@web ~]#

你会发现,base64命令会输出 base64: invalid input,似乎它把按Ctrl+D后的空行也作为输入来处理了。

格式:echo "str" | base64

将字符串str+换行 编码为base64字符串输出。

格式: base64 <<< "hello"

将字符串 hello 编码为 base64 , bash 中 <<< 三个小于号意味着将右边的字符转为左边命令的输入

格式:echo -n "str" | base64

将字符串 str 编码为 base64 字符串输出。无换行。

在 zsh 中,无换行会以 % 百分号结尾,在bash中,命令提示符会直接跟在输出结果的后面 []$,而 zsh 会强制转换。

格式:base64 file

从指定的文件file中读取数据,编码为base64字符串输出。

格式:base64 -d

从标准输入中读取已经进行base64编码的内容,解码输出。

示例二

[root@web ~]# cat >1.txt 
hello
world

Ctrl+D 
[root@web ~]# base64 1.txt 
aGVsbG8Kd29ybGQK
[root@web ~]# base64 1.txt >2.txt 
[root@web ~]# base64 -d 2.txt 
hello
world
base64: invalid input 
[root@web ~]#

格式:base64 -d -i

从标准输入中读取已经进行base64编码的内容,解码输出。加上-i参数,忽略非字母表字符,比如换行符。

man base64 中

-i, --ignore-garbage
When decoding, ignore non-alphabet characters.

use --ignore-garbage to attempt to recover from non-alphabet characters (such as newlines) in the encoded stream.

格式:echo "str" | base64 -d

将base64编码的字符串str+换行 解码输出。

格式:echo -n "str" | base64 -d

将base64编码的字符串str解码输出。

格式:base64 -d file

从指定的文件file中读取base64编码的内容,解码输出。

[root@web ~]# echo "hello" | base64 
aGVsbG8K
[root@web ~]# echo "aGVsbG8K" | base64 -d 
hello
base64: invalid input 
[root@web ~]# echo -n "aGVsbG8K" | base64 -d 
hello
[root@web ~]#

使用echo输出字符串时,如果没有-n参数会自动添加换行符,这会令base64命令发晕。

reference


2017-01-20 base64 , linux , encode , decode

RESTful 接口

RESTful 为 Representational State Transfer 的缩写,拆分开这三个单词来就是:

  • Representational - REST resources can be represented in virtually any form, include XML, JSON, or even HTML 表现层,资源的表现形式
  • State - concerned with the state of a resource 状态,指的是互联网上资源的状态
  • Transfer - transferring resource data 转换,服务端/客户端的转换

Put more succinctly, REST is about transferring the state of resources in a representational form that is most appropriate for the client or server from a server to a client (or vice versa).

These HTTP methods are often mapped to CRUD verbs as follows:

  • Create — POST 新建资源,也可用于更新资源
  • Read — GET 获取资源
  • Update — PUT or PATCH 更新资源,PUT时客户端提供修改的完整资源,PATCH 为客户端提供改变的属性
  • Delete — DELETE 删除资源

什么是RESTful架构:

  1. 每一个URI代表一种资源;
  2. 客户端和服务器之间,传递这种资源的某种表现层;
  3. 客户端通过四个HTTP动词,对服务器端资源进行操作,实现”表现层状态转化”。

看到这里便可以回答:”PUT 和 POST” 的区别了 —- POST 用来新建资源,而 PUT 和 POST 都可以用来更新资源提交更新。

对于一个 HTTP 请求可以分成一下部分:

VERB is one of the HTTP methods like GET, PUT, POST, DELETE, OPTIONS, etc

URI is the URI of the resource on which the operation is going to be performed

HTTP Version is the version of HTTP, generally “HTTP v1.1” .

Request Header contains the metadata as a collection of key-value pairs of headers and their values. These settings contain information about the message and its sender like client type, the formats client supports, format type of the message body, cache settings for the response, and a lot more information.

Request Body is the actual message content. In a RESTful service, that’s where the representations of resources sit in a message.

对于一个 Http Response 可以分成一下部分:

HTTP Version

Response Code

Response Header

Response Body contains the representation if the request was successful

一些常见问题

API版本控制

将API版本放入 URI

https://api.example.com/v1

或者将版本信息放入 HTTP 头信息中。

以下是读 《Oreilly REST API Design Rulebook》 的一些笔记。

A Web API conforming to the REST architectural style is a REST API.

URI

格式

RFC 3986 * defines the generic URI syntax as shown below:

URI = scheme "://" authority "/" path [ "?" query ] [ "#" fragment ]

建议:

  • 使用前置的 “/” (forward slash separator) 来表达资源层级,在 URI 结尾不添加 “/”
  • 使用 Hyphens “-” 来增加可读性,不使用 Underscores “_”
  • 使用小写
  • 不使用 File extensions

Resource Archetypes

A REST API 有 4 种不同的资源原型( Resource Archetypes ) : document, collection, store and controller. 下面四种资源类型翻译出来不伦不类,直接原文反而比较容易明白。

  • A document resource is a singular concept that is akin to an object instance or database record. A document’s state representation typically includes both fields with values and links to other related resources.

  • A collection resource is a server-managed directory of resources. 服务端托管资源的目录

  • A store is a client-managed resource repository. 客户端管理的资源

    The example interaction below shows a user (with ID 1234) of a client program using a fictional Soccer REST API to insert a document resource named alonso in his or her store of favorites:

    PUT /users/1234/favorites/alonso
  • A controller resource models a procedural concept. Controller resources are like executable functions, with parameters and return values; inputs and outputs.

URI Path Design 路径设计

  • 单数名词用于 document
  • 复数名词用于 collection
  • 复数名词用于 store
  • 动词或者动词短语用于 Controller 名字
  • Variable path segments may be substituted with identity-based values
  • CRUD 名字不应该在URI中使用,而应该使用 DELETE /users/1234

URI Query Design 参数设计

  • The query component of a URI may be used to filter collections or stores

    比如 GET /users?role=admin

  • 用来分页

    GET /users?pageSize=25&pageStartIndex=50

Interaction Design with HTTP

REST API 使用 HyperText Transfer Protocol , version 1.1 (HTTP/1.1) , 包括:

  • request methods
  • response codes
  • message headers

RFC 2616 defines the Status-Line syntax as shown below:

Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

Request Methods

请求的方法区别:

The purpose of GET is to retrieve a representation of a resource’s state. HEAD is used to retrieve the metadata associated with the resource’s state. PUT should be used to add a new resource to a store or update a resource. DELETE removes a resource from its parent. POST should be used to create a new resource within a collection and execute controllers.

需要注意:

  • GET and POST must not be used to tunnel other request methods
  • GET must be used to retrieve a representation of a resource
  • HEAD should be used to retrieve response headers
  • PUT must be used to both insert and update a stored resource
  • POST must be used to create a new resource in a collection
  • POST must be used to execute controllers
  • DELETE must be used to remove a resource from its parent
  • OPTIONS should be used to retrieve metadata that describes a resource’s available interactions

Response Status Codes 返回码

Category Description 分组描述

1xx: Informational Communicates transfer protocol-level information.

2xx: Success Indicates that the client’s request was accepted successfully.

3xx: Redirection Indicates that the client must take some additional action in order to complete their request.

4xx: Client Error This category of error status codes points the finger at clients. 客户端请求错误

5xx: Server Error The server takes responsibility for these error status codes. 服务器内部错误

具体的状态码:

  • 200 表明成功, response 需携带 response body
  • 201 Create 表示资源创建成功
  • 202 Accepted 用于表示成功开始了异步动作
  • 204 No Content,通常用于 PUT,POST,和 DELETE 请求的response,如果 GET 返回结果为空,通常也用204
  • 301 “Moved Permanently”,通常应该在返回结果 header 中包含 Location 重定向的请求地址
  • 302 (“Found”) should not be used
  • 303 “See Other” refer the client to a different URI
  • 304 Not Modified preserve bandwidth , client already has the most recent version of the representation
  • 307 Temporary Redirect tell clients to resubmit the request to another URI
  • 400 Bad Request may be used to indicate nonspecific failure,客户端请求错误
  • 401 Unauthorized,must be used 客户端无授权,令牌,密码等无验证
  • 403 Forbidden,should be used to forbid access regardless of authorization state
  • 404 Not found,must be used when a client’s URI cannot be mapped to a resource 不存在该记录
  • 405 (“Method Not Allowed”) must be used when the HTTP method is not supported
  • 406 Not Acceptable,must be used when the requested media type cannot be served
  • 409 Conflict should be used to indicate a vialation of resource state
  • 412 Precondition Failed should be used to support conditional operations
  • 415 Unsupported Media Type must be used when the media type of a request’s payload cannot be processed
  • 500 Internal Server Error should be used to indicate API malfunction

Metadata Design

HTTP Headers

  • Content-Type must be used

  • Content-Length should be used, Content-Length header 给出了整个 body bytes 大小,给出他的理由有两个:1. 客户端可以检查是否读取完整的大小 2. 客户端可以通过 HEAD 请求来得知整个body 的大小,而不同下载。

  • Last-Modified should be used in responses

  • ETag should be used in responses ETag是HTTP协议提供的若干机制中的一种Web缓存验证机制,并且允许客户端进行缓存协商。 这就使得缓存变得更加高效,而且节省带宽。 如果资源的内容没有发生改变,Web服务器就不需要发送一个完整的响应。 ETag也可用于乐观并发控制,作为一种防止资源同步更新而相互覆盖的方法。

  • Location must be used to specify the URI of a newly created resource

  • Cache-Control, Expires, and Date response headers should be used to encourage caching

Media Types

Media Type 有如下语法:

type "/" subtype *( ";" parameter )

type 的值可以有: application, audio, image, message, model, multipart, text 和 video.

A typical REST API will most often work with media types that fall under the application type.

text/plain

A plain text format with no specific content structure or markup. ‡

text/html

Content that is formatted using the HyperText Markup Language (HTML). §

image/jpeg

An image compression method that was standardized by the Joint Photographic

Experts Group (JPEG). ‖

application/xml

Content that is structured using the Extensible Markup Language (XML). #

application/atom+xml

Content that uses the Atom Syndication Format (Atom), which is an XML-based

format that structures data into lists known as feeds. *

application/javascript

Source code written in the JavaScript programming language. †

application/json

The JavaScript Object Notation (JSON) text-based format that is often used by

programs to exchange structured data. ‡

Media Type Design

Client developers are encouraged to rely on the self-descriptive features of a REST API.

Representation Design

REST API 通常使用 response message 的 body 来传递资源的状态。 REST APIs 通常使用文本格式来表示资源。

  • JSON should be supported for resource representation

Client Concerns

Versioning

  • 使用新的 URIs
  • Schemas
  • Entity tags

Security

  • OAuth

CORS(Cross-origin resource sharing 跨域资源共享) should be supported to provide multi-origin read/write access from JavaScript,克服了 AJAX 只能同源使用资源的限制。

Access-Control-Allow-Origin

该字段是必须的。它的值要么是请求时Origin字段的值,要么是一个*,表示接受任意域名的请求。

Access-Control-Allow-Credentials

该字段可选。它的值是一个布尔值,表示是否允许发送Cookie。默认情况下,Cookie不包括在CORS请求之中。设为true,即表示服务器明确许可,Cookie可以包含在请求中,一起发给服务器。这个值也只能设为true,如果服务器不要浏览器发送Cookie,删除该字段即可。

Access-Control-Expose-Headers

该字段可选。CORS请求时,XMLHttpRequest对象的getResponseHeader()方法只能拿到6个基本字段:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。如果想拿到其他字段,就必须在Access-Control-Expose-Headers里面指定。上面的例子指定,getResponseHeader(‘FooBar’)可以返回FooBar字段的值。

CORS 请求默认不发送 Cookie 和 HTTP 认证信息,如果想要把 Cookie 发送到服务器,一方面要服务器同意,指定 Access-Control-Allow-Credentials 为 true。

调试 RESTful 接口

接口调试工具 Postman https://www.getpostman.com/

其他工具


2017-01-10 Web , API , RESTful

每天学习一个命令:lscpu 查看 CPU 信息

lscpu 显示 CPU 的架构信息

lscpusysfsproc/cpuinfo 中收集信息。这个命令的输出是规范的可以用来解析,或者给人来阅读。该命令显示的信息包括,CPU 的数量,线程 (thread),核心 (core),Socket 还有 Non-Uniform Memory Access (NUMA) 节点数。

  • Socket 具体是指的主板上 CPU 的插槽数量,一般笔记本只有一个,而服务器可能会有多个。如果有两个插槽,通常称为两路
  • Core 具体是指 CPU 的核心,也就是平常说的几核,比如八核之类
  • thread 是指的每个 Core 的硬件线程数,超线程

举例来说,如果某个服务器”2 路 4 核超线程”,也就是 2 个插槽,4 核心,默认为 2 thread,也就是 242 是 16 逻辑 CPU。对操作系统来说,逻辑 CPU 的数量就是 Socket * Core * Thread

比如下面我的台式机,1 Sockets, 4 Cores,2 Threads,那么就是 4 核 8 线程。

如下示例:

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 94
Model name:            Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
Stepping:              3
CPU MHz:               1075.117
CPU max MHz:           4000.0000
CPU min MHz:           800.0000
BogoMIPS:              6816.61
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc art arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb invpcid_single intel_pt retpoline kaiser tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm mpx rdseed adx smap clflushopt xsaveopt xsavec xgetbv1 dtherm ida arat pln pts hwp hwp_notify hwp_act_window hwp_epp

Byte Order

Big endian vs Little endian 大端和小端,对于整型、长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而 Little endian 则相反,认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放据的低位字节到高位字节)。

一般来说,x86 系列 CPU 都是 little-endian 的字节序,PowerPC 通常是 big-endian,网络字节顺序也是 big-endian 还有的 CPU 能通过跳线来设置 CPU 工作于 Little endian 还是 Big endian 模式。


2017-01-09 linux , command

每天学习一个命令:nmap 扫描开放端口

nmap 是一个网络探测和安全审核工具,能够扫描主机开放端口。nmap 全称 network mapper 网络映射器,设计的目标是快速扫描大型网络。

nmap以原始IP报文来检测网络上有哪些主机,主机运行哪些操作系统(包括版本),主机提供哪些服务(应用程序名和版本),主机使用什么类型的报文过滤器/防火墙,以及一堆其它功能。虽然Nmap通常用于安全审核,许多系统管理员和网络管理员也用它来做一些日常的工作,比如查看整个网络的信息,管理服务升级计划,以及监视主机和服务的运行。

Nmap输出的是扫描目标的列表,以及每个目标的补充信息,至于是哪些信息则依赖于所使用的选项。 “所感兴趣的端口表格”是其中的关键。结果列出端口号,协议,服务名称和状态。状态可能是 open(开放的),filtered(被过滤的),closed(关闭的),或者unfiltered(未被过滤的)。

  • Open(开放的)意味着目标机器上的应用程序正在该端口监听连接/报文。
  • filtered(被过滤的) 意味着防火墙,过滤器或者其它网络障碍阻止了该端口被访问,Nmap无法得知 它是 open(开放的) 还是 closed(关闭的)。 
  • closed(关闭的) 端口没有应用程序在它上面监听,但是他们随时可能开放。
  • unfiltered(未被过滤的)当端口对Nmap的探测做出响应,但是Nmap无法确定它们是关闭还是开放时
如果Nmap报告状态组合 open filtered 和 closed filtered 时,那说明Nmap无法确定该端口处于两个状态中的哪一个状态。当要求进行版本探测时,端口表也可以包含软件的版本信息。当要求进行IP协议扫描时 (-sO),Nmap提供关于所支持的IP协议而不是正在监听的端口的信息。

除了所感兴趣的端口表,Nmap还能提供关于目标机的进一步信息,包括反向域名,操作系统猜测,设备类型,和MAC地址。

简单例子

    nmap -A -T4 scanme.nmap.org

端口状态

open 开放的

应用程序正在该端口接收TCP 连接或者UDP报文。发现这一点常常是端口扫描的主要目标,安全意识强的人们知道每个开放的端口都是攻击的入口。攻击者或者入侵测试者想要发现开放的端口。而管理员则试图关闭它们或者用防火墙保护它们以免妨碍了合法用户。非安全扫描可能对开放的端口也感兴趣,因为它们显示了网络上那些服务可供使用。

closed 关闭的

关闭的端口对于Nmap也是可访问的(它接受Nmap的探测报文并作出响应), 但没有应用程序在其上监听。 它们可以显示该IP地址上(主机发现,或者ping扫描)的主机正在运行up 也对部分操作系统探测有所帮助。 因为关闭的关口是可访问的,也许过会儿值得再扫描一下,可能一些又开放了。 系统管理员可能会考虑用防火墙封锁这样的端口。 那样他们就会被显示为被过滤的状态,下面讨论。

filtered 被过滤的

由于包过滤阻止探测报文到达端口,Nmap无法确定该端口是否开放。过滤可能来自专业的防火墙设备,路由器规则 或者主机上的软件防火墙。这样的端口让攻击者感觉很挫折,因为它们几乎不提供 任何信息。有时候它们响应ICMP错误消息如类型3代码13 (无法到达目标: 通信被管理员禁止),但更普遍的是过滤器只是丢弃探测帧, 不做任何响应。 这迫使Nmap重试若干次以访万一探测包是由于网络阻塞丢弃的。 这使得扫描速度明显变慢。

unfiltered 未被过滤的

未被过滤状态意味着端口可访问,但Nmap不能确定它是开放还是关闭。 只有用于映射防火墙规则集的ACK扫描才会把端口分类到这种状态。 用其它类型的扫描如窗口扫描,SYN扫描,或者FIN扫描来扫描未被过滤的端口可以帮助确定 端口是否开放。

open filtered 开放或者被过滤的

当无法确定端口是开放还是被过滤的状态。开放的端口不响应就是一个例子,没有响应也可能意味着报文过滤器丢弃了探测报文或者它引发的任何响应。因此Nmap无法确定该端口是开放的还是被过滤的。UDP,IP协议,FIN,Null,和Xmas扫描可能把端口归入此类。

closed filtered 关闭或者被过滤的

Nmap不能确定端口是关闭的还是被过滤的。它只可能出现在IPID Idle扫描中。

常用端口 Common Ports

端口号从 1 到 65535

  • 小于1024 的端口号通常和 Linux 和 Unix-Like 系统内置服务关联,通常不单独使用,一般需要root才能开启
  • 1024 到 49151 的端口,被认为是 registered.  通常特定的服务可以向 IANA (Internet Assigned Numbers Authority) 来申请使用。 - 在49152 到65535 之间的端口不能被注册使用,并且推荐作为私有用途

常见的端口

20: FTP data
21: FTP control port
22: SSH
23: Telnet <= Insecure, not recommended for most uses
25: SMTP
43: WHOIS protocol
53: DNS services
67: DHCP server port
68: DHCP client port
80: HTTP traffic <= Normal web traffic
110: POP3 mail port
113: Ident authentication services on IRC networks
143: IMAP mail port
161: SNMP
194: IRC389: LDAP port
443: HTTPS <= Secure web traffic
587: SMTP <= message submission port
631: CUPS printing daemon port
666: DOOM <= This legacy FPS game actually has its own special port

其他常见的端口可以通过

    less /etc/services 

来查看。

查看本地端口

    sudo netstat -plunt

netstat 命令用来查看本地端口和服务。

使用 Nmap

安装

    sudo apt-get update      sudo apt-get install nmap

nmap 的创建者提供了一个测试服务器

scanme.nmap.org

扫描类型

-sT    TCP connect()扫描,这是最基本的TCP扫描方式。这种扫描很容易被检测到,在目标主机的日志中会记录大批的连接请求以及错误信息。    
-sS    TCP同步扫描(TCP SYN),因为不必全部打开一个TCP连接,所以这项技术通常称为半开扫描(half-open)。这项技术最大的好处是,很少有系统能够把这记入系统日志。不过,你需要root权限来定制SYN数据包。    
-sF,-sX,-sN    秘密FIN数据包扫描、圣诞树(Xmas Tree)、空(Null)扫描模式。这些扫描方式的理论依据是:关闭的端口需要对你的探测包回应RST包,而打开的端口必需忽略有问题的包(参考RFC 793第64页)。    
-sP    ping扫描,用ping方式检查网络上哪些主机正在运行。当主机阻塞ICMP echo请求包是ping扫描是无效的。nmap在任何情况下都会进行ping扫描,只有目标主机处于运行状态,才会进行后续的扫描。    
-sU    UDP的数据包进行扫描,如果你想知道在某台主机上提供哪些UDP(用户数据报协议,RFC768)服务,可以使用此选项。    
-sA    ACK扫描,这项高级的扫描方法通常可以用来穿过防火墙。    
-sW    滑动窗口扫描,非常类似于ACK的扫描。    
-sR    RPC扫描,和其它不同的端口扫描方法结合使用。    
-b    FTP反弹攻击(bounce attack),连接到防火墙后面的一台FTP服务器做代理,接着进行端口扫描。    

通用选项

-P0    在扫描之前,不ping主机。    
-PT    扫描之前,使用TCP ping确定哪些主机正在运行。    
-PS    对于root用户,这个选项让nmap使用SYN包而不是ACK包来对目标主机进行扫描。    
-PI    设置这个选项,让nmap使用真正的ping(ICMP echo请求)来扫描目标主机是否正在运行。    
-PB    这是默认的ping扫描选项。它使用ACK(-PT)和ICMP(-PI)两种扫描类型并行扫描。如果防火墙能够过滤其中一种包,使用这种方法,你就能够穿过防火墙。    
-O    这个选项激活对TCP/IP指纹特征(fingerprinting)的扫描,获得远程主机的标志,也就是操作系统类型。    
-I    打开nmap的反向标志扫描功能。    
-f    使用碎片IP数据包发送SYN、FIN、XMAS、NULL。包增加包过滤、入侵检测系统的难度,使其无法知道你的企图。    
-v    冗余模式。强烈推荐使用这个选项,它会给出扫描过程中的详细信息。    
-S <IP>    在一些情况下,nmap可能无法确定你的源地址(nmap会告诉你)。在这种情况使用这个选项给出你的IP地址。    
-g port    设置扫描的源端口。一些天真的防火墙和包过滤器的规则集允许源端口为DNS(53)或者FTP-DATA(20)的包通过和实现连接。显然,如果攻击者把源端口修改为20或者53,就可以摧毁防火墙的防护。    
-oN    把扫描结果重定向到一个可读的文件logfilename中。    
-oS    扫描结果输出到标准输出。    
--host_timeout    设置扫描一台主机的时间,以毫秒为单位。默认的情况下,没有超时限制。    
--max_rtt_timeout    设置对每次探测的等待时间,以毫秒为单位。如果超过这个时间限制就重传或者超时。默认值是大约9000毫秒。    
--min_rtt_timeout    设置nmap对每次探测至少等待你指定的时间,以毫秒为单位。    
-M count    置进行TCP connect()扫描时,最多使用多少个套接字进行并行的扫描。 ```  

扫描目标

目标地址可以为IP地址,CIRD 地址等。如192.168.1.2,222.247.54.5/24    

-iL filename    从filename文件中读取扫描的目标。    
-iR    让nmap自己随机挑选主机进行扫描。    
-p    端口 这个选项让你选择要进行扫描的端口号的范围。如:-p 20-30,139,60000
-exclude    排除指定主机。    
-excludefile    排除指定文件中的主机。    

常用命令

获取远程主机系统类型和开放端口

nmap -sS -P0 -sV -O [target]

这里的 target 可以是单一 IP, 或主机名,或域名,或子网

-sS TCP SYN 扫描 (又称半开放,或隐身扫描)
-P0 允许你关闭 ICMP pings.
-sV 打开系统版本检测
-O 尝试识别远程操作系统

其它选项:

-A 同时打开操作系统指纹和版本检测
-v 详细输出扫描情况.

寻找网络中所有在线主机

sudo nmap -sP 192.168.0.0/24

参数

Usage: nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION:
  Can pass hostnames, IP addresses, networks, etc.
  Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0-255.0-255.1-254
  -iL <inputfilename>: Input from list of hosts/networks
  -iR <num hosts>: Choose random targets
  --exclude <host1[,host2][,host3],...>: Exclude hosts/networks
  --excludefile <exclude_file>: Exclude list from file
HOST DISCOVERY:
  -sL: List Scan - simply list targets to scan
  -sP: Ping Scan - go no further than determining if host is online
  -P0: Treat all hosts as online -- skip host discovery
  -PS/PA/PU [portlist]: TCP SYN/ACK or UDP discovery probes to given ports
  -PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
  -n/-R: Never do DNS resolution/Always resolve [default: sometimes resolve]
SCAN TECHNIQUES:
  -sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
  -sN/sF/sX: TCP Null, FIN, and Xmas scans
  --scanflags <flags>: Customize TCP scan flags
  -sI <zombie host[:probeport]>: Idlescan
  -sO: IP protocol scan
  -b <ftp relay host>: FTP bounce scan
PORT SPECIFICATION AND SCAN ORDER:
  -p <port ranges>: Only scan specified ports
    Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080
  -F: Fast - Scan only the ports listed in the nmap-services file)
  -r: Scan ports consecutively - don't randomize
SERVICE/VERSION DETECTION:
  -sV: Probe open ports to determine service/version info
  --version-light: Limit to most likely probes for faster identification
  --version-all: Try every single probe for version detection
  --version-trace: Show detailed version scan activity (for debugging)
OS DETECTION:
  -O: Enable OS detection
  --osscan-limit: Limit OS detection to promising targets
  --osscan-guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
  -T[0-6]: Set timing template (higher is faster)
  --min-hostgroup/max-hostgroup <msec>: Parallel host scan group sizes
  --min-parallelism/max-parallelism <msec>: Probe parallelization
  --min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <msec>: Specifies
      probe round trip time.
  --host-timeout <msec>: Give up on target after this long
  --scan-delay/--max-scan-delay <msec>: Adjust delay between probes
FIREWALL/IDS EVASION AND SPOOFING:
  -f; --mtu <val>: fragment packets (optionally w/given MTU)
  -D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
  -S <IP_Address>: Spoof source address
  -e <iface>: Use specified interface
  -g/--source-port <portnum>: Use given port number
  --data-length <num>: Append random data to sent packets
  --ttl <val>: Set IP time-to-live field
  --spoof-mac <mac address, prefix, or vendor name>: Spoof your MAC address
OUTPUT:
  -oN/-oX/-oS/-oG <file>: Output scan results in normal, XML, s|<rIpt kIddi3,
     and Grepable format, respectively, to the given filename.
  -oA <basename>: Output in the three major formats at once
  -v: Increase verbosity level (use twice for more effect)
  -d[level]: Set or increase debugging level (Up to 9 is meaningful)
  --packet-trace: Show all packets sent and received
  --iflist: Print host interfaces and routes (for debugging)
  --append-output: Append to rather than clobber specified output files
  --resume <filename>: Resume an aborted scan
  --stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
  --no-stylesheet: Prevent Nmap from associating XSL stylesheet w/XML output
MISC:
  -6: Enable IPv6 scanning
  -A: Enables OS detection and Version detection
  --datadir <dirname>: Specify custom Nmap data file location
  --send-eth/--send-ip: Send packets using raw ethernet frames or IP packets
  --privileged: Assume that the user is fully privileged
  -V: Print version number
  -h: Print this help summary page.
EXAMPLES:
  nmap -v -A scanme.nmap.org
  nmap -v -sP 192.168.0.0/16 10.0.0.0/8
  nmap -v -iR 10000 -P0 -p 80

reference


2017-01-05 linux , nmap , 学习笔记 , port , network

每天学习一个命令:netstat 查看本地监听端口

以”查看本地端口占用情况”为契机学习一下 netstat 命令。在 man netstat 中的介绍,netstat 可以打印网络连接,路由表,接口信息,masquerade 连接,多播信息的工具。

netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships

简单使用

直接运行以下命令可以打印出当前系统上所有开放的端口(包括TCP,UDP端口),进程等等信息

sudo netstat -tupln
  • -l will list listening ports 列出所有在监听的服务端口
  • -p will display the process
  • -n will show port numbers instead of names 尽量显示数字
  • -t to show TCP ports
  • -u will show UDP ports

其他常用参数

  • -a 显示当前所有连接
  • -r 显示路由信息
  • -e 显示扩展信息
  • -s 按照各个协议进行统计

输出结果中,各个字段的含义

字段 含义
Proto 连接使用协议
Recv-Q 接受队列
Send-Q 发送队列,此队列和上面接受队列一般都为0,如果不是则表示队列中有正在处理
Local Address 本地地址和端口
Foreign Address 网络地址
State 显示套接口当前状态
PID/Program PID 和进程名字

返回中的状态说明:

  • LISTEN:侦听来自远方的TCP端口的连接请求
  • SYN-SENT:再发送连接请求后等待匹配的连接请求(如果有大量这样的状态包,检查是否中招了)
  • SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(如有大量此状态,估计被flood攻击了)
  • ESTABLISHED:代表一个打开的连接
  • FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
  • FIN-WAIT-2:从远程TCP等待连接中断请求
  • CLOSE-WAIT:等待从本地用户发来的连接中断请求
  • CLOSING:等待远程TCP对连接中断的确认
  • LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认(不是什么好东西,此项出现,检查是否被攻击)
  • TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
  • CLOSED:没有任何连接状态

常用组合

列出所有端口,包括监听的和未监听

-a 选项会列出所有连接

netstat -a

列出所有 tcp 端口

netstat -at

列出 udp 端口

netstat -au

列出处于监听状态的 Sockets

网络服务的后台进程都会打开一个端口,用于监听请求,使用 -l 参数列出正在监听的网络端口

netstat -l

-l 只会显示监听的端口,不会显示连接

只列出所有监听 tcp 的端口

netstat -lt

同理,只监听 udp 的端口

netstat -lu

显示进程信息

-p 选项会打印出进程的名字

sudo netstat -p

需要注意 -p 选项使用 root 运行,大部分网络服务都需要 root 运行

持续输出 netstat 信息

netstat -c

禁止反向域名解析

-n 选项禁用域名反向解析,打印的结果中将只会有IP地址

netstat -ant

打印网络接口

netstat -i

如果需要更加详细的信息可以添加 -e

netstat -ie

那么此刻打印的内容就和 ifconfig 一样了

reference


2017-01-04 network , linux , netstat , ports

修复 Linux mint 下 sogou 输入法

记录一下 Linux 下 Sogou 输入法失效的问题,以及解决修复过程。 Linux 真是太难折腾了,一些配置总是太乱,没有文档,没有集中的 Q&A ,导致使用过程非常困难,一些基础设施都很难用。当然如果调教的好,也是能够非常高效的。比如解决了这个基础打字问题之后的这篇文章就是在 Linux Mint 下完成的。

问题描述

不知道是系统升级还是因为输入法升级,(可在我印象中完全没有做任何干扰到输入法的事情),搜狗输入法 Linux 版,就这么挂掉了,而其他设置一切正常,其他的输入法也都一切正常,但是实在无法用的过来, RIME没有一个可更新的词库,google pinyin 也是词库不全,使用起来总还是不太方便,虽然 sogou 输入法在 Linux 下有些问题所在,但是还是相对来说比较好用的,但是它就这么挂了。

解决过程

在刚开始的时候以为是 Fcitx 的问题,卸载 sudo apt remove fcitx,重装,登入登出好几回,发现并没有任何用,期间也尝试使用过 iBus,但是实在无法使用。

最后在网上查阅问题的时候,发现 搜狗输入法在系统的 ~/.config 下会有三个配置文件夹,包括

  • SogouPY
  • SogouPY.user
  • sogou-qimpanel

将此三文件夹,移动位置,或者删除,重新安装搜狗输入法,登出,登录,即可。


2017-01-03 Linux , Linux Mint , Sogou

Java 查漏补缺之注解

注解,也称为元数据,注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。

注解有许多用处,主要如下:

  • 提供信息给编译器:编译器可以利用注解来探测错误和警告信息
  • 编译阶段时的处理:软件工具可以用来利用注解信息来生成代码、Html 文档或者做其它相应处理
  • 运行时的处理:某些注解可以在程序运行的时候接受代码的提取

注解的形式

常用的注解 @Override 等等就略过,如果注解有 annotation type element declarations,可写成:

@SuppressWarnings(value = "unchecked")
void myMethod() { ... }

或者省略

@SuppressWarnings("unchecked")
void myMethod() { ... }

如果没有 annotation type element declarations,括号也能省略。如果遇到

@Author(name = "Jane Doe")
@Author(name = "John Smith")
class MyClass { ... }

这样的形式,这是 Java 8 引入的新的 Repeating Annotations 注解。

注解可以在定义时使用,包括类定义,field 定义,方法定义时。 Java 8 之后,注解也可以用在下面这些情况:

  • 类实例化时

      new @Interned MyObject()
    
  • 强制类型装换时

      myString = (@NonNull String) str;
    
  • implements 语句

      class UnmodifiableList<T> implements
              @Readonly List<@Readonly T> { ... }
    
  • 抛出异常时

      void monitorTemperature() throws
              @Critical TemperatureException { ... }
    

这种类型的注解叫做 type annotation,更多信息可以在这里 查看。

定义注解

看上去很像接口,下面是 JDK 中自带的 Override 注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}

定义自己的注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface TimeCost {
    public boolean enabled() default true;
}

注解的属性也叫做 annotation type element declarations,看起来像方法,但是不是。注解只有 annotation type element declarations,没有方法。注解的 annotation type element declarations 在注解的定义中以“无形参的方法”形式来声明,其方法名定义了该 annotation type element declarations 的名字,其返回值定义了该 annotation type element declarations 的类型。

元注解

有如下元注解 (meta-annotation),可以理解成定义注解的注解。

注解名字 解释
@Target 定义的注解可以用于什么地方,详见 ElementType 枚举
@Retention 在什么级别保存该注解信息,详见 RetentionPolicy 枚举
@Document 将注解包含在 Javadoc 中
@Inherited 允许子类继承父类中的注解
@Repeatable 表示该注解可以在同一个定义地方被多次使用

前四个注解是 Java 5 引入,后 Java 8 引入了 Repeating Annotations.

Repeating Annotations

可重复的注解是 Java 8 引入的内容,为什么需要可重复的注解呢?举个官方文档上的例子,比如说定义了一个定时任务,有两种方式来驱动

@Schedule(dayOfMonth="last")
@Schedule(dayOfWeek="Fri", hour="23")
public void doPeriodicCleanup() { ... }

亦或是在类上定义权限

@Alert(role="Manager")
@Alert(role="Administrator")
public class UnauthorizedAccessException extends SecurityException { ... }

为了实现可重复的注解,在注解定义时需要添加 @Repeatable 元注解

import java.lang.annotation.Repeatable;

@Repeatable(Schedules.class)
public @interface Schedule {
  String dayOfMonth() default "first";
  String dayOfWeek() default "Mon";
  int hour() default 12;
}

@Repeating 元注解括号中需要定义 container annotation,这个 container annotation 是 Java 编译器生成用来存储可重复注解的。在例子中,container annotation type 就是 Schedules,因此可重复注解 @Shedule 就被保存在 @Schedules 中。

定义 container annotation type 必须要包含一个 value 变量,这个变量是一个包含注解的数组。

public @interface Schedules {
    Schedule[] value();
}

获取解析注解

通过反射获取注解有很多方法,之前的 AnnotatedElement.getAnnotation(Class<T>) 方法维持不变,依然返回一个注解。或者在 JAVA 8 以后,可以通过 AnnotatedElement.getAnnotationsByType(Class<T>) 来一次性获取多个注解。

reference


2017-01-03 java , annotation , interface

每天学习一个命令:iptables Linux上的防火墙

iptables命令是Linux上常用的防火墙软件,是netfilter项目的一部分。可以直接配置,也可以通过许多前端和图形界面配置。这篇文章主要介绍iptables的安装,添加规则,清除规则,开放指定端口,屏蔽指定ip,ip段,等等基本功能。

安装

apt-get install iptables

常见用法

清除已有iptables规则

iptables -F     # 刷新所有链
iptables -X     # 删除表中所有非默认链
iptables -Z

允许本地回环接口(即运行本机访问本机)

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT

允许所有本机向外的访问

iptables -A OUTPUT -j ACCEPT

允许访问22端口,允许某IP访问指定端口,以22端口为例命令是

iptables -A INPUT -p tcp --dport 22 -j ACCEPT                         # 允许所有的IP访问22端口
iptables -I INPUT -s 123.45.6.7 -p tcp --dport 22 -j ACCEPT           # 允许某个IP访问
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT       # 允许IP段访问

允许访问80端口

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

允许FTP服务的21和20端口

iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT

如果有其他端口稍微修改上述语句中的端口号即可

允许已建立的或相关连的通行

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

禁止访问

禁止其他未允许的规则访问

注意:如果22端口未加入允许规则,SSH链接会直接断开

屏蔽单个IP的命令是

iptables -I INPUT -s 123.45.6.7 -j DROP

封整个段即从123.0.0.1到123.255.255.254的命令

iptables -I INPUT -s 123.0.0.0/8 -j DROP

封IP段即从123.45.0.1到123.45.255.254的命令

iptables -I INPUT -s 124.45.0.0/16 -j DROP

封IP段即从123.45.6.1到123.45.6.254的命令是

iptables -I INPUT -s 123.45.6.0/24 -j DROP

屏蔽某IP访问指定端口,以22端口为例命令是

iptables -I INPUT -s 123.45.6.7 -p tcp --dport 22 -j DROP

查看规则

查看已添加的iptables规则

iptables -L -n
iptables -nvL --line-numbers
  • n:只显示IP地址和端口号,不将ip解析为域名

将所有iptables以序号标记显示

iptables -L -n --line-numbers

删除规则

删除已添加的iptables规则

比如要删除INPUT里序号为8的规则,执行:

iptables -D INPUT 8

保存和恢复配置规则

保存生效的配置,让系统重启的时候自动加载有效配置(iptables提供了保存当前运行的规则功能)

iptables-save > /etc/iptables.rules
iptables-restore < /etc/iptables.rules

reference


2017-01-03 iptables , firewall , linux , network , command

电子书

Google+

最近文章

  • 修正关于 HTTP Header 的错误认识 HTTP 请求的 Header 是不区分大小写的!,一直以为 HTTP 请求的请求头是有区分大小的,知道今天调试发现 Spring 将 header 全部处理成小写,然后有人提了 Bug 58464 然后看到 Stackoverflow 上面有人回答。
  • 解决 failed to create bus connection no such file or directory 错误 今天在修改 hostname 使用 sudo hostnamectl set-hostname ds 命令时遇到问题:
  • Vim 的颜色主题 Retro groove color scheme for Vim
  • Linux Mint 下禁用 Alt 拖拽窗口 问题的出现,Linux Mint 使用了很长时间了,一直也没有啥大的问题,只是最近自定义一些快捷键,Alt + Shift ,发现所有的 Alt 相关的操作,只要按住 Alt 键,然后鼠标在任何窗口中就变成了小手,拖拽会直接拖动窗口。
  • 威联通折腾篇八:重启服务 家里遇到一次断电,然后 NAS 就这样异常关机了,重启之后提示磁盘有些碎片需要整理,整理的时候 Qnap 会停止 NAS 上所有的服务,包括 Container Station 中的内容,而 Qnap 说了会在检查完磁盘之后重新启动的,然而并没有,所以只能手动来重启这些服务。