Linux内核 sysctl.conf 优化设置

可以通过/etc/sysctl.conf控制和配置Linux内核及网络设置。

# 避免放大攻击
net.ipv4.icmp_echo_ignore_broadcasts = 1

# 开启恶意icmp错误消息保护
net.ipv4.icmp_ignore_bogus_error_responses = 1

# 开启SYN洪水攻击保护
net.ipv4.tcp_syncookies = 1

# 开启并记录欺骗,源路由和重定向包
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# 处理无源路由的包
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# 开启反向路径过滤
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# 确保无人能修改路由表
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# 不充当路由器
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0

# 开启execshild
kernel.exec-shield = 1
kernel.randomize_va_space = 1

# IPv6设置
net.ipv6.conf.default.router_solicitations = 0
net.ipv6.conf.default.accept_ra_rtr_pref = 0
net.ipv6.conf.default.accept_ra_pinfo = 0
net.ipv6.conf.default.accept_ra_defrtr = 0
net.ipv6.conf.default.autoconf = 0
net.ipv6.conf.default.dad_transmits = 0
net.ipv6.conf.default.max_addresses = 1

# 优化LB使用的端口

# 增加系统文件描述符限制
fs.file-max = 65535

# 允许更多的PIDs (减少滚动翻转问题); may break some programs 32768
kernel.pid_max = 65536

# 增加系统IP端口限制
net.ipv4.ip_local_port_range = 2000 65000

# 增加TCP最大缓冲区大小
net.ipv4.tcp_rmem = 4096 87380 8388608
net.ipv4.tcp_wmem = 4096 87380 8388608

# 增加Linux自动调整TCP缓冲区限制
# 最小,默认和最大可使用的字节数
# 最大值不低于4MB,如果你使用非常高的BDP路径可以设置得更高

# Tcp窗口等
net.core.rmem_max = 8388608
net.core.wmem_max = 8388608
net.core.netdev_max_backlog = 5000
net.ipv4.tcp_window_scaling = 1
转自:http://www.hit008.com/read.php?5

优化LINUX内核阻挡SYN洪水攻击

SYN洪水攻击(SYN Flooding Attack)即是指利用了 TCP/IP 三次握手协议的不完善而恶意发送大量仅仅包含 SYN 握手序列数据包的攻击方式。该种攻击方式可能将导致被攻击计算机为了保持潜在连接在一定时间内大量占用系统资源无法释放而拒绝服务甚至崩溃。如果在Linux服务器下遭受SYN洪水攻击,可以进行如下一些设置:

#缩短SYN- Timeout时间:
iptables -A FORWARD -p tcp –syn -m limit –limit 1/s -j ACCEPT
iptables -A INPUT -i eth0 -m limit –limit 1/sec –limit-burst 5 -j ACCEPT

#每秒 最多3个 syn 封包 进入 表达为 :
iptables -N syn-flood
iptables -A INPUT -p tcp –syn -j syn-flood
iptables -A syn-flood -p tcp –syn -m limit –limit 1/s –limit-burst 3 -j RETURN
iptables -A syn-flood -j REJECT

#设置syncookies:
sysctl -w net.ipv4.tcp_syncookies=1
sysctl -w net.ipv4.tcp_max_syn_backlog=3072
sysctl -w net.ipv4.tcp_synack_retries=0
sysctl -w net.ipv4.tcp_syn_retries=0
sysctl -w net.ipv4.conf.all.send_redirects=0
sysctl -w net.ipv4.conf.all.accept_redirects=0
sysctl -w net.ipv4.conf.all.forwarding=0
sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1

#防止PING:
sysctl -w net.ipv4.icmp_echo_ignore_all=1

#拦截具体IP范围:
iptables -A INPUT -s 10.0.0.0/8 -i eth0 -j Drop
转自:http://www.hit008.com/read.php?30

简述Postfix的工作原理

传统的Sendmail将所有功能都集中在同一个程序里,这种结构我们称之为“单体式设计”(monolithic).Postfix采用专职负责的策略,不同的功能分别交由不同的专门程序处理,这种结构称为“模块化设计”(modular)。这些自成一格的专门程序,我们称之为组件(component)。大多数组件都是以daemon的形式存在,也就是常驻在系统内存里的连续动作的后台进程(background process)。
  当Postfix被启动后,首先启动的是master daemon,它主导邮件的处理流程,同时也是其他组件的总管。在处理邮件的过程中,master会启动对应功能的组件来处理相关事宜,被master启动的组件,在完成交付的工作之后会自行结束;或者,如果组件的处理时间超过时限,或是工作量到达预定限度,组件也会自行结束。master daemon会常驻在系统中,当管理员启动它时,它从main.cf和master.cf这两个配置文件取得启动参数。

Postfix内部收信、发信流程图

PostfixPostfix
整个处理流程分为三个阶段:接收邮件、将邮件排入队列、递送邮件。每个阶段由一组独立的Postfix组件负责。当一封邮件被收下并排入队列之后,队列管理器(Queue Manager)会启动适当的MDA,将邮件送到终点。

邮件如何进入Postfix系统

邮件有四种渠道可以进入Postfix系统:
  1、Postfix可接受来自本机系统的邮件(本机用户或自主进程提交的邮件)。
  2、Postfix可接受网络传入的邮件(来自MUA或者其他MTA)。
  3、已经被Postfix收下并交给MDA的邮件,被MDA传回到Postfix(通常是为了转寄到另一个地址)。
  4、当Postfix无法将邮件寄到目的地时,自己会产生退信通知函。
  邮件有可能在进入Postfix之前就被拒绝了,或者因为暂时性的故障(网络断线、远程服务器响应暂时性的错误等),同样的邮件可能会每隔一段时间就重复进入Postfix系统一次,重新递送。

来自服务器本机的邮件

各个Postfix组件之间的合作全靠队列(Queue)交换邮件、Postfix系统有多个队列,这些队列全部队列管理器(Queue Manager)负责控制管理。Postfix组件可将邮件交付给Queue Manager,由其代为放入适当的队列。当需要处理特定工作时,Queue Manager将队列里的邮件交付给正确的组件。
  在Unix系统上,当用户要寄出邮件时(不管这封信是寄到哪里),通常是使用sendmail包内的sendmail命令。Postfix提供了一个与此命令兼容的同名工具,也称为sendmail。当用户以Postfix的sendmail寄出邮件后,sendmail(postfix的版本)会使用postdrop程序将邮件存入Postfix队列目录下的maildrop/子目录。专门注意maildrop子目录有无变化的是Pickup Daemon,每当有新的邮件进入maildrop时,Pickup Daemon便会读出新邮件,然后交给cleanup daemon进入“清理程序”。
  当邮件刚进入Postfix时,不一定含有构成有效邮件的所有必要字段,而且标头里的地址也可能需要被改写成标准格式([email protected]),并依据规范的或虚拟的查询表(如果有的话)将原本的地址改成其他地址。所谓的“清理程序”就是补足遗漏的标头字段,这部分工作由cleanup daemon负责;地址的处理由Trivial-Rewrite Daemon负责。
  经过Cleanup Daemon处理好的邮件,会被传入收件队列(Incoming Queue)。Queue Manager会不断的注意收件队列的变化,每当有新邮件进入收件队列时,便会用适当的MDA将邮件送到下一站,或直接送到最终目的地。

来自网络的邮件

来自网络的邮件由Postfix Smtpd Daemon接收进来,然后交给Cleanup Daemon运行清理程序,随后排入收件队列,由Queue Manager选择适当的MDA将邮件送到下一站或最终目的地。Smtpd有可能收到两种邮件,第一种是外界寄给Postfix所控制的网域的邮件(Postfix系统本身是邮件的终点站或网关),另一种是要寄到其他网域的邮件。
  Smtpd一定会收下第一种邮件(如果收件人存在的话),至于第二种邮件(目的地在其他网域),就要看传邮件过来的客户端是否有资格。网络收下要寄到其他网域的邮件,并代为寄送到目的地的动作称为转发(relay)。在两种情况下,Postfix愿意提供转发服务:一是客户端符合配置文件限定的资格,二是收信网域是relay_domain参数所列出的网域之一。

通知函

当用户的邮件被延时时,或是根本无法递送到目的地时,Postfix使用Defer或Bounce Daemon产生一封新的通知函。这封通知函会被交给Cleanup Daemon,由它进行例行的清理程序之后再排入收件队列,由Queue Manager接手处理。

转寄邮件

有时候,邮件在委托给MDA之后,MDA会发现该邮件其实应该寄送到另一个系统的另一个账户。比如说,当MDA在用户个人的forward文件发现了另一个地址时,就会发现这种情况。照理说,MDA可以直接使用Smtp Client(即Smtp Daemon)送出邮件。不过,由于同一封信可能有多位收件人,为了照顾到每一位收件人,同时也为了在邮件日志上留下完整记录,MDA应该依提交新邮件的方式,让邮件重新回到Postfix系统,由Postfix按照“来自本机的邮件”的程序来处理。

Postfix的队列管理器

邮件本身的处理工作主要是由队列管理器(Queue Manager)负责,每一个能收到邮件的Postfix组件,都有一个共同的目的地--队列管理器。邮件进入队列之前的关卡是Cleanup Daemon,因为只有经过清理的邮件,才有资格进入队列。Cleanup将邮件排入队列后,会通知Queue Manager去处理新邮件。每当Queue Manager察觉收信队列有新信到达时,就会使用Trivial-Rewrite来决定邮件路由信息,这些信息包括传输方法、下一站以及收件人地址。
  Queue Manager总共维护四种队列:收件(Incoming)、活动(Active)、延迟(Deferred)、故障(Corrupt)。新邮件通过Cleanup之后的第一站是“收件队列”。假设系统资源空闲。Queue Manager会将邮件移入“活动队列”,然后调用适当的MDA来投递邮件,而投递失败的邮件则会被移入“耽搁队列”。
  如果邮件被耽搁太久,或是被判定无法送达,则Queue Manager还要负责协调Bounce与Defer Daemons来产生一份递送状态报告,并传回给系统管理员或送信者(或两者)。在Postfix的队列目录下(默认位置是/var/spool/postfix/),除了上述四种邮件队列目录之外,还有bounce/与defer/目录。这些目录含有状态信息,解释特定邮件为何被耽搁或无法递送,Bounce与Defer Daemon就是利用这些目录下的状态信息来产生通知函。

投递操作

Postfix依据收件地址的类型,来判断是否要收下邮件以及如何进行投递操作。主要的地址类型有本地(Local)、虚拟别名(Virtual Alias)、虚拟邮件(Virtual Mailbox)以及转发(Relay)。如果收件地址不在这四种主要类型之中,则邮件会被交给Smtp Client,通过网络寄送出去(假设原信是来自有资格使用转发服务的客户端);否则,Queue Manager便依据地址的类型,选择适当的MDA来投递邮件。
  

本地邮件

  如果收件人为Postfix本地系统的用户(在运行Postfix的那台服务器上有Shell账户的用户),则他们的邮件会被交给Local MDA处理,凡是收件地址的网域名称与mydestination参数列出的任一网域名称相符,这类邮件都算是本地邮件,对于送到任何mydestination网域的任何有效账户的邮件,Local MDA会先检查收件人是否有个人的.forward文件,如果没有,则邮件会被存入用户的个人邮箱;否则,则依据.forward文件的内容来进行投递操作(或转寄到其他地方,或是交给外部程序处理)。
  对于需要转寄到他处的邮件,将会被重新提交会Postfix,以便传送到新地址。如果传送过程发生了暂时性问题,MDA会通知Queue Manager,而邮件会被保存在延迟队列等待下次的递送机会;如果发生永久性问题,则要求Queue Manager将信息退给发信者。
  

虚拟别名邮件

  寄给虚拟别名地址的邮件,全部都需要转寄(Forward)到其真实地址,虚拟别名的网域名称列在virtual_alias_domains参数中,每一个虚拟网域都可以有自己的一组用户,不同的虚拟网域可以容许有同名的用户。用户与其真实地址之间对应关系,列在virtual_alias_maps参数所指定的查询表中。当Queue Manager发现邮件的收件地址的网域部分virtual_alias_domains所列出的网域之一,则会重新提交邮件,以便传到真实地址。
  

虚拟邮箱邮件

  虚拟邮箱的网域名称列在virtual_mailbox_domains参数中。每一个网域都可以有自己的用户群,而且有各自独立的命名空间,换言之,即不同的虚拟邮箱网域可以有同名的用户。用户与邮箱之间的对应关系,定义在virtual_mailbox_maps参数所指定的查询表中,虚拟邮箱与系统上的Shell账户之间没有关联性,虚拟邮箱邮件的投递操作由Virtual MDA负责运行。
  

转发邮件

  实际邮箱位于其他MTA控制管理的网域,但是Postfix愿意代收并转寄的邮件,称为转发邮件。这类网域的名称列在relay_domains参数中,其邮件由smtp MDA通过网络送到目标网域的MTA。当你假设邮件网关系统时,便可利用转发功能收下Internet寄到内部网域的邮件,并转寄到内部网络的邮件系统上。
  

其他邮件

  如果邮件的收件地址不属于前述四类,则一律交给Smtp以递送到正确地点,因为这类邮件必定是要送到系统本身之外的其他网域。先前在“来自网络的邮件”曾说过,并非所有客户端都有资格使用转发服务。一般而言,我们会将转发服务开放给与Postfix Server位于相同局域网络的其他主机,好让这些主机可通过Postfix Server寄信到Internet上的外界网域。
  当Smtp MDA收到外地邮件时,它会依据收件地址来判断邮件应该送到哪个(或哪些)主机,然后依序连接到这些主机,直到有一部主机愿意收下邮件为止。如果投递过程发生暂时性问题,Smtp会通知Queue Manager将邮件放在延迟队列,等待下次传送的机会;如果发生永久性错误,则要求Queue Manager退信给发信者。
  当因暂时故障而不能连接的远程主机恢复连接时,Postfix会先采取试探性动作,以免过多的延迟邮件使对方瘫痪。一开始,Smtp只会搭建有限度的几条连接通道(数量可通过配置文件调整)到收件方,在发现对方能够成功收下邮件之后,才会慢慢提升连接通道的数量(到一个可设定的上限);相反的,如果Smtp发现接送方有任何麻烦,它会立刻撤销连接。
  

其他传送代理程序

  Postfix还提供了其他MDA,可用来处理特殊的地址或目的地。这些MDA需要在master.cf配置文件中设定妥当之后才有作用。此外,你还必须在class_transport或transport_maps参数指定的传送表(transport table)中设定如何启动它们。最常用的两个特殊MDA是LMTP与PIPE。
  

LMTP投递

  LMTP是一种很类似SMTP的协议,但只能用于同一网络上的邮件系统之间,或是同一主机上的不同邮件程序之间。举例来说,如果需要将邮件送到不同的软件包–该软件可能与Postfix在同一台机器上,也可能位于局域网络上的另一台主机,则Queue Manager可以调用LMTP MDA将邮件传送给该软件包。
  实际上,LMTP最常被用来将邮件交给特殊的POP/IMAP Server,以便使用特殊邮箱格式来存储邮件。在这种情况下,由于只要POP/IMAP SERVER知道特殊邮件格式,所以只好使用标准的LMTP来交付邮件。如果LMTP投递过程中出了任何问题,LMTP MDA会通知Queue Manager将邮件放在延迟队列,等待下次传送的机会。

PIPE投递

  Postfix提供了Pipe Daemon将邮件传送给外部程序。实际上,Pipe经常被用来将邮件传给外部的内容过滤程序(例如:病毒扫描系统、垃圾邮件分析程序)或其他通信媒介(例如:传真机)。同样,如Pipe无法顺利传出邮件,它会通知Queue Manager将邮件放在延迟队列,等待下次传送的机会。
  实际追踪POSTFIX的邮件处理流程
  让我们追踪一封典型邮件如何通过POSTFIX系统。处理流程是一封邮件从发信方到达目的地(信封地址所指的MTA),然后又被转寄到最终的MTA(收件人实际取信处)。
  例如:HELENE的账户位于一台运行POSTFIX的服务器,她使用自己习惯的MUA编写邮件,然后调用POSTFIX的sendmail命令送出邮件。POSTFIX的sendmail程序从HELENE的MUA软件中取下邮件,然后放在队列的MAILDROP/子目录下。
  接着,Pickup Daemon从该目录取出邮件,交给CLEANUP DAEMON运行必要的清理程序,如果HELENE的MUA软件没提供地址from:,或是该地址没使用完整的主机名称,则Cleanup会自动补齐不足的信息以确保邮件格式符合标准。完成清理程序之后,Cleanup将邮件存入收件队列,并通知Queue Manager,使其知道有一封新信正在等待投递。
  如果Queue Manager已经准备好处理新邮件,它会将邮件搬移到活动队列。由于HELENE的信是要送到其他网域系统的用户,所以Queue Manager使用SMTP MDA来投递该邮件。SMTP使用DNS查出哪些邮件服务器愿意收下目的地网域的邮件,然后从中挑出最优先的邮件交换主机(MX HOST)并与该主机接洽,以SMTP协议送出HELENE写的邮件。
  当目的网域的服务器上的MTA SMTPD收下HELENE的SMTP MDA送来的邮件。当smtpd确认它应该收下该邮件之后,它会将邮件交给Cleanup Daemon进行检查,然后存入收件队列。
  Queue Manager将邮件搬移到活动队列,检查收件人地址,然后使用LOCAL MDA来进行投递操作。接着,LOCAL发现收件地址其实是一个别名,其真实地址位于另一个网域,所以将邮件与新地址信息传给CLEANUP DAEMON,回到POSTFIX的队列系统。
  当CLEANUP与Queue Manager处理邮件时,依靠TRIVIAL-REWRITE将地址转换成标准格式,并判断传送方式以及递送流程到下一站。
  当Queue Manager发现新邮件应该送到另一个网络,则会调用SMTP来进行投递操作,而SMTP会先向DNS查出哪些邮件服务器可能接收该网域的邮件。该网域的MTA收下这封邮件后,最后会将邮件交给LOCAL MDA,由它将邮件存入该系统的邮箱。
  到这个时候,Postfix就完成了它的工作。这时收件人现可以用他自己的MUA来阅读邮件,至于这个MUA是直接从邮箱取信,还是使用POP或IMAP之类的协议通过网络下载邮件,都已经不是Postfix所能控制的了。
  我们的例子只假设了最理想的简单状态,实际的传送程序可能会遇到一些意外状况,诸如网络临时断线、远程主机死机、邮箱空间不足。发生意外时,MDA必须通知Queue Manager,将邮件暂时放回延迟队列,等待一段时间之后再重新投递。
  除了临时意外回影响投递过程,还有一些情况也会影响,比方说,收件人并非实际的系统账户,而是IMAP邮件系统的一个账户,在这种情况下,Queue Mananger可能要通过LMTP MDA来投递邮件,或是通过PIPE MDA将邮件送到一个事先确定的外部程序。
  Postfix还要面对各式各样的变化与潜在的复杂性,幸运的,它本身的结构设计足够稳定,几乎能够应付所有可想像到的情况,也有足够的可塑性来适应未来的可能变化。
  

队列种类

  收件:Incoming 活动:Active 延迟:Deferred 故障:Corrupt 保留:Hold
  

组件结构

  Master组件:主导邮件处理流程、其他组件的总管。配置文件:main.cf和master.cf。
  Qmgr组件:队列管理器。各个postfix组件之间的合作依靠队列交换邮件。
  Sendmail组件:服务器本机发送邮件。
  Postdrop组件:将邮件存入postfix队列目录下的maildrop/子目录。
  Pickup组件:监视maildrop/子目录,读出新邮件,交给cleanup组件。
  Cleanup组件:补足遗漏的标头字段。
  Trivial-Rewrite组件:地址处理,改成标准格式。决定路由信息,包括传输方法、下一站以及收件人地址。
  Smtpd组件:接收来自网络的邮件,交给cleanup组件处理。
  Defer组件:邮件被延时时产生通知函。
  Bounce组件:邮件无法送达目的地时产生通知函。
  Dns组件:查找符合条件的邮件服务器。
 

Postfix命令行工具

  postalias:创建或查询别名数据库。
  postcat:显示出队列文件的内容,让管理员可观察滞留在队列里的邮件内容。
  postconf:显示或改变postfix参数,可一次显示一个参数,或是显示所有参数。
  postdrop:将邮件放回到maildrop目录,由postfix重新进行投递操作。
  postfix:启动或停止postfix系统,或重新读取配置文件。也可以用于其他维护工作,包括检查系统配置,以及清空队列。
  postkick:对特定postfix服务发出请求。此工具的作用,主要是给shell scripts提供一个能够与postfix沟通服务的管道。
  postlock:锁定特定文件,确保能够独占访问。此工具的作用,主要是让shell scripts能使用兼容于postfix的锁定方式。
  postlog:将特定的信息记录到系统日志文件中。这是支持shell scripts工具,使其能以类似于postfix的样式来记录信息到日志文件。
  postmap:创建查询表的DB数据库或查询查询表内容。postfix有许多配置信息都是记录在postmap所建的查询表数据库中。
  postqueue:让一般的用户能够有限度地访问postfix队列。可能改变队列的访问方式需要有管理员特权才能进行,而这方面的访问能力由postsuper命令提供。
  postsuper:供管理员访问postfix队列。管理员可删除邮件、扣留邮件(搬到hold队列)、取回邮件(将邮件从hold队列搬回active队列),必要时,还可以修复队列目录结构。
转自:http://www.mike.org.cn/articles/postfix-works-briefly/

邮件系统架设-postfix+dovecot+mysql+postfixadmin+roundcube

这篇文章介绍一个实现Web收发的邮件系统方案,利用postfix作为SMTP服务器,实现邮件的发送与接收,使用dovecot作为IMAP服务器,roundcube作为web MUA(邮件用户代理),实现web在线邮件发送与接收。而postfix的虚拟域名和虚拟用户则由postfixadmin管理。

系统及软件环境

系统:centos-5.8 32位
软件:postfix-2.8.7,dovecot-1.0.7,apache-2.2.22,php-5.2.17,mysql-5.1.58,postfixadmin-2.3.5,roundcubemail-0.7.2
注意:本教程并不通用,使用不同的软件版本可能配置方法不一样, 请注意。

安装LAMP

1、第三方库添加
由于postfixadmin要求php-5.2以上的版本,且我们这里使用yum安装lamp,默认的版本是5.1,所以需要添加第三方的rpm库安装php 5.2版本。

  1. rpm –import http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka
  2. vi /etc/yum.repos.d/CentOS-Base.repo

加入:

  1. [utterramblings]
  2. name=Jason’s Utter Ramblings Repo
  3. baseurl=http://www.jasonlitka.com/media/EL$releasever/$basearch/
  4. enabled=1
  5. gpgcheck=1
  6. gpgkey=http://www.jasonlitka.com/media/RPM-GPG-KEY-jlitka

2、开始安装

  1. yum -y install httpd mysql mysql-devel mysql-server php php-pecl-Fileinfo php-mcrypt php-devel php-mysql hp-common php-mbstring php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc pcre pcre-devel

3、启动服务

  1. service httpd start
  2. service mysqld start
  3. mysqladmin -uroot password ‘mysql密码’

安装postfix

由于centos自带的postfix不支持mysql,所以只能选择编译安装。
首先删除自带的sendmail

  1. rpm -e sendmail
  1. yum install db4-devel
  2. groupadd -g 1001 postfix
  3. groupadd postdrop
  4. useradd -M -u 1001 -g postfix  -s /sbin/nologin postfix
  5. cd /tmp
  6. wget http://postfix.energybeam.com/source/official/postfix-2.8.7.tar.gz
  7. tar xzf postfix-2.8.7.tar.gz
  8. cd postfix-2.8.7
  9. make -f Makefile.init makefiles ‘CCARGS=-DHAS_MYSQL -I/usr/include/mysql’   ‘AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm’
  10. make && make install

简单配置一下postfix:

  1. vi /etc/postfix/main.cf

添加如下代码:

  1. virtual_mailbox_base = /var/mail/vmail
  2. virtual_uid_maps = static:1001
  3. virtual_gid_maps = static:1001

1001分别为postfix用户和postfix用户组的id

安装dovecot

  1. yum -y install dovecot

安装postfixadmin

  1. cd /tmp
  2. wget http://softlayer.dl.sourceforge.net/project/postfixadmin/postfixadmin/postfixadmin-2.3.5/postfixadmin-2.3.5.tar.gz
  3. tar xzf postfixadmin-2.3.5.tar.gz -C /var/www/html
  4. mv /var/www/html/postfixadmin-2.3.5 /var/www/html/postfixadmin
  5. cd /var/www/html/postfixadmin
  6. mysql -uroot -p
  7. mysql > CREATE DATABASE postfix;
  8. mysql > CREATE USER ‘postfix’@’localhost’ IDENTIFIED BY ‘postfix_password’;
  9. mysql > GRANT ALL PRIVILEGES ON `postfix` . * TO ‘postfix’@’localhost’;

postfix_password替换成自己的。
修改配置文件:

  1. vi config.inc.php

找到下面的参数并作修改:

  1. $CONF[‘configured’] = true;
  2. $CONF[‘database_password’] = ‘postfix_password’;
  3. $CONF[‘default_language’] = ‘cn’;
  4. $CONF[‘used_quotas’] = ‘YES’;
  5. $CONF[‘quota’] = ‘YES’;

postfix_password即上一步设置的postfix用户密码。
打开浏览器,输入下面的网址开始安装:
http://your-domain/postfixadmin/setup.php

postfix与postfixadmin整合

  1. vi /etc/postfix/main.cf

按如下添加或修改:

  1. virtual_mailbox_domains = proxy:mysql:/etc/postfix/sql/mysql_virtual_domains_maps.cf
  2. virtual_alias_maps =
  3.    proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_maps.cf,
  4.    proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_maps.cf,
  5.    proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf
  6. virtual_mailbox_maps =
  7.    proxy:mysql:/etc/postfix/sql/mysql_virtual_mailbox_maps.cf,
  8.    proxy:mysql:/etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf
  9.   
  10. # Additional for quota support
  11. virtual_create_maildirsize = yes
  12. virtual_mailbox_extended = yes
  13. virtual_mailbox_limit_maps = mysql:/etc/postfix/mysql_virtual_mailbox_limit_maps.cf
  14. virtual_mailbox_limit_override = yes
  15. virtual_maildir_limit_message = Sorry, the user’s maildir has overdrawn his diskspace quota, please try again later.
  16. virtual_overquota_bounce = yes

建立目录sql

  1. mkdir /etc/postfix/sql

以下的几个文件注意修改postfix_password。

  1. vi /etc/postfix/sql/mysql_virtual_alias_maps.cf

内容:

  1. user = postfix
  2. password = postfix_password
  3. hosts = localhost
  4. dbname = postfix
  5. query = SELECT goto FROM alias WHERE address=’%s’ AND active = ‘1’
  6. #expansion_limit = 100
  1. vi /etc/postfix/sql/mysql_virtual_alias_domain_maps.cf

内容:

  1. user = postfix
  2. password = postfix_password
  3. hosts = localhost
  4. dbname = postfix
  5. query = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = ‘%d’ and alias.address = CONCAT(‘%u’, ‘@’, alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active=’1′
  1. vi /etc/postfix/sql/mysql_virtual_alias_domain_catchall_maps.cf

内容:

  1. # handles catch-all settings of target-domain
  2. user = postfix
  3. password = postfix_password
  4. hosts = localhost
  5. dbname = postfix
  6. query  = SELECT goto FROM alias,alias_domain WHERE alias_domain.alias_domain = ‘%d’ and alias.address = CONCAT(‘@’, alias_domain.target_domain) AND alias.active = 1 AND alias_domain.active=’1′
  1. vi /etc/postfix/sql/mysql_virtual_domains_maps.cf

内容:

  1. user = postfix
  2. password = postfix_password
  3. hosts = localhost
  4. dbname = postfix
  5. query          = SELECT domain FROM domain WHERE domain=’%s’ AND active = ‘1’
  6. #query          = SELECT domain FROM domain WHERE domain=’%s’
  7. #optional query to use when relaying for backup MX
  8. #query           = SELECT domain FROM domain WHERE domain=’%s’ AND backupmx = ‘0’ AND active = ‘1’
  9. #expansion_limit = 100
  1. vi /etc/postfix/sql/mysql_virtual_mailbox_maps.cf

内容:

  1. user = postfix
  2. password = postfix_password
  3. hosts = localhost
  4. dbname = postfix
  5. query  = SELECT maildir FROM mailbox WHERE username=’%s’ AND active = ‘1’
  6. #expansion_limit = 100
  1. vi /etc/postfix/sql/mysql_virtual_alias_domain_mailbox_maps.cf

内容:

  1. user = postfix
  2. password = postfix_password
  3. hosts = localhost
  4. dbname = postfix
  5. query = SELECT maildir FROM mailbox,alias_domain WHERE alias_domain.alias_domain = ‘%d’ and mailbox.username = CONCAT(‘%u’, ‘@’, alias_domain.target_domain) AND mailbox.active = 1 AND alias_domain.active=’1′
  1. vi /etc/postfix/sql/mysql_virtual_mailbox_limit_maps.cf

内容:

  1. user = postfix
  2. password = postfix_password
  3. hosts = localhost
  4. dbname = postfix
  5. query = SELECT quota FROM mailbox WHERE username=’%s’ AND active = ‘1’

dovecot与postfixadmin整合

  1. vi /etc/dovecot.conf

按如下修改或添加:

  1. default_mail_env = maildir:/var/mail/vmail/%u/
  2.  
  3. auth default {
  4.   mechanisms plain
  5.   userdb sql {
  6.     # Path for SQL configuration file, see doc/dovecot-sql-example.conf
  7.     args = /etc/dovecot-mysql.conf
  8.   }
  9.   passdb sql {
  10.     # Path for SQL configuration file, see doc/dovecot-sql-example.conf
  11.     args = /etc/dovecot-mysql.conf
  12.   }
  13. }
  14.  
  15. # Valid UID range for users, defaults to 500 and above.
  16. first_valid_uid = 1001  # Change this to your postfix UID
  17.  
  18. ## IMAP quota
  19. protocol imap {
  20.   mail_plugins = quota imap_quota
  21. }
  22.  
  23. ## POP quota
  24. protocol pop3 {
  25.   mail_plugins = quota
  26. }
  27.  
  28. ## Local Delivery Agent
  29. protocol lda {
  30.   mail_plugins = quota
  31. }
  32.  
  33. ## Dictionary DB proxy
  34. dict {
  35.   quota = mysql:/etc/dovecot-dict-quota.conf
  36. }
  37.  
  38. ## Default quota values
  39. plugin {
  40. quota = dict:storage=200000 proxy::quota
  41. }

以下两个文件注意修改postfix_password。

  1. vi /etc/dovecot-mysql.conf

内容:

  1. connect = host=localhost dbname=postfix user=postfix password=postfix_password
  2. driver = mysql
  3.  
  4. # Default password scheme.
  5. # depends on your $CONF[‘encrypt’] setting:
  6. # md5crypt  -> MD5-CRYPT
  7. # md5       -> PLAIN-MD5
  8. # cleartext -> PLAIN
  9. default_pass_scheme = MD5-CRYPT
  10.  
  11. # Query to retrieve password. user can be used to retrieve username in other
  12. # formats also.
  13.  
  14. password_query = SELECT username AS user,password FROM mailbox WHERE username = ‘%u’ AND active=’1′
  15.  
  16. # Query to retrieve user information.
  17.  
  18. user_query = SELECT maildir, 1001 AS uid, 1001 AS gid, CONCAT(‘dict:storage=’,floor(quota/1000),’ proxy::quota’) as quota FROM mailbox WHERE username = ‘%u’ AND active=’1′
  1. vi /etc/dovecot-dict-quota.conf

内容:

  1. driver = mysql
  2. connect = host=localhost dbname=postfix user=postfix password=postfix_password
  3. default_pass_scheme = MD5-CRYPT
  4. table = quota
  5. select_field = current
  6. where_field = path
  7. username_field = username

启动服务

  1. postmap /etc/aliases
  2. /usr/sbin/postfix start
  3. service dovecot start

roundcube安装

  1. cd /tmp
  2. wget http://voxel.dl.sourceforge.net/project/roundcubemail/roundcubemail/0.7.2/roundcubemail-0.7.2.tar.gz
  3. tar xzf roundcubemail-0.7.2.tar.gz  -C /var/www/html
  4. mv /var/www/html/roundcubemail-0.7.2 /var/www/html/webmail
  5. mysql -uroot -p
  6. mysql> CREATE DATABASE roundcubemail;
  7. mysql> GRANT ALL PRIVILEGES ON roundcubemail.* TO roundcube@localhost IDENTIFIED BY ‘password’;
  8. mysql> FLUSH PRIVILEGES;

现在你可以浏览器打开以下网址安装:
http://yourdomain/webmail/installer/
详细的roundcubemail安装说明可以参考:http://blog.dvxj.com/pandola/roundcube-install-config.html
这样就实现了完整的邮件系统功能,没有实现的是smtp的认证,即无法使用像outlook express客户端发送邮件,如有需要,可以搜索sasl方面的教程配置。
相关网站:
http://www.postfix.org/
http://www.dovecot.org/
http://postfixadmin.sourceforge.net/
http://roundcube.net/

通过调整Linux内核参数提升网络性能

如下网络配置参数调整,主要是针对请求压力大的Linux (2.6 kernel)服务器而言.
如果服务器压力不大,那么维持默认即可.

下述内容取材于”Performance Tuning For Linux Server”一书.

  1. $ /proc/sys/net/core/wmem_max

最大socket写buffer,可参考的优化值:873200

  1. $ /proc/sys/net/core/rmem_max

最大socket读buffer,可参考的优化值:873200

  1. $ /proc/sys/net/ipv4/tcp_wmem

TCP写buffer,可参考的优化值: 8192 436600 873200

  1. $ /proc/sys/net/ipv4/tcp_rmem

TCP读buffer,可参考的优化值: 32768 436600 873200

  1. $ /proc/sys/net/ipv4/tcp_mem

同样有3个值,意思是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
上述内存单位是页,而不是字节.
可参考的优化值是:786432 1048576 1572864

  1. $ /proc/sys/net/core/netdev_max_backlog

进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000.

  1. $ /proc/sys/net/core/somaxconn

listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.
可调整到256.

  1. $ /proc/sys/net/core/optmem_max

socket buffer的最大初始化值,默认10K.

  1. $ /proc/sys/net/ipv4/tcp_max_syn_backlog

进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.
可调整到2048.

  1. $ /proc/sys/net/ipv4/tcp_retries2

TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源.

  1. $ /proc/sys/net/ipv4/tcp_keepalive_time
  2. $ /proc/sys/net/ipv4/tcp_keepalive_intvl
  3. $ /proc/sys/net/ipv4/tcp_keepalive_probes

这3个参数与TCP KeepAlive有关.默认值是:
tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds
意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.
如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.
对服务器而言,显然上述值太大. 可调整到:

  1. /proc/sys/net/ipv4/tcp_keepalive_time  1800
  2. /proc/sys/net/ipv4/tcp_keepalive_intvl  30
  3. /proc/sys/net/ipv4/tcp_keepalive_probes  3
  1. $ proc/sys/net/ipv4/ip_local_port_range

指定端口范围的一个配置,默认是32768 61000,已够大.
原文:http://butian.org/knowledge/linux/1402.html

配置PHP与Oracle数据库连接

首先确认你已经安装有oracle 11g,下面是在装有oracle 11g的centos-6 64位配置php与oracle连接的事例。

安装oracle即时客户端

到这里http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html下载oracle-instantclient11.2-basic,oracle-instantclient11.2-devel,oracle-instantclient11.2-sqlplus文件,开始安装:

  1. rpm -ivh oracle-instantclient11.2-basic-11.2.0.3.0-1.x86_64.rpm  oracle-instantclient11.2-devel-11.2.0.3.0-1.x86_64.rpm  oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm
  1. vi /etc/ld.so.conf.d/oracle-lib.conf

加入:

  1. /usr/lib/oracle/11.2/client64/lib/
  1. ldconfig

安装OCI8 PHP扩展

  1. cd /tmp
  2. wget http://pecl.php.net/get/oci8-1.4.7.tgz
  3. tar xzf oci8-1.4.7.tgz
  4. cd oci8-1.4.7
  5. phpize
  6. ./configure –with-oci8=shared,instantclient,/usr/lib/oracle/11.2/client64/lib/
  7. make && make install

在/etc/php.ini中加入:

  1. extension = "oci8.so"

接着使用php -m查看模块是否已经被加载

CentOS-6 64位安装oracle 11g

一、使用oracle硬件要求

1、内存要求

最小内存1G,推荐2G或2G以上

2、swap大小设定

1GB跟2GB物理内存之间的,设定swap大小为物理内存的1.5倍
2GB跟16GB物理内存之间的,设置swap大小与物理内存相等
16GB物理内存以上的,设置swap大小为16GB

3、共享内存/dev/shm要求

至少比在每个oracle实例中的MEMORY_MAX_TARGET和MEMORY_TARGET要大。

4、/tmp空间大小要求

至少1GB空间

5、硬盘大小要求

存放oracle软件文件和数据文件的空间至少6GB

二、使用oracle软件要求

1、操作系统要求

Asianux Server 3 SP2
Oracle Linux 4 Update 7
Oracle Linux 5 Update 2
Oracle Linux 5 Update 5 (with the Oracle Unbreakable Enterprise Kernel for Linux)
Red Hat Enterprise Linux 4 Update 7
Red Hat Enterprise Linux 5 Update 2
Red Hat Enterprise Linux 5 Update 5 (with the Oracle Unbreakable Enterprise Kernel for Linux)
SUSE Linux Enterprise Server 10 SP2
SUSE Linux Enterprise Server 11

2、软件包要求

下面是64位centos 5或6的软件包要求
binutils compat-libstdc++-33 compat-libstdc++-33.i686 elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc.i686 glibc-common glibc-devel glibc-devel.i686 glibc-headers ksh libaio libaio.i686 libaio-devel libaio-devel.i686 libgcc libgcc.i686 libstdc++ libstdc++.i686 libstdc++-devel make sysstat

三、开始安装oracle

因为本机没有安装桌面环境,所以我们采用静默安装oracle。

1、安装依赖

  1. yum -y install binutils compat-libstdc++-33 compat-libstdc++-33.i686 elfutils-libelf elfutils-libelf-devel gcc gcc-c++ glibc glibc.i686 glibc-common glibc-devel glibc-devel.i686 glibc-headers ksh libaio libaio.i686 libaio-devel libaio-devel.i686 libgcc libgcc.i686 libstdc++ libstdc++.i686 libstdc++-devel make sysstat

2、添加用户

  1. /usr/sbin/groupadd oinstall
  2. /usr/sbin/groupadd dba
  3. /usr/sbin/useradd -g oinstall -G dba oracle
  4. passwd oracle

3、修改内核参数

  1. vi /etc/sysctl.conf
  1. #######
  2. fs.aio-max-nr = 1048576
  3. fs.file-max = 6815744
  4. kernel.shmall = 2097152
  5. kernel.shmmax =  536870912
  6. kernel.shmmni = 4096
  7. kernel.sem = 250 32000 100 128
  8. net.ipv4.ip_local_port_range = 9000 65500
  9. net.core.rmem_default = 262144
  10. net.core.rmem_max = 4194304
  11. net.core.wmem_default = 262144
  12. net.core.wmem_max = 1048586
  13. #######
  1. /sbin/sysctl -p

4、修改用户资源限制

  1. vi /etc/security/limits.conf
  1. #####
  2. oracle              soft    nproc   2047
  3. oracle              hard    nproc   16384
  4. oracle              soft    nofile  1024
  5. oracle              hard    nofile  65536
  6. oracle              soft    stack   10240
  7. #####

5、目录创建

  1. mkdir -p /usr/local/oracle /usr/local/oraInventory /usr/local/oradata/
  2. chown -R oracle:oinstall /usr/local/oracle /usr/local/oraInventory /usr/local/oradata/
  3. chmod -R 775 /usr/local/oracle /usr/local/oraInventory /usr/local/oradata/

6、设置用户环境

  1. su – oracle
  2. vi .bash_profile
  1. #####
  2. export ORACLE_BASE=/usr/local/oracle
  3. export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
  4. export ORACLE_SID=sales
  5. export ORACLE_OWNER=oracle
  6. export PATH=$PATH:$ORACLE_HOME/bin:$HOME/bin
  7. ####
  1. source .bash_profile

7、下载oracle

切换到root用户

  1. su –

下载oracle 11g到/home/并解压

  1. chmod 777 /home/database
  2. chown -R oracle.oinstall /home/database

8、创建oraInst.loc

  1. vi /etc/oraInst.loc
  1. #####
  2. inventory_loc=/usr/local/oraInventory
  3. inst_group=oinstall
  4. #####
  1. chown oracle:oinstall /etc/oraInst.loc
  2. chmod 664 /etc/oraInst.loc

9、开始安装

  1. su – oracle
  2. /home/database/runInstaller -silent -debug -force
  3.  FROM_LOCATION=/home/database/stage/products.xml
  4.  oracle.install.option=INSTALL_DB_SWONLY
  5.  UNIX_GROUP_NAME=oinstall
  6.  INVENTORY_LOCATION=/usr/local/oraInventory
  7.  ORACLE_HOME=/usr/local/oracle/product/11.2.0/db_1
  8.  ORACLE_HOME_NAME="Oracle111"
  9.  ORACLE_BASE=/usr/local/oracle
  10.  oracle.install.db.InstallEdition=EE
  11.  oracle.install.db.isCustomInstall=false
  12.  oracle.install.db.DBA_GROUP=oinstall
  13.  oracle.install.db.OPER_GROUP=oinstall
  14.  DECLINE_SECURITY_UPDATES=true
  15. su –
  16.  
  17. /usr/local/oracle/product/11.2.0/db_1/root.sh

安装参考:http://docs.oracle.com/cd/E11882_01/install.112/e24326/toc.htm
错误大全:http://docs.oracle.com/cd/E11882_01/server.112/e17766/toc.htm#BEGIN

Apache 的 order deny allow 设置说明

Allow和Deny可以用于apache的conf文件或者.htaccess文件中(配合Directory, Location, Files等),用来控制目录和文件的访问授权。
所以,最常用的是:
Order Deny,Allow
Allow from All

注意“Deny,Allow”中间只有一个逗号,也只能有一个逗号,有空格都会出错;单词的大小写不限。

上面设定的含义是先设定“先检查禁止设定,没有禁止的全部允许”,而第二句没有Deny,也就是没有禁止访问的设定,直接就是允许所有访问了。这个主要是用来确保或者覆盖上级目录的设置,开放所有内容的访问权。

按照上面的解释,下面的设定是无条件禁止访问:
Order Allow,Deny
Deny from All

如果要禁止部分内容的访问,其他的全部开放:
Order Deny,Allow
Deny from ip1 ip2
或者
Order Allow,Deny
Allow from all
Deny from ip1 ip2

apache会按照order决定最后使用哪一条规则,比如上面的第二种方式,虽然第二句allow允许了访问,但由于在order中allow 不是最后规则,因此还需要看有没有deny规则,于是到了第三句,符合ip1和ip2的访问就被禁止了。注意,order决定的“最后”规则非常重要,下面是两个错误的例子和改正方式:

Order Deny,Allow
Allow from all
Deny from domain.org
错误:想禁止来自domain.org的访问,但是deny不是最后规则,apache在处理到第二句allow的时候就已经匹配成功,根本就不会去看第三句。
解决方法:Order Allow,Deny,后面两句不动,即可。

Order Allow,Deny
Allow from ip1
Deny from all
错误:想只允许来自ip1的访问,但是,虽然第二句中设定了allow规则,由于order中deny在后,所以会以第三句deny为准,而第三句的范围中又明显包含了ip1(all include ip1),所以所有的访问都被禁止了。
解决方法一:直接去掉第三句。
解决方法二:
Order Deny,Allow
Deny from all
Allow from ip1

总结:Order Deny,Allow中,后一个是一定会被执行的(有相应的allow或deny语句时),如果没有则按照语义分析。

此文为转载,原文地址不详

配置apache密码认证

apache提供了一系列的认证,授权,访问控制模块,我们这里选用最方便的mod_auth_basic,mod_authn_file,mod_authz_user这三个模块实现目录或文件需要输入用户和密码认证。
1、生成密码文件
示例:

  1. htpasswd -c /var/www/.htpasswd centos

/var/www/.htpasswd是密码文件的位置
centos是添加授权的用户
htpasswd工具详细使用说明:http://lamp.linux.gov.cn/Apache/ApacheMenu/programs/htpasswd.html
2、配置httpd.conf文件

  1. <directory /var/www/html/centos>
  2. AuthType basic
  3. AuthBasicProvider file
  4. AuthUserFile /var/www/.htpasswd
  5. Require valid-user
  6. </directory>

这里是当访问centos目录时需要认证。
参考:http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/auth.html