使用Mac OS X上网

2012年1月7日 16hot 没有评论

现在在Mac 系统下发的博客。早就心仪Mac OS X系统了,漂亮程度用华丽两字来形容,一点也不过分。不过,Mac OS X系统,对硬件是有要求的。当然是苹果推出的系列产品兼容最好,但是价格比较高。虽然Intel平台,有些也能运行,但是可能遇到各种各样的意外。

我用的苹果电脑?没有,现在是在thinkpad 笔记本里,FreeBSD + VirtualBox + Mac OS X的组合。下个目标想换成苹果电脑,先用这个组合熟悉熟悉Mac系统,以后换成苹果电脑后,好快速上手。

分类: MacOSX 标签: ,

lua日期与时间操作

2011年12月20日 16hot 没有评论

os.time() <== 返回当前系统的日历时间
os.date() <== 返回本地化的时间字符串,这里是”11/28/08 17:23:37″
os.date(“%x”, os.time()) <== 返回自定义格式化时间字符串(完整的格式化参数),这里是”11/28/08″
os.clock() <== 返回执行该程序CPU花去的时钟秒数,这里是1156.726
附录
完整的格式化参数
这些时间输出的字符串表示是经过本地化的。所以如果是在巴西(葡萄牙语系),”%B” 得到的就是 “setembro”(译者按:大概是葡萄牙语九月?),”%x” 得到的就是 “16/09/98″(月日次序不同)。标记的意义和显示实例总结如下表。实例的时间是在1998年九月16日,星期三,23:48:10。返回值为数字形式的还列出了它们的范围。(都是按照英语系的显示描述的,也比较简单,就不烦了)
%a abbreviated weekday name (e.g., Wed)
%A full weekday name (e.g., Wednesday)
%b abbreviated month name (e.g., Sep)
%B full month name (e.g., September)
%c date and time (e.g., 09/16/98 23:48:10)
%d day of the month (16) [01-31]
%H hour, using a 24-hour clock (23) [00-23]
%I hour, using a 12-hour clock (11) [01-12]
%M minute (48) [00-59]
%m month (09) [01-12]
%p either “am” or “pm” (pm)
%S second (10) [00-61]
%w weekday (3) [0-6 = Sunday-Saturday]
%x date (e.g., 09/16/98)
%X time (e.g., 23:48:10)
%Y full year (1998)
%y two-digit year (98) [00-99]
%% the character ‘%’
事实上如果不使用任何参数就调用date,就是以%c的形式输出。这样就是得到经过格式化的完整时间信息。
注意%x、%X和%c由所在地区和计算机系统的改变会发生变化。
如果该字符串要确定下来(例如确定为mm/dd/yyyy),可以使用明确的字符串格式方式(例如”%m/%d/%Y”)。

分类: LUA 标签:

LUA中的字符串函数库

2011年12月20日 16hot 没有评论

Lua解释器对字符串的支持很有限。一个程序可以创建字符串并连接字符串,但不能截取子串,检查字符串的大小,检测字符串的内容。在Lua中操纵字符串的功能基本来自于string库。

字符串库中的一些函数是非常简单的:

string.len(s) 返回字符串s的长度;
string.rep(s, n) 返回重复n次字符串s的串;你使用string.rep(“a”, 2^20)可以创建一个1M bytes的字符串(比如,为了测试需要);
string.lower(s) 将s中的大写字母转换成小写(string.upper将小写转换成大写)。如果你想不关心大小写对一个数组进行排序的话,你可以这样:
table.sort(a, function (a, b) return string.lower(a) < string.lower(b) end)
string.upper(s) 将s中的小写字母转换成大写
string.upper和string.lower都依赖于本地环境变量。所以,如果你在 European Latin-1环境下,表达式:
string.upper("a??o") --> “A??O”
string.sub(s,i,j) 函数截取字符串s的从第i个字符到第j个字符之间的串。Lua中,字符串的第一个字符索引从1开始。你也可以使用负索引,负索引从字符串的结尾向前计数:-1指向最后一个字符,-2指向倒数第二个,以此类推。所以, string.sub(s, 1, j)返回字符串s的长度为j的前缀;string.sub(s, j, -1)返回从第j个字符开始的后缀。如果不提供第3个参数,默认为-1,因此我们将最后一个调用写为string.sub(s, j);string.sub(s, 2, -2)返回去除第一个和最后一个字符后的子串。
s = “[in brackets]”
print(string.sub(s, 2, -2)) –> in brackets
记住:Lua中的字符串是恒定不变的。string.sub函数以及Lua中其他的字符串操作函数都不会改变字符串的值,而是返回一个新的字符串。一个常见的错误是:
string.sub(s, 2, -2)
认为上面的这个函数会改变字符串s的值。如果你想修改一个字符串变量的值,你必须将变量赋给一个新的字符串:
s = string.sub(s, 2, -2)
string.char函数和string.byte函数用来将字符在字符和数字之间转换。string.char获取0个或多个整数,将每一个数字转换成字符,然后返回一个所有这些字符连接起来的字符串。string.byte(s, i)将字符串s的第i个字符的转换成整数;第二个参数是可选的,缺省情况下i=1。下面的例子中,我们假定字符用ASCII表示:

print(string.char(97)) –> a
i = 99; print(string.char(i, i+1, i+2)) –> cde
print(string.byte(“abc”)) –> 97
print(string.byte(“abc”, 2)) –> 98
print(string.byte(“abc”, -1)) –> 99

上面最后一行,我们使用负数索引访问字符串的最后一个字符。
Lua提供了string.format()函数来生成具有特定格式的字符串, 函数的第一个参数是格式(formatstring), 之后是对应格式中每个代号的各种数据. 由于格式字符串的存在, 使得产生的长字符串可读性大大提高了. 这个函数的格式很像C语言中的printf().函数string.format在用来对字符串进行格式化的时候,特别是字符串输出,是功能强大的工具。这个函数有两个参数,你完全可以照C语言的printf来使用这个函数。第一个参数为格式化串:由指示符和控制格式的字符组成。指示符后的控制格式的字符可以为:十进制’d';十六进制’x';八进制’o';浮点数’f';字符串’s'。在指示符’%'和控制格式字符之间还可以有其他的选项:用来控制更详细的格式,比如一个浮点数的小数的位数:
格式字符串可能包含以下的转义码:
%c – 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i – 接受一个数字并将其转化为有符号的整数格式
%o – 接受一个数字并将其转化为八进制数格式
%u – 接受一个数字并将其转化为无符号整数格式
%x – 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X – 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e – 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E – 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f – 接受一个数字并将其转化为浮点数格式
%g(%G) – 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q – 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s – 接受一个字符串并按照给定的参数格式化该字符串
为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:
(1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
(4) 宽度数值
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%6.3f)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%5.3s)则设定该字符串只显示前n位.
在这些参数的后面则是上述所列的转义码类型(c, d, i, f, …).

print(string.format(“pi = %.4f”, PI))
–> pi = 3.1416
d = 5; m = 11; y = 1990
print(string.format(“%02d/%02d/%04d”, d, m, y))
–> 05/11/1990
tag, title = “h1″, “a title”
print(string.format(“<%s>%s“, tag, title, tag))
–>

a title

第一个例子,%.4f代表小数点后面有4位小数的浮点数。第二个例子%02d代表以固定的两位显示十进制数,不足的前面补0。而%2d前面没有指定0,不足两位时会以空白补足。对于格式串部分指示符得详细描述清参考lua手册,或者参考C手册,因为Lua调用标准C的printf函数来实现最终的功能。

以下是一些例子:

string.format(“%%c: %c”, 83) 输出S
string.format(“%+d”, 17.0) 输出+17
string.format(“%05d”, 17) 输出00017
string.format(“%o”, 17) 输出21
string.format(“%u”, 3.14) 输出3
string.format(“%x”, 13) 输出d
string.format(“%X”, 13) 输出D
string.format(“%e”, 1000) 输出1.000000e+03
string.format(“%E”, 1000) 输出1.000000E+03
string.format(“%6.3f”, 13) 输出13.000
string.format(“%q”, “One\nTwo”) 输出”One\
  Two”
string.format(“%s”, “monkey”) 输出monkey
string.format(“%10s”, “monkey”) 输出 monkey
string.format(“%5.3s”, “monkey”) 输出 mon

分类: LUA, 转载 标签:

下一代系统日志工具(syslog-ng) 转载

2011年12月20日 16hot 没有评论

  1.syslog-ng简介

  在UNIX系统的维护中,经常会忽略系统事件的处理。经常检查系统日志对于保持系统的安全和正常运行是至关重要的。但是,系统日志中有太多的噪音,一些不是很重要的信息会掩盖重要的信息。目前的工具很难甄别出系统管理者感兴趣的信息。

  用户可以通过指定facility/priority,把消息发到不同的地方。系统预先定义了12+8个(mail、news、auth等)facility,八个不同的优先级(alert到debug)。

  这其中存在一个问题,大量的程序使用同样的facility(daemon),把日志都保存到一个文件中(messages),即使它们毫无关联。这样就造成用户很难筛选出自己感兴趣的东西。

  第二个问题是,大多数的程序无法改变日志配置,只能修改软件的源代码。

  因此,使用facility作为过滤不是一个好办法。最好能够有一些runtime选项,使用这些选项指定日志facility,建立新的facility。

  syslog-ng的一个设计原则就是建立更好的消息过滤粒度。syslog-ng能够进行基于内容和优先权/facility的过滤。另一个设计原则是更容易进行不同防火墙网段的信息转发,它支持主机链,即使日志消息经过了许多计算机的转发,也可以找出原发主机地址和整个转发链。最后的一个设计原则就是尽量使配置文件强大和简洁。

  2.消息路径

  一个消息路径是由一个或者多个日志消息源、一个或者多个过滤规则以及一个或者多个日志消息目的组成的。来自某个日志消息源的消息进入syslog-ng,如果消息命中某条规则,syslog-ng就把它发送到对应的日志消息目的。

  消息源

  一些日志消息源驱动器(source driver)组成一个消息源,这些驱动器使用给定的方法收集日志消息。譬如,有的syslog()系统调用使用的AF_UNIX、SOCK_STREAM风格的套接字源驱动器。

  在配置文件中,你可以使用下面的语法声明一个日志消息源:

  source { source-driver(params); source-driver(params); … };

  identifier是给定消息源的唯一标志,但是这个标志符不能和保留字有冲突。

  你可以控制使用哪个驱动器来收集日志消息,因而你需要知道你的系统和他的内部syslogd是如何通讯的。下面介绍一下某些平台中,syslogd是如何工作的。

  Linux 一个叫作/dev/log的SOCK_STREAM unix套接字
  BSD 一个叫作/var/run/log的SOCK_STREAM unix套接字
  Solaris(2.5或以下) 一个叫做/dev/log的SVR4风格的STREAMS设备

  solaris(2.6或以上) 除了2.6之前版本使用的STREAMS设备之外,使用了一种新的多线程IPC方法调用门。默认情况下,这个调用门是/etc/syslog_door,由syslogd使用。

  在syslog-ng中,每个可能的通讯机制都有对应的日志消息源驱动器。例如:如果要打开一个SOCK_DGRAM风格的UNIX套接字进行通讯,你就会用到unix-dgram驱动器,同样SOCK_STREAM式的通讯需要unix-stream驱动器。

  例2-1.Linux中的一个源指令

  source src { unix-stream(”/dev/log”); internal(); udp(ip(0.0.0.0) port(514)); };

  驱动器可以使用参数,参数有些是必需的,有些是可选的。必需的参数一般在前面。上面的指令中,  /dev/log就是必需参数。

  下面是可用的源驱动器:

  internal syslog-ng内部产生的消息
  unix-stream 打开指定的SOCK_STREAM模式的unix套接字,接收日志消息
  unix-dgram 打开指定的SOCK_DGRAM模式的unix套接字,接收日志消息
  file 打开指定的文件读取日志信息
  pipe,fifo 打开指定的管道或者FIFO设备,读取日志信息
  tcp 在指定的TCP端口接收日志消息
  udp 在指定的UDP端口接收日志消息
  sun-stream(s) 在solaris系统中,打开一个(多个)指定的STREAM设备,从其中读取日志消息

  过滤器

  在syslog-ng中,过滤器执行日志路由。你可以使用syslog-ng的内部函数编写布尔表达式,来决定日志信息是否通过。

  过滤器也都有唯一的标志符,语法如下:

  fileter { expression;};

  表达式中可以包含逻辑操作符(and、or、not)和函数。

  例2-2.一个搜索来自blurp主机,包含deny的日志消息的过滤指令。

  filter f_blurp_deny { host(”blurp”) and match(”deny”); };
  下面是syslog-ng的过滤函数:

  facility() 根据设备选择日志消息
  level()或者priority() 根据优先级选择日志消息
  program() 日志消息的程序名是否匹配一个正则表达式
  host() 日志消息的主机名是否和一个正则表达式匹配
  match() 对日志消息的内容进行正则匹配
  filter() 调用另一条过滤规则并判断它的值

  关于这些函数,后面的章节中将有更为详细的介绍。

  有一个特殊的过滤器标志符DEFAULT,用于捕获所有没有处理的日志消息。例如:

  options { keep_hostname(yes); };
  source src { unix-stream(”proba2″); internal(); };
  destination ftpd { file(”ftplog”); };
  destination named { file(”namedlog”); };
  destination daemon { file(”daemonlog”); };
  filter f_ftpd { match(”ftp”); };
  filter f_named { match(”named”); };
  filter f_daemon { facility(daemon); };
  log { source(src); filter(f_ftpd); destination(ftpd); };
  log { source(src); filter(f_named); destination(named); };
  log { source(src); filter(f_daemon); filter(DEFAULT); destination(daemon); };

  在这个例子中,default过滤器捕获所有没有被f_ftpd和f_named过滤器捕获的facility是daemon的日志消息。

  日志消息目的

  destination指定匹配过滤规则的日志消息的去处。和日志消息源类似,日志消息目的可以包括一些目的驱动器,指定日志的派发方向。你需要使用如下语法来声明日志消息目的:

  destination { destination-driver(params); destination-driver(params); … };
下面是syslog-ng支持的日志消息目的驱动器:

  file 日志消息写到指定的文件
  fifo,pipe 把日志消息写到指定的管道
  unix-stream 把日志消息发送到给定的SOCK_STREAM类型的UNIX套接字(Linux)
  unix-dgram 把日志消息发送到给定的SOCK_DGRAM类型的UNIX套接字(BSD)
  udp 把日志消息发送到指定主机的UDP端口
  TCP 把日志消息发送到指定主机的TCP端口
  usertty 如果用户登录,把日志发送到指定的终端
  program fork并启动指定的程序,把日志消息发送到这个进程的标准输出。

  详情请参考下面的章节。

  日志路径

  前面的章节中,我们学习了如何定义消息源、过滤器和消息目的。现在我们要把这些结合起来形成一条完整的指令。凡是来源于指定的消息源,匹配所有指定的过滤器,并送到指定的地址。其语法如下:

  log { source(s1); source(s2); …
  filter(f1); filter(f2); …
  destination(d1); destination(d2); … };

  日志路径中的成员是顺序执行的。

  选项

  你可以通过设置一些选项来改变syslog-ng的行为。设置选项的语法一般是:

  options { option1(params); option2(params); … };

  每个选项也可以有自己的参数。
  以下是syslog-ng支持的参数:

名字 参数类型 描述
time_reopen() 数字 一个断开的连接重新连接之前需要等待的时间
time_reap() 数字 一个闲置的目标文件关闭之前需要等待的时间
sync_freq() 数字 在写入文件之前,可以缓冲的日志消息行数
mark_freq() 数字 目前尚未实现
log_fifo_size() 数字 输出队列的行数
chain_hostnames() yes/no 打开/关闭主机名链(用于日志转发)
use_time_recvd() yes/no 使用收到日志消息的时间,不用日志消息中指定的时间
use_dns() yes/no 打开/关闭DNS查询功能。因为DNS查询无法返回会造成syslog-ng处于阻塞状态,从而造成拒绝服务攻击。为了避免这种情况的出现,应该使用防火墙严格保护使用syslog-ng的网络节点,并确认syslog-ng使用的所有主机都是可以解析的。
use_fqdn() yes/no 使用完整的域名
gc_idle_threshold() 数字 当syslog-ng空闲时,设置其进入垃圾信息收集状态的阀值。一旦分配的对象数达到了这个数字,syslog-ng就启动垃圾信息收集状态。默认值是1000。
gc_busy_threshold() 数字 当syslog-ng忙时,设置其进入垃圾信息收集状态的阀值。一旦分配的对象数达到这个数字,syslog-ng就启动垃圾信息收集状态。默认值是3000。

  3.参考

  本章,将详细介绍配置文件中使用的驱动器和选项。

  消息源驱动器
  internal()

  所有syslog-ng内部产生的日志消息都来自这个日志消息源。如果你需要syslog-ng自身山城的警告、错误和提醒信息,就需要在配置文件中加入以下声明:

  Declaration: internal()

  如果这个消息源驱动器没有被引用,syslog-ng会向你输出报警信息。

  例3-1.使用inernal()日志消息源驱动器

  source s_local { internal(); };
  unix-stream()和unix-dgram()

  这两个日志消息源驱动器比较相似,都打开AF_UNIX类型的套接字,在套接字上监听日志消息。unix-stream()主要用在Linux,使用SOCK_STREAM参数,是面向连接的,不会造成日志消息的丢失;unix-dgram()用在BSD系统上,使用SOCK_DGRAM参数,是无连接的,如果系统过载,会造成日志消息丢失。

  在使用面向连接的协议时,为了避免造成拒绝服务攻击,需要对同时接受的连接数量进行闲置。这由max-connections()参数实现。

  Declaration:
  unix-stream(filename [options]);
  unix-dgram(filename [options]);
  以下选项可以用于unix-stream和unix-dgram日志消息源驱动器的声明:

名字 参数数据类型 描述
owner() 字符串 设置套接字的uid,默认是:root
group() 字符串 设置套接字的gid,默认是:root
perm() 数字 设置权限掩码。八进制数字以0开头,例如:0755表示rwxr-xr-x。
keep-alive() yes/no 当syslog-ng重启动,选择是否保持连接,只用于unix-stream()。默认是yes
max-connections() 数字 同时打开的连接的数目限制,只用于unix-stream()日志消息源驱动器。默认是10。

  例3-2.使用unix-stream()和unix-dgram()日志消息源驱动器

  source s_stream { unix-stream(”/dev/log” max-connections(10)); };
  source s_dgram { unix-dgram(”/var/run/log”); };
  tcp()和udp()

  使用这两个日志消息源驱动器,你可以使用TCP或者UDP协议从网络上接受日志消息。

  UDP是一种简单的用户数据报协议,使用这种协议可能会发生日志消息的丢失,而且这种协议没有重传机制;TCP是一种面向连接的传输层协议,不会造成日志消息的丢失。

  这两种消息源驱动器都不需要位置参数。默认情况下,syslog-ng会绑定到0.0.0.0:514,在所有有效的端口上监听。可以使用localip()参数来限制其接受连接的端口。

  注意:514端口是rshell使用的端口,因此如果syslog-log和rshell同时使用,你需要为syslog-ng选择另外的端口。

  Declaration:
  tcp([options]);
  udp([options]);
  下面是udp()和tcp()可用的选项:

选项名 数据类型 描述 默认值
ip或者iplocalip 字符串 绑定的IP地址 0.0.0.0

  udp()和tcp()使用示例:

  source s_tcp { tcp(ip(127.0.0.1) port(1999); max-connections(10); };
  source s_udp { udp(); };
  file()

  通常,内核会把自己的消息送到一个特殊的文件(BSD系统是/dev/kmsg,Linux系统是/proc/kmsg),因此你需要使用file()日志消息源驱动器来指定这个文件。在Linux中,klogd会读取内核信息,并转发到syslogd进程,klogd在转发之前会对内核消息进行处理,使用/boot/System.map文件中的符号名代替原来的地址。如果你不需要这种功能,可以使用-x参数运行klogd。

  Declaration:
  file(filename);
  file()日志消息源驱动器示例:
  source s_file { file(”/proc/kmsg”); };
  pipe()

  pipe日志消息源驱动器打开一个命名管道,在这个命名管道监听日志消息。在HP-UX系统中,它用于内部日志消息的获得。

  Declaration:
  pipe(filename);

  注意首先你需要使用mkfifo建立命名管道。

  例3-6.使用pipe()日志消息源驱动器

  source s_pipe { pipe(”/dev/log”); );
  sun-streams()

  solaris使用STREAMS API把日志消息发送到syslogd进程。你必须在编译syslog-ng时加入这个特征。
新版solaris(>=2.51)中,STREAMS使用一个新的IPC调用门来投递日志消息。syslog-ng支持这种IPC机制。

  日志消息目的驱动器

  日志目的驱动器把日志消息从syslog-ng输出到其它地方:一个文件或者一个网络套接字。

  file()

  file是syslog-ng最重要的日志消息目的驱动器之一。使用它,你可以把日志消息定向到一些文件中。

  在设置日志目的文件时,可以使用宏,从而使用一个简单的file日志消息目的驱动器就可以设置很多目的文件。和PHP/PERL一样,宏也是以$开头。

  如果文件所在的目录不存在,则由create_dirs()来决定是否创建这个目录。
  警告:由于syslog-ng必须跟踪建立的每个文件,因此会消耗一些内存。如果在60秒钟内(也可以由time_reap选项设置)没有新的消息到达某个文件,syslog-ng就会关闭这个文件,释放占用的资源。如果目的文件数和所需内存超出日志服务器的的能力,就会造成拒绝服务攻击。

  最危险的宏是$PROGRAM,因此在不可信的环境中不要使用这个宏。

  以下是可以用于扩展file的宏:

  HOST 日志消息的源发主机名。如果日志消息穿过几个主机,并且chain_hostname()功能已经打开,就使用第一个主机名。

  FACILITY 日志消息来自的日志设备
  PRIOPRITY/LEVEL 日志消息的优先级
  PROGRAM 发送日志消息的程序
  YEAR 发送日志消息的年份,这个宏既可以指定日志消息送出的时间,也可以指定日志消息收到的时间。这由use_time_recvd()选项控制
  MONTH 发送日志消息的月份
  DAY 发送日志消息的日子
  HOUR 顾名思义,嘿嘿:)
  MIN 同上
  SEC 当然是秒了^_^
  file()日志消息目的驱动器的选项:

选项 数据类型 描述 默认值
log_file_size() 数字 输出文件的条目数 使用全局设定
sync_freq() 数字 当日志消息达到一定数目就写入文件 使用全局设定
encrypt() yes/no 给日志文件加密 使用全局设定
compress() yes/no 压缩日志文件 使用全局设定
owner() 字符串 指定日志文件的所有者 root
group() 字符串 指定日志文件所有者的组 root
perm() 数字 建立时日志文件的权限掩码 0600
dir_per() 数字 建立目录时的权限掩码 0600
create_dirs() yes/no 如果目录不存在就建立 no

  pipe()

  syslog-ng通过pipe()日志消息目的驱动器把日志消息发送到/dev/xconsole之类的命名管道。

  unix-stream()和unix0dgram()

  syslog-ng通过这两个日志消息目的驱动器把日志消息发送到一个SOCK_STREAM或者SOCK_DGRAM模式的UNIX套接字。

  udp()和tcp()

  使用TCP或者UDP协议把日志消息送到本地网络上或者internet上的另外的主机。

  usertty()

  syslog-ng使用这个日志消息目的驱动器把日志消息送到一个登录用户使用的终端。

  program()

  program()驱动器fork出一个进程,使用给定的参数执行一个特定的程序,然后把日志消息送到这个进程的标准输入设备。

  4.优化syslog-ng

  syslog-ng的默认设置是针对单服务器或者工作站的,而对于一个网络的中央日志主机却远远不够。因此,需要对其进行一些调整和优化。
  设置垃圾收集参数

  syslog-ng有自己的垃圾收集器,而且一旦进入垃圾收集状态就不再接受日志消息。从而造成非连接的传输协议的信息丢失。因此,需要对syslog-ng的垃圾收集状态进行控制,你可以通过以下两个选项来控制其垃圾收集状态。

  gc_idle_threshold()

  这个选项能够设置垃圾收集器在syslog-ng处于空闲状态时的阀值。如果分配的的对象达到这个数字,而且系统处于空闲状态(100msec内没有日志消息到达),syslog-ng就启动垃圾收集器。此时系统处于空闲状态,因此基本不会造成日志信息的丢失。这个值应该比较小,不过要大于已分配对象的最小值。已分配对象的最小值取决于你的配置,也可以通过-v命令行参数指定。

  gc_busy_threshold()

  如果syslog-ng正忙于接受日志消息(日志消息的间隔小于100msec),为了防止其吃掉所有内存,也应该运行垃圾收集器。这个值应该比较高,以便在正常情况下不打断日志消息的接收。

  设置输出队列的大小

  为了防止发送日志的daemon程序阻塞,syslog-ng一直在读取其向内的日志通道。如果输出队列已满,就可能造成日志消息的丢失。因此,设置输出队列的大小非常重要,你可以设置全局输出队列的大小,也可以为每个日志消息驱动器设置输出队列的大小。

  options { log_fifo_size(1000); };

  或者

  destination d_dmessages { file(”/var/log/messages” log_fifo_size(1000); };

  输出队列的大小应该合理,这对于大量的日志消息涌来特别重要。如果蜂拥而至的日志信息占据了目标通道的所有带宽,syslog-ng能够把日志消息消息保存到输出队列中,等高峰过去再发出。

  当然,syslog-ng不能测试你的网络带宽,因此如果目的主机在一个噪音很大的网络上,而且日志流量超过网络带宽,syslog-ng也无能为力。

  设置同步(sync)参数

  syslog-ng一般先对日志消息进行缓存。当达到一定的数量,就写入磁盘。注意syslog-ng是对每条日志消息分别使用write()系统调用,而不是成匹写入(why?I can’t understand*_*)。
source s_sys { file (“/proc/kmsg” log_prefix(“kernel: “)); unix-stream (“/dev/log”); internal(); };
source s_udp { udp(); };
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_mlal { usertty(“*”); };

destination d_network { file(“/var/log/network”); };
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); };
#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); };

destination d_pipe { pipe(“/tmp/mysql.pipe”
template(“INSERT INTO logs (host, facility, priority, level, tag, date, time, program, msg) VALUES ( ‘$HOST’, ‘$FACILITY’, ‘$PRIORIT
Y’, ‘$LEVEL’, ‘$TAG’, ‘$YEAR-$MONTH-$DAY’, ‘$HOUR:$MIN:$SEC’, ‘$PROGRAM’, ‘$MSG’ );\n”) template-escape(yes));
};log { source(s_udp); destination(d_pipe); };
log { source(s_udp); destination(d_network); };
syslog.sql
CREATE DATABASE syslog;
USE syslog;
CREATE TABLE logs (
host varchar(32) default NULL,
facility varchar(10) default NULL,
priority varchar(10) default NULL,
level varchar(10) default NULL,
tag varchar(10) default NULL,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;
此文件整理有關 syslog-ng + mysql + php-syslog-ng 的安裝筆記,用以集中數台Linux主機的 logs 於 Mysql database 上以利於檢視分析.
如有任何錯誤請不吝指正.

http://samlin2004.myweb.hinet.net/docs/log/syslog-ngInstallationGuide.htm

Centralized syslog-ng to Mysql Installation Guide
——————————————————————————–

1.Requirement

OS: Red Hat 9.0
Database: MySQL 4.0.20
Web Server: Apache2
PHP Supported.

Packages:
syslog-ng-1.6.5.tar.gz
libol-0.3.14.tar.gz
php-syslog-ng-2.5.1.tar.gz
 

2.Installation

2.1 Install libol-0.3.14.tar.gz

The Libol package contains support libraries needed by Syslog-ng.

2.1.1 Prepare Libol for compilation
#tar zxvf libol-3.0.14.tar.gz
#./configure –prefix=/usr –enable-shared

2.1.2 Compile Libol
#make

2.1.3 Install
#make install

2.2 Install syslog-ng-1.6.5.tar.gz

2.2.1 Prepare Syslog-ng for compilation
#tar zxvf syslog-ng-1.6.5.tar.gz
#./configure –prefix=/usr –sysconfdir=/etc

2.2.2 Compile Syslog-ng
#make

2.2.3 Install
#make install 

2.3 Extract php-syslog-ng-2.5.1.tar.gz

Extract php-syslog-ng-2.5.1.tar.gz under Apache’s document root (ex: /usr/local/apache2/htdocs)
 

3.Configuration

3.1 Create Database Schema

3.1.1 Edit syslog-ng.sql script for creating log database schema

=== syslog-ng.sql script start here ===

CREATE DATABASE syslog;

USE syslog;

CREATE TABLE logs (
host varchar(32) default NULL,
facility varchar(10) default NULL,
priority varchar(10) default NULL,
level varchar(10) default NULL,
tag varchar(10) default NULL,
date date default NULL,
time time default NULL,
program varchar(15) default NULL,
msg text,
seq int(10) unsigned NOT NULL auto_increment,
PRIMARY KEY (seq),
KEY host (host),
KEY seq (seq),
KEY program (program),
KEY time (time),
KEY date (date),
KEY priority (priority),
KEY facility (facility)
) TYPE=MyISAM;
 

=== syslog-ng.sql script end here ===

3.1.2 Run the command to install the database into mysql.

#mysql -u YOURACCOUNT -p < syslog-ng.sql 

3.2 Edit syslog-ng.conf

Edit syslog-ng.conf (default installation path will be /usr/local/etc/syslog-ng/ depends on your installation prefix argument)

=== Configuration file start here ===

options
{
chain_hostnames(no);
create_dirs (no);
dir_perm(0755);
dns_cache(yes);
keep_hostname(yes);
log_fifo_size(204);
log_msg_size(8192);
long_hostnames(on);
perm(0644);
stats(3600);
sync(0);
time_reopen (10);
use_dns(yes);
use_fqdn(yes);
};

#----------------------------------------------------------------------
# Sources
#----------------------------------------------------------------------
# For Linux
#----------------------------------------------------------------------
source s_stream
{ unix-stream("/dev/log"; };

source s_internal
{ internal(); };

source s_kernel
{ pipe("/proc/kmsg" log_prefix("kernel: "); };

source s_tcp
{ tcp(port(4800) keep-alive(yes) max_connections(100)); };

#----------------------------------------------------------------------
# Piping method
#----------------------------------------------------------------------
destination database { pipe("/tmp/mysql.pipe" template("INSERT INTO logs (host, facility, priority, level, tag, date, time, program, msg) VALUES ( '$HOST', '$FACILITY', '$PRIORITY', '$LEVEL', '$TAG', '$YEAR-$MONTH-$DAY', '$HOURMINSEC', '$PROGRAM', '$MSG' );\n" template-escape(yes)); };

#----------------------------------------------------------------------
# Logging to a database
#----------------------------------------------------------------------

log { source(s_stream);
source(s_internal);
source(s_kernel); destination(database); };

=== Configuration file end here === 

3.3 Pipe and startup script

3.3.1 Setup syslog-ng run as a daemon

(1)Edit /etc/rc.d/init.d/syslog-ng as below,

=== syslog-ng script start here ===

################################################################################
#
# Program: syslog-ng init script for Red Hat
#
################################################################################
# the following information is for use by chkconfig
# if you are want to manage this through chkconfig (as you should), you must
# first must add syslog-ng to chkconfig's list of startup scripts it
# manages by typing:
#
# chkconfig --add syslog-ng
#
# DO NOT CHANGE THESE LINES (unless you know what you are doing)
# chkconfig: 2345 12 88
# description: syslog-ng is the next generation of the syslog daemon. \
# syslog-ng gives you the flexibility of logging not only by facility and \
# severity, but also by host, message content, date, etc. it can also replace \
# klogd's function of logging kernel messages
#
# This following block of lines is correct, do not change! (for more info, see
# http://www.linuxbase.org/spec/refspecs/LSB_1.1.0/gLSB/facilname.html)
### BEGIN INIT INFO
# Provides: $syslog
### END INIT INFO
################################################################################
#
# This is an init script for syslog-ng on the Linux platform.
#
# It totally relies on the Redhat function library and works the same
# way as other typical Redhat init scripts.
#
#
# Platforms (tested): Linux (Redhat 7.3)
#
#
# Author: Gregor Binder ;
# Changed: October 10, 2000
#
# Last Changed: September 27, 2002
# Updated by: Diane Davidowicz
# changes: Brought the start script up to snuff as far as compliance
# with managing the startup script through chkconfig;
# added PATH variable ability to hook in path to syslog-ng (if
# its necessary); converted init script format to the
# standard init script format in Red Hat (7.3 to be exact)
# including using the /etc/sysconfig/syslog-ng file to
# managed the arguments to syslog-ng without changing this
# script, and disabled klogd but noted where and under what
# conditions it should be enabled. HAPPY LOGGING.
#
# Copyright (c) 2000 by sysfive.com GmbH, All rights reserved.
#
#
################################################################################
#
# configuration
#

INIT_PROG=”/usr/local/sbin/syslog-ng” # Full path to daemon
INIT_OPTS=”" # options passed to daemon

#
# Source Redhat function library.
#
. /etc/rc.d/init.d/functions

# Tack on path to syslog-ng if not already in PATH
SYSLOGNG_PATH=”:/usr/local/sbin”

PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
INIT_NAME=`basename “$INIT_PROG”`

# /etc/sysconfig/ is the standard way to pull in options for a daemon to use.
# Source config
if [ -f /etc/sysconfig/syslog-ng ] ; then
. /etc/sysconfig/syslog-ng
else
SYSLOGNG_OPTIONS=
fi

RETVAL=0

umask 077
ulimit -c 0

# See how we were called.
start() {
echo -n “Starting $INIT_PROG: ”
#daemon $INIT_PROG $SYSLOGNG_OPTIONS
daemon –check $INIT_PROG “$INIT_PROG $INIT_OPTS”
RETVAL=$?
echo

[ $RETVAL -eq 0 ] && touch “/var/lock/subsys/${INIT_NAME}”
return $RETVAL
}

stop() {

echo -n “Stopping $INIT_PROG: ”
killproc $INIT_PROG
RETVAL=$?
echo

[ $RETVAL -eq 0 ] && rm -f “/var/lock/subsys/${INIT_NAME}”
return $RETVAL

}

rhstatus() {
status $INIT_PROG
}

restart() {
stop
start
}

case “$1″ in
start)
start
;;
stop)
stop
;;
status)
rhstatus
;;
restart|reload)
restart
;;
condrestart)
[ -f /var/lock/subsys/syslog-ng ] && restart || :
;;
*)
echo $”Usage: $0 {start|stop|status|restart|reload}”
exit 1
esac

exit $?

=== syslog-ng script end here ===

(2)Set as startup script

#chmod ugo+x /etc/rc.d/init.d/syslog-ng
#chkconfig –add syslog-ng 

3.3.2 Setup mysql-pipe file run as startup

(1)Edit /etc/rc.d/init.d/sqlsyslogd as below,

=== sqlsyslogd script start here ===

#!/bin/bash
#
# sqlsyslogd This is a daemon that takes syslog-ng input and pipe it into
# a MySQL database.
#
# chkconfig: 2345 98 10
# description: sqlsyslogd bridges syslog-ng and mysql.
# author: Josh Kuo Thu 2004/08/12 13:21:56 PDT

. /etc/rc.d/init.d/functions

case “$1″ in
start)
if [ -x /tmp/mysql.pipe ]; then
mkfifo /tmp/mysql.pipe
else
# if the service is already running, do not start another one
PIDS=`pidofproc mysql`
if [ "$PIDS" ]; then
echo “sqlsyslogd is already running.”
exit 1
fi
mysql -u YOURACCOUNT -h YOURMYSQLSERVERNAME -pYOURPASSWORD syslog < /tmp/mysql.pipe &

#If you need to collect apache logs into mysql, uncomment the following two lines.
#tail -f /usr/local/apache2/logs/access_log | logger -p info -t apache &
#tail -f /usr/local/apache2/logs/error_log | logger -p notice -t apache &

fi
;;
stop )
killproc mysql
#If you need to collect apache logs into mysql, uncomment the next line.
#killproc tail
;;

*)
echo "Usage: sqlsyslogd {start|stop}"
exit 1;
esac
exit 0;
=== sqlsyslogd script end here ===

(2)Set as startup script

#chmod ugo+x /etc/rc.d/init.d/sqlsyslogd
#chkconfig --add sqlsyslogd

3.4 Start the services

Run the following command or reboot the system.

#service syslog-ng start
#service sqlsyslogd start
 

4.Syslog-ng Monitor
4.1 Modify db_fns.php

(1)Configure the database function of php include file. YOURDOCROOT/YOURFOLDERNAME/includes/db_fns.php

=== db_fns.php start here ===

function db_connect_syslog()
{
$result = mysql_pconnect("YOURMYSQLSERVERNAME", "YOURACCOUNT", "YOURPASSWORD";
if (!$result)
return false;
if (!mysql_select_db("syslog")
return false;

return $result;
}

?>;

分类: BSD/linux 标签:

FreeBSD 9.0-STABLE + KMS补丁[分享]

2011年12月4日 16hot 2 条评论

由于kib提供的KMS补丁是基于HEAD版本的,有人提取了9.0-STABLE的版本补丁出来。

下面是原始下载地址:

https://docs.google.com/open?id=0BxbPi2OX4_B-NDcwZGI1OTAtOTQxOC00YmMxLTg5ZjEtNmIxYTY0M2I0OWI5

访问不了docs.google.com 兄弟,可以从下面地址下载:

http://www.16hot.com/tmp/drm-all.12.3-stable9.patch

打补丁:
代码:

# cd /usr/src
# patch -p3 < drm-all.12.3-stable9.patch

之后是编译和安装内核……

注:我已经使用12.3版本一天左右时间,目前没有发现异常。之前是一直用10.3。

分类: BSD/linux 标签: ,

身体状况有喜有忧

2011年11月26日 16hot 没有评论

13号开始,腰疼得厉害。吃了些腰,缓和了些,但仍然是疼。在19号去309医院检查,拍了两个X光片,竟然腰椎峡部裂,一度滑脱。按309医院的医生,就要求赶紧住院做手术。后来去北医三院给骨科医生看了片子,说不用手术,给开了些药吃。让不疼的时候,做下腰肌锻炼。
将情况跟父亲说了,也给开了些中药吃。

另外,折腾了两年多的肾炎,在最近的检查,已经基本恢复正常了。一开始得知有尿蛋白,也没有特别的在意,在海淀医院看过,也开了些药吃。在309看的时候,医生就要求赶紧住院,要做肾穿刺。当时是09年年底,那时还在赛尔当技术总监,很忙,就没有去住院。最近回想起来,应该是08年或者09年年初那段时间吃黄豆太多导致尿蛋白过高的。
现在尿蛋白问题解决了,接下来要跟腰椎搏斗了。

分类: 16hot 杂记 标签:

Iptables 规则 一些简单实例和详细介绍(转)

2011年10月30日 16hot 没有评论

设定规则
iptables -p INPUT DROP
iptables -p OUTPUT ACCEPT
iptables -p FORWARD DROP
1、防止外网用内网IP欺骗
iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
查看nat规则
iptables -t nat -L
2、如果想取消上面所加的规则:
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
3、阻止一个IP连接本机
iptables -t filter -A INPUT -s 192.168.1.5 -i eth0 -j DROP
4、查看本机的IPTABLES的所填规则
iptables -L -n
5、清除filter中所有的规则连接
iptables -F
清除filter中使用者自定义连接中的规则
iptables -X
6、保存所修改的iptables规则
/etc/rc.d/init.d/iptables save
重新启动iptables服务
service iptables restart
7、关闭不安全的端口连接本机
iptables -A OUTPUT -p tcp –sport 31337 -j DROP
iptables -A OUTPUT -p tcp –dport 31337 -j DROP
8、开启所需要的端口
22
iptables -A INPUT -p tcp –dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp –sport 22 -j ACCEPT
80
iptables -A OUTPUT -p tcp –sport 80 -j ACCEPT
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
9、禁止一个IP或者一个IP段访问服务器端口服务
80端口
iptables -t filter -I INPUT 2 -s 192.168.5.0/24 -p tcp –dport http -j DROP
FTP端口
iptables -t filter -I INPUT 2 -s 192.168.7.9 -p tcp –dport ftp -j DROP

用iptables -ADC 来指定链的规则,-A添加 -D删除 -C 修改

iptables – [RI] chain rule num rule-specification[option]
用iptables – RI 通过规则的顺序指定

iptables -D chain rule num[option]
删除指定规则
iptables -[LFZ] [chain][option]
用iptables -LFZ 链名 [选项]

iptables -[NX] chain
用 -NX 指定链

iptables -P chain target[options]
指定链的默认目标

iptables -E old-chain-name new-chain-name
-E 旧的链名 新的链名
用新的链名取代旧的链名
说明
Iptalbes 是用来设置、维护和检查Linux内核的IP包过滤规则的。
可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作’target’(目标),也可以跳向同一个表内的用户定义的链。

TARGETS
防火墙的规则指定所检查包的特征,和目标。如果包不匹配,将送往该链中下一条规则检查;如果匹配,那么下一条规则由目标值确定.该目标值可以是用户定义的链名,或是某个专用值,如ACCEPT[通过], DROP[删除], QUEUE[排队], 或者 RETURN[返回]。
ACCEPT 表示让这个包通过。DROP表示将这个包丢弃。QUEUE表示把这个包传递到用户空间。RETURN表示停止这条链的匹配,到前一个链的规则重新开始。如果到达了一个内建的链(的末端),或者遇到内建链的规则是RETURN,包的命运将由链准则指定的目标决定。

TABLES
当前有三个表(哪个表是当前表取决于内核配置选项和当前模块)。
-t table
这个选项指定命令要操作的匹配包的表。如果内核被配置为自动加载模块,这时若模块没有加载,(系统)将尝试(为该表)加载适合的模块。这些表如下:filter,这是默认的表,包含了内建的链INPUT(处理进入的包)、FORWORD(处理通过的包)和OUTPUT(处理本地生成的包)。nat,这个表被查询时表示遇到了产生新的连接的包,由三个内建的链构成:PREROUTING (修改到来的包)、OUTPUT(修改路由之前本地的包)、POSTROUTING(修改准备出去的包)。mangle 这个表用来对指定的包进行修改。它有两个内建规则:PREROUTING(修改路由之前进入的包)和OUTPUT(修改路由之前本地的包)。
OPTIONS
这些可被iptables识别的选项可以区分不同的种类。

COMMANDS
这些选项指定执行明确的动作:若指令行下没有其他规定,该行只能指定一个选项.对于长格式的命令和选项名,所用字母长度只要保证iptables能从其他选项中区分出该指令就行了。
-A -append
在所选择的链末添加一条或更多规则。当源(地址)或者/与 目的(地址)转换为多个地址时,这条规则会加到所有可能的地址(组合)后面。

-D -delete
从所选链中删除一条或更多规则。这条命令可以有两种方法:可以把被删除规则指定为链中的序号(第一条序号为1),或者指定为要匹配的规则。

-R -replace
从选中的链中取代一条规则。如果源(地址)或者/与 目的(地址)被转换为多地址,该命令会失败。规则序号从1开始。

-I -insert
根据给出的规则序号向所选链中插入一条或更多规则。所以,如果规则序号为1,规则会被插入链的头部。这也是不指定规则序号时的默认方式。

-L -list
显示所选链的所有规则。如果没有选择链,所有链将被显示。也可以和z选项一起使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。

-F -flush
清空所选链。这等于把所有规则一个个的删除。

–Z -zero
把所有链的包及字节的计数器清空。它可以和 -L配合使用,在清空前察看计数器,请参见前文。

-N -new-chain
根据给出的名称建立一个新的用户定义链。这必须保证没有同名的链存在。

-X -delete-chain
删除指定的用户自定义链。这个链必须没有被引用,如果被引用,在删除之前你必须删除或者替换与之有关的规则。如果没有给出参数,这条命令将试着删除每个非内建的链。

-P -policy
设置链的目标规则。

-E -rename-chain
根据用户给出的名字对指定链进行重命名,这仅仅是修饰,对整个表的结构没有影响。TARGETS参数给出一个合法的目标。只有非用户自定义链可以使用规则,而且内建链和用户自定义链都不能是规则的目标。

-h Help.
帮助。给出当前命令语法非常简短的说明。

PARAMETERS
参数
以下参数构成规则详述,如用于add、delete、replace、append 和 check命令。

-p -protocal [!]protocol
规则或者包检查(待检查包)的协议。指定协议可以是tcp、udp、icmp中的一个或者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在/etc/protocols中定义的协议名。在协议名前加上”!”表示相反的规则。数字0相当于所有all。Protocol all会匹配所有协议,而且这是缺省时的选项。在和check命令结合时,all可以不被使用。
-s -source [!] address[/mask]
指定源地址,可以是主机名、网络名和清楚的IP地址。mask说明可以是网络掩码或清楚的数字,在网络掩码的左边指定网络掩码左边”1″的个数,因此,mask值为24等于255.255.255.0。在指定地址前加上”!”说明指定了相反的地址段。标志 –src 是这个选项的简写。

-d –destination [!] address[/mask]
指定目标地址,要获取详细说明请参见 -s标志的说明。标志 –dst 是这个选项的简写。

-j –jump target
-j 目标跳转
指定规则的目标;也就是说,如果包匹配应当做什么。目标可以是用户自定义链(不是这条规则所在的),某个会立即决定包的命运的专用内建目标,或者一个扩展(参见下面的EXTENSIONS)。如果规则的这个选项被忽略,那么匹配的过程不会对包产生影响,不过规则的计数器会增加。

-i -in-interface [!] [name]
i -进入的(网络)接口 [!][名称]
这是包经由该接口接收的可选的入口名称,包通过该接口接收(在链INPUT、FORWORD和PREROUTING中进入的包)。当在接口名前使用”!”说明后,指的是相反的名称。如果接口名后面加上”+”,则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为”+”,那么将匹配任意接口。

-o –out-interface [!][name]
-o –输出接口[名称]
这是包经由该接口送出的可选的出口名称,包通过该口输出(在链FORWARD、OUTPUT和POSTROUTING中送出的包)。当在接口名前使用”!”说明后,指的是相反的名称。如果接口名后面加上”+”,则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为”+”,那么将匹配所有任意接口。

[!] -f, –fragment
[!] -f –分片
这意味着在分片的包中,规则只询问第二及以后的片。自那以后由于无法判断这种把包的源端口或目标端口(或者是ICMP类型的),这类包将不能匹配任何指定对他们进行匹配的规则。如果”!”说明用在了”-f”标志之前,表示相反的意思。

OTHER OPTIONS
其他选项
还可以指定下列附加选项:

-v –verbose
-v –详细
详细输出。这个选项让list命令显示接口地址、规则选项(如果有)和TOS(Type of Service)掩码。包和字节计数器也将被显示,分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍(不过请参看-x标志改变它),对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印。

-n –numeric
-n –数字
数字输出。IP地址和端口会以数字的形式打印。默认情况下,程序试显示主机名、网络名或者服务(只要可用)。

-x -exact
-x -精确
扩展数字。显示包和字节计数器的精确值,代替用K,M,G表示的约数。这个选项仅能用于 -L 命令。

–line-numbers
当列表显示规则时,在每个规则的前面加上行号,与该规则在链中的位置相对应。

MATCH EXTENSIONS
对应的扩展
iptables能够使用一些与模块匹配的扩展包。以下就是含于基本包内的扩展包,而且他们大多数都可以通过在前面加上!来表示相反的意思。

tcp
当 –protocol tcp 被指定,且其他匹配的扩展未被指定时,这些扩展被装载。它提供以下选项:

–source-port [!] [port[:port]]
源端口或端口范围指定。这可以是服务名或端口号。使用格式端口:端口也可以指定包含的(端口)范围。如果首端口号被忽略,默认是”0″,如果末端口号被忽略,默认是”65535″,如果第二个端口号大于第一个,那么它们会被交换。这个选项可以使用 –sport的别名。

–destionation-port [!] [port:[port]]
目标端口或端口范围指定。这个选项可以使用 –dport别名来代替。

–tcp-flags [!] mask comp
匹配指定的TCP标记。第一个参数是我们要检查的标记,一个用逗号分开的列表,第二个参数是用逗号分开的标记表,是必须被设置的。标记如下:SYN ACK FIN RST URG PSH ALL NONE。因此这条命令:iptables -A FORWARD -p tcp –tcp-flags SYN, ACK, FIN, RST SYN只匹配那些SYN标记被设置而ACK、FIN和RST标记没有设置的包。

[!] –syn
只匹配那些设置了SYN位而清除了ACK和FIN位的TCP包。这些包用于TCP连接初始化时发出请求;例如,大量的这种包进入一个接口发生堵塞时会阻止进入的TCP连接,而出去的TCP连接不会受到影响。这等于 –tcp-flags SYN, RST, ACK SYN。如果”–syn”前面有”!”标记,表示相反的意思。

–tcp-option [!] number
匹配设置了TCP选项的。

udp
当protocol udp 被指定,且其他匹配的扩展未被指定时,这些扩展被装载,它提供以下选项:

–source-port [!] [port:[port]]
源端口或端口范围指定。详见 TCP扩展的–source-port选项说明。

–destination-port [!] [port:[port]]
目标端口或端口范围指定。详见 TCP扩展的–destination-port选项说明。

icmp
当protocol icmp被指定,且其他匹配的扩展未被指定时,该扩展被装载。它提供以下选项:
–icmp-type [!] typename
这个选项允许指定ICMP类型,可以是一个数值型的ICMP类型,或者是某个由命令iptables -p icmp -h所显示的ICMP类型名。

mac
–mac-source [!] address
匹配物理地址。必须是XX:XX:XX:XX:XX这样的格式。注意它只对来自以太设备并进入PREROUTING、FORWORD和INPUT链的包有效。

limit
这个模块匹配标志用一个标记桶过滤器一一定速度进行匹配,它和LOG目标结合使用来给出有限的登陆数.当达到这个极限值时,使用这个扩展包的规则将进行匹配.(除非使用了”!”标记)

–limit rate
最大平均匹配速率:可赋的值有’/second’, ‘/minute’, ‘/hour’, or ‘/day’这样的单位,默认是3/hour。

–limit-burst number
待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则概数字加1.默认值为5

multiport
这个模块匹配一组源端口或目标端口,最多可以指定15个端口。只能和-p tcp 或者 -p udp 连着使用。

–source-port [port[, port]]
如果源端口是其中一个给定端口则匹配

–destination-port [port[, port]]
如果目标端口是其中一个给定端口则匹配

–port [port[, port]]
若源端口和目的端口相等并与某个给定端口相等,则匹配。
mark
这个模块和与netfilter过滤器标记字段匹配(就可以在下面设置为使用MARK标记)。

–mark value [/mask]
匹配那些无符号标记值的包(如果指定mask,在比较之前会给掩码加上逻辑的标记)。

owner
此模块试为本地生成包匹配包创建者的不同特征。只能用于OUTPUT链,而且即使这样一些包(如ICMP ping应答)还可能没有所有者,因此永远不会匹配。

–uid-owner userid
如果给出有效的user id,那么匹配它的进程产生的包。

–gid-owner groupid
如果给出有效的group id,那么匹配它的进程产生的包。

–sid-owner seessionid
根据给出的会话组匹配该进程产生的包。

state
此模块,当与连接跟踪结合使用时,允许访问包的连接跟踪状态。

–state state
这里state是一个逗号分割的匹配连接状态列表。可能的状态是:INVALID表示包是未知连接,ESTABLISHED表示是双向传送的连接,NEW表示包为新的连接,否则是非双向传送的,而RELATED表示包由新连接开始,但是和一个已存在的连接在一起,如FTP数据传送,或者一个ICMP错误。

unclean
此模块没有可选项,不过它试着匹配那些奇怪的、不常见的包。处在实验中。

tos
此模块匹配IP包首部的8位tos(服务类型)字段(也就是说,包含在优先位中)。

–tos tos
这个参数可以是一个标准名称,(用iptables -m tos -h 察看该列表),或者数值。

TARGET EXTENSIONS
iptables可以使用扩展目标模块:以下都包含在标准版中。

LOG
为匹配的包开启内核记录。当在规则中设置了这一选项后,linux内核会通过printk()打印一些关于全部匹配包的信息(诸如IP包头字段等)。
–log-level level
记录级别(数字或参看 syslog.conf(5))。
–log-prefix prefix
在纪录信息前加上特定的前缀:最多14个字母长,用来和记录中其他信息区别。

–log-tcp-sequence
记录TCP序列号。如果记录能被用户读取那么这将存在安全隐患。

–log-tcp-options
记录来自TCP包头部的选项。
–log-ip-options
记录来自IP包头部的选项。

MARK
用来设置包的netfilter标记值。只适用于mangle表。

–set-mark mark

REJECT
作为对匹配的包的响应,返回一个错误的包:其他情况下和DROP相同。

此目标只适用于INPUT、FORWARD和OUTPUT链,和调用这些链的用户自定义链。这几个选项控制返回的错误包的特性:

–reject-with type
Type可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port-nreachable、icmp-proto-unreachable、 icmp-net-prohibited 或者 icmp-host-prohibited,该类型会返回相应的ICMP错误信息(默认是port-unreachable)。选项 echo-reply也是允许的;它只能用于指定ICMP ping包的规则中,生成ping的回应。最后,选项tcp-reset可以用于在INPUT链中,或自INPUT链调用的规则,只匹配TCP协议:将回应一个TCP RST包。
TOS
用来设置IP包的首部八位tos。只能用于mangle表。

–set-tos tos
你可以使用一个数值型的TOS 值,或者用iptables -j TOS -h 来查看有效TOS名列表。
MIRROR
这是一个试验示范目标,可用于转换IP首部字段中的源地址和目标地址,再传送该包,并只适用于INPUT、FORWARD和OUTPUT链,以及只调用它们的用户自定义链。

SNAT
这个目标只适用于nat表的POSTROUTING链。它规定修改包的源地址(此连接以后所有的包都会被影响),停止对规则的检查,它包含选项:

–to-source [-][:port-port]
可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。如果未指定端口范围,源端口中512以下的(端口)会被安置为其他的512以下的端口;512到1024之间的端口会被安置为1024以下的,其他端口会被安置为1024或以上。如果可能,端口不会被修改。

–to-destiontion [-][:port-port]
可以指定一个单一的新的IP地址,一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。如果未指定端口范围,目标端口不会被修改。

MASQUERADE
只用于nat表的POSTROUTING链。只能用于动态获取IP(拨号)连接:如果你拥有静态IP地址,你要用SNAT。伪装相当于给包发出时所经过接口的IP地址设置一个映像,当接口关闭连接会终止。这是因为当下一次拨号时未必是相同的接口地址(以后所有建立的连接都将关闭)。它有一个选项:

–to-ports [-port>]
指定使用的源端口范围,覆盖默认的SNAT源地址选择(见上面)。这个选项只适用于指定了-p tcp或者-p udp的规则。

REDIRECT
只适用于nat表的PREROUTING和OUTPUT链,和只调用它们的用户自定义链。它修改包的目标IP地址来发送包到机器自身(本地生成的包被安置为地址127.0.0.1)。它包含一个选项:

–to-ports [ ]
指定使用的目的端口或端口范围:不指定的话,目标端口不会被修改。只能用于指定了-p tcp 或 -p udp的规则。

DIAGNOSTICS
诊断
不同的错误信息会打印成标准错误:退出代码0表示正确。类似于不对的或者滥用的命令行参数错误会返回错误代码2,其他错误返回代码为1。

BUGS
臭虫
Check is not implemented (yet).
检查还未完成。

COMPATIBILITY WITH IPCHAINS
与ipchains的兼容性
iptables和Rusty Russell的ipchains非常相似。主要区别是INPUT 链只用于进入本地主机的包,而OUTPUT只用于自本地主机生成的包。因此每个包只经过三个链的一个;以前转发的包会经过所有三个链。其他主要区别是 -i 引用进入接口;-o引用输出接口,两者都适用于进入FORWARD链的包。当和可选扩展模块一起使用默认过滤器表时,iptables是一个纯粹的包过滤器。这能大大减少以前对IP伪装和包过滤结合使用的混淆,所以以下选项作了不同的处理:
-j MASQ
-M -S
-M -L
在iptables中有几个不同的链。

分类: BSD/linux, 转载 标签: ,

解决FreeBSD下编译LuaJIT的问题

2011年10月29日 16hot 没有评论

在FreeBSD下编译LuaJIT时,报如下错误:

CC lj_err.o
lj_err.c:189:20: error: unwind.h: No such file or directory
lj_err.c:199: error: expected declaration specifiers or '...' before '_Unwind_Action'
lj_err.c:200: error: expected declaration specifiers or '...' before '_Unwind_Exception_Class'
lj_err.c:201: warning: 'struct _Unwind_Context' declared inside parameter list
lj_err.c:201: warning: its scope is only this definition or declaration, which is probably not what you want
lj_err.c:201: warning: 'struct _Unwind_Exception' declared inside parameter list
lj_err.c: In function 'lj_err_unwind_dwarf':
lj_err.c:206: error: '_URC_FATAL_PHASE1_ERROR' undeclared (first use in this function)
lj_err.c:206: error: (Each undeclared identifier is reported only once
lj_err.c:206: error: for each function it appears in.)
lj_err.c:207: error: 'uexclass' undeclared (first use in this function)
lj_err.c:208: warning: implicit declaration of function '_Unwind_GetCFA'
lj_err.c:208: warning: cast to pointer from integer of different size
lj_err.c:210: error: 'actions' undeclared (first use in this function)
lj_err.c:210: error: '_UA_SEARCH_PHASE' undeclared (first use in this function)
lj_err.c:213: error: '_URC_CONTINUE_UNWIND' undeclared (first use in this function)
lj_err.c:218: error: '_URC_HANDLER_FOUND' undeclared (first use in this function)
lj_err.c:220: error: '_UA_CLEANUP_PHASE' undeclared (first use in this function)
lj_err.c:225: error: '_UA_HANDLER_FRAME' undeclared (first use in this function)
lj_err.c:226: warning: implicit declaration of function '_Unwind_DeleteException'
lj_err.c:231: error: '_UA_FORCE_UNWIND' undeclared (first use in this function)
lj_err.c:234: warning: implicit declaration of function '_Unwind_SetGR'
lj_err.c:235: warning: implicit declaration of function '_Unwind_SetIP'
lj_err.c:235: error: '_Unwind_Ptr' undeclared (first use in this function)
lj_err.c:238: error: '_URC_INSTALL_CONTEXT' undeclared (first use in this function)
lj_err.c:246: error: expected ')' before 'lj_vm_unwind_rethrow'
lj_err.c: In function 'err_raise_ext':
lj_err.c:271: error: invalid use of undefined type 'struct _Unwind_Exception'
lj_err.c:271: error: '_Unwind_Exception_Class' undeclared (first use in this function)
lj_err.c:272: error: invalid use of undefined type 'struct _Unwind_Exception'
lj_err.c:273: warning: implicit declaration of function '_Unwind_RaiseException'
gmake: *** [lj_err.o] 错误 1

只需要拷贝一个头文件,并且改名即可:

/usr/src/contrib/gcc/unwind-generic.h /usr/include/unwind.h

分类: BSD/linux, LUA 标签: , ,

用LUA做程序配置文件

2011年10月27日 16hot 没有评论

本来想用bison、flex来写一个配置文件的。但是看了看资料,不容易懂,而且也不灵活。还是放弃了。
后来想起了lua,现在流行用lua来做服务程序的配置文件。强大、灵活,而且与C可以紧密结合。

下面是C程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
 
/*
 * getcfg.c
 * cc -o getcfg getcfg.c -I/usr/local/include/lua51 -L/usr/local/lib/lua51 -llua -lm
 */
 
#include <lua.h>
#include <lauxlib.h>
#include <stdlib.h>
#include <stdio.h>
 
 
int
main(void)
{
    int status, result, ind;
	const char       *key, *value;
    double sum;
    lua_State *L;
 
    /*
     * All Lua contexts are held in this structure. We work with it almost
     * all the time.
     */
    L = luaL_newstate();
 
    luaL_openlibs(L); /* Load Lua libraries */
 
    /* Load the file containing the script we are going to run */
    if ( luaL_loadfile(L, "server.cfg") || lua_pcall(L, 0, 0, 0) ) {
        /* If something went wrong, error message is at the top of */
        /* the stack */
        fprintf(stderr, "Couldn't load file: %s\n", lua_tostring(L, -1));
		lua_pop(L, 1);
        exit(1);
    }
 
	lua_getglobal(L, "socket" );
	const char *socket = lua_tostring(L, -1);
 
	printf( "socket %s\n", lua_tostring(L, -1));
 
	lua_pop(L, 2);
 
	lua_getglobal(L, "servers"); 
 
	if (!lua_istable(L, -1))
	{
		fprintf(stderr, "%s\n", lua_tostring(L, -1));
		lua_pop(L, 1); // remove the error-msg 
		return -1; 
	}
	ind = lua_gettop(L);
	printf( "index: %d\n", ind );
	lua_pushnil(L);	
	while (lua_next(L, -2) != 0)
	{
		/** 获取服务索引名 */
			key = lua_tostring(L, -2);
			printf( "key name: %s\n", key );
		if (lua_istable(L, -1))
		{
			ind = 1;
			lua_pushnil(L);
 
 
			while (lua_next(L, -2) != 0)
			{
				/** 获取服务配置 */
				key = lua_tostring(L, -2);
				if(strcmp("bin", key) == 0)
				{
					printf( "bin %s\n", lua_tostring(L, -1) );
				}
				else if(strcmp("pid", key) == 0)
				{
					printf( "pid %s\n", lua_tostring(L, -1) );
				}
				else if(strcmp("params", key) == 0)
				{
					printf( "params %s\n", lua_tostring(L, -1) );
				}
				else if(strcmp("config", key) == 0)
				{
					printf( "config %s\n", lua_tostring(L, -1) );
				}
			    else {
					printf("Unkonw key: %s\n", key );
				}
				lua_pop( L, 1 );
			}
 
		}
		lua_pop(L, 1); 
	}
 
 
    lua_close(L);   /* Cya, Lua */
 
    return 0;
}

下面是LUA代码:

1
2
3
4
5
6
7
8
9
10
11
12
 
daemon = false
 
socket = "/var/run/daemon-server.sock"
 
servers = {
	["phpd"] = { 
		pid = "/var/run/phpd.pid",
		bin = "/usr/local/sbin/phpd",
		delay = 300, 
	}
}
分类: C/C++, LUA 标签: ,

FreeBSD下根据进程名称获取PID

2011年10月27日 16hot 没有评论

想通过进程名称来监控进程是否健在,在网上找了一个小例子,改成如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
 * 
 * gcc getproc.c -I/usr/include -I/usr/local/include -L/usr/lib/ -L/usr/local/lib/ -lkvm -o getproc
 */
 
#include <stdio.h>   
#include <string.h>   
#include <err.h>   
#include <kvm.h>   
#include <sys/param.h>   
#include <sys/sysctl.h>   
#include <sys/user.h>   
#include <sys/param.h>   
#include <fcntl.h>   
#include <stdlib.h>   
#include <sysexits.h>    
static int  
get_pid_of_process(char *process_name)   
{   
 static kvm_t *kd = NULL;   
 struct kinfo_proc *p;   
 int i, n_processes, processes_found;   
 processes_found = 0;   
 
 if ((kd = kvm_open("/dev/null", "/dev/null", "/dev/null", O_RDONLY, "kvm_open")) == NULL)    
    (void)errx(1, "%s", kvm_geterr(kd));   
 else {   
  p = kvm_getprocs(kd, KERN_PROC_PROC, 0, &n_processes);   
  for (i = 0; i < n_processes; i++)   
   if (strncmp(process_name, p[i].ki_comm, COMMLEN+1) == 0) {   
    (void)printf("progame: %s, pid: %d \n", process_name, (int)p[i].ki_pid);   
    processes_found++;   
   }   
//~ if (p[i].ki_pid == pid){
  //~ (void)printf("%s ", p[i].ki_comm);
  //~ processes_found++;
 //~ }
  kvm_close(kd);   
 }
 return processes_found;   
}   
 
 
int main( int argc, char **argv ) {
    int pf = 0;
 
    if ( argc < 2 ) {
        printf( "Please input a process name!\n" );
        exit(0);
    }
 
    pf = get_pid_of_process( (argv[1]) );
 
    printf( "have found %d proess\n", pf );
    return 0;
}
分类: BSD/linux, C/C++ 标签: ,