Posts Tagged FreeBSD

用ssh tunnel打造安全邮件系统

近期,甚至于连Google这样的企业也感觉到了邮件系统的安全问题。这里采用了相对实现成本较低的方式,通过ssh的tunnel达到邮件在传输的过程中不会受到中间人攻击造成数据泄露。

故名思义,tunnel就是在邮件服务器和企业防火墙之后设置一条逻辑上的隧道。这条隧道一方面为了数据安全,另一方面,由于ssh的压缩功能也能在一定程度上减少邮件这类纯文本传输的网络需求。

先决条件:

  1. Unix like的邮件系统,并安装了ssh-server,本例中假定邮件服务器ip为1.2.3.4
  2. 企业路由器和内网:路由最好有vpn和防火墙功能。
  3. 内网的 一台主机,配置不必太高(我用了虚拟机,64M内存已经足够近百人使用),安装有ssh-client,如果是win主机,推荐使用putty的安装版本。经过测试,个人觉得FreeBSD下的性能较好。考虑到安全,这台主机尽量不要安装远程控制台并尽可能上锁。本例假定ip 192.168.1.1。
  4. 注意整个系统的安全策略,账户策略等,相比中间人攻击这样的“高级”黑客行为,破解密码,利用漏洞永远是成本最低的方法。

Read the rest of this entry »

, , , ,

1 Comment

FreeBSD+apache+PHP+OCI支持Oracle

由于FreeBSD的Port中自带了oracle-client可用,但仅支持i386的平台,故此文仅针对于i386,AMD64无法实现oci的连接库。

首先,确定你已经安装好apache + php,没有安装的可以参考这里或者文学化的这里

安装php5-oci8

cd /usr/ports/database/php5-oci8
make install clean

安装到这里,Php的OCI8库已经安装成功,但需要对oracle-client进行设置,否则无法使用。

将tnsnames.ora拷贝到/usr/local/oracle8-client/network/admin/ 目录下
内容大致如下: Read the rest of this entry »

, ,

1 Comment

踩到雷

公司的邮件服务器升级了一下perl,从5.8.8到5.8.9。只为更好的支持更新版本的webmail程序。按理说作为FreeBSD系统,升级下perl不是什么困难的事情,可真正的问题才刚刚开始。

首先是要伴随perl升级一系列的模块,这似乎也不是难事。然后是执行perl-after-upgrade。一切似乎很顺利。随意习惯性的top了一下,发觉负载已经高达60%以上,而且是邮件系统的MailScanner的进程奇高。考虑到MailScanner引用了perl,很明显的需要restart一下。这时候问题来了。

restart之后,邮件不能正常接收,检查原因,发觉邮件在MailScanner中不停的check。赶紧检查日志,很明显的报错:

MailScanner[66402]: Could not use Custom Function code /usr/local/lib/MailScanner/MailScanner/CustomFunctions/GenericSpamScanner.pm, it could not be “require”d. Make sure the last line of the file says “1

调用万能的google,关键字perl5.8.9 MailScanner,发觉通篇都是与我一样的报错,最新的记录似乎也没多远。貌似是我幸运的踩到了雷。

临时处理方法其实也是非常简单的——退回到perl5.8.8就OK。

,

No Comments

FreeBSD的ZFS

ZFS是sun跟随opensolaris项目一并开源的存储解决方案。具体的优势可以参考这里 。 本文不做累述。总之,使用ZFS可以将所有系统的裸存储设备都利用起来——小到磁盘,大到盘柜,都不需要考虑具体的容量分配。相对来说是低成本的存储解决方案。

Freebsd近期也引入了ZFS这一存储格式,作为存储服务器,个人觉得用Solaris远没有Freebsd成本来的低。具体操作如下:

首先,照例的更新版本库,升级内核

#cvsup -h cvsup.cn.freebsd.org /usr/share/examples/cvsup/stable-supfile  //漫长的等待

#cd /usr/src

#make buildkernel ; make installkernel //更加漫长的等待

#halt

关机后为系统安装磁盘,这边由于是测试环境,采用了一个磁盘的两个分区为例。如果是生产环境,建议采用至少2块以上的硬盘作为ZFS的物理设备。

#echo "zfs_enable=YES" >> /etc/rc.conf

# /etc/rc.d/zfs start //启用ZFS服务

# echo ”daily_status_zfs_enable="YES"” >> /etc/periodic.conf //自动更新

开始设置ZFS库

#zpool zpool create zfs raidz ad7s1 ad7s2

这里要注意的是raidz参数可以用mirror、raidz1(raidz默认)、raidz2来代替,分别相当于传统上的Raid 1 Raid5和Raid6

# zpool status zfs
  pool: zfs
 state: ONLINE
 scrub: scrub completed with 0 errors on Wed Nov 19 05:11:29 2008
config:

    NAME        STATE     READ WRITE CKSUM
    zfs         ONLINE       0     0     0
      raidz1    ONLINE       0     0     0
        ad7s1   ONLINE       0     0     0
        ad7s2   ONLINE       0     0     0

errors: No known data errors
 

恭喜,ZSF pool已经成功!

然后是创建文件系统:

# zfs create zfs/www

如果成功,系统将会出现/zfs/www目录

# mount
/dev/ad4s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad4s1g on /data (ufs, local, soft-updates)
/dev/ad4s1e on /tmp (ufs, local, soft-updates)
/dev/ad4s1f on /usr (ufs, local, soft-updates)
/dev/ad4s1d on /var (ufs, local, soft-updates)
zfs on /zfs (zfs, local)
zfs/www on /zfs/www (zfs, local)

设置文件系统参数:

#zfs set compression=gzip zfs/www //设置自动做gzip

设置NFS共享:

#zfs share zfs/www

搞定!

具体命令解释可以参考SUN的官方文档

题外话:

总觉的ZFS的思想有些超前,128位的文件系统倒可以先不谈。光是自动设置gzip这一项,可真是考验机器的设置。4核的Xeon搞个500M左右的文件竟然花费了n久,何况几年前?SUN的技术始终是这么的接近于”实现的边缘“也难怪SUN这些日子可不是那么好过。

1 Comment

用FreeBSD的ports安装apache+php+mysql·改

 正如我一贯习惯于规律性的工作和生活一样,昨天,我按照惯例在以往的时间,用电脑里的outlook软件收信——天热,纵然室内空调的温度已经远远低于官方标准的26度,人毕竟还是没有冷天来的那么清醒。如果从心理学的角度上讲,也许那时的我正处在“意识朦胧状态”。除了正如以往枯燥的工作E-mail之外,我收到了一封网友的E-mail。出乎意料的是,不同于往常访客在浏览了我的个人网页以后会在文章后面发表评论,这次却是发了mail。既然如此,我觉得mail一定是重要的,至少体现了相当一部分访客的心情吧。

那篇E-mail不长,在我的电脑上显示下来仅仅只有三行不到的样子,大抵的内容无非是说本站如何如何的帮了忙,我不免沾沾自喜起来——正如往常的沾沾自喜一样,mail的结尾处指出了小站的几个问题,最重要的是说很多文章过于流程化了,没有一点文字上的修饰和润色,言外之意是字里行间缺乏应有的优雅和细致。要指明的是,所谓优雅和细致,正是目前白领文学或者说白领文化所擅长的。说到白领文化的代表,我想村上春树的小说(或者说林少华翻译的日本小说)、伍佰的歌词、汪家卫的台词、小女人的blog绝对可以作为代表。作为我,从来没有当作自己是白领的一员——乏味的代码、吵闹的机房、灰尘遍布的机架,也许能跟这些词句联系上的只有“体力劳动”一个词了。我固然写不出优雅和细致,字里行间唯独只有王朔依稀的身影。于是我决定做一个尝试,既然有这样的需求,按照目前常说的一句话似乎叫做“需求第一”吧,我决定润色并重写本站访问量最高的那篇文章……

  Read the rest of this entry »

, , ,

5 Comments

使用带有Dtrace的FreeBSD

Dtrace( Dynamic tracing ),原本是Solaris 10中的新特性。它允许用户跟踪系统内核以及用户进程。是非常优秀的诊断工具。自从OpenSolaris之后,这种特性也被移植到了FreeBSD。需要说明的是,Dtrace的操作均通过内核中的prob来进行的,这需要新的内核,故Dtrace功能的内核不会出现在6.X版本中,要想体验Dtrace,目前还必须使用特殊的FreeBSD内核。

编辑特殊的cvsup :

*default host=cvsup10.freebsd.org*default base=/usr*default prefix=/usr/src*default release=cvs*default delete use-rel-suffixp4-cvs-dtrace

Dtarce For FreeBSD正处于测试阶段,故目前仅有cvsup10.freebsd.org一台主机提供同步。

CVSUP并成功编译后,重启主机。注意的是由于该代码树并非stable,并不保证内核能够通过编译。如果采用最保守的编译方式仍不能通过,建议还是等几天再同步一下看看。

正常的话会出现第6项Boot FreeBSD with DTrace enabled。

建立一个dtrace脚本 hello.d:

BEGIN { trace("Hello world !"); exit(0); }

 

Dtrace -s hello.d

No Comments

FreeBSD ports的修复

习惯上用portupgrade -a命令升级全部软件包。可是近期有两个库一直跟我过不去GD和Jpeg,系统提示pkgdb.db文件的依赖性有问题,需要修复。

按照提示输入pkgdb -F修复了半天,回答的问题一道道,像是考试一样,很烦,于是杀掉后,pkgdb -aF自动修复得了,谁知这下玩了蛋,系统提示:

—>  Updating the pkgdb
[Rebuilding the pkgdb <format:bdb_btree> in /var/db/pkg ... /var/db/pkg/pkgdb.db: unexpected file type or format -- Invalid argument: Cannot update the pkgdb!]

呵呵,损坏了!

在man里面找了半天,得出了解决方法。

  • rm /var/db/pkg/pkgdb.db
    删除pkgdb.db软件包数据库。俗话说:旧的不去,新的不来。
  • portversion
    重建软件包数据库。

所有问题迎刃而解,就是这么简单!

No Comments

给FreeBSD Ports加速的方法

  • 使用代理。

在/etc/make.conf中设置:
FETCH_ENV= "HTTP_PROXY=IP[:端口]"
如果需要,在FETCH_ENV值后面加入空格,
HTTP_PROXY_AUTH=basic:*:user:password

  • 利用其他机器下载的文件

首先,请确保2台机器cvsup的一致,然后将A机的/usr/ports/distfiles拷贝至B机的相同位置。
更有甚者……开NFS吧。

方法c:使用wget/axel加速你的port下载

以下所述功能均通过修改make.conf实现

对于wget
========
FETCH_CMD= wget
FETCH_BEFORE_ARGS= -c -t 1
FETCH_AFTER_ARGS=
DISABLE_SIZE=yes #这行是必要的,否则…

前面3行也可以换成
FETCH_CMD=wget -c -t 1

如果你要wget穿透代理服务器,请加上下面两行
FETCH_ENV=http_proxy=http://proxy2.zsu.edu.cn:3128
FETCH_ENV=ftp_proxy=http://proxy2.zsu.edu.cn:3128

或者使用其他的穿越代理工具例如proxychains 或者socks5(runsocks)
则FETCH_CMD=proxychains wget或者runsocks wget

什么?不知道wget是什么?那就先
cd /usr/ports/ftp/wget/
make install clean

对于axel
========
同样,也可以使用axel来替换fetch来进行多线程下载
FETCH_CMD=axel
FETCH_BEFORE_ARGS= -a
FETCH_AFTER_ARGS=
DISABLE_SIZE=yes
或者只写一行
FETCH_CMD=axel -a

axel 穿透代理服务器的方法与wget一致

axel在/usr/ports/ftp/axel位置

  • 添加更快的port下载站点

在make.conf文件中使用配置MASTER_SITE_OVERRIDE参数,可自行增加软件镜像以及修改镜像服务器的优先级。
如,以下是解决教育网用户下载慢的问题
MASTER_SITE_OVERRIDE=
ftp://ftp2.tsinghua.edu.cn/mirror/FreeBSD/ports/distfiles/
ftp://freebsd.csie.nctu.edu.tw/pub/FreeBSD/ports/distfiles/
ftp://ftp.hk.freebsd.org/pub/FreeBSD/ports/distfiles/
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/

No Comments

FreeBSD下整合Apache和Tomcat

首先,建议大家检查 /etc/rc.conf,看看有没有开启Linux二进制兼容模式!

代码:
  linux_enable="YES"

安装之前,需要你安装JDK – Java Develop Kit,对应的需求如下:

  • Tomcat 4.x.x 以下版本 – JDK 1.3.X ~ JDK1.4.X
  • Tomcat 5.0.x 版本 – JDK 1.4.X or upper
  • Tomcat 5.5.x 版本 – JDK 5.0

自从发布了JDK的官方For FreeBSD版本后,安装JDK变得容易了许多。

下面开始进行….首先,请针对所需要安装的ports进行cvsup !

(1)安装Apache Web Server

代码:
  # cd /usr/ports/www/apache13/
  # make
  # make install


完成后,请在 /etc/rc.conf 加入如下内容:

代码:
  apache_enable="YES"

(2)安装Apache Tomcat

代码:
  # cd /usr/ports/www/jakarta-tomcat5/
  # make
  # make install


安装完成后,请确认是存在/usr/local/bin/tomcat50ctl!并确认server.xml是有开启AJP1.3的:

代码:
  <Connector port="8009" protocol="AJP/1.3" protocolHandlerClassName="org.apache.jk.server.JkCoyoteHandler" redirectPort="8443">

(3)配置一些环境变量

图简单可以把它们放在/etc/rc.conf中!

代码:
  export JAVA_HOME=/usr/local/jdk1.5.0
  export CATALINA_HOME=/usr/local/jakarta-tomcat5.0
  export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

(4)阶段性测试

看看Tomcat是否正常:

代码:
  # cd /usr/local/jakarta-tomcat5.0/bin/
  # ./startup.sh


应该看到如下的内容,并请你用Web浏览器测试Tomcat!

代码:
  Using CATALINA_BASE:   /usr/local/jakarta-tomcat5.0
  Using CATALINA_HOME:   /usr/local/jakarta-tomcat5.0
  Using CATALINA_TMPDIR:   /usr/local/jakarta-tomcat5.0/temp
  Using JAVA_HOME:   /usr/local/jdk1.5.0

(5)开始进行整合Apache & Tomcat

首先安装mod_jk:

代码:
  # cd /usr/ports/www/mod_jk
  # make
  # make install


完成后,请修改/usr/local/etc/apache/httpd.conf,找到下面2行,把行首的注释符号#去掉!

代码:
  LoadModule jk_module  libexec/apache/mod_jk.so
  AddModule  mod_jk.c


新增下面的配置内容:

代码:
  Include /usr/local/etc/apache/mod_jk.conf


修改/usr/local/etc/apache/mod_jk.conf的内容:

代码:
   <IfModule mod_jk.c>
       JkWorkersFile /usr/local/etc/apache/workers.properties
       JkLogFile  /var/log/mod_jk.log
       JkLogLevel warn
       JkMount /*.jsp default
       JkMount /servlet/* default
       JkMount /examples/* default
   </IfModule>


接下来,需要修改/usr/local/etc/apache/workers.properties (注意2个文件中的default只是一个代号!):

代码:
  workers.tomcat_home=/usr/local/jakarta-tomcat5.0
  workers.java_home=$JAVA_HOME
  ps=/
  worker.list=default
  worker.default.port=8009
  worker.default.host=localhost
  worker.default.type=ajp13
  worker.default.lbfactor=1

好,到这里配置基本上完成了,接下来开始祈祷并运行吧!

代码:
  # touch /var/log/mod_jk.log
  # /usr/local/bin/tomcat50ctl start
  # /usr/local/sbin/apachectl start

写一个测试的test.jsp放到/usr/local/jakarta-tomcat5.0/webapps/ROOT/,用 http://localhost/test.jsp 看看!

更多信息,请参考:ApacheTomcat.com FlashGuides

, ,

1 Comment

”httpready” Accept Filter

在FreeBSD下使用ports安装apache22会出现类似的warming:
No such file or directory: Failed to enable the ”httpready” Accept Filter

解决方法是:
#kldload accf_http

并将/boot/defaults/loader.conf中,以便下次启动自动装载模块
accf_data_load="YES"
accf_http_load="YES"

个人觉得这好像是一个apache22的bug,不能启动FreeBSD自带的一个基于http端口过滤的模块。这个模块的作用很不错——检查HTTP请求是否完整,符合规则accpt一个Http进程,
否则就扔掉。

linux下也有一个类似的东西,工作在 accept 的 socket 上面。代码:

val = 5;      setsockopt(srv_socket->fd, SOL_TCP, TCP_DEFER_ACCEPT, &val, sizeof(val)) ;

,

No Comments