Nginx geo 使用方法

geo指令是ngx_http_geo_module模块提供的,默认情况下nginx有加载这个模块,除非手动--without-http_geo_module

ngx_http_geo_module模块可以用来创建变量,其值依赖于客户端IP地址。

语法: geo [$address] $variable {…}

默认值: -

配置段: http

定义从指定的变量获取客户端的IP地址。默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其它变量获得。如:

1
2
3
4
5
6
7
8
geo $remote_addr $geo {
default 0;
127.0.0.1 1;
}
geo $arg_dingmingk_com $geo {
default 0;
127.0.0.1 1;
}

如果该变量的值不能代表一个合法的IP地址,那么nginx将使用地址“255.255.255.255”。

nginx通过CIDR或者地址段来描述地址,支持以下几个参数:

  • delete: 删除指定的网络。
  • default: 如果客户端地址不能匹配任意一个定义的地址,nginx将使用此值。如果使用CIDR,可以用“0.0.0.0/0”代替default。
  • include: 包含一个定义地址和值的文件,可以包含多个。
  • proxy: 定义可信地址。如果请求来自可信地址,nginx将使用其“X-Forwarded-For”头来获得地址。相对于普通地址,可信地址是顺序检测的。
  • proxy_recursive: 开启递归查找地址。如果关闭递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中的最后一个地址来代替原始客户端地址。如果开启递归查找,在客户端地址与某个可信地址匹配时,nginx将使用“X-Forwarded-For”中最后一个与所有可信地址都不匹配的地址来代替原始客户端地址。
  • ranges: 使用以地址段的形式定义地址,这个参数必须放在首位。为了加速装载地址库,地址应按升序定义。
1
2
3
4
5
6
7
8
9
10
11
12
geo $country {
default ZZ;
include conf/geo.conf;
delete 127.0.0.0/16;
proxy 192.168.100.0/24;
proxy 2001:0db8::/32;
127.0.0.0/24 US;
127.0.0.1/32 RU;
10.1.0.0/16 RU;
192.168.1.0/24 UK;
}
1
2
3
4
$vim conf/geo.conf
10.2.0.0/16 RU;
192.168.2.0/24 RU;

地址段例子:

1
2
3
4
5
6
7
8
9
geo $country {
ranges;
default ZZ;
127.0.0.0-127.0.0.0 US;
127.0.0.1-127.0.0.1 RU;
127.0.0.1-127.0.0.255 US;
10.1.0.0-10.1.255.255 RU;
192.168.1.0-192.168.1.255 UK;
}

遵循最精确匹配原则,即nginx使用能最精确匹配客户端地址的值。

下面看几个适用实例以便理解该指令的用法。

1.使用默认变量也就是$remote_addr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
http {
#geo $remote_addr $dingmingk_com {
geo $dingmingk_com {
default 0;
127.0.0.1 1;
}
server {
listen 80;
server_name test.dingmingk.com;
location /hello {
default_type text/plan;
echo $dingmingk_com; echo $arg_boy;
}
}
}
1
2
3
$ curl 127.0.0.1/helo?boy=king
1
king

2.使用指定变量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
http {
geo $arg_boy $dingmingk_com {
default 0;
127.0.0.1 1;
8.8.8.8 2;
}
server {
listen 80;
server_name test.dingmingk.com;
location /hello {
default_type text/plain;
echo $dingmingk_com;
echo $arg_boy;
}
}
}
1
2
3
$curl 127.0.0.1/hello?boy=8.8.8.8
2
8.8.8.8

3.匹配原则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http {
geo $arg_boy $dingmingk_com {
default 0;
127.0.0.1/24 24;
127.0.0.1/32 32;
8.8.8.8 2;
}
server {
listen 80;
server_name test.dingmingk.com;
location /hello {
default_type text/plain;
echo $dingmingk_com;
echo $arg_boy;
}
}
}
1
2
3
4
5
6
$curl 127.0.0.1/hello?boy=127.0.0.1
32
127.0.0.1
$curl 127.0.0.1/hello?boy=127.0.0.12
23
127.0.0.12

geo指令主要是根据IP来对变量进行赋值的。因此geo模块下只能定义IP或网段,否则会报错“nginx:invalid network。”

Nginx 用户请求限制

我们经常会遇到服务器流量异常、负载过大等这些恶意的攻击访问。资源浪费还是其次,造成正常用户无法访问那就不好了。

Nginx有ngx_http_limit_conn_modulengx_http_limit_req_module两个模块可以在一定程度上缓解这个问题。接下来就分别介绍这两个模块配置用法以及如何添加白名单。

ngx_http_limit_conn_module

该模块可以根据定义的键来限制每个键值的连接数,并不是同一个IP来源的所有连接数都会被该模块计数,只有那些正在被处理的请求(这些请求的头信息已被完全读入)所在的连接才会被计数。

1
2
3
4
5
6
7
8
9
10
11
12
http {
limit_conn_zone $binary_remote_addr zone=limit:10m;
limit_conn_log_level info;
server {
location ^~ /download/ {
limit_conn limit 4;
limit_rate 200k;
alias /data/blog.dingmingk.com/download/;
}
}
}

语法: limit_conn_zone $variable zone=name:size;

默认值: none

配置段: http

该指令描述会话状态存储区域。键的状态中保存了当前连接数,键的值可以是特定变量的任何非空值(空值将不会被考虑)。$variable定义键,zone=NAME定义区域名称,后面的limit_conn会用到的。size定义各个键共享内存空间大小。如:

1
limit_conn_zone $binary_remote_addr zone=addr:10m;

客户端的IP地址作为键。

注意,这里使用的是$binary_remote_addr变量,而不是$remote_addr变量。

  • $remote_addr 变量长度为7字节到15字节,而存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。
  • $binary_remote_addr 变量的长度是固定的4字节,存储状态在32位平台中占用32字节或64字节,在64位平台中占用64字节。

1M共享空间可以保存3.2万个32位的状态,1.6万个64位的状态。如果共享内存空间被耗尽,服务器将会对后续所有的请求返回 503(Service Temporarily Unavailable)错误。

limit_zone 指令和 limit_conn_zone 指令同等意思,已经被弃用,就不再说明了。

语法: limit_conn_log_level info|notice|warn|erro

默认值: error

配置段: http,server,location

当达到最大限制连接数后,记录日志的等级。

语法: limit_conn zone_name number

默认值: none

配置段: http,server,location

指定每个给定键值的最大同时连接数,当超过这个数字时被返回 503(Service Temporarily Unavailable)错误。

当多个 limit_conn 被配置时,所有的连接数限制都会生效。比如下面的配置不仅会限制单一IP来源的连接数,同时也会限制单一虚拟服务器的总连接数:

1
2
3
4
5
6
limit_conn_zone $binary_remote_addr zone=perip:10m;
limit_conn_zone $server_name zone=perserver:10m;
server {
limit_conn perip 10;
limit_conn perserver 100;
}

limit_conn指令可以继承

语法: limit_conn_status code;

默认值: 503

配置段: http,server,location

该指令在1.3.15版本引入,指定当超过限制时,返回的状态码。

语法: limit_rate rate

默认值: 0

配置段: http,server,location,if in location

对每个连接的速率限制。参数rate的单位是字节/秒,设置为0将关闭限速。按连接限速而不是按IP限制,因此如果某个客户端同时开启了两个连接,那么该客户端的整体速率是这条指令设置值的2倍。

ngx_http_limit_req_module

ngx_http_limit_req_module模块和ngx_http_limit_conn_module模块基本类似,该模块可以通过定义的键值来限制请求处理的频率。特别的,可以限制来自单个IP地址的请求处理频率。限制的方法如同漏斗,每秒固定处理请求数,推迟过多请求。

1
2
3
4
5
6
7
8
9
10
http {
limit_req_zone $binary_remote_addr zone=dingmingk_com:10m rate=1r/s;
server {
location ^~ /download/ {
limit_req zone=ttlsa_com burst=5;
alias /data/blog.dingmingk.com/download/;
}
}
}

语法: limit_req_zone $variable zone=name:size rate=rate;

默认值: none

配置段: http

设置一块共享内存限制域用来保存键值的状态参数,特别是保存当前超出请求的数量。键的值就是指定的变量(空值不会被计算)。

客户端的IP地址作为键。

语法: limit_req zone=name [burst=number] [nodelay];

默认值: -

配置段: http,server,location

设置对应的共享内存限制域和允许被处理的最大请求数阈值。如果请求的频率超过了限制域配置的值,请求处理会被延迟,所以所有的请求都是以定义的频率被处理的。超过频率限制的请求会被延迟,直到被延迟的请求数超过了定义的阈值,这时这个请求会被终止,并返回503(Service Temporarily Unavailable)错误。

白名单

有些时候,我们不希望对某些IP进行限制,比如公司IP、反代服务器等,这就需要配置白名单。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
http {
geo $whiteiplist {
default 1;
127.0.0.1 0;
10.0.0.0/8 0;
120.26.73.0 0;
}
map $whiteiplist $limit {
1 $binary_remote_addr;
0 "";
}
limit_conn_zone $limit zone=limit:10m;
server {
listen 8080;
server_name blog.dingmingk.com;
location ^~ /dingmingk.com/ {
limit_conn limit 4;
limit_rate 200k;
alias /data/blog.dingmingk.com/download/;
}
}
}

技术要点

  • geo指令定义一个白名单$whiteiplist,默认值为1,所有都受限制。如果客户端IP与白名单列出的IP相匹配,则$whiteiplist的值为0也就不受限制。
  • map指令是将$whiteiplist值为1的,也就是受限制的IP,映射为客户端IP。将$whiteiplist值为0的,也就是白名单IP,映射为空的字符串。
  • limit_conn_zonelimit_req_zone指令对于键为空值的将会被忽略,从而实现对于列出来的IP不做限制。

使用 Jenkins 自动化部署 Java Web 程序

Jenkins 是一个开源软件,旨在提供一个开放易用的软件平台,是软件的持续集成变成可能。

功能

Jenkins 是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,功能包括:

  1. 持续的软件版本发布/测试项目;
  2. 监控外部调用执行的工作。

安装

Jenkins 安装比较简单,可以参考官方文档。

CentOS为例:

1
2
3
4
5
$ sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
$ sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
$ yum install jenkins

Jenkins 基础配置

在开始自动化任务之前需要配置一些系统的基础项,比如安装必要的插件,配置相应服务器的证书等。

安装 Jenkins 插件

进入 系统管理 - 插件管理 可以看到 可更新 | 可选插件 | 已安装这几项,可选插件中可以选择安装我们需要的插件。

jenkins1

推荐几个插件:

  • GitLab Plugin
  • GIT plugin
  • Gradle plugin
  • Publish Over SSH
  • SSH Credentials Plugin

Jenkins 系统配置

Jenkins 并不能单独完成一套完整的自动化构建流程,它需要搭配其它工具,如 Git/SVN, Gradle/Maven, SSH/FTP...等等。

进入系统管理 - 系统设置,我会一一讲解各个参数。

JDK

在安装 Jenkins 之前,应该已经先安装 JDK 了,我们只需要将相应的路径填入即可。(这里也可以通过 Jenkins 自动安装,不推荐。)

jenkins_jdk

Git

我用的代码管理工具是 GitLab,Jenkins 服务器上需要安装好 Git 客户端,一般 Linux 服务器默认都已安装好,把路径填入即可。

jenkins_git

Gradle

我们公司项目管理用 Gradle, 相应的 Jenkins 服务器需要安装好 Gradle, 并把路径填入。

jenkins_gradle

Publish over SSH

Jenkins 有多种代码部署方式,我选择的是 SSH,记得配置证书。

jenkins_ssh

这里可以配置多台需要推送的服务器信息。

jenkins_server

Tip

这里无论是 Jenkins 从 GitLab 上拉取代码,还是推送应用到服务器上,都推荐使用 SSH,并且配置证书。

可以在 GitLab 不同的项目 Settings - Deploy Keys里授权给相应的 Jenkins 项目。

同样,只给相应的应用服务器部署 Jenkins 服务器的 SSH 公钥。

其它配置

由于我这里使用的是 Git、Gradle、SSH 等功能,配置 SVN、Maven、FTP 基本类似,安装好相应的程序配置好目录即可。

详细的配置和说明可参考官网文档。

Jenkins 任务

完成以上一系列基本配置之后就可以开始创建 Jenkins 任务了。

首页 - 新建

输入任务名称。

这里可以选择几种创建方式,如果你不了解而且是第一次的用户建议选择`构建一个自由风格的软件项目`。

jenkins_job1

一次基本的构建过程包括以下五个步骤:

  1. 源码管理
  2. 构建触发器
  3. 构建环境
  4. 构建
  5. 构建后操作

源码管理

以 Git 为例,需要配置三个主要参数:

  • Repositories 仓库地址
  • Credentials 用户授权
  • Branched to build 构建分支

jenkins_job_git

构建触发器

触发器可以设置一些触发构建的条件,如钩子、定时任务等…如下图所示每15分钟检测一次远端仓库是否有更新。

jenkins_job_hook

构建环境

  • Send files or execute commands over SSH before the build starts
  • Send files or execute commands over SSH after the build runs

构建

这里是主要编译打包代码环节,可选多种方式,这里介绍使用 shell 和 gradle 两种。

Gradle比较简单,项目根目录写好 build.gradle文件,这里直接配置gradle参数 clean build即可。

jenkins_job_build1

如果项目不支持 Gradle 或其它管理工具,需要写一些简单的脚本来编译打包。

jenkins_job_build2

构建后操作

构建好后需要推送到远端应用服务器,有时还需要执行一些命令来重启相应的应用或执行一系列操作。

jenkins_job_push

顺便附上我部署 tomcat 应用以及重启的脚本。jenkins_deploy.sh

后记

Jenkins 的功能远不止这些,它可以结合很多组件构建一个完整的系统。

TODO

高效 Mac 运维环境配置

为什么要用 Mac

作为一名运维工程师,远程登录服务器是每天工作一大头,一个高效便捷的工作环境将大大提升工作效率节省时间。今天向大家介绍的就是Mac下的 iTerm + Zsh + Tmux ,这一套环境将我们的注意力高度集中在键盘上,减少手指在键盘与触摸板中移动的频率和时间,更佳专注于文本编辑,长久使用还能形成肌肉记忆。

为什么要 Mac 呢?

先说下三大平台对比:

  • Windows: 原生不支持SSH(未来PowerShell将支持),客户端有 XShell, SecureCRT, Putty…等,基本功能满足但功能有限;
  • Linux: 原生支持 SSH,桌面 Terminal 功能有限,无法在同一窗口打开多个标签页,本地和服务端同时使用 Tmux 时会出现快捷键冲突等;
  • OSX: 原生支持SSH,iTerm功能丰富,个人认为最好用的客户端。还有 Mac 的最大优势就是 GUI 和命令行的完美结合!

人生苦短,我用 Mac。

iTerm

让命令行也能丰富多彩

iTerm 是一款完全免费,在 GPLv2 下发布的,转为 Mac OSX 用户打造的命令行应用。我们可以打开它的 官方网站 看一看,简单下载安装之后就可以开始 iTerm 之旅了。

主题配色

1
Perferences - Profiles - Colors

进入配色方案面板后,在右下角下拉框中有几种配色方案供我们选择,比如黑色风格、白色风格、深蓝风格…等等。

iTerm2-1

选择文本

iTerm 提供一种脱离触摸板也可以选择文本的机制,叫做 搜索 + Tab ,不要小看这个细微的功能,它能让你保持专注。

我们在使用命令行的时候,经常会要去选择命令行中的文本复制粘贴。就比如说 ping 命令, 我们用 ping 命令来获取一个域名解析后的 IP。

相信大家都有过这样的体验:ping 命令得到 IP 后,我们想要把它复制下来,我们只能通过在触摸板上三指滑动精确选中这段 IP(或在 IP 中间单指快速轻点两次)。频繁的在键盘和触摸板之间切换,很会影响我们的注意力。

iTerm 提供一个好的办法,我们只需 Cmd + F 调出搜索框,然后输入这段 IP 的前缀,然后按下 Tab 键补全,iTerm就自动帮我们把这段 IP 选中,并且自动复制到剪贴板中了。

iTerm2-2

一键调出命令行

我们有时会临时需要用命令行执行某一个操作,然后就不需要了。虽然可能 iTerm 时常都在运行,但单屏状态下经常切换桌面也会让人觉得眼花缭乱。

1
Perferences - Keys - Hotkey

将 Hotkey 选项下的复选框选中,并且设置一个快捷键,比如我这里设置的是 Cmd + \ ,toggle 下拉框中选择 Hotkey window

稍后在我们临时需要使用命令行的时候,只需按下刚才定义的快捷键,神奇的事情就发生了!

iTerm2-3

行标记

这个功能简单来说就是,我们在某一行按下Cmd + Shift + M将这行标记。随后在需要的时候,可以按下 Cmd + Shift + J 立即跳回这行。

正则表达式搜索

这个就不用多说了吧,你可以任性地搜索,专为极客们准备。只需在调出搜索界面的时候,将 Regular Expression 选项钩上,就可以使用正则表达式进行搜索了。

iTerm2-4

剪贴板历史记录

这也是个很方便的特性。iTerm 能够将我们在使用命令行过程中所有的复制粘贴操作保存下来,当我们按下 Cmd + Shift + H 就可以列出这些记录。

iTerm2-5

快照返回

iTerm 的快照返回功能就是当你按下 Cmd + Option + B 时,会在界面上显示一个时间轴,可以通过键盘的左右箭头控制时间轴,同时 iTerm 上的命令行界面也随着变化成你选中的时间点的内容。

这个功能对于重新执行命令,没有 bash 下直接执行 historyCtrl + r 方便;但用它查看内容输出比用 Tmux 回滚方便一些。

iTerm 小结

以上是关于使用 iTerm 一些小的技巧,熟练掌握这些就能一定程度提高我们的工作效率。可能刚开始你并不能记住这些功能,但当你正在做某个低效的动作时,想起曾经看过相应的解决办法,回过头来掌握这个方法,这样印象就比较深刻了。也可以自己发掘一些高效的功能,让你的工作越来越得心应手!

Zsh

目前常用的 Linux 发行版和 OSX 系统默认的 SHell 都是 bash,但是 OSX 预装了 Zsh,所以我们可以直接运行以下命令来设置当前用户使用 zsh。

1
$ chsh -s /bin/zsh

Linux 用户可以使用相应的包管理工具安装 Zsh。

Windows 用户…去洗洗睡吧。

安装 Oh My Zsh

Zsh 虽然很强大,但是由于配置过于复杂,所以少有人使用。我们可以直接使用老外开发的 Oh My Zsh这个项目来帮助我们快速上手配置 Zsh。

自动安装

1
$ wget https://github.com/robbyrussell/oh-my-zsh/raw/master/tools/install.sh -O - | sh

手动安装

1
2
$ git clone git://github.com/robbyrussell/oh-my-zsh.git ~/.oh-my-zsh
$ cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc

安装完成后打开一个新的终端窗口,就可以见到如下彩色提示。

Zsh-1

配置 Oh My Zsh

TODO

Tmux

Tmux是一个优秀的终端复用软件,类似GNU Screen。通过一个终端登录并运行tmux后,在其中可以开启多个控制台而无需开启多个终端,且tmux在后台运行,每次登录tmux即可继续上次工作进度。

安装 Tmux

各平台下相应的包管理工具可直接安装,或登录tmux.github.io下载。

配置 Tmux

tmux默认配置在用户目录下.tmux.conf,可参考如下我的配置。

我的tmux配置

使用 Tmux

创建session

1
tmux new -s test

查看session

1
tmux ls

登录session

1
tmux a -t test

挂起session

1
Ctrl-q + d

如果使用了我上面链接的配置

创建window

1
Ctrl-q + c

选择window

1
Ctrl-q + n/p

分割pane

1
Ctrl-q + |

横向分隔pane

1
Ctrl-q + -

选择pane

1
Ctrl-q + h/j/k/l

更多功能可自行挖掘。
TODO

生活在上海和南平之间

前两天回南平办事,顺便见了一些同学朋友。发现很多人都在南平买房买车安居了,再看看自己依然在外漂泊,不免唏嘘。

  • 上海是一个规则化比较高的城市,回到南平则是人情关系的世界,不适合我这样的人生存;
  • 南平市区一些比较好的小区如山水华庭、江南第一城、正荣,房价现在5k左右,再好点的如延府豪庭也不过1.3w;上海房产均价3.5w,现在住的这老公房因为小区对面有个小学价格在5w以上,更多就上不封顶了;
  • 在南平很大一部分人月薪在2、3k左右,4、5k的已经算高了吧。而在上海搞两年IT的基本都20k以上;
  • 其实要说压力问题,在上海通过几年努力,也能混到个中产阶级。并且,将会有持续的竞争力。但若在南平,估计安闲蹉跎若干年后,情况依然没有改变;
  • 纸厂生活区很多人一个月生活费500不到,而万万一个月都不只花500(洗澡一次100,猫粮一袋320,罐头一个10、每周两个,还有其他玩具xxx),我们家每个月开销1w~1.5w,在上海生活很滋润;
  • 大城市的人都很普通,大家早出晚归的上下班,偶尔聚聚等,很少勾心或攀比。小城市的人很骚包,经常有人拉你去豪吃唱K洗浴什么的,装有钱装屌。所以小城市的父母们总说,你看谁家谁家怎么啦,等等等…无时无刻的攀比心理,让人很难接受;
  • 其他的如网购、医疗、交通什么的就不多说了。

你回到了家乡,买一套100平50~60w的房,买两辆代步小车,日子过得也很温馨。你的孩子出生之后,享受到的物质水平也许不比任何一个大城市的孩子要差。

可是,不可避免的,你孩子所接触到的世界和眼界和大城市的孩子在出生的时候就有了差别。大城市的多元性可以让孩子更加了解这个世界的五彩缤纷。

同样,在一个大城市里,你所能接触到的朋友的社会形态也能影响你自己。

我吃了那么多的苦,在上海打拼的艰辛,一路走来,多不容易!

靠自己的知识,有一份工作,事业处于上升期,接触最优秀的人,和相爱的人安居乐业,何乐不为!

Nginx 禁止 IP 及未绑定域名访问

Nginx禁止IP及未绑定域名访问

今天不小心在某搜索引擎搜到自己的网站,但显示的域名却完全不认识,DNS解析出来的IP也是别人的。为了避免别人把未备案的域名解析到我的服务器IP而导致被断网,就需要在nginx上禁止未绑定域名和IP访问服务器目录。

添加一个vHost

1
2
3
4
server {
listen 80 default;
rewrite ^(.*) http://xxx.dingmingk.com permanent;
}

如果别人通过未知域名或直接使用IP访问的时候,就会被301跳转到已绑定的网站,这样既避免了不必要的麻烦,又顺便把这些流量收集起来。当然也可以直接返回500或其他异常信息。

使用 ss 命令代替 netstat

ss是Socket Statistics的缩写。

顾名思义, ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

为什么要告别netstat

当服务器的socket连接数非常大时,无论使用netstat还是cat /proc/net/tcp,执行速度都很慢。

天下武功唯快不破。ss的秘诀在于,它利用到了TCP协议栈中tcp_diag。

tcp_diag是一个用于分析统计的模块,可以获得linux内核中第一手信息,这就确保了ss的快捷高效。当然,如果你的系统中没有tcp_diag,ss也可以正常运行,只是效率会变得很慢(仍然比netstat快)。

性能对比

TODO

自己手头暂时没有适合测试的机器,网上有人测试过数据如下:

(当服务器维持3w个socket链接时)

1
2
3
netstat -at | wc 耗时 15.60 秒
ss -atr | wc 耗时 5.40 秒(未利用tcp_diag)
ss -atr | wc 耗时 0.47 秒(利用tcp_diag)

安装ss

几乎所有的linux系统都会默认包含netstat命令,但并非所有系统都会默认包含ss命令。

netstat命令是net-tools工具集中的一员:

1
2
$rpm -q netstat-tools
net-tools-1.60-110.el6_2.x86_64

而ss命令是iproute工具集中的一员:

1
2
3
4
$rpm -q /usr/sbin/ss
iproute-2.6.32-45.el6.x86_64
$rpm -q iproute
iproute-2.6.32-45.el6.x86_64

如果你无法使用ss命令,那么可能是缺少了iproute,需要安装一下:

1
yum install iproute iproute-doc

ss常见用法

当前服务器的网络连接统计

1
2
3
4
5
6
7
8
9
10
11
$ ss -s
Total: 78 (kernel 85)
TCP: 5 (estab 2, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 5
Transport Total IP IPv6
* 85 - -
RAW 0 0 0
UDP 4 4 0
TCP 5 5 0
INET 9 9 0
FRAG 0 0 0

查看所有打开的网络接口以及对应的程序名称

1
2
3
4
5
6
7
8
9
10
$ ss -pl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:http *:*
users:(("nginx",2591,6),("nginx",15272,6))
LISTEN 0 10 127.0.0.1:15770 *:*
users:(("aegis_quartz",16616,8))
LISTEN 0 128 *:22 *:*
users:(("sshd",24244,3))
```
**查看所有socket连接**

$ ss -a

1
2
3
4
5
6
7
* 如果只想查看TCP sockets, 那么使用 `-ta` 选项
* 如果只想查看UDP sockets, 那么使用 `-ua` 选项
* 如果只想查看RAW sockets, 那么使用 `-wa` 选项
* 如果只想查看UNIX sockets, 那么使用 `-xa` 选项
#### 附录
#####ss命令参数列表

-h, --help
       Show summary of options.

-V, --version
       Output version information.

-n, --numeric
       Do now try to resolve service names.

-r, --resolve
       Try to resolve numeric address/ports.

-a, --all
       Display all sockets.

-l, --listening
       Display listening sockets.

-o, --options
       Show timer information.

-e, --extended
       Show detailed socket information

-m, --memory
       Show socket memory usage.

-p, --processes
       Show process using socket.

-i, --info
       Show internal TCP information.

-s, --summary
       Print  summary  statistics. This option does not parse socket lists obtaining summary from various sources.
       It is useful when amount of sockets is so huge that parsing /proc/net/tcp is painful.

-4, --ipv4
       Display only IP version 4 sockets (alias for -f inet).

-6, --ipv6
       Display only IP version 6 sockets (alias for -f inet6).

-0, --packet
       Display PACKET sockets.

-t, --tcp
       Display only TCP sockets.

```

iproute & net-tools

从某种意义上来说,iproute工具集几乎可以替代掉net-tools工具集。

用途 net-tools iproute2
地址和链路配置 ifconfig ip addr, ip link
路由表 route ip route
邻居 arp ip neigh
VLAN vconfig ip link
隧道 iptunnel ip tunnel
组播 ipmaddr ip maddr
统计 netstat ss

netstat2iproute

痛苦与救赎

pain

人的一切痛苦,本质上都是对自己无能的愤怒。

比看不清前方更让人绝望的是,明明它就在那伸手就能抓到的地方,却好像永远也够不着。

从今天起好好维护这个博客,希望能把平时的生活和学习记录下来。

进步, Fighting!