Skip to content


OpenSSH ssh-agent 客户端远程代码执行漏洞CVE-2023-38408

漏洞描述

SSH-Agent是SSH的一部分,它是一个用于管理私钥并支持公钥身份验证的程序。

用户使用 SSH-Agent 转发代理功能连接攻击者恶意服务器时,由于 SSH-Agent 未对加载的共享库进行限制,攻击者可通过将恶意共享库作为参数传递给 SSH-Agent 并通过其调用dlopen/dlclose函数加载/卸载位于用户客户端主机的共享库,实现远程代码执行。

影响范围

ssh-agent@(-∞, 9.3_p2)

openssh@(-∞, 9.3p2-1)

解决方案

为了有效解决和防范CVE-2023-38408,请遵循以下综合步骤:

首先升级到OpenSSH 9.3p2或更高版本:升级到最新版本的OpenSSH至关重要,因为它包含缓解漏洞的关键补丁。确保所有相关系统和服务器及时更新至推荐版本或更高版本。

另外采取预防措施来避免被利用:

建议在仅仅OpenSSH用于远程主机管理的机器,通过Openssh配置(sshd_config)、防火墙,安全组ACL等限制来源访问IP为白名单仅可信IP地址,同时,非必要,关闭SSH代理转发功能,禁止在有关主机启用ssh隧道等。

关闭SSH代理转发功能方法为:

配置/etc/ssh/sshd_config

AllowTcpForwarding NO

参考链接

https://www.oscs1024.com/hd/MPS-hwop-qus5

https://nvd.nist.gov/vuln/detail/CVE-2023-38408

Posted in 安全通告.

Tagged with , , .


存货重新发布inotify_rsync代码同步shell脚本

inotify_rsync代码同步shell脚本

介绍

以inotify+rsync同步discuz论坛代码shell脚本示例

项目地址
Gitee(国内): https://gitee.com/c1g/inotify_rsync
Blog: https://blog.c1gstudio.com/

软件架构

需要安装inotify,rsync 并配置好目标主机的rsync项目

优势

限制每秒同步一次,不会批量上传文件后进行海量同步。

安装部署

mkdir -p /opt/shell/rsynclog && cd /opt/shell/  
wget -O inotify.sh https://gitee.com/c1g/inotify_rsync/raw/master/inotify.sh   
chmod +x ./inotify.sh
./inotify.sh &

使用说明

默认代码目录在 /opt/htdocs/discuz/
监听 {V_WATCH} 和 {V_WATCH2} 目录, 每秒只传输一次
注意:{V_RSYNC_DELETE}请谨慎操作,会删除不一致文件
如需半自动同步那就从监听中移除 {V_WATCH}
手动同步

 touch ${V_WATCH2}/syncbbs

开机启动

echo "cd /opt/shell && /opt/shell/inotify.sh &" >> /etc/rc.local

运行

 cd /opt/shell && /opt/shell/inotify.sh &

关闭可以直接杀

 pkill inotify

Posted in shell.

Tagged with , , .


存货重新发布php后门查找自动版

php后门查找自动版

介绍

跟据样本及关键字定时查找php后门自动版,适合小网站运行。
首次运行会跟据当前web目录产生初始样本库,以后每次运行都会和初始库比对一次。
如果查找出文件中含有eval,shell_exec,unserialize,$_FILES等可利用的词时就会发送通知邮件。
如更新了代码或确认代码没问题可以运行./find_trojan_auto.sh buildorg 重新产生样本库。


项目地址

Gitee(国内): https://gitee.com/c1g/find_trojan_auto
Blog: https://blog.c1gstudio.com/

软件架构

需要diff,md5sum,mail,find等命令支持

功能

查找没有用户和组的文件
查找可能含有一句话后门的php(需人工分析)
发送运行结果通知邮件
支持设定避开指定目录
第一次运行会先建立原始库之后对此进行对比(file_db_org)
删除原始库可以重新建立比对标准

安装部署

mkdir -p /opt/shell/log && cd /opt/shell/  
wget -O find_trojan_auto.sh https://gitee.com/c1g/find_trojan_auto/raw/master/find_trojan_auto.sh   
chmod +x ./find_trojan_auto.sh
#设定接收邮箱和web目录
sed -i "s/maillist=.*$/maillist='[email protected]'/" ./kickleech_auto.sh
sed -i "s/findpath=.*$/findpath='/opt/htdocs'/" ./kickleech_auto.sh
./find_trojan_auto.sh buildorg

使用说明

cd /opt/shell/
./find_trojan_auto.sh
#加入到crontab定时运行,每天6点36检查一次
crontab -e
36 6 * * * cd /opt/shell/ && /bin/sh ./find_trojan_auto.sh > /dev/null 2>&1

Posted in PHP, shell.

Tagged with , , .


存货重新发布shell反爬虫脚本手动版

kickleech反爬虫

介绍

shell反爬虫脚本手动版,分析web日志找出访问量异常高的IP。

  • 手动版反爬虫,输出ip及相关信息供反爬虫判断;
  • 运行前请确保日志临时目录V_TMPFILE存在并可读写,调用IP所在地公网接口需要curl支持
  • 支持单独白名单文件,nginx白名单文件,支持ipv4,ipv6 的/24斜线写法,不支持255.255.255.0 写法
  • 支持取日志中remote_addr或http_x_forwarded_for左一(没有则取remote_addr)为判断IP
  • 可以指定提取全部或多少条日志进行分析,排序显示单IP或IP C段大于指定阈值的IP
  • 运行结果可以输出到指定日志文件
  • 命令行支持指定WEB日志文件/日志条数/单IP阈值/IP C段阈值/显示IP数量/显示当前IP白名单
  • 可以指定是否排除蜘蛛等特定UserAgent
  • 分析后显示单IP请求数/页面分布/HTTP状态分布/抽样/IP所在地/是否(白|黑)名单中/是否正常请求

优势

  • 支持http_x_forwarded_for取IP
  • 支持IPV6地址
  • 支持IPC段统计
  • 支持IP黑白名单

项目地址

安装部署

kickleech手动版

wget -O kickleech_manual.sh https://gitee.com/c1g/kickleech/raw/master/kickleech/kickleech_manual.sh
chmod +x ./kickleech_manual.sh
#脚本会自动创建临时目录和日志目录,也可以手动创建
mkdir -p /opt/nginx/logs/
mkdir ./log

./kickleech_manual.sh

使用说明

Example: ./kickleech_manual.sh -f /var/log/nginx/access.log -n 500000 -t 1000 -c 3000 -m 100 -s -i

OPTION:
-f apache log file,default=/var/log/nginx/access.log
-n output the last K lines {full|500000},default=full
-t threshold for the number of requests from same IP address,default=1000
-c threshold for the number of requests from same class C IP address,default=3000
-m show number of IP,default=100
-s show IP allow list
-i show IP location
-v show this information
RESULT:
IP Count: ./log/kickleech_manual_ip_count.log
Class C IP Count: ./log/kickleech_manual_ipc_count.log
IP Detail: ./log/kickleech_manual_ip_info.log
IP Result: ./log/kickleech_manual_ip_bad.log

也可以直接编辑脚本将常用参数写在变量里。  

示例

./kickleech_manual.sh -f /var/log/nginx/bbs.c1gstudio.com.log -n 50000 -t 100 -c 300 -m 100 -s -i

=====start:20230706 18:04:46=====
LOAD nginx safe ip
SAFE IP:
127.0.0.1/32 192.168.0.0/24
LINE number:50000
364 64.62.252.163
241 173.208.200.2
139 182.148.222.121
115 110.188.45.251
101 183.146.253.6
KICKLEECH BAD 64.62.252.163
KICKLEECH BAD 173.208.200.2
KICKLEECH BAD 182.148.222.121
KICKLEECH BAD 110.188.45.251
KICKLEECH BAD 183.146.253.6
skip reload nginx!
=====end:20230706 18:04:50=====

结果查看

cat log/kickleech_manual_ip_info.log

get head line:

220.185.30.0 – – [27/Jun/2023:13:08:06 +0800] “GET /forum.php?mod=forumdisplay&fid=56&filter=digest&digest=1&typeid=25&specialtype=trade&orderby=views HTTP/1.1” 200 7925 “-” “Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.873.3 Safari/537.36”

364 64.62.252.163
get status layout:5
364 200
get page layout:7
199 /space
125 /thread
40 /forum.php?mod=forumdisplay
get sample:3
64.62.252.163 – – [27/Jun/2023:13:08:16 +0800] “GET /space-uid-735.html HTTP/1.1” 200 4182 “-” “The Knowledge AI” 64.62.252.163 – – [27/Jun/2023:13:08:16 +0800] “GET /space-username-a.html HTTP/1.1” 200 4203 “-” “The Knowledge AI” 64.62.252.163 – – [27/Jun/2023:13:08:17 +0800] “GET /thread-935-1-1.html HTTP/1.1” 200 4959 “-” “The Knowledge AI” get host:
Host 163.252.62.64.in-addr.arpa. not found: 3(NXDOMAIN)
get ip location:
{“ip”:”64.62.252.163″,”beginip”:”64.62.244.152″,”endip”:”64.62.255.255″,”country”:”美国”,”area”:”加利福尼亚州弗里蒙特市Hurricane Electric公司”}

241 173.208.200.2
get status layout:5
241 200
get page layout:7
91 /forum.php?mod=forumdisplay
38 /connect.php?mod=login
6 /forum.php?mod=viewthread
3 /forum.php?mod=post
1 /forum.php?mod=redirect
get sample:3
173.208.200.2 – – [27/Jun/2023:13:09:32 +0800] “GET /forum.php?mod=forumdisplay&fid=94&orderby=lastpost HTTP/1.1” 200 7989 “-” “Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2545.102 Safari/537.36”
173.208.200.2 – – [27/Jun/2023:13:09:34 +0800] “GET /forum.php?mod=forumdisplay&fid=34&filter=author HTTP/1.1” 200 8210 “-” “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.1717.77 Safari/537.36”
173.208.200.2 – – [27/Jun/2023:13:09:35 +0800] “GET /forum.php?mod=forumdisplay&fid=39&filter=author HTTP/1.1” 200 8250 “-” “Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.1349.50 Safari/537.36”
get host:
2.200.208.173.in-addr.arpa domain name pointer smtp101.florybeauty.com.
get ip location:
{“ip”:”173.208.200.2″,”beginip”:”173.208.128.0″,”endip”:”173.208.255.255″,”country”:”美国”,”area”:”密苏里州堪萨斯城WholeSale互联网股份有限公司”}

目录结构

.
├── kickleech_manual.sh
├── kickleechsafeip.conf
└── log

├── kickleech_manual_ip_bad.log
├── kickleech_manual_ipc_count.log
├── kickleech_manual_ip_count.log
├── kickleech_manual_ip_info.log
└── kickleech_manual_log_2023.log

Posted in LINUX, shell.

Tagged with , , .


存货重新发布kickleech反爬虫SHELL脚本

介绍

之前写的反爬虫脚本重新整理了一下,适合小网站单机运行,有更高的需求可以自已布WAF或云防。
反爬虫自动封禁版,可以使用iptables或nginx自动封禁爬虫或攻击IP.
反爬虫手动分析版,分析显示异常ip信息。
原理是分析web日志找出访问量异常IP。

优势

  • 支持http_x_forwarded_for取IP
  • 支持iptables或nginx封禁
  • 支持IPV6地址
  • 支持IP黑白名单

项目地址

安装部署

kickleech手动版

wget -O kickleech_manual.sh https://gitee.com/c1g/kickleech/raw/master/kickleech/kickleech_manual.sh
chmod +x ./kickleech_manual.sh
#脚本会自动创建临时目录和日志目录,也可以手动创建
mkdir -p /opt/nginx/logs/
mkdir ./log

./kickleech_manual.sh

kickleech自动版

mkdir -p /opt/shell/log && cd /opt/shell
wget -O kickleech_auto.sh https://gitee.com/c1g/kickleech/raw/master/kickleech/kickleech_auto.sh
chmod +x ./kickleech_auto.sh
#脚本会自动创建临时目录和日志目录,也可以手动创建
mkdir -p /opt/nginx/logs/
./kickleech_auto.sh

#加入crontab自动运行

crontab -e
*/3 * * * * cd /opt/shell && /bin/sh ./kickleech_auto.sh > /dev/null 2>&1

Posted in LINUX, shell.

Tagged with , , .


nginx强制使用https访问的多种方法(http跳转到https)

nginx强制使用https访问的多种方法(http跳转到https)

先说明一下HTTP跳转的状态码

301 Moved Permanently:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的。客户端在收到 301 响应后,会自动将 HTTP 请求转为 GET 请求,同时将请求地址修改为重定向后的地址。这意味着,如果原始请求是 POST 请求,那么 301 重定向会将其转变为 GET 请求。此外,浏览器会缓存 301 响应,下一次请求时会直接跳转到 HTTPS 上。

302 Found / 303 See Other:这两种方式将所有的 HTTP 请求临时性地重定向到 HTTPS 上。302 Found 的响应会将请求方法保持不变,同时将请求地址修改为重定向后的地址。而 303 See Other 则会将所有请求方法转变为 GET 方法,并将请求地址修改为重定向后的地址。这两种方式都不会缓存响应,下一次请求时会再次发起请求。

307 Temporary Redirect:该方式将所有的 HTTP 请求临时性地重定向到 HTTPS 上,并且会保留原始的请求方法。这意味着,如果原始请求是 POST 请求,那么重定向后的请求仍然是 POST 请求。同时,请求地址也会被修改为重定向后的地址。与 302 Found 类似,307 Temporary Redirect 不会缓存响应,下一次请求时会再次发起请求。

308 Permanent Redirect:该方式将所有的 HTTP 请求重定向到 HTTPS 上,并且该重定向是永久性的。客户端在收到 308 响应后,会自动将 HTTP 请求转为与原始请求方法相同的请求方法,同时将请求地址修改为重定向后的地址。与 301 Moved Permanently 不同的是,308 Permanent Redirect 不会允许浏览器将 POST 请求重定向到新地址。308 响应也会被缓存,下一次请求时会直接跳转到 HTTPS 上。

497 normal request was sent to HTTPS:(HTTP到HTTPS(Nginx))Nginx内置的代码,被用于原始的HTTP的请求发送给HTTPS端口去分辨4XX在日志中和一个错误页面的重定向

推荐使用return 307 跳转码,百度、亚马逊等也是使用307跳转。

方式一:
返回 301 错误,并跳转到 https 地址


server{
        listen 80;
        listen 443 ssl;
        server_name  blog.c1gstudio.com;
        set $sslflag 0;
        if ($ssl_protocol = '') {
            set $sslflag "${sslflag}1";
        }
        if ($sslflag = "01") {
            return 301 https://$server_name$request_uri;
        }
}

方式二:
当 nginx 配置的站点只允许 https 访问时,我们却使用 http 去访问,此时 nginx 会报出 497 错误码。
我们就可以利用 error_page 命令将 497 状态码的链接重定向到 https


server{
        listen 80;
        listen 443 ssl;
        server_name  blog.c1gstudio.com;
        error_page 497 https://$server_name$request_uri;
}

方式三:
使用参数标记,只跳转一次https。
将 http 请求重写到 https 地址,并带上?https=Y参数.
PURGE方式不进行跳转


server{
        listen 80;
        listen 443 ssl;
        server_name  blog.c1gstudio.com;
        set $sslflag 0;
        if ($server_port = 80) {
            set $sslflag "${sslflag}1";
        }
        if ( $request_method = "PURGE") {
            set $sslflag "${sslflag}2";
        }
        if ($arg_sslsign ) {
            set $sslflag "${sslflag}4";
        }
        set $ssljumpparam "?https=Y";
        if ($is_args = '?'){
            set $ssljumpparam "&https=Y";
        }
        if ($sslflag = "01") {
            rewrite ^(.*)$ https://$host$uri$is_args$query_string$ssljumpparam? redirect;
        }  
}

方式四:
当post数据到http协议时,重定向后会出现请求方法变为 get,post数据丢失。
解决这个问题就要换返回的状态码,307是临时,308是永久.


server{
        listen 80;
        listen 443 ssl;
        server_name  blog.c1gstudio.com;
        set $sslflag 0;
        if ($scheme = http) {
            set $sslflag "${sslflag}1";
        }
        if ($request_method = POST) {
            set $sslflag "${sslflag}2";
        }

        if ($sslflag = "012") {
        return 307 https://$host$request_uri;
        }  
        if ($sslflag = "01") {
        return 301 https://$host$request_uri;
        }
}

方式五:
所有http 的GET请求301跳转至https,
POST等请求的用proxy_pass来接收并反代https


server{
        listen 80;
        server_name  blog.c1gstudio.com;

        set $sslflag 0;
        if ($ssl_protocol = '') {
          set $sslflag "${sslflag}1";
        }
        if ( $request_method = "GET") {
            set $sslflag "${sslflag}2";
        }
        if ($sslflag = "012") {
          return 301 https://$server_name$request_uri;
        }

        location / {
            proxy_set_header Host  $host;
            proxy_set_header X-Pass my_proxy;
            proxy_pass https://127.0.0.1;
        }

}

Posted in Nginx.

Tagged with , , .


自动化运维工具SaltStack安装

一.SaltStack介绍

1.常见的自动化运维工具介绍

chef,ansible,saltstack,puppet;
这几款都是自动化运维工具,可以用来提高运维管理效率,在这几款运维工具中目前主流的是ansible和saltstack。
ansible和saltstack的区别在于ansible无需安装客户端,这也成为了ansible的一大优势。
而saltstack则需要安装客户端,也可以不用安装,他们的适用场景也不一样,ansible适用于小型企业,管理较少的服务器时适用,saltstack则用于中大型企业,因为ansible无法并行执行saltstack则可以并行执行。
但是这几款运维工具并不存在优劣,只是适用的场景的不同。

语言的选择(puppet/chef vs ansible/saltstack)
Puppet、Chef基于Ruby开发,ansible、saltstack基于python开发的
运维开发语言热衷于python(后期可做二次开发),排除Puppet、Chef

速度的选择 (ansible vs saltstack)
ansible基于ssh协议传输数据,SaltStack使用消息队列zeroMQ传输数据。从网上数据来看,SaltStack比ansible快大约40倍。
对比ansible,Saltstack缺点是需要安装客户端。为了速度建议选择SaltStack

Ansible适合100台以下到200这样服务器规模应用
SaltStack,适合几百台的规模!
puppet适合上千台和几万台的规模

2. 服务架构介绍

saltstack是基于python开发的一套C/S自动化运维工具,通信采用了zeromq消息队列的(pub/sub),数据传输采用了AES(高级加密)保证安全性,认证采用了SSL方式.
在SaltStack架构中服务器端叫作Master,客户端叫作Minion,传统C/S架构为:客户端发送请求给服务器端,服务器端接收到请求并且处理完成后再返回给客户端。在SaltStack架构中不仅有传统的C/S架构服务模式,而且有消息队列中的发布与订阅(pub/sub)服务模式。这使得SaltStack应用场景更加丰富。目前在实际环境中一般使用SaltStack的C/S架构进行配置管理。

在Master和Minion端都是以守护进程的模式运行,一直监听配置文件里面定义的ret_port(接受minion请求,默认端口号:4506)和publish_port(发布消息,默认端口号:4505)的端口。当Minion运行时会自动连接到配置文件里面定义的Master地址ret_port端口进行连接认证。默认客户端请求id是socket.getfqdn()取到的值,也可以在Minion启动之前修改Minion的id值。

SaltStack github地址:
https://github.com/saltstack/salt
SaltStack 官网文档地址:
https://docs.saltproject.io/en/latest/

3.saltstack四大功能与四大运行方式

saltstack四大功能,分别是:

远程执行 (批量执行命令)在master上执行命令时,会在所有的minion上执行。
配置管理/状态管理 (描述想到达到的状态,saltstack就会去执行)
云管理(cloud) 用于管理云主机
事件驱动 被动执行的,当达到某个值会自动触发
saltstack可以通过远程执行实现批量管理,并且通过描述状态来达到某些功能的目的。

saltstack四大运行方式:

local本地运行 (masterless模式)
master/minion传统方式 这是saltstack的主要模式
syndic 分布式
salt ssh (agentless模式)

Master:控制中心,salt命令运行和资源状态管理
Minion : 需要管理的客户端机器,会主动去连接Mater端,并从Master端得到资源状态
信息,同步资源管理信息
States:配置管理的指令集
Modules:在命令行中和配置文件中使用的指令模块,可以在命令行中运行
Grains:minion端的变量,静态的
Pillar:minion端的变量,动态的比较私密的变量,可以通过配置文件实现同步minions定义
highstate:为minion端下发永久添加状态,从sls配置文件读取.即同步状态配置
salt_schedule:会自动保持客户端配置
Python API就是给Python提供的API使用,需要在SaltStack master上运行

4.saltstack配置文件

saltstack的配置文件在/etc/salt 目录

saltstack配置文件说明:

配置文件 说明
/etc/salt/master 主控端配置文件
/etc/salt/minion 受控端配置文件
配置文件件/etc/salt/master默认的配置就可以很好的工作,故无需修改此配置文件

配置文件/etc/salt/minion常用配置参数

master:设置主控端的IP
id:设置受控端主机的唯一标识符,可以是IP也可以是主机名或自取见名知意的单词等都可。
在日常使用过程中,经常需要调整或修改Master配置文件,SaltStack大部分配置都已经指定了默认值,只需根据自己的实际需求进行修改即可。下面的几个参数是比较重要的

max_open_files:可根据Master将Minion数量进行适当的调整
timeout:可根据Master和Minion的网络状况适当调整
auto_accept和autosign_file:在大规模部署Minion时可设置自动签证
master_tops和所有以external开头的参数:这些参数是SaltStack与外部系统进行整合的相关配置参数
saltstack的认证机制
saltstack主控端是依靠openssl证书来与受控端主机认证通讯的,受控端启动后会发送给主控端一个公钥证书文件,在主控端用salt-key命令来管理证书。

master与minion的认证过程
minion在第一次启动时会在/etc/salt/下生成/pki/minion目录,并在下面创建minion.pem(私钥)和minion.pub(公钥)。
然后主动将minion.pub发送到master的/etc/salt/pki/master/minions.pre/下面,并且文件以minion的id文件内的数据命名,等待认证。
在master上执行salt-key -L命令可以查看等待签证的minion。
执行salt-key -A -y命令同意所有没有签证的minion。
这时minion会在/etc/salt/pki/minion/下生成minion_master.pub文件,注这个是master的公钥文件。
并且master会将/pki/master/minions.pre目录下的公钥转移到/pki/master/minions/目录下表示已经认证,这时master就可以管理minion了。

二.安装部署SaltStack

1.配置yum源

cat /etc/issue.net
CentOS release 6.7 (Final)

在 Master 端和 Minion 端都需要安装 epel 的 yum源
注意网上很多教程的centos6源都已过期,注意切换到存档源


#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-archive-6.repo
#wget http://archives.fedoraproject.org/pub/archive/epel/6/x86_64/epel-release-6-8.noarch.rpm
#rpm -ivh epel-release-6-8.noarch.rpm 

#Centos7源
#wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

安装Centos6源


wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-6.10.repo
wget -O /etc/yum.repos.d/salt.repo https://archive.repo.saltproject.io/yum/redhat/6/x86_64/saltstack-rhel6.repo
sed -i 's/repo.saltstack.com/archive.repo.saltproject.io/g' /etc/yum.repos.d/salt*.repo
yum clean expire-cache

当前环境配置的示例ip
Master: 192.168.0.11
Minion: 192.168.0.73
环境说明:

主机名 IP 所需应用 系统
master(控制节点) 192.168.0.11 salt-master salt-minion CentOS6.7
minion01(被控节点) 192.168.0.12 salt-minion CentOS6.7

2. master端安装salt-master

当前python为2.6
python -V
Python 2.6.6

yum list |grep salt

PyYAML.x86_64 3.11-1.el6 @saltstack/6.7
python-crypto.x86_64 2.6.1-2.el6 @saltstack/6.7
python-futures.noarch 3.0.3-1.el6 @saltstack/6.7
python-jinja2.noarch 2.7.3-1.el6 @saltstack/6.7
python-markupsafe.x86_64 0.11-10.el6 @saltstack/6.7
python-tornado.x86_64 4.2.1-1.el6 @saltstack/6.7
python-zmq.x86_64 14.5.0-2.el6 @saltstack/6.7
salt.noarch 2016.3.1-1.el6 @saltstack/6.7
salt-minion.noarch 2016.3.1-1.el6 @saltstack/6.7
zeromq.x86_64 4.0.5-4.el6 @saltstack/6.7
python-salttesting.noarch 2015.7.10-1.el6 epel-archive
salt-api.noarch 0.8.2-0.el6 epel-archive
salt-cloud.noarch 0.8.8-1.el6 epel-archive

注意切成 archive.repo.saltproject.io 后再安装.
我这里之前安装过老版本salt-minion,现升级为3000.5,之前版本都有些安全漏洞.

yum clean expire-cache

yum install salt-master

Installing:
salt-master noarch 3000.5-1.el6 saltstack-repo 3.0 M
Installing for dependencies:
PyYAML27 x86_64 3.11-3.el6 saltstack-repo 152 k
python27 x86_64 2.7.13-3.ius.el6 saltstack-repo 82 k
python27-babel noarch 0.9.4-5.3.el6 saltstack-repo 1.4 M
python27-backports x86_64 1.0-7.el6 saltstack-repo 5.1 k
python27-backports-ssl_match_hostname noarch 3.4.0.2-4.el6 saltstack-repo 11 k
python27-backports_abc noarch 0.5-11.el6 saltstack-repo 15 k
python27-chardet noarch 3.0.4-8.el6 saltstack-repo 188 k
python27-crypto x86_64 2.6.1-5.el6 saltstack-repo 501 k
python27-futures noarch 3.0.3-3.el6 saltstack-repo 27 k
python27-idna noarch 2.7-4.el6 saltstack-repo 102 k
python27-ipaddress noarch 1.0.18-6.el6 saltstack-repo 36 k
python27-jinja2 noarch 2.8.1-3.el6 saltstack-repo 284 k
python27-libs x86_64 2.7.13-3.ius.el6 saltstack-repo 5.6 M
python27-markupsafe x86_64 0.11-12.el6 saltstack-repo 24 k
python27-msgpack x86_64 0.6.2-2.el6 saltstack-repo 83 k
python27-psutil x86_64 5.4.2-1.ius.el6 saltstack-repo 383 k
python27-pycurl x86_64 7.19.0-11.el6 saltstack-repo 76 k
python27-pysocks noarch 1.6.8-7.el6 saltstack-repo 30 k
python27-requests noarch 2.20.1-3.el6 saltstack-repo 120 k
python27-setuptools noarch 36.6.0-1.ius.el6 saltstack-repo 605 k
python27-singledispatch noarch 3.4.0.3-16.el6 saltstack-repo 19 k
python27-six noarch 1.9.0-4.el6 saltstack-repo 29 k
python27-urllib3 noarch 1.23-6.el6 saltstack-repo 180 k
python27-zmq x86_64 14.5.0-4.el6 saltstack-repo 478 k
Updating for dependencies:
salt noarch 3000.5-1.el6 saltstack-repo 11 M
salt-minion noarch 3000.5-1.el6 saltstack-repo 40 k

Transaction Summary

Install 25 Package(s)
Upgrade 2 Package(s)

Total download size: 24 M
Is this ok [y/N]:

以下可装可不装
yum install salt-ssh
yum install salt-syndic
yum install salt-cloud
yum install salt-api

master只监听内网


#手动编辑 vi /etc/salt/master
#interface: 192.168.0.11
#sed -i 's/#interface: 0.0.0.0/interface: 192.168.0.11/g' /etc/salt/master 
echo 'interface: 192.168.0.11' >> /etc/salt/master 

iptables开放内网端口4505和4506
iptables -A INPUT -p tcp -m tcp -s 192.168.0.0/24 -m multiport –dports 4505,4506 -j ACCEPT
/etc/init.d/iptables save

启动
/etc/init.d/salt-master start

开机启动
chkconfig salt-master on
chkconfig –list salt-master

查看当前salt版本
salt –version
salt 3000.5

查看当前salt组件版本
salt –versions-report
Salt Version:
Salt: 3000.5

Dependency Versions:
cffi: Not Installed
cherrypy: Not Installed
dateutil: Not Installed
docker-py: Not Installed
gitdb: Not Installed
gitpython: Not Installed
Jinja2: 2.8.1
libgit2: Not Installed
M2Crypto: Not Installed
Mako: Not Installed
msgpack-pure: Not Installed
msgpack-python: 0.6.2
mysql-python: Not Installed
pycparser: Not Installed
pycrypto: 2.6.1
pycryptodome: Not Installed
pygit2: Not Installed
Python: 2.7.13 (default, May 8 2020, 22:36:22)
python-gnupg: Not Installed
PyYAML: 3.11
PyZMQ: 14.5.0
smmap: Not Installed
timelib: Not Installed
Tornado: 4.5.3
ZMQ: 4.0.5

System Versions:
dist: centos 6.7 Final
locale: UTF-8
machine: x86_64
release: 2.6———.el6.x86_64
system: Linux
version: CentOS 6.7 Final

3.安装 minion 端

在minion机
配置yum源
wget -O /etc/yum.repos.d/salt.repo https://archive.repo.saltproject.io/yum/redhat/6/x86_64/saltstack-rhel6.repo
sed -i ‘s/repo.saltstack.com/archive.repo.saltproject.io/g’ /etc/yum.repos.d/salt.repo

yum list |grep salt

修复[Errno 14]ssl错误
Loading mirror speeds from cached hostfile
https://archive.repo.saltproject.io/yum/redhat/6/x86_64/latest/repodata/repomd.xml: [Errno 14] problem making ssl connection
Trying other mirror.
关闭salt源,修改salt.repo
将里面的enabled=1改成enabled=0
sed -i ‘s/enabled=1/enabled=0/g’ /etc/yum.repos.d/salt.repo
sed -n ‘/^enabled=/p’ /etc/yum.repos.d/salt.repo

yum -y install ca-certificates
yum -y update curl nss
如果还不行,那需要升级openssl等组件或者换个非https的源

再次打开salt源
sed -i ‘s/enabled=0/enabled=1/g’ /etc/yum.repos.d/salt.repo
sed -n ‘/^enabled=/p’ /etc/yum.repos.d/salt.repo

安装 salt-minion

备份原配置文件,如果有的话
mv /etc/salt/minion /etc/salt/minion.2016.bak

yum clean expire-cache
yum -y install salt-minion

Dependencies Resolved

Package Arch Version Repository Size

Installing:
salt-minion noarch 3000.5-1.el6 saltstack-repo 40 k
Installing for dependencies:
PyYAML27 x86_64 3.11-3.el6 saltstack-repo 152 k
libyaml x86_64 0.1.3-4.el6_6 os 52 k
python27 x86_64 2.7.13-3.ius.el6 saltstack-repo 82 k
python27-babel noarch 0.9.4-5.3.el6 saltstack-repo 1.4 M
python27-backports x86_64 1.0-7.el6 saltstack-repo 5.1 k
python27-backports-ssl_match_hostname noarch 3.4.0.2-4.el6 saltstack-repo 11 k
python27-backports_abc noarch 0.5-11.el6 saltstack-repo 15 k
python27-chardet noarch 3.0.4-8.el6 saltstack-repo 188 k
python27-crypto x86_64 2.6.1-5.el6 saltstack-repo 501 k
python27-futures noarch 3.0.3-3.el6 saltstack-repo 27 k
python27-idna noarch 2.7-4.el6 saltstack-repo 102 k
python27-ipaddress noarch 1.0.18-6.el6 saltstack-repo 36 k
python27-jinja2 noarch 2.8.1-3.el6 saltstack-repo 284 k
python27-libs x86_64 2.7.13-3.ius.el6 saltstack-repo 5.6 M
python27-markupsafe x86_64 0.11-12.el6 saltstack-repo 24 k
python27-msgpack x86_64 0.6.2-2.el6 saltstack-repo 83 k
python27-psutil x86_64 5.4.2-1.ius.el6 saltstack-repo 383 k
python27-pycurl x86_64 7.19.0-11.el6 saltstack-repo 76 k
python27-pysocks noarch 1.6.8-7.el6 saltstack-repo 30 k
python27-requests noarch 2.20.1-3.el6 saltstack-repo 120 k
python27-setuptools noarch 36.6.0-1.ius.el6 saltstack-repo 605 k
python27-singledispatch noarch 3.4.0.3-16.el6 saltstack-repo 19 k
python27-six noarch 1.9.0-4.el6 saltstack-repo 29 k
python27-urllib3 noarch 1.23-6.el6 saltstack-repo 180 k
python27-zmq x86_64 14.5.0-4.el6 saltstack-repo 478 k
salt noarch 3000.5-1.el6 saltstack-repo 11 M
zeromq x86_64 4.0.5-4.el6 saltstack-repo 568 k

Transaction Summary

Install 28 Package(s)

Total download size: 22 M
Installed size: 99 M
Is this ok [y/N]:

指定 master 的ip地址


#替换#master: salt
#sed -i 's/#master: salt/master: 192.168.0.11/g' /etc/salt/minion 
#sed -i 's/master: 192.168.4.138/master: 192.168.0.56/g' /etc/salt/minion 

推荐在尾部添加
echo ‘master: 192.168.0.56’ >> /etc/salt/minion
echo ‘environment: prd’ >> /etc/salt/minion
echo ‘hash_type: sha256’ >> /etc/salt/minion

再次确认master ip地址
sed -n ‘/^master:/p’ /etc/salt/minion
master: 192.168.0.11

指定minion的id
id默认为hostname,如需修改可以编辑minion配置文件的#id:
sed -i ‘s/^#id:/id: c1g-w32/g’ /etc/salt/minion #注意id:后的空格

推荐直接编辑id文件
echo hostname >/etc/salt/minion_id

查看当前版本
salt-minion –version
salt-minion 3000.5

启动服务
/etc/init.d/salt-minion start
Starting salt-minion:root:c1g-w32 daemon: OK

开机启动
chkconfig salt-minion on
chkconfig –list salt-minion

关闭服务
/etc/init.d/salt-minion stop

查看当前id
cat /etc/salt/minion_id

如id错误,修改当前id
echo ‘c1g-w32’ >/etc/salt/minion_id

4.C/S认证

在master机
salt-key 密钥管理

salt-key -L 查看当前需要接受的keys(master和minions都需要把服务开启)。
//salt-key常用选项
-L //列出所有公钥信息
-a minion //接受指定minion等待认证的key
-A //接受所有minion等待认证的key
-r minion //拒绝指定minion等待认证的key
-R //拒绝所有minion等待认证的key
-f minion //显示指定key的指纹信息
-F //显示所有key的指纹信息
-d minion //删除指定minion的key
-D //删除所有minion的key
-y //自动回答yes

查看当前证书情况
salt-key -L
Accepted Keys:
Denied Keys:
Unaccepted Keys:
c1g-w32
Rejected Keys:

单独接受c1g-w32
salt-key -ya c1g-w32

The following keys are going to be accepted:
Unaccepted Keys:
c1g-w32
Key for minion c1g-w32 accepted.

再次查看
salt-key -L
Accepted Keys:
c1g-w32
Denied Keys:
Unaccepted Keys:
Rejected Keys:

接受所有的minion证书
salt-key -yA

5.远程命令执行

测试master和minion之间的通信是否正常
salt “c1g-w32” test.ping
c1g-w32:
True

salt “*” test.ping
c1g-w32:
True

salt ‘*’ cmd.run ‘df -h’

salt ‘*’ cmd.run ‘yum -y install tree’

三.SaltStack 相关命令

1.在master上配置nodegroup

1.在/etc/salt/master的最下面加上default_include
echo ‘default_include: master.d/*.conf’ >> /etc/salt/master

2.编辑组
不要用I@ 会匹配不到
vim /etc/salt/master.d/group.conf
nodegroups:
proxy: ‘E@c1g-w0[1-7]’
nginx: ‘E@c1g-w0[8-9] or E@c1g-w[1][0-9] or E@c1g-w2[0-3] or E@c1g-w3[3-6] or L@c1g-w31’
bak: ‘L@c1g-w37’
manage: ‘E@c1g-w2[4-8] or E@c1g-w3[0-2]’

无需重启

3.测试组
salt -N proxy test.version
salt -N nginx test.version
c1g-w35:
3000.5
c1g-w36:
3000.5

salt命令使用

salt远程执行命令
//语法:salt [options] ” [arguments]

//常用的options
–version //查看saltstack的版本号
–versions-report //查看saltstack以及依赖包的版本号
-h //查看帮助信息
-c CONFIG_DIR //指定配置文件目录(默认为/etc/salt/)
-t TIMEOUT //指定超时时间(默认是5s)
–async //异步执行
-v //verbose模式,详细显示执行过程
–username=USERNAME //指定外部认证用户名
–password=PASSWORD //指定外部认证密码
–log-file=LOG_FILE //指定日志记录文件

//常用target参数
-E //正则匹配
-L //列表匹配
-S //CIDR匹配网段
-G //grains匹配
–grain-pcre //grains加正则匹配
-N //组匹配
-R //范围匹配
-C //综合匹配(指定多个匹配)
-I //pillar值匹配

查看所有的function:
salt “c1g-w32” sys.doc cmd

默认的规则是使用glob匹配minion id
salt ‘‘ test.ping salt ‘node‘ test.ping
正则表达式
salt ‘node[1|2]’ test.ping
salt ‘node[!2]’ test.ping
salt -E ‘server[1-3]’ test.ping
salt -E ‘node(1|2)’ test.ping
指定列表
salt -L ‘server2,server3’ test.ping
指定ip
salt -S ‘192.168.0.13’ test.ping
指定ip段
salt -S ‘192.168.0.0/24’ test.ping

测试
salt ‘*’ test.echo ‘hello’

网络
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.network.html
salt ‘‘ network.ping baidu.com # 使用ping命令测试到某主机的连通性 salt ‘‘ network.connect baidu.com 80 # #测试minion至某一台服务器的网络是否连通
salt ‘‘ network.default_route #查看默认路由 network.get_route #查询到一个目标网络的路由信息 network.netstat #返回所有打开的端口和状态 network.routes #返回当前路由表 salt ‘‘ network.get_hostname # 获取主机名
salt ‘‘ network.active_tcp # 返回所有活动的tcp连接 salt ‘‘ network.ip_addrs # 返回一个IPv4的地址列表
salt ‘‘ network.get_fqdn # 查看主机的fqdn(完全限定域名) salt ‘‘ network.interfaces

salt ‘‘ service.available sshd # 查看ssh服务是否可达 salt ‘‘ service.get_all # 查看所有启动的服务
salt ‘‘ service.status nginx # 查看指定服务是否在线 salt ‘‘ state.show_top # 查看top_file情况
salt ‘*’ disk.usage

查看进程
salt c1g-w01 cmd.run ‘ps aux|grep titanagent’
c1g-w01:

查看chconfig zabbix是否开启
salt ‘c1g-w01’ cmd.run ‘chkconfig –list|grep zabbix_agentd’
salt -N bak cmd.run ‘chkconfig –list|grep zabbix_agentd’
salt ‘*’ cmd.run ‘chkconfig –list|grep zabbix_agentd’

salt-run
salt-run [options] [runner.func]
salt-run manage.status ##查看所有minion状态
salt-run manage.down ##查看所有没在线minion
salt-run manged.up ##查看所有在线minion

salt-call
该命令通常在minion上执行,minion自己执行可执行模块,不是通过master下发job
salt-call [options] [arguments]
salt-call test.ping ##自己执行test.ping命令
salt-call cmd.run ‘ifconfig’ ##自己执行cmd.run函数

文件分发salt-cp
salt-cp命令用于复制一个文件到多个minion系统中。指定minion可以使用通配符、正则表达式、Grains等方法
分发文件到minion上,不支持目录分发,通常在master运行
salt-cp [options] ” SOURCE DEST
salt-cp ‘‘ testfile.html /tmp salt-cp ‘node‘ /opt/index.html /tmp/a.html

salt-cp ‘*’ /etc/hosts /etc #不用创建上面的sls即可实现(不建议此方法)

更新nginx 的nginx.conf

salt-cp ‘c1g-w3’ /srv/salt/prd/server/c1g-w3/opt/nginx/conf/nginx.conf /opt/nginx/conf/

salt ‘c1g-w3’ cmd.run ‘/opt/nginx/sbin/nginx -t’
salt ‘c1g-w3’ cmd.run ‘/opt/nginx/sbin/nginx -s reload’

Saltstack配置管理

修改file_root文件目录
文件件中的flie_roots选项管理。Salt文件服务器的默认环境为为base环境,base环境必须定义,因为
当环境没有明确指定时,文件下载就是从base环境中去找的。其配置如下:
文件服务器在给minions传输文件时,是有搜索顺序的。配置说明:如果文件URL为:salt://httpd/httpd.conf。那么传输文件时,先搜
索/srv/salt/base/httpd/httpd.conf,如果找到了,则下载;否则就使用 /srv/salt/failover/httpd/httpd.conf

注意:
如果minion里定义了environment,那么master里也要有对应的environment

echo ‘environment: prd’ >> /etc/salt/minion

否则出会现以下环境对不上的错误
No matching salt environment for environment ‘prd’ found

vim /etc/salt/master
file_roots:
base:
– /srv/salt/base
– /srv/salt/failover
dev:
– /srv/salt/dev
– /srv/salt/base
prd:
– /srv/salt/prd
– /srv/salt/base

创建文件目录
mkdir /srv/{salt,pillar}
mkdir -p /srv/salt/{base,dev,prd,failover}/init/files

编写.sls文件
sls文件是YAML语言来进行描述的,请遵循YAML语法规范

Online YAML Parser: Convert YAML to JSON or Python data structures.
https://yaml-online-parser.appspot.com/

The Official YAML Specification
https://yaml.org/spec/1.2.2/
WHAT IS YAML
https://docs.saltproject.io/en/latest/topics/yaml/index.html

规则一: 缩进
Salt需要每个缩进级别由两个空格组成,不要使用tabs。
如果你遇到“rendering sls files errors”等错误,请检查你的sls文件,确保没有Tab等非法符合

规则二: 冒号
字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。
my_key: my_value

映射到Python里面就是:
{‘my_key’: ‘my_value’}
不常见,通常情况下,一个key的value不是单一的,而是一个 列表 的values

规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
key:

  • v1
  • v2
  • v3

映射到Python里面就是:
{‘key’: [v1,v2,v3]}
这个在Salt很常见.

规则四: 嵌套
基本遵循2个空格的缩进,只有定义context,defaults选项的时候才使用四个空格作为缩进。用大括号的除外。

批量修改/etc/resolv.conf文件示例
file.manage
https://docs.saltproject.io/en/latest/ref/states/all/salt.states.file.html#salt.states.file.managed
cd /srv/salt/base
vim init/dns.sls
/etc/resolv.conf: #标签
file.managed: #状态模块file的mamaged方法,用以实现
– source: salt://init/files/resolv.conf #源文件resolv.conf
– user: root #文件用户属主
– group: root #文件数组
– mode: 644 #文件权限

init/files/resolv.conf 
# Generated by NetworkManager
nameserver 192.168.0.11
nameserver 114.114.114.114

top.sls文件是必需的
vim top.sls
base:
‘: – dns dev: ‘‘:
– dns
prd:
‘*’:
– dns

重启服务
/etc/init.d/salt-master restart

执行dns状态文件
salt ‘c1g-w02’ state.sls init.dns

c1g-w02:
----------
          ID: /etc/resolv.conf
    Function: file.managed
      Result: True
     Comment: File /etc/resolv.conf updated
     Started: 14:36:30.204689
    Duration: 70.436 ms
     Changes:   
              ----------
              diff:
                  --- 
                  +++ 
                  @@ -1,4 +1,4 @@
                  -; generated by /sbin/dhclient-script
                  +# Generated by NetworkManager
                   nameserver 192.168.0.11
                   nameserver 114.114.114.114
                  +

Summary for c1g-w02
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  70.436 ms

指定环境运行
salt -N bak state.sls saltenv=’prd’ init.dns

state高级状态默认从top文件中执行
salt ‘c1g-w03’ state.highstate

常用文档地址
grains
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.grains.html
user.list_users
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.useradd.html#salt.modules.useradd.list_users
SALT.MODULES.CP
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.cp.html
SALT.MODULES.CP
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.cron.html#module-salt.modules.cron
SALT.MODULES.DISK
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.disk.html
SALT.MODULES.DNSMASQ
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.dnsmasq.html
SALT.MODULES.ELASTICSEARCH
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.elasticsearch.html
SALT.MODULES.ETHTOOL
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.ethtool.html
SALT.MODULES.FILE
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.file.html
SALT.MODULES.HOSTS
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.hosts.html
SALT.MODULES.HTTP
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.http.html
SALT.MODULES.IPTABLES
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.iptables.html
SALT.MODULES.LINUX_IP
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.linux_ip.html
SALT.MODULES.LINUX_LVM

https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.linux_lvm.html
SALT.MODULES.LINUX_SERVICE
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.linux_service.html
SALT.MODULES.LOCALEMOD
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.localemod.html

https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.logrotate.html

https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.memcached.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.minion.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.network.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.nginx.html#

https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.pillar.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.rabbitmq.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.redismod.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.rsync.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.saltcheck.html#
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.saltutil.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.schedule.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.scp_mod.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.selinux.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.splunk.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.ssh.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.ssh_service.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.status.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.svn.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.system.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.timezone.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.useradd.html
https://docs.saltproject.io/en/latest/ref/modules/all/salt.modules.varnish.html

参考:
https://www.cnblogs.com/0x00000/p/5790918.html
https://tsov.net/uupee/23010/
https://www.jianshu.com/p/9fc253c35189

Posted in saltstack/ansible, 技术.


windows下VMware 虚拟机转换到 VirtualBox

在将 VMware 虚拟机迁移到 Vbox 之前,确保在 VMware 的状态为“关闭电源” —— 非挂起。如果是挂起,启动虚拟机然后关机。
接下来,找到 OVFTool 所在目录。如果你用的是 VMware Player,目录在类似 C:\Program Files (x86)\VMware\VMware Player\OVFTool。按住 Shift 键,右击选择在此处打开命令行窗口。

G:\Program Files\vmware\VMware Workstation\OVFTool

G:\vmos\CentOS 7_mini_vm5\CentOS 7_mini_vm5.vmx
ovftool “G:\vmos\CentOS 7_mini_vm5\CentOS 7_mini_vm5.vmx” G:\vmos\CentOS7_mini_vr\centos7.ovf

Opening VMX source: G:\vmos\CentOS 7_mini_vm5\CentOS 7_mini_vm5.vmx
Opening OVF target: G:\vmos\CentOS7_mini_vr\centos7.ovf
Writing OVF package: G:\vmos\CentOS7_mini_vr\centos7\centos7.ovf
Transfer Completed
Completed successfully

过程结束之后,可以使用管理菜单中的导入虚拟电脑选项,将 .ovf 文件导入 Vbox。

 

Posted in 技术.

Tagged with , .


安装一个自已的DNS服务器dnsmasq

补发丢失贴子

centos下超简单

yum install dnsmasq

vim /etc/dnsmasq.conf

# 让dnsmasq读取目录内所有配置文件
# conf-dir=/etc/dnsmasq.d
# 让dnsmasq读取设定的resolv-file
# no-resolv
no-poll
strict-order
resolv-file=/etc/dnsmasq.d/resolv.dnsmasq.conf

# 不读取系统hosts,读取你设定的
no-hosts
addn-hosts=/etc/dnsmasq.d/dnsmasq.hosts
# dnsmasq日志设置
log-queries
# dnsmasq缓存设置
cache-size=1024
# 单设置127只为本机使用,加入本机IP为内部全网使用
listen-address=127.0.0.1,192.168.0.56
echo 'no-poll' >> /etc/dnsmasq.conf
echo 'strict-order' >> /etc/dnsmasq.conf
echo 'resolv-file=/etc/dnsmasq.d/resolv.dnsmasq.conf' >> /etc/dnsmasq.conf
echo 'addn-hosts=/etc/dnsmasq.d/dnsmasq.hosts' >> /etc/dnsmasq.conf
echo 'log-queries' >> /etc/dnsmasq.conf
echo 'cache-size=1024' >> /etc/dnsmasq.conf
echo 'listen-address=127.0.0.1,10.100.131.1' >> /etc/dnsmasq.conf


cp /etc/hosts /etc/dnsmasq.d/dnsmasq.hosts

vi /etc/resolv.conf
nameserver 127.0.0.1

vi /etc/dnsmasq.d/resolv.dnsmasq.conf
nameserver 114.114.114.114
nameserver 223.5.5.5



dnsmasq --test
dnsmasq: syntax check OK.


/etc/init.d/dnsmasq start

chkconfig dnsmasq on

iptables -A INPUT -p tcp -m state -s 192.168.0.0/24 --state NEW --dport 53 -j ACCEPT
iptables -A INPUT -p udp -m state -s 192.168.0.0/24 --state NEW --dport 53 -j ACCEPT

/etc/init.d/iptables save

客户端
vi /etc/resolv.conf
nameserver 192.168.0.56

dnsmasq -v
Dnsmasq version 2.48 Copyright (C) 2000-2009 Simon Kelley
Compile time options IPv6 GNU-getopt DBus no-I18N DHCP TFTP “–bind-interfaces with SO_BINDTODEVICE”

This software comes with ABSOLUTELY NO WARRANTY.
Dnsmasq is free software, and you are welcome to redistribute it
under the terms of the GNU General Public License, version 2 or 3.

http://pub-shbt.s3.360.cn/cert-public-file/%E3%80%90360CERT%E3%80%91Dnsmasq__%E5%A4%9A%E4%B8%AA%E9%AB%98%E5%8D%B1%E6%BC%8F%E6%B4%9E%E9%A3%8E%E9%99%A9%E9%80%9A%E5%91%8A.pdf
修复安全漏洞,启动时加上 –dns-forward-max=100

vi /etc/init.d/dnsmasq


  start)
        if [ $UID -ne 0 ] ; then
            echo "User has insufficient privilege."
            exit 4
        fi
        echo -n "Starting dnsmasq: "
        daemon $dnsmasq --dns-forward-max=100 $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/dnsmasq

重启
/etc/init.d/dnsmasq restart
验证
ps aux|grep dnsmasq

nobody 28688 0.0 0.0 12888 712 ? S 11:42 0:00 /usr/sbin/dnsmasq –dns-forward-max=100

开启日志

log-facility=/var/log/dnsmasq.log

vi /etc/logrotate.d/dnsmasq
输入:
/var/log/dnsmasq.log {
notifempty
weekly
dateext
rotate 58
sharedscripts
postrotate
[ ! -f /var/run/dnsmasq.pid ] || kill -USR2 cat /var/run/dnsmasq.pid
endscript
}

/usr/sbin/logrotate -vf /etc/logrotate.conf

统计dnsmasq的解析

cat /var/log/dnsmasq.log |grep ‘query[A]’|gawk ‘{print $6}’|sort|uniq -c|sort -nr

Posted in dns/dnsmasq.

Tagged with , .


nginx+syslog-ng实现web日志集中管理

补发丢失的贴子

简单的要求是本地和中心都要可以实时记录日志,方便安装、管理及扩展。
参考了下其它的方案,觉得syslog-ng是很方便高效的,并且已有现成的syslog-ng+splunk中心服务器.
Scribe是facebook开源的日志收集系统,c/c++实现,可用于搜索引擎中进行大规模日志分析处理。其通常与Hadoop结合使用,安装非常复杂.主要包括三部分,分别为scribe agent, scribe和存储系统
Apache的Chukwa,属于hadoop系列产品,java实现, 因而使用了很多hadoop的组件(用HDFS存储,用mapreduce处理数据),主要有3种角色,分别为:adaptor,agent,collector
LinkedIn的Kafka 采用scala语言编写,Kafka是高吞吐量的分布式发布订阅消息系统,主要有三种角色,分别为producer,broker和consumer.支持Hadoop并行数据加载
Cloudera的Flume ,由三层组成,分别为agent,collector和storage.java实现,配置复杂
logstash Logstash 的过滤器是用 Ruby 写的,Kibana 是用纯 Javascript 写的,而 ElasticSearch 也有自己的 REST 接口和 JSON 模板。

graylog2比Kibana要弱

syslog-ng方案尝试了几种方式

nginx 1.7.1 起支持syslog

1.tnginx(nginx)通过syslog输出,本地用syslog接收并写入本地和发送至syslog-ng中心服务器.
A.每条访问日志前会有syslog的时间戳.
B.多个web日志文件分离不方便.
功能及便利就不如syslog-ng了,不推荐使用.
2.tnginx(nginx)不做修改还是输出至文件,syslog-ng监控本地文件并将变动发送至syslog-ng中心服务器.
syslog-ng中心服务器没有应用程序标记无法分离日志.
3.web访问日志通过tengine或nginx的syslog方式输出到本地syslog-ng服务,syslog-ng将日志保存在本地,并发送一份至syslog-ng中心服务器.
推荐使用

->local file tengine->local syslog-ng(syslog) ->remote syslog-ng

一.syslog-ng安装

先安装syslog-ng,本地及中心服务器都装上
最新版为syslog-ng_3.4.8,需python2.5以上支持,我用syslog-ng_3.3.9.

checking for a Python interpreter with version >= 2.5… none
configure: error: no suitable Python interpreter found
configure: error: ./configure.gnu failed for modules/afamqp/rabbitmq-c


wget https://my.balabit.com/downloads/libol/0.3/libol-0.3.18.tar.gz
wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.9/source/syslog-ng_3.3.9.tar.gz
wget http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.9/source/eventlog_0.2.12.tar.gz

wget http://www.balabit.com/downloads/files?path=/libol/0.3/libol-0.3.18.tar.gz http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.9/source/syslog-ng_3.3.9.tar.gz http://www.balabit.com/downloads/files/syslog-ng/open-source-edition/3.3.9/source/eventlog_0.2.12.tar.gz

1.安装eventlog

tar -zxvf eventlog_0.2.12.tar.gz
cd eventlog-0.2.12
./configure –prefix=/usr/local/eventlog_0.2.12
make && make install
cd /usr/local/
ln -s eventlog_0.2.12 eventlog
cd –

2.安装libol
mv files?path=%2Flibol%2F0.3%2Flibol-0.3.18.tar.gz libol-0.3.18.tar.gz tar -zxvf libol-0.3.18.tar.gz cd libol-0.3.18 ./configure –prefix=/usr/local/libol-0.3.18 make && make install cd /usr/local/ ln -s libol-0.3.18 libol cd –

3.安装syslog-ng

yum install pcre

设置环境变量

export PKG_CONFIG_PATH=/usr/local/eventlog/lib/pkgconfig/:/usr/local/lib/pkgconfig/:$PKG_CONFIG_PATH

openssl如果升级过,编不过去可以关闭
–disable-ssl

tar -zxvf syslog-ng_3.3.9.tar.gz
cd syslog-ng-3.3.9
./configure –prefix=/usr/local/syslog-ng_3.3.9 –with-libol=/usr/local/libol/ –enable-pcre –disable-ipv6
make && make install
cd /usr/local/
ln -s syslog-ng_3.3.9 syslog-ng

/usr/local/syslog-ng_3.3.9/sbin/syslog-ng -V

二.方式1配置

vi /opt/nginx/conf/nginx.conf
access_log syslog:local5:notice:/dev/log:adminsyslog.c1gstudio.com access ;

查看是否是syslogd服务
ps aux|grep log
root 19199 0.0 0.0 6328 1108 ? Ss 2013 0:24 syslogd -m 0

vi /etc/init.d/syslog
SYSLOGD_OPTIONS=”-r -x -m 0″
-r: 打开接受外来日志消息的功能,其监控514 UDP端口;
-x: 关闭自动解析对方日志服务器的FQDN信息,这能避免DNS不完整所带来的麻烦;

vi /etc/syslog.conf

local5.* /opt/nginx/logs/weblog

local5.* @192.168.0.39

重启syslog服务
/etc/init.d/syslog restart

本地文件及splunk会记录日志

三.方式2配置

注释掉/etc/syslog.conf中的修改

vi /usr/local/syslog-ng/etc/syslog-ng.conf

source s_webfile { file(“/opt/nginx/logs/access.log”); };

destination r_centerlog { udp(“192.168.0.39” port(514) ); };

log { source(s_webfile); destination(r_centerlog); };

<13>Jul 22 11:30:18 192.168.0.38 192.168.0.40 – c1g_web [22/Jul/2014:11:30:18 +0800] “GET /5 HTTP/1.0” 404 219 “-” “Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36” 116.210.54.88
本地文件及splunk会记录日志

四.方式3配置

vi /opt/nginx/conf/nginx.conf
access_log syslog:local5:notice:127.0.0.1:514:adminsyslog.c1gstudio.com access ;
php错误通过udp发送至syslog-ng中心服务器,web日志则通过tcp方式发送,并保存一份在/opt/nginx/logs/$PROGRAM.log

本地syslog-ng
vi /usr/local/syslog-ng/etc/syslog-ng.conf

@version: 3.3
@include “scl.conf”

options {
use_dns (no);
use_fqdn(no);
chain_hostnames(off);
keep_hostname(off);
flush_lines(0);
stats_freq(7200);
create_dirs(no);
};
source s_internal { internal(); };
destination d_syslognglog { file(“/var/log/syslog-ng.log”); };
log { source(s_internal); destination(d_syslognglog); };

source s_php { file(“/opt/php/logs/php_error.log”); };

source s_weblog { udp(ip(127.0.0.1) port(514) so_rcvbuf(8738000));};

filter f_weblog { facility(local5); };

destination r_remote { udp(“192.168.0.39” port(514) flush_lines(0) ); };
destination r_centerlog { tcp(“192.168.0.39” port(514) ); };

destination d_locallog { file(“/opt/nginx/logs/$PROGRAM.log” template(“$MSG\n”) owner(“www”) group(“website”) perm(0664) ) ); };

log { source(s_weblog); filter(f_weblog); destination(d_locallog); };
log { source(s_weblog); filter(f_weblog); destination(r_centerlog); };

log { source(s_php); destination(r_remote); };

要上没带上template(“$MSG\n”)会增加Jul 22 13:57:58 127.0.0.1 adminsyslog.c1gstudio.com[7150]:
Jul 22 13:57:58 127.0.0.1 adminsyslog.c1gstudio.com[7150]: 192.168.0.40 – c1g_web [22/Jul/2014:13:57:58 +0800] “GET /8 HTTP/1.0” 404 219 “-” “Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36” 116.210.54.88

syslog-ng中心服务器配置
mkdir -p /opt/log/

vi /usr/local/syslog-ng/etc/syslog-ng.conf

source s_remotetcp {
tcp(ip(192.168.0.39) port(514) log_fetch_limit(100) log_iw_size(50000) max-connections(50) );
};
filter f_filter11 { facility(local5); };
destination r_local5 { file(“/opt/log/$YEAR.$MONTH/$DAY/$PROGRAM.log” template(“$MSG\n”) owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes) flush_lines(300) ); };

log { source(s_remotetcp); filter(f_filter11); destination(r_local5); };

完整的syslog-ng.conf
我这里还带着splunk

@version: 3.3
@include “scl.conf”
options {
use_dns (no);
use_fqdn(no);
chain_hostnames(off);
keep_hostname(off);
flush_lines(0);
stats_freq(1200);
create_dirs(yes);
log_fifo_size(1000000);
};
source s_internal { internal(); };
destination d_syslognglog { file(“/var/log/syslog-ng.log”); };
log { source(s_internal); destination(d_syslognglog); };

source s_sys { system();file(“/proc/kmsg”); unix-stream(“/dev/log”);};
destination d_cons { file(“/dev/console”); };
destination d_mesg { file(“/var/log/messages”); };
destination d_auth { file(“/var/log/secure”); };
destination d_mail { file(“/var/log/maillog”); };
destination d_spol { file(“/var/log/spooler”); };
destination d_boot { file(“/var/log/boot.log”); };
destination d_cron { file(“/var/log/cron”); };
destination d_rsync { file(“/var/log/rsync”); };
destination d_mlal { usertty(“*”); };
filter f_filter1 { facility(kern); };
filter f_filter2 { level(info) and
not (facility(mail)
or facility(authpriv) or facility(cron)); };
filter f_filter3 { facility(authpriv); };
filter f_filter4 { facility(mail); };
filter f_filter5 { level(emerg); };
filter f_filter6 { facility(uucp) or
(facility(news) and level(crit)); };
filter f_filter7 { facility(local7); };
filter f_filter8 { facility(cron); };
filter f_filter9 { facility(daemon); };
filter f_filter10 { facility(local6); };
filter f_filter11 { facility(local5); };

log { source(s_sys); filter(f_filter1); destination(d_cons); };

log { source(s_sys); filter(f_filter2); destination(d_mesg); };
log { source(s_sys); filter(f_filter3); destination(d_auth); };
log { source(s_sys); filter(f_filter4); destination(d_mail); };
log { source(s_sys); filter(f_filter5); destination(d_mlal); };
log { source(s_sys); filter(f_filter6); destination(d_spol); };
log { source(s_sys); filter(f_filter7); destination(d_boot); };
log { source(s_sys); filter(f_filter8); destination(d_cron); };

Remote logging

source s_remote {
udp(ip(192.168.0.39) port(514));
};
source s_remotetcp {
tcp(ip(192.168.0.39) port(514) log_fetch_limit(100) log_iw_size(50000) max-connections(50) );
};

template t_weblog { template(“$MSG\n”); template_escape(no) );

destination r_mesg { file(“/var/log/syslog-ng/$YEAR.$MONTH/$HOST/messages” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes)); };
destination r_auth { file(“/var/log/syslog-ng/$YEAR.$MONTH/$HOST/secure” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes)); };
destination r_mail { file(“/var/log/syslog-ng/$YEAR.$MONTH/$HOST/maillog” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes)); };
destination r_spol { file(“/var/log/syslog-ng/$YEAR.$MONTH/$HOST/spooler” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes)); };
destination r_boot { file(“/var/log/syslog-ng/$YEAR.$MONTH/$HOST/boot.log” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes)); };
destination r_cron { file(“/var/log/syslog-ng/$YEAR.$MONTH/$HOST/cron” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes)); };
destination r_daemon { file(“/var/log/syslog-ng/$YEAR.$MONTH/$HOST/daemon” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes)); };
destination r_local6 { file(“/var/log/syslog-ng/$YEAR.$MONTH/network/messages” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes)); };
destination r_local5 { file(“/opt/log/$YEAR.$MONTH/$DAY/$PROGRAM.log” template(“$MSG\n”) owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes) flush_lines(300) ); };

destination d_separatedbyhosts {

file(“/var/log/syslog-ng/$HOST/messages” owner(“root”) group(“root”) perm(0640) dir_perm(0750) create_dirs(yes));

};

destination d_tcp { tcp(“localhost” port(1999) localport(999) flush_lines(100) ); };

log { source(s_remote); destination(d_separatedbyhosts); };

log { source(s_remote); filter(f_filter2); destination(r_mesg); };
log { source(s_remote); filter(f_filter3); destination(r_auth); };
log { source(s_remote); filter(f_filter4); destination(r_mail); };
log { source(s_remote); filter(f_filter6); destination(r_spol); };
log { source(s_remote); filter(f_filter7); destination(r_boot); };
log { source(s_remote); filter(f_filter8); destination(r_cron); };
log { source(s_remote); filter(f_filter9); destination(r_daemon); };
log { source(s_remote); filter(f_filter10); destination(r_local6); };

log { source(s_remotetcp); filter(f_filter11); destination(r_local5); };

log { source(s_remote); destination(d_tcp); };

打开iptables接收端口,这里只开放给内网
iptables -A INPUT -p tcp -m tcp -s 192.168.0.0/16 –dport 514 -j ACCEPT iptables -A INPUT -p udp -m udp -s 192.168.0.0/16 –dport 514 -j ACCEPT

启动/
/usr/local/syslog-ng/sbin/syslog-ng
syslogng参数优化
以下为4个关键参数默认值,调整不佳会丢消息
log_fetch_limit =10
max_connections =10
log_iw_size =1000
log_fifo_size =10000 输出队列的行数 出现以下错误说明参数值不合理
WARNING: window sizing for tcp sources were changed in syslog-ng 3.3, the configuration value was divided by the value of max-connections(). The result was too small, clamping to 100 entries. Ensure you have a proper log_fifo_size setting to avoid message loss.; orig_log_iw_size=’10’, new_log_iw_size=’100′, min_log_fifo_size=’10000′ 参数公式
log_iw_size = max_connections * log_fetch_limit
log_fifo_size = log_iw_size * (10~20) syslog-ng中心增加接收能力
source s_remotetcp { tcp(ip(192.168.0.39) port(514) log_fetch_limit(100) log_iw_size(50000) max-connections(50) ); }; log_fifo_size为全局输出值
options { use_dns (no); use_fqdn(no); chain_hostnames(off); keep_hostname(off); flush_lines(0); stats_freq(1200); create_dirs(yes); log_fifo_size(1000000); }; 本地udp接收带8M缓存
source s_weblog { udp(ip(127.0.0.1) port(514) so_rcvbuf(8738000)); }; 内核优化
/etc/sysctl.conf
net.core.rmem_max = 8738000 net.core.wmem_max = 6553600 net.ipv4.tcp_rmem = 8192 873800 8738000 net.ipv4.tcp_wmem = 4096 655360 6553600
sysctl 查看统计信息
/usr/local/syslog-ng/sbin/syslog-ng-ctl stats
SourceName;SourceId;SourceInstance;State;Type;Number destination;d_mail;;a;processed;0 destination;d_spol;;a;processed;0 destination;r_boot;;a;processed;0 global;payload_reallocs;;a;processed;86 source;s_internal;;a;processed;4 source;s_sys;;a;processed;52 destination;d_mesg;;a;processed;41 source;s_remotetcp;;a;processed;32426 destination;r_local5;;a;processed;32426 日志切割后需发个信号
…. /bin/mv ${log_dir}/proxy.www.c1gstudio.com.log ${log_dir}/proxy.www.c1gstudio.com.${yesterday}.log /bin/kill -USR1 cat /usr/local/syslog-ng/var/syslog-ng.pid /bin/gzip ${log_dir}/proxy.www.c1gstudio.com.${yesterday}.log & …. 开机启动
vi /etc/rc.local
/usr/local/syslog-ng/sbin/syslog-ng 碎碎念 使用/dev/log
会把syslog接管,远程目录会偏移
nginx
access_log syslog:local5:notice:/dev/log:adminsyslog.c1gstudio.com access ; 本地syslogng
source s_sys { unix-dgram (“/dev/log”);}; Jul 22 14:45:43 Caserver caserver adminsyslog.c1gstudio.com[13318]: 192.168.0.40 – c1g_web [22/Jul/2014:14:45:43 +0800] “GET /9 HTTP/1.0” 404 219 “-” “Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.146 Safari/537.36” 116.210.54.88
unix-stream()主要用在Linux,使用SOCK_STREAM参数,是面向连接的,不会造成日志消息的丢失;unix-dgram()用在BSD系统上,使用SOCK_DGRAM参数,是无连接的,如果系统过载,会造成日志消息丢失。
测试
logger -p local5.info hello 垃圾收集状态
当满足一定的条件,syslog-ng即会进入垃圾收集状态,而暂时不再接受日志信息。这时,会造成非连接的传输协议的日志丢失(例如UDP)。通过设置下面两个选项可以控制:
引用
gc_idle_threshold(n) :
意思是,一旦被分派的对象到达这个数字,并且当syslog-ng空闲时(100微秒内没有日志消息到达)。此时,syslog-ng就会启动垃圾信息收集状态。
已分配的对象可通过-v命令行参数指定其的最小值。而syslog-ng这个值应该比较小,但比已分配的对象要大即可。 例如,空闲状态,syslog-ng会显示:
引用
Nov 13 16:35:35 syslogng syslog-ng[4510]: STATS: dropped 0
Nov 13 16:45:35 syslogng syslog-ng[4510]: STATS: dropped 0 当忙时:
引用
gc_busy_threshold(n) :当syslog-ng忙时,一旦分派的对象达到这个数字,syslog-ng就进入垃圾信息收集状态的时间。该值应该比较高,以保证正常情况下不会打断日志消息的收取。 ※TCP基于连接方式传输,不会造成日志丢失,而UDP则不同。但因为传统的syslog基于UDP的514端口,所以,UDP方式也经常会使用到。 另外,514也是rshell的默认端口,请注意冲突。 参考:
https://pzolee.blogs.balabit.com/2011/02/syslog-ng-performance-tuning/
http://www.balabit.com/support/documentation/syslog-ng-ose-3.3-guides/en/syslog-ng-ose-v3.3-guide-admin-en/pdf/syslog-ng-ose-v3.3-guide-admin-en.pdf
http://dongxicheng.org/search-engine/log-systems/

Posted in Nginx, 日志.

Tagged with , , .