mac 下用 brew 安装mongodb

mac 下安装mongoDB一般俩种方法.

(1)下载源码,解压,编译,配置,启动 比较艰难的一种模式.

(2)brew install mongodb ,然后就可以悠闲的品一口茶,顺便瞄一眼网易新闻,这是一种傻瓜模式.

但傻瓜模式也有人为干预的时候,粗略说一下使用brew 安装mongodb

zhangzhi@moke:~/code$ brew install mongodb

此图说明已经安装成功,安装的目录就是 _usr_local_Cellar_mongodb/2.4.9

第一次启动服务端,这里需要做一些准备工作.

1.默认mongodb 数据文件是放到根目录 data/db 文件夹下,如果没有这个文件,请自行创建.

zhangzhi@moke:~/code$ mkdir -p /data/db

2.如果你当前的环境变量还没有加入 mongod  ,手动添加的环境变量中.

zhangzhi@moke:~/code$ nano ~/.bash_profile
//添加mongodb安装目录到环境变量中
export PATH=/usr/local/Cellar/mongodb/2.4.9/bin:${PATH}

3.如果让环境变量马上生效? 执行下面的shell

source ~/.bash_profile

4.修改mongodb配置文件,配置文件默认在 _usr_local/etc 下的 mongod.conf

# Store data in /usr/local/var/mongodb instead of the default /data/db
dbpath = /data/db
# Append logs to /usr/local/var/log/mongodb/mongo.log
logpath = /usr/local/var/log/mongodb/mongo.log
logappend = true
# Only accept local connections
bind_ip = 127.0.0.1

第二行修改成数据库文件写入目录地址,如果准备连接非本地环境的mongodb数据库时,bind_ip = 0.0.0.0 即可.

5.尝试启动 mongod

好吧,万事开头难,mongodb 服务器没有启动起来,看最后一行错误提示已经退出,google 后得知是因为 _data_db 文件没有写入权限.

6.给 _data_db 文件夹赋权限

sudo chown id -u /data/db

ok,这一句搞定,继续尝试启动服务器端

ok,mongodb 服务端终于启动起来了.接着启动mongodb 客户端

zhangzhi@moke:/usr/local/etc$ mongo

到现在位置,mongodb 的安装到服务器端启动,客户端启动,下一步就是如何使用.

mac 下用 brew 安装mongodb

2017/2/28 posted in  linux

LInux查看文件夹大小

du命令参数详解见:http://baike.baidu.com/view/43913.htm

下面我们只对其做简单介绍;
查看linux文件目录的大小和文件夹包含的文件数

统计总数大小

du -sh filename(其实我们经常用du -sh *,显示当前目录下所有的文件及其大小,如果要排序再在后面加上 | sort -n)
du -sm * | sort -n 统计当前目录大小 并按大小 排序
du -sk * | sort -n
du -sk * | grep filename 查看一个文件夹的大小
du -m | cut -d "_" -f 2 /_看第二个/ 字符前的文字
查看此文件夹有多少文件 **/* 有多少文件
du filename/
du filename
*/ |wc -l
40752
解释:
wc [-lmw]
参数说明:
-l :多少行
-m:多少字符
-w:多少字
或者也可以打开Nautilus窗口(文件夹首选项),点击“编辑”-“首选项”,切换到“显示”标签,改变“图标标题”下面的树形列表的内容为“大小,修改日期、类型”。设置立即生效。现在在文件图标的下面会显示文件的大小。
PS:
df -hl 查看磁盘剩余空间

du -sm文件夹
返回该文件夹总M数

更多功能查看:
df --help
du --help

du --help
用法:du [选项]... [文件]...
总结每个<文件>的磁盘用量,目录则取总用量。
长选项必须用的参数在使用短选项时也是必须的。
-a, --all write counts for all files, not just directories
--apparent-size print apparent sizes, rather than disk usage; although
the apparent size is usually smaller, it may be
larger due to holes in (sparse') files, internal
fragmentation, indirect blocks, and the like
-B, --block-size=SIZE use SIZE-byte blocks
-b, --bytes equivalent to
--apparent-size --block-size=1'
-c, --total produce a grand total
-D, --dereference-args dereference FILEs that are symbolic links
-H like --si, but also evokes a warning; will soon
change to be equivalent to --dereference-args (-D)
-h, --human-readable print sizes in human readable format (e.g., 1K 234M 2G)
--si like -h, but use powers of 1000 not 1024
-k like --block-size=1K
-l, --count-links count sizes many times if hard linked
-L, --dereference dereference all symbolic links
-P, --no-dereference don't follow any symbolic links (this is the default)
-0, --null end each output line with 0 byte rather than newline
-S, --separate-dirs do not include size of subdirectories
-s, --summarize display only a total for each argument
-x, --one-file-system skip directories on different filesystems
-X FILE, --exclude-from=FILE Exclude files that match any pattern in FILE.
--exclude=PATTERN Exclude files that match PATTERN.
--max-depth=N print the total for a directory (or file, with --all)
only if it is N or fewer levels below the command
line argument; --max-depth=0 is the same as
--summarize
--help 显示此帮助信息并离开
--version 显示版本信息并离开

eg: du -smh oracle
54G 显示oracle文件夹的大小为54G

2017/2/26 posted in  linux

Ubuntu配置L2TP VPN

报错

通过ipsec verify 会出现报错,这里是因为多个网卡造成的,官方有帮助
https://lists.openswan.org/pipermail/users/2009-September/017423.html
http://askubuntu.com/questions/337036/openswans-ipsec-verify-fails-on-two-or-more-interfaces-found-checking-ip-forw
大概意思是多网卡的时候,对子网的检测会出现问题,这里可以忽略
只要 cat _proc_sys_net_ipv4/ip_forward 返回结果是1就没事

Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path [OK]
Linux Openswan U2.6.38/K3.19.0-25-generic (netkey)
Checking for IPsec support in kernel [OK]
SAref kernel support [N/A]
NETKEY: Testing XFRM related proc values [OK]
[OK]
[OK]
Checking that pluto is running [OK]
Pluto listening for IKE on udp 500 [OK]
Pluto listening for NAT-T on udp 4500 [OK]
Two or more interfaces found, checking IP forwarding [FAILED]
Checking NAT and MASQUERADEing [OK]
Checking for 'ip' command [OK]
Checking _bin_sh is not _bin_dash [WARNING]
Checking for 'iptables' command [OK]
Opportunistic Encryption Support [DISABLED]

折腾了一圈还是有点问题,下回专门来弄一下

2017/2/1 posted in  linux

Ubuntu desktop版本新安装

安装步骤纪要

  1. 配置Root密码
  2. 安装openssh

apt-get install openssh-server

  1. 取消 root 的登入權限

_etc_ssh/sshd_config

#PermitRootLogin Yes

  1. 安装vnc

ubuntu默认使用unity桌面,现在unity桌面对于vnc的支持不是太好,还是需要使用回GNOME。

  1. 更新系统 apt-get update -y apt-get upgrade -y
  2. apt-get install vnc4server 安装vncserver
  3. 启动服务器端vncserver :1,第一次启动需要输入用户密码
  4. 使用vnc viewer连接,这时使用vnc 的话,实际上是使用的是unity,所以直接登陆可能会存在显示问题。
  5. 安装gnome,apt-get install gnome-panel gnome-settings-daemon metacity nautilus gnome-terminal
  6. 修改xstartup文件

xstartup文件在 _home_xxx_.vnc_下,在当前使用的用户的home目录下。

#!/bin/sh
export XKL_XMODMAP_DISABLE=1  
unset SESSION_MANAGER  
unset DBUS_SESSION_BUS_ADDRESS  

gnome-panel &  
gnome-settings-daemon &  
metacity &  
nautilus &  
gnome-terminal &
  1. 重启进程
vncserver -kill :1 
vncserver :1 

重新连接即可。

一些设置

设置分辨率

在vmware下面安装的ubuntu ,直接显示的分辨率是800*600,如果要调整屏幕分辨率,当前安装的一修改错误,就会报错,采用xrandr 好像也没有生效,后面需要单独测试一下。

屏幕分辨率

现在在mac 下使用remote desktop manager 来进行远程桌面管理,好处是能够同时支撑windows和vnc以及各种其他的连接。

默认的情况下配置的vnc的分辨率是800x600,使用起来的时候会感觉比较小,很多东西不适合。采用操作系统直接配置会出现上面的报错,所以试着改变在vnc的配置来修改vnc使用的分辨率

vi /etc/vncservers.conf

##修改如下配置
VNCSERVERS="1:xxx 2:xxx"    #xxx为vnc用户
VNCSERVERARGS[1]="-geometry 1024x768"
VNCSERVERARGS[2]="-geometry 1440x900"

使用这种配置方式可以同时支持不同的分辨率,比如说我平时会用pad和mac来连接,所以设置:1用于ipad连接,刚好等同于我的ipad mini的屏幕分辨率。设置:2用于mac连接,等同于中等分辨率的全屏。

使用remote desktop manager 连接的时候就可以使用全屏连接,这样在mac上能看到ubuntu的全屏效果。

公网连接配置

这台ubuntu是通过内网nat跳出到外网的,所以配置了DNAT

iptables -t nat -A PREROUTING -d ***.***.***.*** -p tcp --dport 40006 -j DNAT --to-destination 192.168.11.**:5902

iptables -t nat -A PREROUTING -d ***.***.***.*** -p tcp --dport 40005 -j DNAT --to-destination 192.168.11.**:5901

这样配置两台之后,就把相应的5901 和 5902这两个vnc的端口通往公网了,可以通过公网进行访问

2017/1/30 posted in  linux

Linux 服务器信息

CPU情况

判断依据:

  • 具有相同core id 的CPU是同一个core的超线程
  • 具有相同physical id的CPU是同一个CPU封装的线程或核心

物理CPU个数

cat /proc/cpuinfo | grep "physical id" |sort|uniq|wc -l

物理CPU中core的个数(核数)

cat /proc/cpuinfo | grep "core id"|uniq

逻辑CPU的个数

cat /proc/cpuinfo” | grep “processor”|wc -l

物理CPU个数 * 核数 = 逻辑CPU的格式

在虚拟化环境中比较好对应,如果服务器配置 虚拟插槽数是1,每个插槽内核数是4,那么物理CPU个数查询是1,CPU中的core个数是4,逻辑CPU的个数是4。 如果服务器配置的 虚拟插槽数是2,每个插槽内核数是4,那么物理CPU的个数查询是2,CPU的core的个数是4,逻辑CPU的个数是8。 也满足上面的公司。

所以这里也很好的展示了操作系统和vmware下虚拟机对应的关系。

Linux 内存使用情况

使用free -m命令

root@test-pjj:~# free -m
total used free shared buffers cached
Mem: 3948 337 3611 13 23 107
-_+ buffers_cache: 206 3742
Swap: 4091 0 4091

-buffer/cache: 已用的内存数,即used - buffers - cached

+buffer/cache :可用的内存数,即free + buffers + cached

可用内存 = free + buffers + cached

-buffers_cache 反映的是被程序实实在在占用的内存, + buffers_cache反映的是可以挪用的内存总数。
swap是指交换分区

在Linux系统中,内存是拿来用的,不是用来看的。在windows中,无论你的真实物理内存有多少,他都会通过硬盘交换文件来读,即使是内存还有一大部分。

这也是为什么我们在windows的时候,当你的内存足够大的时候,当你的硬盘是HDD机械硬盘的时候,强烈的推荐关闭虚拟内存,使用真实内存,这样可以很好的提高操作系统的速度。

这也是linux和windows的不同之处,也就是为什么我们会说linux的内存管理会比较好的原因。

观察Linux系统内存使用情况时,只要没发现用swap的交换空间,就不用担心自己的内存大小,如果常常看到swap用了很多,你可能就要考虑增加物理内存了。这也是在linux服务器上查看内存是否够用的标准

这样我们也能很清楚的看懂free -m 命令的标准了。

查看硬盘使用情况

硬盘及分区信息 fdisk -l
磁盘空间占用情况 df -h
查看磁盘的IO情况 `iostat -d -x

2017/1/5 posted in  linux

ubuntu 下的ufw 配置

  • ufw配置

ubuntu在iptables上提供了一套更简单的

开启ufw

ufw enable

注意如果是远程访问服务器,最好先开启ssh之后,然后在enable,否则可能会被拒绝下来。

ufw allow ssh/tcp

或者

ufw allow 22/tcp

查看

ufw status numbered

这样的好处是按照排序的,在不需要的时候可以删除

ufw delete 1

ufw 的ip 控制

UFW(iptables)规则的匹配基于规则出现的顺序,一旦匹配某个规则,检查便会停止。因此,如果某个规则允许访问TCP端口22(如使用udo ufw allow 22),后面另一个规则指示拦截某个IP地址(如使用 ufw deny proto tcp from 202.54.1.1 to any port 22)。最终,允许访问TCP端口22的规则会被使用,而后一个拦截黑客IP地址 202.54.1.1 却没有被使用。这都是由于规则的顺序造成的。为避免这类问题,你需要编辑 _etc_ufw/before.rules文件,在“# End required lines”之后"Block an IP Address"添加规则。

sudo vi /etc/ufw/before.rules

查找如下所示的行:

End required lines

添加规则来拦截黑客或垃圾信息传播者:

Block spammers

-A ufw-before-input -s 178.137.80.191 -j DROP

Block ip/net (subnet)

-A ufw-before-input -s 202.54.1.0/24 -j DROP
保存并关闭文件。最后,让防火墙重新加载配置信息:
sudo ufw reload

2016/12/30 posted in  linux

Linux 文本过滤

正则表达式

^ 只只匹配行首
$ 只只匹配行尾
* 只一个单字符后紧跟*,匹配0个或多个此单字符
[ ] 只匹配[ ]内字符。可以是一个单字符,也可以是字符序列。可以使用 -表示[ ]内字符序列范围,如用 [ 1 - 5 ]代替[ 1 2 3 4 5 ]
\ 只用来屏蔽一个元字符的特殊含义。因为有时在 s h e l l中一些元字符有特殊含义。 \可以使其失去应有意义
. 只匹配任意单字符
pattern\{n\} 用来匹配前面pattern出现次数。 n为次数
pattern\{n,\}m 含义同上,但次数最少为 n
pattern\{n,m\} 只含义同上,但 pattern出现次数在n与m之间

部分实例

空行 $

空行使用$来匹配

特殊字符

下列被认为是特殊字符

$ . ' " * [ ] ^ | ( ) \ + ?

这些符号都要使用\ 来进行转义

[]来匹配范围集合

使用“ -”表示一个字符串范围,表明字符串范围从“-”左边字符开始,到“ -”右边字符结束。

结合使用 *与[ ]更是有益,例如 [ A - Z a - Z ] *将匹配所有单词。

注意符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容。[a-z]

使用{}匹配模式结果出现的次数

pattern{n} 匹配模式出现n次。
pattern{n,} 匹配模式出现最少n次。
pattern{n,m} 匹配模式出现n到m次之间, n , m为0 - 2 5 5中任意整数。
The

grep 家族

grep

g r e p一般格式为:

grep [选项]基本正则表达式[文件] 

这里基本正则表达式可为字符串。

双引号

在grep命令中输入字符串参数时,最好将其用双引号括起来。

一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串

grep选项

-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。

精确匹配

使用grep抽取精确匹配的一种更有效方式是在抽取字符串后加 >。

使用grep匹配“与”或者“或”模式

g r e p命令加 - E参数,这一扩展允许使用扩展模式匹配。

awk

如果要格式化报文或从一个大的文本文件中抽取数据包,那么 a w k可以完成这些任务

命令格式

awk [-F field-separator ] 'commands' input-files

[ - F域分隔符]是可选的,因为 a w k使用空格作为缺省的域分隔符,因此如果要浏览域间有空格的文本,不必指定这个选项

awk -f awk-script-files input-files

-f选项指明在文件 a w k _ s c r i p t _ f i l e中的a w k脚本, i n p u t _ f i l e ( s )是使用a w k进行浏览的文件名。

脚本执行流程

如果设置了 - F选项,则a w k每次读一条记录或一行,并使用指定的分隔符分隔指定域,但如果未设置- F选项, a w k假定空格为域分隔符,并保持这个设置直到发现一新行。当新行出现时, a w k命令获悉已读完整条记录,然后在下一个记录启动读命令,这个读进程将持续到文件尾或文件不再存在。

模式和动作

任何awk语句都由模式和动作组成。在一个 awk脚本中可能有许多语句。模式部分决定动作语句何时触发及触发事件。处理即对数据进行的操作。如果省略模式部分,动作将时刻保持执行状态。

实际动作在大括号 { }内指明。动作大多数用来打印,但是还有些更长的代码诸如 i f和循环(looping)语句及循环退出结构。如果不指明采取动作, awk将打印出所有浏览出来的记录。

域和记录

awk执行时,其浏览域标记为 \(1,\)2...$n。这种方法称为域标识。

使用 $0,意即所有域。

为打印一个域或所有域,使用 p r i n t命令。这是一个a w k动作(动作语法用圆括号括起来)。

打印头

打印信息头放置在 B E G I N模式部分,因为打印信息头被界定为一个动作,必须用大括号括起来。

如果在末行加入end of report信息,可使用E N D语句。 E N D语句在所有文本处理动作执行完之后才被执行。 E N D语句在脚本中的位置放置在主要动作之后。

awk 'BEGIN { print "name belt....."} { print \(1 "/t" \)4} END {"end of report"}

awk错误提示

• 确保整个a w k命令用单引号括起来。
• 确保命令内所有引号成对出现。
• 确保用花括号括起动作语句,用圆括号括起条件语句。
• 可能忘记使用花括号,也许你认为没有必要,但 a w k不这样认为,将按之解释语法。

awk正则表达式

awk中同样也可以使用正则表达式

awk支持的正则
\ ^ $ . [ ] | ( ) * + ?
匹配

使用~后跟正则表达式来匹配

表达式{if($4~_brown_) print }

精确匹配

为精确匹配 4 8,使用等号 = =,并用单引号括起条件。例如 $ 3 = =“ 4 8”,

不匹配

有时要浏览信息并抽取不匹配操作的记录,与 ~相反的符号是 !~,意即不匹配。

小于
小于等于
大于
大小写

为查询大小写信息,可使用 [ ]符号。

任意字符
或关系匹配
行首
AND
OR

awk内置变量

ARGC 命令行参数个数
ARGV 命令行参数排列
ENVIRON 支持队列中系统环境变量的使用
FILENAME awk浏览的文件名
FNR 浏览文件的记录数
FS 设置输入域分隔符,等价于命令行 - F选项
NF 浏览记录的域个数
NR 已读的记录数
OFS 输出域分隔符
ORS 输出记录分隔符
RS 控制记录分隔符t

awk操作符

在a w k中,设置有意义的域名是一种好习惯,在进行模式匹配或关系操作时更容易理解。一般的变量名设置方式为 n a m e = \( n,这里n a m e为调用的域变量名, n为实际域号。例如设置学生域名为n a m e,级别域名为 b e l t,操作为n a m e = \) 1 ; b e l t s = $ 4

阈值比较操作

有两种方式测试一数值域是否小于另一数值域。
1) 在B E G I N中给变量名赋值。
2) 在关系操作中使用实际数值

修改数值域取值

当在a w k中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的a w k复本。 a w k会在变量N R或N F变量中反映出修改痕迹。

修改文本域

修改文本域即对其重新赋值。需要做的就是赋给一个新的字符串

只显示修改部分

在模式后面使用花括号将只打印修改部分

创建新域

在a w k中处理数据时,基于各域进行计算时创建新域是一种好习惯。创建新域要通过其他域赋予新域标识符。如创建一个基于其他域的加法新域 { \( 4 = \) 2 + $ 3 },这里假定记录包含3个域,则域4为新建域,保存域2和域3相加结果。

当然可以创建新域,并赋给其更有意义的变量名

增加列值

为增加列数或进行运行结果统计,使用符号 + =。增加的结果赋给符号左边变量值,增加到变量的域在符号右边。

内置的字符串函数

gsub(r, s) 在整个\( 0中用s替代r
g s u b ( r, s , t ) 在整个t中用s替代r
i n d e x ( s , t ) 返回s中字符串t的第一位置
l e n g t h ( s ) 返回s长度
m a t c h ( s , r ) 测试s是否包含匹配 r的字符串
s p l i t ( s , a , f s ) 在f s上将s分成序列a
s p r i n t ( f m t , e x p ) 返回经f m t格式化后的e x p
s u b ( r, s ) 用\) 0中最左边最长的子串代替 s
s u b s t r ( s , p ) 返回字符串s中从p开始的后缀部分
s u b s t r ( s , p , n ) 返回字符串s中从p开始长度为n的后缀部分

字符串屏蔽序列

\ b 退格键
\ t t a b键
\ f 走纸换页
\ d d d 八进制值
\ n 新行
\ c 任意其他特殊字符,例如 \ \为反斜线符号
\ r 回车键

awk输出函数printf

p r i n t f函数基本语法是p r i n t f( [格式控制符 ],参数),格式控制字符通常在引号里。

awk printf修饰符

-左对齐
Width 域的步长,用 0表示0步长
.prec 最大字符串长度,或小数点右边的位数

awk printf 格式

% c A S C I I字符
% d 整数
% e 浮点数,科学记数法
% f 浮点数,例如( 1 2 3 . 4 4)
% g a w k决定使用哪种浮点数转换 e或者f
% o 八进制数
% s 字符串
% x 十六进制数

2016/12/28 posted in  linux

Radhat安装zabbix-agent

radhat以及一些比较老版本的CentOS ,使用yum安装总是报出各种各样的依赖异常,不好解决。zabbix在做zabbix的时候自启动脚本使用了systemd来处理,这在大多数的radhat里面都是没有的。

在radhat下面还是推荐使用自己编译安装。

安装GCC

安装gcc, 这里就不多说了。

用光盘mount一下就能装,记得安装各种依赖。

添加用户和组

添加Zabbix用户和组

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

下载解压安装包

cd /usr/local/src
# wget http://jaist.dl.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/3.2.0/zabbix-3.2.0.tar.gz
# tar zxvf zabbix-3.2.0.tar.gz
# ./configure --prefix=/usr/local/zabbix --enable-agent
# make && make install

修改zabbix agent 配置文件

# vim /usr/local/zabbix/etc/zabbix_agentd.conf  //只需修改Server参数后的“Zabbix Server的IP和
LogFile=/tmp/zabbix_agentd.log
Server=127.0.0.1   // zabbix server的ip
ServerActive=127.0.0.1   //zabbix server的ip,主动向zabbix server报数据
Hostname=test
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d
UnsafeUserParameters=1

编辑 服务

编辑_etc_services,添加以下内容:

cat >> /etc/services <<eof
zabbix-agent    10050/tcp                           #ZabbixAgent
zabbix-agent    10050/udp                           #Zabbix Agent
eof

给zabbix-2.0.3服务端程序做软链接

cd /usr/local/zabbix/bin/
for i in *;do ln -s /usr/local/zabbix/bin/${i} /usr/bin/${i};done
cd /usr/local/zabbix/sbin/
for i in *;do ln -s /usr/local/zabbix/sbin/${i} /usr/sbin/${i};done

复制Zabbix自启动脚本到_etc_init.d目录

cp /usr/local/src/zabbix-3.2.0/misc/init.d/fedora/core/zabbix_agentd /etc/init.d/zabbix_agentd

chmod +x /etc/init.d/zabbix_agentd

vim /etc/init.d/zabbix_agentd  //修改BASEDIR为/usr/local/zabbix

        # Zabbix-Directory
        BASEDIR=/usr/local/zabbix

启动Zabbix Agent

# /etc/init.d/zabbix_agentd start

使用netstat命令查看Zabbix Agent是否已被正常启动:

# netstat -utlnp | grep zabbix

设置防火墙的TCP 10050端口。

# iptables -I INPUT -p tcp --dport 10050 -j ACCEPT
# /etc/init.d/iptables save

设置开机启动

chkconfig zabbix_agentd on
chkconfig —list
2016/12/28 posted in  linux

CentOS 安装 zabbix agent-agent 3.2版本

  • release

公司用的比较多的两个操作系统ubuntu和centos,后面也主要维护这两个操作系统。前面已经介绍过ubuntu下面安装zabbix了,这里介绍一下CentOS下面zabbix-agent 3.2版本的安装。

关闭selinux

  sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config
  setenforce 0  

防火墙设置

允许zabbix-agent的10050端口通过

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

安装zabbix 3.2版本

[root@localhost opt]# rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/7/x86_64/zabbix-release-3.2-1.el7.noarch.rpm

[root@localhost opt]# yum install zabbix-sender zabbix-agent zabbix

[root@localhost opt]# rpm -qa|grep zabbix-agent
zabbix-agent-3.2.3-1.el7.x86_64

[root@localhost opt]# vi /etc/zabbix/zabbix_agentd.conf

centos 6版本

rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2-1.el6.noarch.rpm 

[Index of /zabbix/3.0/rhel/6/x86_64](http://repo.zabbix.com/zabbix/3.0/rhel/6/x86_64/)

重启zabbix服务,并设置成为开机启动

[root@localhost opt]# systemctl restart zabbix-agent.service
[root@localhost opt]# systemctl enable zabbix-agent.service
2016/12/28 posted in  linux

ubuntu 下使用 shadowsocks

  • release

安装

sudo apt-get update
sudo apt-get install python-pip
sudo apt-get install python-setuptools m2crypto
pip install shadowsocks

我们可以在_home_mudao/ 下新建个文件shadowsocks.json (mudao是我在我电脑上的用户名,这里路径你自己看你的)。内容是这样:

{
"server":"11.22.33.44",
"server_port":50003,
"local_port":1080,
"password":"123456",
"timeout":600,
"method":"aes-256-cfb"
}

server 你服务端的IP
servier_port 你服务端的端口
local_port 本地端口,一般默认1080
passwd ss服务端设置的密码
timeout 超时设置 和服务端一样
method 加密方法 和服务端一样

确定上面的配置文件没有问题,然后我们就可以在终端输入 sslocal -c _home_mudao/shadowsocks.json 回车运行

后台运行

sslocal -c /etc/shadowsocks.json -d start

这种运行方法是在前台运行的,运行完成之后就不能退出了。这样也有好处,就是想用的时候打开,不想用的时候关掉。

配置

在这种安装完之后,会发现有时候还是上不了Google,是因为google走的https协议。

ubuntu 自带的ss-qt5 里面,配置可以选择 socks5 和 Https模式,针对不同的使用情况,我们可以使用不同的模式来配置。

上网页

针对网页需要在shadowsocks里面

5A4D1986-000A-4D89-94BF-F113FAC390B4

配置完成后需要在浏览器中配置相应的代理

EFB7682A-19C8-40D1-B374-697F58E19AD6

配置完成后需要在setting - network - 里面配置 Network Proxy 。 并添加相应的HTTP 代理。

命令行使用git clone

针对gitclone需要使用socks5模式。

需要在ss-qt5上配置socks5 模式

C3D262A5-5DC3-4CD1-B600-0952271E893

配置完socks5之后还是没有相应的,需要同时将git自己的代理配置成socks5

git config --global http.proxy 'socks5://127.0.0.1:1080' 
git config --global https.proxy 'socks5://127.0.0.1:1080'

shadowsocks的本地端口默认是1080

配置chacha20加密方式的特殊操作

ss如果要使用chacha20 或者 salsa20算法,需要安装libsodium,否则会报错
libsodium not found

安装方式

   apt-get install build-essential
    wget https://download.libsodium.org/libsodium/releases/LATEST.tar.gz
    tar xf libsodium-1.0.10.tar.gz && cd libsodium-1.0.10
    ./configure && make -j4 && make install
    ldconfig

2016/12/26 posted in  linux

ubuntu 下配置SNAT和DNAT

  • release

SNAT和DNAT的区别

先讲一下Snat和Dnat 的区别,网上讲这的比较多,这里可以先摘抄一段帮助理解:

SNAT,DNAT,MASQUERADE都是NAT
MASQUERADE是SNAT的一个特例
SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机
MASQUERADE是用发送数据的网卡上的IP来替换源IP,因此,对于那些IP不固定的场合,比如拨号网络或者通过dhcp分配IP的情况下,就得用MASQUERADE
DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B

下面看到这个是感觉比较靠谱,也比较能够理解的回答:

SNAT,这个规则被用于将Outbound Packets的 Source IP Address 翻译为能够被目标网路识别到的地址。例如:想要让Private Network VMs上到Internet,那么,就可以配置SNAT Rules,然后SNAT Rules就会将Private IP Address翻译为Public IP Address,进而实现被Public Network接受;
DNAT,这个规则被用于将Inbound Packets的Destination IP Address翻译为能够被内部Private Network VMs识别。例如:如果想要将一个 Private IP Address VM(Web Server)发布到 Internet,希望外部的用户能够访问到这个Private IP Address VM,则可以配置 DNAT Rules 实现这个诉求;

总结一下:
SNAT 主要管Outbound, 也就是网络数据包流出,简单的也可以说成内网访问公网。
DNAT主要管Inbound,也就是网络数据包流入,简单的也可以说成公网访问内容。

其中SNAT主要起到,对于内网的服务器,没有公网ip,但是需要访问公网,这时可以采用SNAT,将内网机器与网关配置,从而可以访问公网。这也是当前电信运营商采用的方法,1个ip可以对应6万户上网。从截包也可以看到,一般都是使用的40000左右的端口出去。

DNAT 主要起到公网来访问内网的主机。如果发生情况是公网的某台机器,希望访问某个内网的端口,此时内网电脑是没有公网ip 的,那么我们可以在公网主机上配置DNAT,比如开启40000端口,然后映射到内网ip的某个端口,比如我们希望在公网访问内网的电脑的ssh,我们就可以开通22端口。 在外网访问公网ip的4000端口就能映射到内网主机的22端口。

SNAT的配置

给内网网卡配置静态IP(此前确保另一张外网网卡eth0已经能够正常访问Internet。已经为eth1配置过内网静态IP的可以跳过本步)

sudo ip addr add 10.0.0.11/24 dev eth1

  
这里假设eth1的IP为10.0.0.11,。

配置NAT规则

sudo iptables -A FORWARD -o eth0 -i eth1 -s 10.0.0.0/24 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

  
第一条规则允许转发初始网络包,第二条规则允许转发已经建立连接后的网络包,第三条则设置NAT。

接下来需要保存iptables规则,确保每次重启时能够加载NAT规则:

[root@localhost ~]# iptables -A FORWARD -o eth1 -i eth0 -s 192.168.12.0/24 -m conntrack --ctstate NEW -j ACCEPT
[root@localhost ~]# iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -t nat -F POSTROUTING
[root@localhost ~]# iptables -t nat -A POSTROUTING -o eht1 -j MASQUERADE

保存iptables规则

sudo iptables-save | sudo tee /etc/iptables.sav

编辑/etc/rc.local文件,将下面的一行添加到“exit 0”之前:

iptables-restore < /etc/iptables.sav

  
这样以后每次重启机器时都会自动加载NAT相关的iptables规则。  

启用路由转发,编辑/etc/sysctl.conf 文件,删除起始的“#”,解除

#net.ipv4.ip_forward=1

 
的注释。然后使其生效:

sudo sysctl -p

  
这样我们就完成了网关一端的设置。

Client端

一旦网关机器设置完成,任何OS的客户端都能够通过连接到网关而访问外部网络。这里以Ubuntu Server作为client为例,假设client的eth0连接到网关eth1所在的内网10.0.0.0上,

为eth0指派静态IP(需与server端的eth1在同一网段,如果已经配置过则可以跳过本步),编辑/etc/network/interfaces文件:

auto eth0
iface eth0 inet static
        address 10.0.0.31
        netmask 255.255.255.0
        gateway 10.0.0.11
        dns-nameservers YourDNSServer

  因为我们的网关服务端并没有充当DNS服务器,此处需要额外指定client的DNS服务器,通常从网络服务提供商(ISP)那里获得。

接下来配置路由网关

sudo route add default gw 10.0.0.11 dev eth0

  
使网关配置生效,如果以前已经生成过_etc_resolv.conf文件中的nameserver字段,那么这时client应该已经能够访问外部网络了,否则需要编辑_etc_resolv.conf,添加字段:

nameserver YourDNSServer

  
由于在_etc_network/interfaces文件中已经配置过dns-nameservers,所以重新启动client机器时不会影响DNS配置。

此时client已经能够通过网关机器访问外网,如果不知道ISP的DNS服务器地址,可以使用OpenDNS作为替代。

DNAT 的配置

在DNAT中,要把规则定义在PREROUTING链中

iptables -t nat -A PREROUTING -d 10.0.0.1 -j DNAT –-to-destination 172.16.93.1

此条规则将请求IP为10.0.0.1的数据包转发到后端172.16.93.1主机上

iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1

此条规则将请求IP为10.0.0.1并且端口为80的数据包转发到后端的172.16.93.1主机上,通过定义不同的端口,就可以实现PNAT,将同一个IP不同的端口请求转发到后端不同的主机

iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp –-dport 80 -j DNAT –-to-destination 172.16.93.1:8080

此条规则在上条规则的基础上,发往后端的数据包的目标端口改为8080,在后端主机的web服务器上使用8080端口接收访问, 这样能更好的保护后端主机

这样就可以实现内网的机器进行外放访问,并可以让外放访问内网服务器了。

说明一下,这种方式和nginx的proxy功能,可以起到两个不同的作用。

SNAT 的另一种配置方式

用上面讲述的snat 的配置方式,可能出现SNAT只能绑定在一张网卡上,如果我们要针对多个内网网段或者多个内网网卡进行snat的时候,使用上面的方法会命令重复,从而我发配置相应的snat。我们需要使用如下的方法配置

iptables  -F
iptables  -P   INPUT   ACCEPT
iptables  -P   FORWARD ACCEPT
iptables  -t nat  -A  POSTROUTING   -s  192.168.1.0/24   -o  eth0 -j MASQUERADE

其中第一步为清除原始的所有iptables规则,第二三步为打开INPUT和FORWARD。
第四步为配置nat。

使用这种方式可以同时配置多个网段和多个端口的SNAT。

#配置10网段的SNAT
iptables -t nat -A POSTROUTING -s 10.11.11.0/24 -o eth2 -j MASQUERADE
#配置192.168网段的snat
iptables -t nat -A POSTROUTING -s 192.168.11.0/24 -o eth2 -j MASQUERADE
#配置DNAT
iptables -t nat -A PREROUTING -d 61.183.247.113 -p tcp --dport 40001 -j DNAT --to-destination 192.168.11.88:22

查看SNAT和DNAT配置

默认的使用iptables -L 主要查看的是filter表的内容,没有办法看到nat表的内容,如果要查看我们已经配置的snat和dnat的内容,可以使用如下命令

root@ubuntu:~# iptables -t nat -vnL POSTROUTING --line-number
Chain POSTROUTING (policy ACCEPT 1 packets, 64 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1    77640 5908K MASQUERADE  all  --  *      eth2    0.0.0.0/0            0.0.0.0/0           
2        0     0            all  --  *      eth2    10.11.11.0/24        0.0.0.0/0           
3        0     0            all  --  *      eth2    192.168.11.0/24      0.0.0.0/0           
root@ubuntu:~# iptables -t nat -vnL PREROUTING --line-number
Chain PREROUTING (policy ACCEPT 2445 packets, 201K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        1    64 DNAT       tcp  --  *      *       0.0.0.0/0            61.183.247.113       tcp dpt:40000 to:10.11.11.154:22
2        1    64 DNAT       tcp  --  *      *       0.0.0.0/0            61.183.247.113       tcp dpt:40001 to:192.168.11.88:22

整理

使用iptables配置SNAT和DNAT实际上就是使用 iptabeles的nat转换,也就是操作iptables 的nat表。

所以对iptables的操作都是使用 iptables -t nat 开头。而我们使用的SNAT和DNAT实际上对应了两张表的内容,SNAT对应POSTROUTING,DNAT对应PREROUTING。

而iptables的其他命令都适用。比如说查询我们可以使用 iptables -t nat -L PREROUTINGiptables -t nat -L POSTROUTING, 如果希望查询的内容更多,可以采用 iptables -t nat -vnL PREROUTING --line-number

默认的iptables -L实际上是查询的filter表 的内容。

同样的,删除我们可以采用查询到line-number之后,采用iptables -t nat -D REEROUTING 3来进行删除。

2016/12/25 posted in  linux

iptables

  • release

基本概念

基本组成

iptables分为以下三种功能:包过滤、NAT转换(网络地址转换)、通用pre-route packet mangling。

Netfilter 是 Linux 核心中一个通用架构,它提供了一系列的 “表”(tables),每个表由若干 “链”(chains)组成,而每条链中可以有一条或数条 “规则”(rule)组成。

系统缺省的表为 “filter”,该表中包含了 INPUT、FORWARD 和 OUTPUT 3 个链。

规则

每一条链中可以有一条或数条规则,每一条规则都是这样定义的:如果数据包头符合这样的条件,就这样处理这个数据包。当一个数据包到达一个链时,系统就会从第一条规则开始检查,看是否符合该规则所定义的条件: 如果满足,系统将根据该条规则所定义的方法处理该数据包;如果不满足则继续检查下一条规则。最后,如果该数据包不符合该链中任一条规则的话,系统就会根据该链预先定义的策略来处理该数据包。

iptables 基本表

iptables 可以操纵3 个表:filter 表,nat 表,mangle 表。

NAT 和一般的 mangle 用 -t 参数指定要操作哪个表。filter 是默认的表,如果没有 -t 参数,就默认对 filter 表操作。

Rule 规则:过滤规则,端口转发规则等,例如:禁止任何机器 ping 我们的服务器,可以在服务器上设置一条规则:

iptables -A INPUT -s ! 127.0.0.1 -p icmp -j DROP 

从 –s 开始即是一条规则,-j 前面是规则的条件,-j 开始是规则的行为(目的)。整条命令解释为,在filter 表中的 INPUT 规则链中插入一条规则,所有源地址不为 127.0.0.1 的 icmp 包都被抛弃。

Chain 规则链:由一系列规则组成,每个包顺序经过 chain 中的每一条规则。chain 又分为系统 chain和用户创建的 chain。下面先叙述系统 chain。

filter 表的系统 chain:INPUTFORWADOUTPUT

nat 表的系统 chain: PREROUTINGPOSTROUTINGOUTPUT

mangle 表的系统 chain: PREROUTINGOUTPUT

每条系统 chain 在确定的位置被检查。比如在包过滤中,所有的目的地址为本地的包,则会进入INPUT 规则链,而从本地出去的包会进入 OUTPUT 规则链。

所有的 table 和 chain 开机时都为空,设置 iptables 的方法就是在合适的 table 和系统 chain 中添相应的规则。

命令帮助

启动

Linux防火墙(Iptables)重启系统生效

开启: chkconfig iptables on

关闭: chkconfig iptables off

Linux防火墙(Iptables) 即时生效,重启后失效

开启: service iptables start

关闭: service iptables stop

查看所有配置

iptables -L 

会返回如下模式

这里可以看到相关的系统filter的三种,分别为input、forward、output。

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  10.11.11.0/24        anywhere             ctstate NEW
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination     

iptables 语法

iptables [-t table] CMD [chain] [rule-matcher] [-j target] 

-A 或 -append 在所选链尾加入一条或多条规则

-D 或 -delete 在所选链尾部删除一条或者多条规则

-R 或 -replace 在所选链中替换一条匹配规则

-I 或 -insert 以给出的规则号在所选链中插入一条或者多条规则. 如果规则号为1,即在链头部.

-L 或 -list 列出指定链中的所有规则,如果没有指定链,将列出链中的所有规则.

-F 或 -flush 清除指定链和表中的所由规则, 假如不指定链,那么所有链都将被清空.

-N 或 -new-chain 以指定名创建一条新的用户自定义链,不能与已有链名相同.

-X 或 -delete-chain 删除指定的用户定义帘,必需保证链中的规则都不在使用时才能删除,若没有指定链,则删除所有用户链.

-P 或 -policy 为永久帘指定默认规则(内置链策略),用户定义帘没有缺省规则,缺省规则也使规则链中的最后一条规则,用-L显示时它在第一行显示.

-C 或 -check 检查给定的包是否与指定链的规则相匹配.

-Z 或 -zero 将指定帘中所由的规则包字节(BYTE)计数器清零.

-h 显示帮助信息.

保存到永久生效

iptables的默认配置文件方式

/etc/sysconfig/iptables 文件是 iptables 守护进程调用的默认规则集文件. 

可以使用以下命令保存执行过的IPTABLES命令:

/sbin/iptables-save > /etc/sysconfig/iptables 

要恢复原来的规则库,可以使用:

/sbin/iptables-restore < /etc/sysconfig/iptables 

服务调用save的方式

iptables命令和route等命令一样,重启之后就会恢复,所以:

[root@rhlinux root]# service iptables save 
将当前规则储存到 /etc/sysconfig/iptables: [ 确定 ] 

令一种方法是 _etc_rc.d_init.d_iptables 是IPTABLES的启动脚本,所以:

[root@rhlinux root]# /etc/rc.d/init.d/iptables save 

将当前规则储存到 _etc_sysconfig/iptables: [ 确定 ]

自定义脚本模式

例如若规则使用脚本文件名_etc_fw_rule, 则可以在_etc_rc.d_rc.local中加入以下代码:

if [-x _etc_fw_rule]; then /etc_fw/sule; fi;

这样每次启动都执行该规则脚本,如果用这种方法,建议NTSYSV中停止IPTABLES

ubuntu下使用iptables-persistent 方式

安装

apt-get install iptables-persistent

保存规则

service  iptables-persistent save
* Saving rules...                                                                                                                                                                 *  IPv4...                                                                                                                                                                        *  IPv6...
ls -1 /etc/iptables/
rules.v4
rules.v6
cat  /etc/iptables/rules.v4
#Generated by iptables-save v1.4.21 on Thu Aug 20 08:59:52 2015
*filter
:INPUT ACCEPT [5726:774869]
:FORWARD ACCEPT [170:27598]
:OUTPUT ACCEPT [5467:789045]
COMMIT
#Completed on Thu Aug 20 08:59:52 2015
#Generated by iptables-save v1.4.21 on Thu Aug 20 08:59:52 2015
*nat
:PREROUTING ACCEPT [23:1596]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [9:540]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/16 -o eth0 -j MASQUERADE
COMMIT
#Completed on Thu Aug 20 08:59:52 2015
2016/12/25 posted in  linux

永久路由(几种服务器添加永久路由)

  • release

系统用的比较杂,每次用不同的系统的时候,添加永久路由总是记不住,这里总结一下,供后面使用

windows

-p之后就可以添加永久路由,windows和linux的写法有些不一样。
route add 0.0.0.0 mask 0.0.0.0 192.1681.253 metric 20 -p
route add 192.168.0.0 mask 255.255.0.0 192.168.1.254 -p

删除:route delete 192.168.0.0

ubuntu

echo "route add -net 172.16.100.0/24 gw 192.168.6.249" >>_etc_rc.local

注意ubuntu的添加,最后一行是exit 0 , 这种方式添加的时候,可能会在exit 0 后面,这样会导致路由不生效,有时候需要注意一下。

2016/12/25 posted in  linux

linux内核优化

2、修改网络内核对TCP连接的有关限制(参考对比下篇文章“优化内核参数”)
在Linux上编写支持高并发TCP连接的客户端通讯处理程序时,有时会发现尽管已经解除了系统对用户同时打开文件数的限制,但仍会出现并发TCP连接数增加到一定数量时,再也无法成功建立新的TCP连接的现象。出现这种现在的原因有多种。
第一种原因可能是因为Linux网络内核对本地端口号范围有限制。此时,进一步分析为什么无法建立TCP连接,会发现问题出在connect()调用返回失败,查看系统错误提示消息是“Can’t assign requestedaddress”。同时,如果在此时用tcpdump工具监视网络,会发现根本没有TCP连接时客户端发SYN包的网络流量。这些情况说明问题在于本地Linux系统内核中有限制。其实,问题的根本原因在于Linux内核的TCP/IP协议实现模块对系统中所有的客户端TCP连接对应的本地端口号的范围进行了限制(例如,内核限制本地端口号的范围为1024~32768之间)。当系统中某一时刻同时存在太多的TCP客户端连接时,由于每个TCP客户端连接都要占用一个唯一的本地端口号(此端口号在系统的本地端口号范围限制中),如果现有的TCP客户端连接已将所有的本地端口号占满,则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()调用中返回失败,并将错误提示消息设为“Can’t assignrequested address”。有关这些控制逻辑可以查看Linux内核源代码,以linux2.6内核为例,可以查看tcp_ipv4.c文件中如下函数:
static int tcp_v4_hash_connect(struct sock *sk)
请注意上述函数中对变量sysctl_local_port_range的访问控制。变量sysctl_local_port_range的初始化则是在tcp.c文件中的如下函数中设置:
void __init tcp_init(void)
内核编译时默认设置的本地端口号范围可能太小,因此需要修改此本地端口范围限制。
第一步,修改_etc_sysctl.conf文件,在文件中添加如下行:
net.ipv4.ip_local_port_range = 1024 65000
这表明将系统对本地端口范围限制设置为1024~65000之间。请注意,本地端口范围的最小值必须大于或等于1024;而端口范围的最大值则应小于或等于65535。修改完后保存此文件。
第二步,执行sysctl命令:
[speng@as4 ~]$ sysctl -p

2016/12/23 posted in  linux

nginx日志切割

  • release

编辑脚本文件

/usr/local/nginx# vi nginx_log.sh

#! /bin/bash
#nginx日志切割脚本

logs_path="/usr/local/nginx/logs/"

mv ${logs_path}access.log ${logs_path}access_$(date -d "yesterday" +"%Y%m%d").log
mv ${logs_path}error.log ${logs_path}error_$(date -d "yesterday" +"%Y%m%d").log

/usr/local/nginx/sbin/nginx -s reload

编辑crontab

crontab -e

0 0 * * * bash /usr/local/nginx/nginx_log.sh

crontab -l 查看

2016/12/20 posted in  linux