Centos 7 Zabbix Agent 客户端源码编译安装配置

Zabbix Agent 安装在远程系统上,需要通过Zabbix服务器进行监控。Zabbix Agent在客户端系统上收集资源利用和应用程序数据,并向Zabbix服务器提供这些信息。Zabbix支持Ping,ZBX、SNMP、JMX、IPMI等监控方式。

1. 安装扩展包以及依赖包

$ yum -y install epel-release
$ yum install pcre pcre-devel openssl openssl-devel -y

2. 添加Zabbix用户和组

$ groupadd zabbix
$ useradd zabbix -g zabbix -s /sbin/nologin

3. 安装Zabbix-Agent

下载地址:https://www.zabbix.com/download

$ cd /tmp
$ tar -zxvf zabbix-3.4.1.tar.gz
$ cd zabbix-3.4.1
$ ./configure --prefix=/usr/local/zabbix --enable-agent --with-mysql --with-openssl
$ make && make install

4. 创建Zabbix日志目录并生成(PSK)密钥

$ mkdir -p /usr/local/zabbix/logs/
$ chown -R zabbix.zabbix /user/local/zabbix
$ sh -c "openssl rand -hex 32 > /usr/local/zabbix/etc/zabbix_agentd.psk"
$ cat /usr/local/zabbix/etc/zabbix_agentd.psk
fd1ac849e5f787dfc04300ae997d158e6f6f0c2209d66e7d2e687da2032ecbae

5. 配置zabbix_agentd.conf

以下是配置完成后的内容:

$ egrep -v "(^#|^$)" /usr/local/zabbix/etc/zabbix_agentd.conf

EnableRemoteCommands=1 #来至zabbix服务器的远程命令是否允许被执行
PidFile=/usr/local/zabbix/zabbix_agentd.pid
LogFile=/usr/local/zabbix/logs/zabbix_agentd.log
Server=10.10.204.65 #Zabbix Server IP 地址
ServerActive=10.10.204.65 #地址同上 主动向 Zabbix Server 发送监控内容
Hostname=101020465 #本机主机名 内容要和Zabbix Server 配置的 Host Name 一致
HostMetadataItem=system.uname #用于Item获取数据
User=zabbix
UnsafeUserParameters=1 #是否启用自定义key,zabbix监控mysql、tomcat等数据时需要自定义key
#下面使用预共享密钥(PSK)来保护服务器和客户端之间的连接
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=PSK 001
TLSPSKFile=/usr/local/zabbix/etc/zabbix_agentd.psk

注意:关于更多Agent配置参数优化,请参阅这里(https://www.zabbix.com/documentation/3.4/zh/manual/appendix/config/zabbix_agentd)。

6. 创建systemctl系统Zabbix agent 单元文件

$ vim /usr/lib/systemd/system/zabbix-agent.service

[Unit]
Description=Zabbix Agent
After=syslog.target
After=network.target

[Service]
Environment="CONFFILE=/usr/local/zabbix/etc/zabbix_agentd.conf"
#EnvironmentFile=/usr/local/zabbix/etc/zabbix_agentd.conf.d/
Type=forking
Restart=on-failure
#PIDFile=/tmp/zabbix_agentd.pid
KillMode=control-group
ExecStart=/usr/local/zabbix/sbin/zabbix_agentd -c $CONFFILE
ExecStop=/bin/kill -SIGTERM $MAINPID
RestartSec=10s

[Install]
WantedBy=multi-user.target

7. 启动 Zabbix Agentd 客户端服务并加入开机自启动

$ systemctl start zabbix-agent
$ systemctl enable zabbix-agent

8. 设置 Firewalld 防火墙

$ firewall-cmd --permanent --add-port=10050/tcp
$ firewall-cmd --reload

已经完成 Zabbix Agent 的安装。后期我还会写一些关于zabbix的使用以及优化。

xtrabackup备份还原MySQL数据库

mysqldump 备份鉴于其自身的某些特性(锁表,本质上备份出来insert脚本或者文本,不支持差异备份),不太适合对实时性要求比较高的情况

Xtrabackup可以解决mysqldump存在的上述的一些问题,生产环境应用的也会更多一些。

本文简单测试一下Xtrabackup对MySQL数据库的备份还原操作。

本着先把功能先撸起来再深入细节的原则,粗略地实现了一个备份还原,并未深入细节。

网上有不少xtrabackup的文章,因为环境不一样,有些需要配置xtrabackup的配置文件,
但是我在xtrabackup 2.4.7版本下测试就需要需求任何配置文件。可能是每个版本都的细节上都不一样,因此参考资料的时候要注意版本和环境。

innobackupex 备份

xtrabackup和MySQL的版本如下

未分类

完整备份

innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/var/lib/mysql/mysql.sock /data/backup

说明:

1、 –defaults-file=/etc/my.cnf文件必须在最前面
2、 –user=root –password=root,–use=与 –password= 中间一定要有空格,

如截图,完整备份完成

未分类

如截图,完整备份会创建一个日期(年月日时分秒,yyyy-MM-dd_hh-mm-ss)命名的文件

完整备份出来的内存,实际上是对所备份的数据库的数据文件的copy加上备份时候产生的一些信息,
比如xtrabackup_checkpoints就是当前完整备份的一些个信息,这个信息对差异备份非常重要。

未分类

差异备份

差异备份之所以能够做到差异,就是依赖于完整备份的,在完整备份的基础上进行完整备份之后的差异的备份。
  
而如何确定完整的备份之后备份到哪里,就依赖于完整备份之后的xtrabackup_checkpoints这个文件的。
 

innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --socket=/var/lib/mysql/mysql.sock --incremental /data/backup --incremental-basedir=/data/backup/2017-06-22_13-40-29

如截图,差异备份完成

未分类

如果在进行差异备份的时候,指定的完整备份的文件错误或者是未指定完整备份文件,会发现xtrabackup提示找不到xtrabackup_checkpoints这个文件。

未分类

innobackupex 还原

准备阶段

1、 恢复完整备份,也即完整备份应用(–apply-log)日志
    

innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --socket=/var/lib/mysql/mysql.sock /data/backup/2017-06-22_13-40-29

2、 分别将增量备份应用到完整备份
  

innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --socket=/var/lib/mysql/mysql.sock --incremental /data/backup/2017-06-22_13-40-29 --incremental-basedir=/data/backup/2017-06-22_13-41-48

未分类 

如果有多个差异备份,分别应用差异备份到完整备份。

恢复阶段

1、 完成差异备份的全部应用到完整备份之后,将恢复后的差异备份copy到原数据目录
    
默认情况下,如果数据路径下存在文件,则copy失败,需要清空数据文件路径下的文件。
    

innobackupex --copy-back /data/backup/2017-06-22_13-40-29

如截图,完成copy-back

未分类

2、启动MySQL服务

启动mysql服务,发现启动失败

未分类

看一下错误日志(启动错误信息),mysql5.7yum安装默认的errorlog位于/var/log/mysqld.log中,且默认不会滚动,意味着所有的错误信息都记录在这个文件中。

未分类

数据文件还原之后,需要读数据文件路径授予可读写的权限
  
这里直接授权数据文件路径777,chmod -R 777 /var/lib/mysql
  
然后启动mysql服务,可以正常启动。

未分类  

xtrabackupex才刚刚开始,留下一大堆问题,有时间再一个一个验证。

1、 怎么实现单个库(表)的备份与还原,毕竟实际环境中,因为每个库备份的频率和方式(备份方案)是不一样的?

2、 怎么用全备+差异备份然后结合二进制日志做基于时间点的方式还原?

3、 如何验证备份文件的有效性?

使用Vagrant和VirtualBox一步步地创建一个Base Box

Vagrant和VirtualBox软件的安装步骤省略,去官网下载最新的版本然后下一步下一步地安装就行了,和正常的安装软件没有什么区别。下面看看利用vagrant和virtualbox如果一步步打造出自己的可复用性强的开发环境。

开始前确保您的计算机支持虚拟化技术,在BIOS中可以开启。

一、在virtualbox中新建一个虚拟机

我这里使用的是CentOS-6.5-x86_64-minimal.iso这个镜像文件来安装的,1G内存,8G虚拟硬盘的配置(后面可以修改)。虚拟机名为centos。

安装好后该虚拟机已经自带了ssh服务,如果没有,需要自己先进行安装。

未分类

开启虚拟机,并登陆root用户。

二、配置虚拟机

创建admin用户组

[root@localhost ~]# groupadd admin

创建vagrant用户并添加到admin用户组

[root@localhost ~]# useradd -g admin vagrant

为vagrant用户设置密码,密码为vagrant(会提示密码太弱,可以不用管它)

[root@localhost ~]# passwd vagrant

修改sudoers文件

[root@localhost ~]# vi /etc/sudoers

在该文件添加下面两行代码,并注释掉requiretty行

Defaults env_keep="SSH_AUTH_SOCK"
%admin ALL=NOPASSWD: ALL

配置网卡:将ONBOOT=no 改为 ONBOOT=yes

[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
HWADDR=08:00:27:25:4A:9A
TYPE=Ethernet
UUID=751ae3bb-eb75-4f60-b5c3-7f1afa1dfce1
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=dhcp

配置好网卡后需要重启网络服务:

[root@localhost ~]# service network restart

三、设置端口转发

配置virtualbox端口转发(NAT模式)

未分类

主机ip127.0.0.1

主机端口22(或者其他未被占用端口,最好还是设置成22)

子系统ip可以在虚拟通过ifconfg命令查看到,即eth0网卡的ip地址

子系统端口为22

设置好端口转发规则之后,就能在本地的命令行工具(Xshell,putty..)里通过命令 ssh [email protected] 连接到该虚拟机。

四、添加vagrant公钥,使vagrant用户可以免密码ssh连接该虚拟机

在虚拟机里切换到vagrant用户

[root@localhost ~]# su vagrant
[vagrant@localhost root]$ cd ~
[vagrant@localhost ~]$

然后执行:

[vagrant@localhost ~]$ mkdir ~/.ssh/
[vagrant@localhost ~]$ cd ~/.ssh
[vagrant@localhost .ssh]$ sudo yum -y install wget
[vagrant@localhost .ssh]$ wget http://github.com/mitchellh/vagrant/raw/master/keys/vagrant
[vagrant@localhost .ssh]$ wget http://github.com/mitchellh/vagrant/raw/master/keys/vagrant
[vagrant@localhost .ssh]$ mv vagrant.pub authorized_keys

清理缓存

[vagrant@localhost .ssh]$ sudo yum clean all

然后关闭此虚拟机,通过virtualbox将其电源关闭

五、打包生成box文件

在本地命令行进入该虚拟机目录

cd UsersAdminVirtualBox VMscentos

进行打包

vagrant package --output mycentos.box --base centos

未分类

完成之后你将会在C:UsersAdminVirtualBox VMscentos目录下看到一个mycentos.box文件,我的这个文件有544M。

VirtualBox VMs这个目录可以在virtualbox全局设定-常规里进行修改

到此一个Base Box就制作完成了。

这个box是很干净的,然后可以在这个box的基础上去搭建自己的开发环境,比如lnmp等等。再次进行打包,最后一个带开发环境的box就做好了,可以自己用也可以分发给其他小伙伴使用,不用以后每次都要去搭建一遍环境。

六、附上vagrant常用操作命令

vagrant box list 查看在vagrant里已经安装了哪些box

vagrant box add name boxname.box 添加一个本地的box镜像到vagrant 这个box镜像可以自己制作也可以使用网上的(vagrant box add ubuntu ubuntu/trusty64)

vagrant init name 初始化一个虚拟机,这个name是通过vagrant box list查看

vagrant up 启动虚拟机 在virtualbox中可以看到启动后的虚拟机,第一次启动时时间会长一点

vagrant ssh 连接虚拟机

vagrant reload 重启虚拟机

vagrant status 查看虚拟机当前状态

七、常见问题处理

问题1:

default: in which case you may ignore this message.
==> default: Mounting shared folders...
default: /vagrant => E:/vagrantbox/centos67
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=500,gid=500 vagrant /vagrant

The error output from the command was:

mount: unknown filesystem type 'vboxsf'

上面这样的问题可以执行下命令 vagrant plugin install vagrant-vbguest ,然后重启vagrant reload来解决。

问题2:

vagrant up的时候出现 “rsync” could not be found on your PATH. Make sure that rsync is properly installed on your system and available on the PATH. 出现这样的错误

找到C:Usersadmin.vagrant.dboxescentos7virtualbox类似这样的目录下面的Vagrantfile文件

修改type配置项: config.vm.synced_folder “.”, “/vagrant”, type: “virtualbox”

Centos 7 JDK、Tomcat9 安装并配置

一、JDK 安装

1、安装wget

yum -y install wget

2、下载,输入指令

wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-linux-x64.rpm

3、执行npm安装包,等待安装完成

rpm -ivh jdk-8u112-linux-x64.rpm

4、验证安装是否成功

//输入指令

java -version
//输出版本
java version “1.8.0_112”
Java(TM) SE Runtime Environment (build 1.8.0_112-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.112-b15, mixed mode)

二、Tomcat 安装

1、下载,切换至任意目录执行

wget http://archive.apache.org/dist/tomcat/tomcat-9/v9.0.0.M18/bin/apache-tomcat-9.0.0.M18.tar.gz

2、解压 ,执行以下命令

tar -zxvf apache-tomcat-9.0.0.M18.tar.gz

3、移动至想放置的目录

mv apache-tomcat-9.0.0.M18 /usr/local/

4、配置自启动

切换至Tomcat的bin目录执行vi setenv.sh,并按i进入编辑模式,拷贝以下代码粘贴

#add tomcat pid
CATALINA_PID=”$CATALINA_BASE/tomcat.pid”
#add java opts
JAVA_OPTS=”-server -XX:PermSize=256M -XX:MaxPermSize=1024m -Xms512M -Xmx1024M -XX:MaxNewSize=256m”

之后按esc键,在按shift+:(左下角出现会出现“:”),然后输入wq保存退出,最后执行 chmod +x setenv.sh,确保文件setenv.sh可执行。

5、配置service

执行cd /usr/lib/systemd/system切换至目录 并执行vi tomcat.service(也可以直接vi /usr/lib/systemd/system/tomcat.service),拷贝以下代码粘贴(注意将第6和7行的Tomcat路径/usr/local/apache-tomcat-9.0.0.M18 换成你自己的Tomcat的绝对路径)

[Unit]
Description=Tomcat
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/apache-tomcat-9.0.0.M18/tomcat.pid
ExecStart=/usr/local/apache-tomcat-9.0.0.M18/bin/startup.sh
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target

之后按esc键,在按shift+:(左下角出现会出现“:”),然后输入wq保存退出。执行以下指令将tomcat.service添加开机至开机启动

//配置开机启动
systemctl enable tomcat
//启动tomcat
systemctl start tomcat
//停止tomcat
systemctl stop tomcat
//重启tomcat
systemctl restart tomcat

配置完成,建议重启服务器,即输入命令 reboot(或者sudo reboot)即可在浏览器里输入你的服务器地址+8080端口(例如:192.168.1.161:8080),如果看到小猫咪表示成功,否则请检查以上所有步骤是否全都执行正确了。

6、修改端口

切换至Tomcat conf目录

cd /usr/local/apache-tomcat-9.0.0.M18/conf
//输入指令打开文件
vi server.xml
//输入 /8080 并回车搜索8080 字符串,找到如下两处地方
<<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
//按“i”进入编辑模式,将port="8080"改成port="80"
<Connector port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="80" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

之后按esc键,在按shift+:(左下角出现会出现“:”),然后输入wq保存退出。

7、配置gui-manager项目部署方式

切换至Tomcat conf目录,输入vi tomcat-users.xml打开文件,按“i”进入编辑模式,拷贝以下代码放置标签之间(注意将password和username换成你自己的)

 <role rolename="manager"/>     
  <role rolename="admin"/> 
  <role rolename="admin-gui"/>
  <role rolename="manager-gui"/>
  <user username="xxx" password="***" roles="admin-gui,manager-gui"/>

之后按esc键,在按shift+:(左下角出现会出现“:”),然后输入wq保存退出。

输入 cd webapps/manager/META-INF/ 切换至目录,输入vi context.xml打开文件,按i进入编辑模式,将 标签下的 标签注释掉

<Context antiResourceLocking="false" privileged="true" >
<!--注释掉此标签
 <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127.d+.d+.d+|::1|0:0:0:0:0:0:0:1" />
-->
</Context>

之后按esc键,在按shift+:(左下角出现会出现“:”),然后输入wq保存退出。

8、重启Tomcat

systemctl restart tomcat

浏览器中直接输入你的服务器地址,例如192.168.1.161(不用输端口号了),看见小猫咪,点击manager 输入账号密码即可部署你的项目了。

Tomcat manager无法访问

百度类似文档一大堆,能用的不多。

问题截图

访问tomcat manager页面时提示403拒绝

未分类

解决方法

1、修改权限

[root@192-168-10-51 tomcat]# vim webapps/manager/META-INF/context.xml

将下图中的两行使用屏蔽

未分类

2、配置用户

[root@192-168-10-51 tomcat]# vim conf/tomcat-users.xml

在最后一行之前,加入

<user username="tomcat" password="123com" roles="manager-gui,manager-jmx,manager-script,manager-status"/>

用户名,密码,角色(权限)

未分类

重启tomcat

未分类

测试

未分类

未分类

未分类

tcpdump使用技巧

一般情况下,非HTTP协议的网络分析,在服务器端用tcpdump比较多,在客户端用wireshark比较多,两个抓包软件的语法是一样的。

一、基本语法

1、过滤主机

  • 抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据
tcpdump -i eth1 host 192.168.1.1
  • 指定源地址
tcpdump -i eth1 src host 192.168.1.1
  • 指定目的地址
tcpdump -i eth1 dst host 192.168.1.1

2、过滤端口

  • 抓取所有经过eth1,目的或源端口是25的网络数据
tcpdump -i eth1 port 25
  • 指定源端口
tcpdump -i eth1 src port 25

指定目的端口

tcpdump -i eth1 dst port 25

3、网络过滤

tcpdump -i eth1 net 192.168
tcpdump -i eth1 src net 192.168
tcpdump -i eth1 dst net 192.168

4、协议过滤

tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp

5、常用表达式

非 : ! or "not" (去掉双引号)  且 : && or "and"  或 : || or "or"
  • 抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数据
tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
  • 抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据
tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
  • 抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'

二、高级包头过滤

首先了解如何从包头过滤信息

proto[x:y]          : 过滤从x字节开始的y字节数。比如ip[2:2]过滤出3、4字节(第一字节从0开始排)proto[x:y] & z = 0  : proto[x:y]和z的与操作为0proto[x:y] & z !=0  : proto[x:y]和z的与操作不为0proto[x:y] & z = z  : proto[x:y]和z的与操作为zproto[x:y] = z      : proto[x:y]等于z

操作符 : >, <, >=, <=, =, !=

1、IP头

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |Version|  IHL  |Type of Service|          Total Length         |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |         Identification        |Flags|      Fragment Offset    |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |  Time to Live |    Protocol   |         Header Checksum       |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                       Source Address                          |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                    Destination Address                        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                    Options                    |    Padding    | <-- optional +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                            DATA ...                           |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

本文只针对IPv4。

2、IP选项设置了吗?

“一般”的IP头是20字节,但IP头有选项设置,不能直接从偏移21字节处读取数据。IP头有个长度字段可以知道头长度是否大于20字节。

 +-+-+-+-+-+-+-+-+
 |Version|  IHL  |
 +-+-+-+-+-+-+-+-+

通常第一个字节的二进制值是:01000101,分成两个部分:

0100 = 4 表示IP版本 0101 = 5 表示IP头32 bit的块数,5 x 32 bits = 160 bits or 20 bytes

如果第一字节第二部分的值大于5,那么表示头有IP选项。

下面介绍两种过滤方法(第一种方法比较操蛋,可忽略):

a. 比较第一字节的值是否大于01000101,这可以判断IPv4带IP选项的数据和IPv6的数据。

01000101十进制等于69,计算方法如下(小提示:用计算器更方便)

0 : 0  1 : 2^6 = 64  第一部分 (IP版本)0 : 0   /0 : 0  /-0 : 0  1 : 2^2 = 4   第二部分 (头长度)0 : 0   /1 : 2^0 = 1 /

64 + 4 + 1 = 69

如果设置了IP选项,那么第一自己是01000110(十进制70),过滤规则:

tcpdump -i eth1 'ip[0] > 69'

IPv6的数据也会匹配,看看第二种方法。

b. 位操作

0100 0101 : 第一字节的二进制
0000 1111 : 与操作
<=========
0000 0101 : 结果

正确的过滤方法

tcpdump -i eth1 'ip[0] & 15 > 5'

或者

tcpdump -i eth1 'ip[0] & 0x0f > 5'

3、分片标记

当发送端的MTU大于到目的路径链路上的MTU时就会被分片,这段话有点拗口,权威的请参考《TCP/IP详解》。唉,32借我的书没还,只能凑合写,大家记得看书啊。

分片信息在IP头的第七和第八字节:

 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |Flags|      Fragment Offset    |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Bit 0: 保留,必须是0
Bit 1: (DF) 0 = 可能分片, 1 = 不分片
Bit 2: (MF) 0 = 最后的分片, 1 = 还有分片

Fragment Offset字段只有在分片的时候才使用。

要抓带DF位标记的不分片的包,第七字节的值应该是:

01000000 = 64

tcpdump -i eth1 'ip[6] = 64'

4、抓分片包

  • 匹配MF,分片包
tcpdump -i eth1 'ip[6] = 32'

最后分片包的开始3位是0,但是有Fragment Offset字段。

  • 匹配分片和最后分片
tcpdump -i eth1 '((ip[6:2] > 0) and (not ip[6] = 64))'

测试分片可以用下面的命令:

ping -M want -s 3000 192.168.1.1

5、匹配小TTL

TTL字段在第九字节,并且正好是完整的一个字节,TTL最大值是255,二进制为11111111。

可以用下面的命令验证一下:

$ ping -M want -s 3000 -t 256 192.168.1.200
ping: ttl 256 out of range
 +-+-+-+-+-+-+-+-+
 |  Time to Live |
 +-+-+-+-+-+-+-+-+
  • 在网关可以用下面的命令看看网络中谁在使用traceroute
tcpdump -i eth1 'ip[8] < 5'

6、抓大于X字节的包

  • 大于600字节
tcpdump -i eth1 'ip[2:2] > 600'

7、更多的IP过滤

首先还是需要知道TCP基本结构,再次推荐《TCP/IP详解》,卷一就够看的了,避免走火入魔。

  • TCP头
 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |          Source Port          |       Destination Port        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                        Sequence Number                        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                    Acknowledgment Number                      |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |  Data |       |C|E|U|A|P|R|S|F|                               |
 | Offset|  Res. |W|C|R|C|S|S|Y|I|            Window             |
 |       |       |R|E|G|K|H|T|N|N|                               |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |           Checksum            |         Urgent Pointer        |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                    Options                    |    Padding    |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
 |                             data                              |
 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • 抓取源端口大于1024的TCP数据包
tcpdump -i eth1 'tcp[0:2] > 1024'
  • 匹配TCP数据包的特殊标记

TCP标记定义在TCP头的第十四个字节

 +-+-+-+-+-+-+-+-+
 |C|E|U|A|P|R|S|F|
 |W|C|R|C|S|S|Y|I|
 |R|E|G|K|H|T|N|N|
 +-+-+-+-+-+-+-+-+

重复一下TCP三次握手,两个主机是如何勾搭的:

  1. 源发送SYN
  2. 目标回答SYN, ACK
  3. 源发送ACK

没女朋友的童鞋要学习一下:

  1. MM,你的手有空吗?–
  2. 有空,你呢?~~
  3. 我也有空 _

失败的loser是酱紫的:

  1. MM,这是你掉的板砖吗?(SYN)  ̄▽ ̄
  2. 不是,找拍啊?(RST-ACK) ˋ﹏ˊ
  • 只抓SYN包,第十四字节是二进制的00000010,也就是十进制的2
tcpdump -i eth1 'tcp[13] = 2'
  • 抓SYN, ACK (00010010 or 18)
tcpdump -i eth1 'tcp[13] = 18'
  • 抓SYN或者SYN-ACK
tcpdump -i eth1 'tcp[13] & 2 = 2'

用到了位操作,就是不管ACK位是啥。

  • 抓PSH-ACK
tcpdump -i eth1 'tcp[13] = 24'
  • 抓所有包含FIN标记的包(FIN通常和ACK一起,表示幽会完了,回见)
tcpdump -i eth1 'tcp[13] & 1 = 1'
  • 抓RST(勾搭没成功,伟大的greatwall对她认为有敏感信息的连接发RST包,典型的棒打鸳鸯)
tcpdump -i eth1 'tcp[13] & 4 = 4'

8、大叔注

tcpdump考虑了一些数字恐惧症者的需求,提供了部分常用的字段偏移名字:

icmptype (ICMP类型字段)
icmpcode (ICMP符号字段)
tcpflags (TCP标记字段)

ICMP类型值有:

icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply

TCP标记值:

tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg

这样上面按照TCP标记位抓包的就可以写直观的表达式了:

  • 只抓SYN包
tcpdump -i eth1 'tcp[tcpflags] = tcp-syn'
  • 抓SYN, ACK
tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0'

9、抓SMTP数据

tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))'

抓取数据区开始为”MAIL”的包,”MAIL”的十六进制为0x4d41494c。

10、抓HTTP GET数据

tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420'

“GET “的十六进制是47455420

11、抓SSH返回

tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D'

“SSH-“的十六进制是0x5353482D

tcpdump -i eth1 '(tcp[(tcp[12]>>2):4] = 0x5353482D) and (tcp[((tcp[12]>>2)+4):2] = 0x312E)'

抓老版本的SSH返回信息,如”SSH-1.99..”

三、大叔注

如果是为了查看数据内容,建议用tcpdump -s 0 -w filename把数据包都保存下来,然后用wireshark的Follow TCP Stream/Follow UDP Stream来查看整个会话的内容。

-s 0是抓取完整数据包,否则默认只抓68字节。

另外,用tcpflow也可以方便的获取TCP会话内容,支持tcpdump的各种表达式。

1、UDP头

  0      7 8     15 16    23 24    31
 +--------+--------+--------+--------+
 |     Source      |   Destination   |
 |      Port       |      Port       |
 +--------+--------+--------+--------+
 |                 |                 |
 |     Length      |    Checksum     |
 +--------+--------+--------+--------+
 |                                   |
 |              DATA ...             |
 +-----------------------------------+
  • 抓DNS请求数据
tcpdump -i eth1 udp dst port 53

2、其他

-c参数对于运维人员来说也比较常用,因为流量比较大的服务器,靠人工CTRL+C还是抓的太多,甚至导致服务器宕机,于是可以用-c参数指定抓多少个包。

time tcpdump -nn -i eth0 'tcp[tcpflags] = tcp-syn' -c 10000 > /dev/null

上面的命令计算抓10000个SYN包花费多少时间,可以判断访问量大概是多少。

Linux VPS上DenyHosts阻止SSH暴力攻击

现在的互联网非常不安全,很多人没事就拿一些扫描机扫描ssh端口,然后试图连接ssh端口进行暴力破解(穷举扫描),所以建议vps主机的空间,尽量设置复杂的ssh登录密码,虽然在前段时间曾经介绍过Linux VPS禁止某个IP访问使用hosts.deny禁止某些IP访问,但是功能方面欠缺,如:不能自动屏蔽,那么有什么更好的办法吗,就可以使用denyhosts这款软件了,它会分析/var/log/secure(redhat,Fedora Core)等日志文件,当发现同一IP在进行多次SSH密码尝试时就会记录IP到/etc/hosts.deny文件,从而达到自动屏蔽该IP的目的。

DenyHosts官方网站为:http://denyhosts.sourceforge.net/

LNMP一件安装包中自带该软件可以一键安装,命令:

wget http://soft.vpser.net/lnmp/lnmp1.4beta.tar.gz && tar zxf lnmp1.4beta.tar.gz && cd lnmp1.4/tools/ && ./denyhosts.sh 

回车确认即可开始安装配置,不需要下面的步骤进行安装配置。(该tools目录下也有denyhosts相似的工具fail2ban的一键安装工具 ./fail2ban.sh 安装即可)

1、下载DenyHosts 并解压

# wget http://soft.vpser.net/security/denyhosts/DenyHosts-2.6.tar.gz
# tar zxvf DenyHosts-2.6.tar.gz
# cd DenyHosts-2.6

2、安装、配置和启动

安装前建议执行:echo “” > /var/log/secure && service rsyslog restart 清空以前的日志并重启一下rsyslog

# python setup.py install

因为DenyHosts是基于python的,所以要已安装python,大部分Linux发行版一般都有。默认是安装到/usr/share/denyhosts/目录的,进入相应的目录修改配置文件

# cd /usr/share/denyhosts/
# cp denyhosts.cfg-dist denyhosts.cfg
# cp daemon-control-dist daemon-control

默认的设置已经可以适合centos系统环境,你们可以使用vi命令查看一下denyhosts.cfg和daemon-control,里面有详细的解释

接着使用下面命令启动denyhosts程序

# chown root daemon-control
# chmod 700 daemon-control
# ./daemon-control start

如果要使DenyHosts每次重起后自动启动还需做如下设置:

# ln -sf /usr/share/denyhosts/daemon-control /etc/init.d/denyhosts
# chkconfig –add denyhosts
# chkconfig –level 2345 denyhosts on

或者执行下面的命令加入开机启动,将会修改/etc/rc.local文件:

# echo “/usr/share/denyhosts/daemon-control start” >> /etc/rc.local

DenyHosts配置文件/usr/share/denyhosts/denyhosts.cfg说明:

SECURE_LOG = /var/log/secure
#sshd日志文件,它是根据这个文件来判断的,不同的操作系统,文件名稍有不同。

HOSTS_DENY = /etc/hosts.deny
#控制用户登陆的文件

PURGE_DENY = 5m
DAEMON_PURGE = 5m
#过多久后清除已经禁止的IP,如5m(5分钟)、5h(5小时)、5d(5天)、5w(5周)、1y(一年)

BLOCK_SERVICE  = sshd
#禁止的服务名,可以只限制不允许访问ssh服务,也可以选择ALL

DENY_THRESHOLD_INVALID = 5
#允许无效用户失败的次数

DENY_THRESHOLD_VALID = 10
#允许普通用户登陆失败的次数

DENY_THRESHOLD_ROOT = 5
#允许root登陆失败的次数

HOSTNAME_LOOKUP=NO
#是否做域名反解

DAEMON_LOG = /var/log/denyhosts

为防止自己的IP被屏蔽,可以:echo “你的IP” >> /usr/share/denyhosts/allowed-hosts 将你的IP加入白名单,再重启DenyHosts:/etc/init.d/denyhosts ,如果已经被封,需要先按下面的命令删除被封IP后再加白名单。

如有IP被误封,可以执行下面的命令解封:

wget http://soft.vpser.net/security/denyhosts/denyhosts_removeip.sh && bash denyhost_removeip.sh 要解封的IP

更多的说明请查看自带的README文本文件,好了以后维护VPS就会省一些心了,但是各位VPSer们注意了安全都是相对的哦,没有绝对安全,将密码设置的更Strong,并请定期或不定期的检查你的VPS主机,而且要定时备份你的数据哦。

与DenyHosts类似的软件还有fail2ban功能上更多,还可以对ftp进行保护,自己可以搜索看一下。

如何使用Google身份验证器双重身份验证来保护SSH

未分类

要使用易于使用的双因素认证来保护您的SSH服务器? Google提供必要的软件,可将Google Authenticator的基于时间的一次性密码(TOTP)系统与您的SSH服务器相集成。当您连接时,您必须从手机输入代码。

Google身份验证器不会向Google“回家”事实上,Google Authenticator是完全开源的,所以你甚至可以自己检查它的源代码。

安装Google Authenticator

要使用Google Authenticator实施多因素身份验证,我们需要开源的Google Authenticator PAM模块。PAM代表“可插拔认证模块” – 它可以轻松地将不同形式的认证插入到Linux系统中。

Ubuntu的软件仓库包含一个易于安装的Google Authenticator PAM模块软件包。如果您的Linux发行版不包含该软件包,则必须从Google Code的Google Authenticator下载页面下载该文件并自行编译。

要在Ubuntu上安装软件包,请运行以下命令:

sudo apt-get install libpam-google-authenticator

(这将仅在我们的系统上安装PAM模块 – 我们必须手动激活SSH登录。)

未分类

创建验证密钥

作为您将远程登录的用户登录,并运行google-authenticator命令为该用户创建一个密钥。

通过输入y可以使命令更新您的Google Authenticator文件。然后会提示您提出几个问题,这些问题将允许您限制使用相同的临时安全性令牌,增加令牌可以使用的时间窗口,并限制允许的访问次数来阻止暴力破解尝试。这些选择都为一些易于使用的交易提供了一些安全保障。

未分类

Google Authenticator将向您显示一个秘密密钥和几个“紧急划痕代码”。“将紧急划痕代码写在一个安全的地方 – 它们只能使用一次,如果您丢失手机,它们将被用于使用。

未分类

在您手机上的Google Authenticator应用程式中输入密码(官方应用程式适用于Android,iOS和Blackberry)。您还可以使用扫描条形码功能 – 转到位于命令输出顶部附近的URL,您可以使用手机的相机扫描QR码。

未分类

您的手机上的验证码不断变化。

未分类

如果要作为多个用户远程登录,请为每个用户运行此命令。每个用户将拥有自己的秘密密钥和自己的密码。

激活Google身份验证器

下一步您将不得不要求Google Authenticator进行SSH登录。为此,请打开/ etc / pam。您的系统上的d / sshd文件(例如,使用sudo nano / etc / pam)d / sshd命令),并将以下行添加到file:

auth需要pam_google_authenticator。so

下一步,打开/ etc / ssh / sshd_config文件,找到ChallengeResponseAuthentication行,并将其更改为如下所示:

ChallengeResponseAuthentication yes

(如果ChallengeResponseAuthentication行不存在,请将上述行添加到该文件。)

最后,重新启动SSH服务器,所以您的更改将生效109mh1112

sudo服务ssh restart

未分类

当您尝试通过SSH登录时,系统将提示您输入密码和Google Authenticator代码。

未分类

saltstack自定义模块

今天在基于salt api开发监控平台的时候发现salt的模块有些不是很友好,就准备进行自定义模块来满足需求

配置master

vim /etc/salt/master
file_roots:
  base:
    - /srv/salt

创建模块目录

mkdir -p /srv/salt/_modules

定义模块

vim /srv/salt/_modules/info.py
def test()
    return 'module is ok'

同步模块

salt '*' saltutil.sync_modules
----------输出----------
iZrj91nl9ur3zi797yj8veZ:
    - modules.info
www.uyghurcongress.org:
    - modules.info

执行

salt '*' info.test

Ubuntu安装配置Samba

公司要建一个共享文件服务器,我就简单配置了一个samba服务器,系统使用的是Ubuntu 14.04。

samba是Linux系统上的一种文件共享协议,可以实现其他系统访问Linux系统上的共享资源。

一、安装samba

打开”终端窗口”,输入下面的命令更新源和软件

sudo apt-get update &&  apt-get upgarde

使用下面命令安装

sudo apt-get install -y samba samba-common

二、配置samba

打开”终端窗口”,输入下列命令创建共享文件夹,并修改权限

sudo mkdir /home/share
sudo chmod 777 /home/share

使用vim编辑samba配置文件

cp /etc/samba/smb.conf /etc/samba/smb.conf_bak
sudo vim /etc/samba/smb.conf

在smb.conf文件最后添加下列配置

#security = share  #配置无需密码访问,但是我发现这句没用,添了还启动不了

[Share] # 访问时候显示的文件夹名字
  comment = Share for work
  path = /home/share   # Ubuntu中要共享的目录,记的 chmod 755 修改目录属性
  public = yes
  writeable = yes
  guest ok = yes
  create mask = 0664
  directory mask = 0664
  force user = root
  force group = root
  browseable = yes
  available = yes

保存退出,使用以下命令启动服务器

/etc/init.d/smbd start
/etc/init.d/smbd status

然后就可以访问了,windows下 win+R 输入 “\192.168.2.5” 不用输入账号密码可以直接访问,
mac下要使用Finder中的连接服务器

看图操作:

未分类

未分类

三、设置开机启动

Redhat 或者 Centos 配置开机自启动可以配置 chkconfig,但是Ubuntu 没有,可以使用类似的功能命令 sysv-rc-conf

sudo apt-get install -y sysv-rc-conf #安装
sudo sysv-rc-conf #运行

未分类

按空格进行将启动项反选,按q退出之后配置即完成,重启电脑就可以查看效果。