月度归档:2014年12月

postfix 技巧

1,快速查出系统有那些值得注意的事情:
#egrep '(reject|warning|error|fatal|panic):' /var/log/maillog
#tail -f /var/log/maillog |grep -e "Pass|LOGIN"
2,检查main.cf配置文件是否正确:
#postfix check

3,重启Postfix服务与重新载入配置:
#service postfix restart
#postfix reload

4,一封邮件最多几位收件人限制,默认1000,修改main.cf
smtpd_recipient_limit = 100

5,单封邮件容量上限,默认10MB,修改main.cf
message_size_limit = 10000000

6,客户端出错或恶意错误连接可用以下限制main.cf
smtpd_error_sleep_time = 1s
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20

7,改变投递地址,假如用户kevin@23day.com更换了新地址,使用以下方法提示其它用户:
(1)在/etc/postifx/main.cf中添加relocated_maps = hash:/etc/postfix/relocated参数
(2)touch /etc/postfix/relocated
在relocated中添加以下信息
kevin@23day.com 
  chen@23day.com
#postmap /etc/postfix/relocated
#postfix reload

8,网域更换
(1)在/etc/postifx/main.cf中添加relocated_maps = hash:/etc/postfix/relocated参数
(2)touch /etc/postfix/relocated
在relocated中添加以下信息
@23day.com   23day.cn
#postmap /etc/postfix/relocated
#postfix reload

9,邮件队列管理工具postqueue与postsuper
#postqueue -p查看邮件队列
如果队列序号加了*号表示为活动队列
如果队列序号加了!号表示为延期队列
如果队列序号没有*与!号表示为等待队列
#postsuper -d DBA3F1A9删除队列里的邮件
#postsuper -d ALL删除队列里所有的邮件
#postsuper -r ALL重新排队所有邮件
#postcat -q DBA3F1A9查看邮件内容

10,邮件转发设置将所有出站邮件转发到192.168.1.1服务器上main.cf
relayhost = 192.168.1.1

11,针对某个域的转发
#vi /etc/postfix/main.cf 新增transport_maps = hash:/etc/postfix/transport
#vi /etc/postfix/transport gmail.com  smtp:[192.168.1.10] 设定寄往gmail的邮件从192.168.1.10机器转发出去
#postmap /etc/postfix/transport
#postfix reload

12,CentOS4.7下挂载共享目录
#mount -t cifs -o username=extmailuser,password="mis[]229" //172.28.156.122/extmail /mnt

13,配置垃圾邮件策略行为"D_DISCARD->丢弃,D_PASS->通过,D_BOUNCE->返回"
#vi /etc/amavisd.conf 第115行到118行
$final_virus_destiny      = D_PASS;   
$final_banned_destiny     = D_BOUNCE;
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;

14,单网卡又IP配置
#cd /etc/sysconfig/network-scripts/
#cp ifcfg-eth0 ifcfg-eth0:0
编辑ifcfg-eth0:0里的DEVICE参数为eth0:0
#service network restart

15,CentOS4.7使用代理上网(命令行上网)
编辑/etc/profile文件
#vi /etc/profile
http_proxy=192.168.1.1:3128  代理分别指定http,https,ftp
https_proxy=192.168.1.1:3128
ftp_proxy=192.168.1.1:3128
no_proxy=192.168.1.  局域网不使用代理
export http_proxy https_proxy ftp_proxy no_proxy
保存重启机器

16,拒绝某一IP发送邮件服务器(方法很多)
#vi /etc/postfix/main.cf
smtpd_client_restrictions =
check_client_access hash:/etc/postfix/client_access
#vi /etc/postfix/client_access
192.168.1.5    REJECT   拒绝192.168.1.5发送邮件

17,使用代理升級CentOS(yum)
#vi /etc/yum.conf
proxy=http://192.168.1.55:3128
proxy_username=yum-user
proxy_password=yum-passwd

18,邮件队列处理方式4种队列
收件(incoming),活动(active),延迟(deferred),故障(corrupt)
新邮件第一站是"收件队列"如果系统资料空闲,会转到"活动队列",如果投递失败会被移入"延迟队列"

19,投递操作
Postfix以收件人地址类型判断如何投递邮件,主要地址类型及投递顺序为本地(local),虚拟别名(Virtual alias),虚拟邮箱(virtual mailbox)以及转发(relay).

20,clamav杀毒软件RPM下载地址http://packages.sw.be/clamav/
下载最新版然后使用rpm -Uvh升级.

21,mysql导出查询结果
mysql>select name,username from mailbox into outfile 'mail.txt' fields terminated by ',';
默认导出文件在/var/lib/mysql/extmail目录

21,全局通讯录生成方法
首先使用21项导入数据,然后使用excel编辑保存成csv档,再将数据复制到globabook.cf中就可以了(官方现有批perl工具,非常好用,这是不知道这工具之前想的办法)

22,添加静态路更新freshclam(未验证是否成功)
61.177.194.0    192.168.1.118  255.255.255.0

23,使用rsync同步home目录
Server配置:
#vi /etc/xinetd.d/rsync 将disable改为no
#vi /etc/rsyncd.conf 添加以下内容
[extmail]
path=/home/domains
auth users=admin
uid=root
gid=root
secrets file=/etc/rsyncd.secrets
read only=yes
#vi /etc/rsyncd.secrets 添加以下内容
admin:password
#chmod 600 /etc/rsyncd.secrets
#/etc/xinit.d/xinetd restart
Client配置:
vi /etc/rsyncd.secrets添加密码"password"
#rsync -vzrtopg --delete --progress admin@192.168.1.1::extmail /home/domains --password-file=/etc/rsyncd.secretes

24, freshclam使用代理升级病毒库(其实很简单,找得好辛苦)
#vi /etc/freshclam.conf 将此配置文件的以下代理设置打开就可以了
HTTPProxyServer 192.168.1.9
HTTPProxyPort 3128

25,改变投递地址
#vi main.cf
relocated_maps = hash:/etc/postfix/relocated
#vi relocated
old@test.com    new@test.com
#postmap relocated

26,传输表(邮件网关可用),使用relay参数将mail.23day.com的邮件直接转发到192.168.1.9主机上
#vi main.cf
transport_maps = hash:/etc/postfix/transport
#vi transport
mail.23day.com    relay:[192.168.1.9]
#postmap transport
#postfix reload

27,bcc监视用户邮件main.cf
always_bcc = postmaster@doamin.com
recipient_bcc_maps = hash:/etc/postfix/recipient_bcc_maps
sender_bcc_maps = hash:/etc/postfix/sender_bcc_maps
#touch /etc/postfix/recipient_bcc_maps
a@abc.com  b@abc.com
#touch /etc/postfix/sender_bcc_maps
#postmap /etc/postfix/recipient_bcc_maps
#postmap /etc/postfix/sender_bcc_maps

28,查询与统计用户发送与接收了多少邮件
a)npg001@21cn.com发送了多少邮件进来
egrep npg001@21cn.com /var/log/maillog |grep Pass |grep -v 172.28.156 |wc -l
egrep chenle@npg-group.com /var/log/maillog |grep Pass |grep 172.28.156.90 |wc -l
egrep chenle@npg-group.com /var/log/maillog |grep Pass |grep -v 172.28.156.90 |wc -l

29,header_checks邮件过滤
将所有发给chinanpg@126.com的邮件转发到twork@21cn.com
/^To:.*chinanpg@126\.com*/ REDIRECT        twork@21cn.com
删除来源地址为cn99.com的所有邮件并在日志显示deletecn99信息
/^From:.*@*\.cn99\.com/     DISCARD deletecn99
拒绝twork@21cn.com发往本域的邮件,将返回错误信息给发送者
/^From:.*twork@21cn\.com/        REJECT  rejectspam

Postfix 转发/备用交换

备用交换器

在DNS的术语中,MX代表mail exchanger。一个MX记录代表一个网域承接外来邮件的主

机,以及该主机的优先度。同一个网域可以同时有好几个MX记录,优先度最高的主机称

为主交换器,其余主机称为备用交换器。备用交换器的任务,是在主交换器离线时,承

接该网域的外来邮件;当优先度高于自己的其他备用交换器或主交换器恢复上线时,已

收下的邮件必须传给主交换器来处理,备用交换器不能自己擅作主张,将收到的邮件直

接投递到最终目的地。假设备用交换器时,不必特别设定如何传信给主交换器,因为

postfix自己能从DNS查出如何转信给主交换器。不过,前提是你必须让postfix知道自

己是哪一个网域的备用交换器。你的 postfix系统是哪些网域的备用交换器,那些网域

的名称就必须被列在relay_domains参数中。当寄信方的MTA发觉收信网域的主交换器离

线了,它会试着联系优先度次高的交换器,直到有一个备用交换器能够收下邮件地址为

止。如果你的postfix系统是某个网域的备用交换器,而且该网域被列在

relay_domains参数中,则postfix会收下该网域的邮件,并将其排入队列。每隔一段时

间,postfix会扫描它的队列,并检查是否有优先度更高的邮件交换器恢复连接,如果有

,则交出先前代收的邮件。

如果不能交出邮件,postfix会持续尝试,直到邮件在队列里等待的时间超过

maximal_queue_lifetime所指定的时限为止。此参数的默认值为五天,如果邮件在等待

队列里待的时间超过此上限,postfix会发出退信通知函给寄件人。如果你事先知道主交

换器停机的时间会超过五天,可以适度提高时限。

转发列表

postfix可从relay_domains参数与DNS系统知道自己的备用交换器角色,但是它如何知

道转发的网域中有哪些有效收件人?如果备用交换器无法事先知道主交换器有哪些合法

邮箱,它势必被迫盲目收下所有邮件,等到主交换器恢复连接时,才会发现有哪些邮件

无法投递并退信给原寄件人。因此,我们郑重建议你在备用交换器设置一份列表,记录

受理网域有哪些合法用户,并定期与主交换器同步更新。

当备用交换器上的postfix server收到寄给relay_domains所列网域的邮件时,它会检

查relay_recipient_maps参数所指定的查询表,借此判断是否应该收下邮件,如不应收

下则直接拒收。relay_recipient_maps参数的设定方式如下:

relay_recipient_maps = hash:/etc/postfix/relay_recipients

relay_recipients查询表应该记录所有合法收件人的邮件地址。postfix只需要此表的

索引键,所以对应值可以任意填写(但不可不填)

对于人事变动频繁的网域,我们建议你应该研制一个同步程序,利用rsync、ssh、

crond等工具,自动从主交换器下载最新列表。

如果备用交换器的postfix不过滤转发网域的收件地址,会有什么后果?答案是备用交换

器会收到一大堆无法投递的垃圾邮件,并产生一大堆寄不出去的退信通知函。因为捏造

收件人是垃圾邮件发送者常用的手段之一,他们事先不知道你的邮件交换器有哪些用户

,于是以常用的人名来捏造收件地址,试图蒙混过关。此外,垃圾邮件也不可能会提供

有效的回信地址。

假如备用交换器与主交换器位于同一个局域网,除了使用rsync、scp、ssh、crond等传

统工具之外,还有更好的方法来进行列表的同步更新工作。比方说,将用户账号储存在

某种数据库中,像mysql、ldap等,让postfix能够进行实时查询。

在你设定了relay_recipient_maps之后,还必须面对一个潜在的问题;你必须将所有转

发网域的所有合法邮件地址都列入查询表,因为 postfix将拒收任何收件地址没出现在

查询表的邮件。如果你不知道某些网域的合法邮件地址,你可以为该网域设置一个无限

别名地址;

快速清空

为许多网域承接邮件的网络,时常会面临无法立刻送出邮件的困境,因为他们的顾客的

服务器不见得永远保持连接。在客户离线的情况下,ISP只能将收到的邮件暂时存放在队

列里,等到客户的服务器恢复连接时,再使用SMTP的ETRN命令,一次清空队列里的所有

邮件;

当一个网域的主交换器恢复连接并完成收信准备时,我们的队列里已囤积了大量要传给

该网域的邮件,让postfix逐一检查每一个队列文件的收信网域为何,将会损耗许多时间

。为此,postfix提供了一种称为“快速清空”(fast flush)的功能,可用来在队列

中找出寄给特定网域的所有邮件。快速清空功能是由flush daemon控制管理的,对于

postfix所代理的每一个收信网域,flush各准备了一份列表,记录该网域邮件在队列里

的编号。如此,在发出ETRN 命令之后,postfix可以迅速找出所有要投递到该网域的邮

件。

默认情况下,flush只管理relay_domains所列的网域。如果还有其他网域也需要快速清

空服务,你可以将它们的网域名称在fast_flush_domains参数中,像这样:

fast_flush_domains = $relay_domains, example.com

此例中,example.com是一个没列在relay_domains的网域。

你可以使用postqueue -s命令来通知postfix,某各快速清空网域已经准备好接收先前

累积的邮件了:

postqueue -s example.com

传输表

当你想改变默认的邮递流程时,可利用传输表(transport map)来达成愿望。也就是

说,如果你希望postfix以你指定的方式来处理特定网域的邮件,而不管DNS MX记录是

怎么设定的,你可将相关网域与传送方式写在一二传输表中,然后将transport_maps参

数指向此传输表。

本节讨论transport_maps参数的基本用法,后面几章会陆续谈到此参数在其他方面的应

用。transport_maps参数可指向一个或多个传输表,例如:

transport_maps = hash:/etc/postfix/transport

传输表的索引键可以是完整的邮件地址、网域名称或子网域名称。当收件地址或网域名

称符合传输表某个记录的索引键时,则以该记录的对应值所指定的传输法来投递该邮件

传输表内容

example.com smtp:[192.168.23.56]:20025

oreilly.com relay:[gateway.oreilly.com]

oreillynet.com smtp

ora.com maildrop

kdent@ora.com error:no mail accepted for kdent

传输表对应值的格式,随传输方法而异,但大体上符合transport:nexthop这样的格式

。某些传输方法的nexthop可表示成host:port形式,表示递送路径下一站的主机名与

通信端口。以下分别说明可组成对应值的三种元素:

transport

传输方法的名称。此名称必须是master.cf所定义的传输类型之一。如果你增加

了新的传输方法,则必须先在master.cf定义其名称与传输类型。

host

收信主机或网域。host只能搭配inet传输类型(smtp或lmtp)。postfix按照一

般收信网域的处理流程host:先查询mx记录来决定邮件的去处,如果没有mx记录,则传

到a记录所指的ip地址。如果将主机名称放在一对方括号内,则postfix会直接传信到

host的a记录所指的ip地址。但如果你直接使用ip地址,则一定要加方括号,例如

〔192.168.23.56〕

port

收信主机的通信端口。通常只有inet类型的传输服务才会指定通信端口。port

的格式可以是十进制数,也可以是/etc/services文件定义的服务名称。

上例列出的传输表内容,暂时了transport:host:port的多种可能组合,分别解释如

下:

example.com smtp:〔192.168.23.56〕:20025

收下所有写给example.com的邮件,然后使用smtp MDA传送到位于

192.168.23.56的主机,而且smtp MDA必须连接到该主机的port 20025,而非默认的

smtp port25。请注意,由于我们直接使用了ip地址,所以必须加上方括号。

oreilly.com relay:〔gateway.oreilly.com〕

收下所有要寄到oreilly.com的邮件,然后使用relay MDA转寄给

gateway.oreilly.com主机。由于没指定通信端口,所以relay使用默认的port25。由于

主机名称被放在方括号内,所以邮件是直接传到gateway.oreilly.com的A记录所指的ip

地址,而非mx记录所指的ip地址。

relay MDA是postfix2.0版以后才引进的,它修正了队列调度算法可能引起的潜在效能

瓶颈。当你要将入站邮件送到内部系统时,应该直接通过relay MDA,以避免这类邮件与

出站邮件竞争资源。

oreillynet.com smtp

收下所有目的地为oreillynet.com网域的邮件,然后交给smtp MDA执行投递操

作。由于没指定host:port,所以smtp依照oreillynet.com网域的DNS MX或A记录来决

定目的地,并使用port 25来联系收信服务器。实际上这个例子实属多余,因为只要将

oreillynet.com列在relay_hosts或relay_domains参数,就可以达到相同效果。

ora.com maildrop

收下所有写给ora.com网域的邮件,然后交给maildrop处理。maildrop的运作方

式必须被明确定义在master.cf中。由于maildrop不需要inet socket,所以不必指定

host:port。

kdent@ora.com error:No mail accepted for kdent

error是一种特殊的传输服务,它唯一的作用是当场拒收邮件。冒号之后的字符

串是回复给传送方的错误信息。

传输表不一定用来将邮件传递到外界,也可以用于将特定邮件交给本地系统,以便进行

特殊处理。比方说,过滤邮件内容、暂时扣留某个网域的所有邮件等。

延迟投递时间

在某些情况下,你可能会希望postfix先收下邮件,但不立刻投递出去。等到你下达

posqueue -f domain命令之后,或是postfix从支持快速清空功能的网域收到ETRN

SMTP命令之后,postfix才递送出被暂扣留的邮件。

最常见的一种情况是ISP为客户的网域代收邮件,但是客户的网络并不总是保持连接。

ISP必须先储存邮件,直到客户的网络恢复连接,并且能收下邮件为止。类似的情况还有

客户网络上的用户,应该要能够通过本地的邮件网关来寄信,该网关必须能先暂存外寄

邮件,直到网络恢复连接时才投递出去。

暂缓转发邮件

在以下的程序中,我们要先创建一种新型的传输法,称为“ondemand”,然后设定传输

表,要求所有寄到example.com网域的邮件,一律先暂时扣留在队列里。

1。 在master.cf设置一种新的传输法,并命名为ondemand。它的配置应该与smtp传

输法一样

ondemand unix - - n - - smtp

2、要求postfix自动延缓任何通过ondemand递送的邮件。只要将新设的ondemand传输法

列在main.cf的defer_transports参数中,就可以达到自动延缓的效果:

defer_transports = ondemand

3、 确定transport_maps参数指向我们的传输表:

transport_maps = hash:/etc/postfix/transport

4、编辑修改传输表,使得example.com网域的所有邮件都通过ondemand传输法来投递:

example.com ondemand

5、运行postmap将传输表转换成数据库格式:

postmap /etc/postfix/transport

6、要求postfix重新读取配置文件,使我们所做的改变开始生效:

postfix reload

现在,所有要寄到example.com网域的邮件都会被扣留在队列里,直到你下达以下命令为

止:

postqueue -f example.com

暂缓投递外地邮件

假设有一个小型办公室网络,他们与Internet之间没有连接,而是由网管人员架设呢一

台邮件服务器来接收内部员工寄到外界的邮件。网管人员希望能够控制外地邮件的投递

时间,让postfix只有在有连接时才送出外地邮件。

1、 将smtp服务名称列在main.cf的defer_transports参数中:

defer_transports = smtp

2、要求postfix重新加载配置文件,使我们的改变生效:

postfix reload

以后,每当办公室网络与Internet接通时,网管人员就可以使用postqueue -f命令来送

出所有外地邮件。

入站邮件网关

邮件网关是一种能收下邮件然后将其转交给其他系统的邮件服务器系统。在在网络术语

中,“网关"一词的意义有两个:一是物理上的含义,代表某个网络到达另一个网络的必

经通路;另一层含义是协议的转换,将一种协议所传达的信息以另一个协议传到目标系

统。

邮件网关通常被设置在企业网络与Internet之间,甚至与防火墙系统搭配在一起,以尽

可能减少需要直接访问Internet的服务器数量。

假设有一个企业网络,这家企业有多个部门,各部门都有自己的子网域,也有自己的内

部邮件服务器。网关系统gw.example.com负责收下企业网络的所有邮件。假设人力资源

部门的邮件系统位于mail.example.com,此部门员工的邮件地址是

user@hr.example.com;业务部门的邮件系统位于mail2.example.com,他们的邮件地

址格式是user@sales.example.com。每个字网络上的主机,应该分别从他们各自的内部

邮件服务器取信。邮件网关gw.example.com必须设置传输表,才能将收下的邮件交付给

正确的内部邮件服务器。

下列程序示范要如何设定gw.example.com,才能使它将邮件交给正确的内部服务器。

1、确定hr.example.com与sales.example.com的DNS mx记录都指向gw.example.com网

2、编辑网关系统的main.cf配置文件,将两个子网域列入relay_domains参数:

relay_domains = hr.example.com, sales.example.com

3、确定transport_maps参数指向正确的传输表“

transport_maps = hash:/etc/postfix/transport

4、编辑修改传输表内容,将各网域指向正确的内部服务器:

transport maps

hr.example.com relay:[mail.example.com]

sales.example.com relay:[mail2.example.com]

注意,内部邮件服务器的主机名是放在一对方括号内,这使得网关系统可跳过mx查询,

而直接将邮件递送到主机名称所对应的ip地址。

5、重新加载配置文件,使改变生效:

postfix reload

郑重建议你将mail与mail2的所有合法邮箱列表汇整成一个查询表,放在gw系统上,并将

网关系统的relay_recipient_maps参数指向查询表;否则,gw.example.com将会收下

许多垃圾邮件。

出站邮件网关

若邮件系统没有足够的信息或能力将邮件直接送达目的地,它可将邮件交给位于更有利

位置的其他系统,间接送到目的地。假设那两个内部邮件系统不能直接访问 Internet,

它们不能将字网络上的用户寄到外地的邮件直接递送到目的地,但它们可以将所有外地

邮件都托付给网关系统,由网关代为递送。下列步骤示范如何设定mail.example.com上

的postfix server,使它将收下的所有外地邮件都交给gw.example.com。

在开始设定内部邮件系统之前,请确定邮件网关已被设定成能接收内部邮件系统的转发

要求。网关系统的mynetworks参数应该涵盖内部邮件系统的所有 ip地址;此外,如果

网关系统使用了smtp ube过滤规则,请确定permit_mynetworks被列在过滤规则里。

1、在各部门的办公室贴公告,告诉你的同事,要求他们设定MUA使用的内部邮件系统(mail1 mail2。。。)为smtp server

2、设定内部邮件系统(mail1与mail2)的mynetworks(或mynetworks_style)参数,确定子网络上的全部客户端系统都涵盖在内。

3、编辑内部邮件系统的main.cf,将relayhost参数指向网关系统:

relayhost = 〔gw.example.com〕

4、重新加载postfix配置文件,使改变生效:

postfix reload

现在,所有送到mail.example.com的外地邮件,都会通过gw.example.com送到目的地。

UUCP、传真以及其他投递机制

postfix的在线文件描述了如何设定postfix使其将邮件交给传真机系统以及如何使用postfix来架设UUCP网关。当你的postfix需要与任何特殊设备接轨时,这些例子提供了很好的参考。原则上,如果你需要在不同类型的系统或网络之间架设网关,传输表提供了引导邮件到其他系统或设备的机制。

通过上面文章,我们可以清楚的知道Postfix邮件转发的一些附属知识,能更容易的掌握Postfix邮件转发的功能。

spf

SPF记录详解

句型

在一条SPF记录中,按照排列的先后顺序,对所给出的机制进行验证.如果在SPF记录中,没有机制或修改符,默认结果是中性(Neutral);如果域没有SPF记录,结果是:””(None);如果在DNS解析期间,有一个临时错误,会报临时错误”(TempError)(以前的规划中称作错误”(error));如果SPF记录句型错误,比如写法错误或者使用了未知句型,会报永久错误”(PermError)(以前称作”unknown”)

1 机制

1.1 机制表示

1.1.1 all

这个机制总是匹配的,通常用在记录的结尾.:

“v=spf1 mx –all” 允许所有该域的MX邮件服务器发送邮件,禁止所有其他的.

“v=spf1 –all” 该域根本不能发送邮件

“v=spf1 +all” 任何服务器都可以发送邮件

1.1.2 ip4

“v=spf1 ip4:192.168.0.1/16 –all” 允许192.168.0.1192.168.255.255的服务器发送邮件

“v=spf1 ip4:192.168.0.1 –all”   允许192.168.0.1发送邮件,“v=spf1 ip4:192.168.0.1/32 –all”同意

1.1.3 ip6

单个IP,ip4不同,/128为默认前缀 :

"v=spf1 ip6:1080::8:800:200C:417A/96 -all"

 

允许1080::8:800:0000:0000 1080::8:800:FFFF:FFFF之间的主机发送

"v=spf1 ip6:1080::8:800:68.0.3.1/96 -all"

 

允许 1080::8:800:0000:0000 1080::8:800:FFFF:FFFF之间的主机发送

1.1.4 a

:假设当前域为example.com

"v=spf1 a -all" 当前域被使用

"v=spf1 a:example.com -all"当前域被使用

 

Equivalent if the current-domain is example.com.

"v=spf1 a:mailers.example.com -all" 指定mailers.example.com的主机IP可以外发邮件

"v=spf1 a/24 a:offsite.example.com/24 -all" 如果example.com解析到192.0.2.1,那么全部的C类地址192.0.2.0/24将作为可外发 邮件的IP地址;同样,如果offsite.example.com有多个A记录地址,每一个IP地址也会被扩展到CIDR子网,作为可外发邮件IP地址.

1.1.5 mx

所有域的MX记录对应的A记录,按照MX记录的优先级进行验证.如果发送IP在这些记录中,则机制匹配.如果域未指定,默认为当前域.

 

A记录需要精确匹配发送邮件的IP地址.如果有CIDR前缀,则需要逐个对应IP地址验证.

:

v=spf1 mx mx:deferrals.domain.com -all"

 

Perhaps a domain sends mail through its MX servers plus another set of servers whose job is to retry mail for deferring domains.

也许一个域可以通过他的MX服务器发送邮件,而另外也可以通过deferrals.domain.comMX服务器发送邮件.

"v=spf1 mx/24 mx:offsite.domain.com/24 -all"

也许一个域的MX服务器在一个IP接收邮件,而用临近的另一IP发送邮件.

1.1.7 prt

发送IPPTR记录至少有一个和给定域相匹配.尽量避免使用这种机制,因耗费大量的DNS查询

例子:

"v=spf1 ptr -all"

 

"v=spf1 ptr:otherdomain.com -all"

1.1.8 exists

对被提供的域进行A记录查询,如果有结果,则匹配.如果结果是”-“,会被当作127.0.0.2对待.

在下面的例子中,发件IP地址为1.2.3.4,当前域为example.com

"v=spf1 exists:example.net -all"

如果example.net不能解析,结果失败.如果可以解析.机制匹配.

1.1.10 include

句型:include:<domain>

指定的域被查询后匹配.如果查询无匹配或者有错误,接着开始下一个机制处理.警告:如果指定域不是合法有效的SPF记录,返回永久性错误结果.某些邮件接收者会基于此错误,拒绝接受邮件.

:

在下面的例子中,发信IP1.2.3.4,当前域是example.com

“v=spf1 include:example.net –all”

如果example.net没有SPF记录,结果是永久错误”(PermError)

假设example.netSPF记录是”v=spf1 a –all”

查询exapmle.netA记录,如果匹配1.2.3.4,结果是通过”(Pass);如果不匹配,,include整体匹配失败,后面的-all将不再验证,最后总的结果还是失败”(Fail).

 

这个机制会涉及信任关系,可能会有越权行为,可能被人假冒.因此可以设置为中性,include前加上标识符?

“v=spf1 ?include:example.net –all”

该机制一般不宜选择.

 

1.2 标识符

作为机制的前缀,表明机制的状态.机制的默认标识符为”+”

"+" Pass (通过)

"-" Fail (失败)

"~" SoftFail (软失败)

"?" Neutral (中性)

2修改符

在一个SPF记录中,每个修改符只能使用一次,不能重复使用.未知修改符将会在验证时忽略。

 

1.2.1 redirect

句型: redirect=<domain>

将会用指定域代替当前域

在下面的例子里:当前域为example.com,发信IP1.2.3.4

“v=spf1 redirect=example.net”

如果example.net没有SPF记录,返回”unknown”的错误

假设example.netSPF记录是”v=spf1 a –all”

查询example.netA记录,如果匹配1.2.3.4,通过”(Pass);如果不匹配,该行为失败,接着开始执行-all机制.

 

1.2.2 exp

句型: exp=<domain>

提供解释性的语句.如果SMTP接收者拒绝一个信息,它可以包含一个返回给发信者的解释信息.SPF记录里可以包含一个解释字符串给发送者,告之相关的错误信息或需要访问的帮助页面等.

处理过程

错误代码

验证SPF记录的结果只能有如下几在种:

结果

解释

可做行为

Pass

SPF记录指定,主机被允许发送

接受

Fail

SPF记录指定,主机不被允许发送

拒绝

SoftFail

SPF记录指定,主机不被允许发送,但可以再发送

接受但做标记

Neutral

SPF记录详尽,但不能确认其有效性

接受

None

SPF记录或SPF记录验证无结果

接受

PermError

永久错误(例如不正确的格式记录)

未指明

TempError

临时错误发生

接受或拒绝

 

常见问题

Legenda
>Syntax >Type >Meaning
-all Fail Fail all servers not listed here (recommended option)
~all Soft fail Give extra scrutiny to servers not listed here
?all Neutral Unsure whether e-mail infrastructure is secure
+all Pass There’s no infrastructure security at all


其它参考:
http://www.openspf.org/SPF_Record_Syntax

bash 判断

运算符 描述 示例
文件比较运算符
-e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
-d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
-f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
-L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
-r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
-w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
-x filename 如果 filename可执行,则为真 [ -L /usr/bin/grep ]
filename1-nt filename2 如果 filename1 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
filename1-ot filename2 如果 filename1 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]
字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)
-z string 如果 string长度为零,则为真 [ -z "$myvar" ]
-n string 如果 string长度非零,则为真 [ -n "$myvar" ]
string1= string2 如果 string1 string2相同,则为真 [ "$myvar" = "one two three" ]
string1!= string2 如果 string1 string2不同,则为真 [ "$myvar" != "one two three" ]
算术比较运算符
num1-eq num2 等于 [ 3 -eq $mynum ]
num1-ne num2 不等于 [ 3 -ne $mynum ]
num1-lt num2 小于 [ 3 -lt $mynum ]
num1-le num2 小于或等于 [ 3 -le $mynum ]
num1-gt num2 大于 [ 3 -gt $mynum ]
num1-ge num2 大于或等于 [ 3 -ge $mynum ]



if 语句语法:


if [ condition ]
then 
    action
fi


只有当 condition 为真时,该语句才执行操作,否则不执行操作,并继续执行 "fi" 之后的任何行。

if [ condition ]
then 
    action
elif [ condition2 ]
then 
    action2
.
.
.
elif [ condition3 ]
then 
else
    actionx
fi



以上 "elif" 形式将连续测试每个条件

sh & bash 资料

一 简单过程

1)可以使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写shell脚本。ubuntu中可以使用gedit,notpad++也不错啊。

2)文件必须以#!/bin/sh开始。符号#!用来告诉系统那个shell来执行该脚本的程序,系统中可以有多个shell,例如使用/bin/sh,/bin/bash。

3)编辑结束并保存后,如果要执行该脚本,必须先使其可执行,使用命令chmod +x filename。

4)此后在该脚本所在目录下,输入 ./filename 即可执行该脚本。

5)最简单的调试方法当然是使用echo命令。你可以在任何怀疑出错的地方用echo打印变量值。

6)可以用sh -x strangescript来调试。

7)可以使用sh -n your_script来检查语法,不执行。

8)以# 开始的行表示注释,直到该行的结束。



二 命令

可以使用所有的Unux的命令。



三 变量

Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:1. 首个字符必须为字母(a-z,A-Z)2. 中间不能有空格,可以使用下划线(_)3. 不能使用标点符号 4. 不能使用bash里的关键字(可用help命令查看保留关键字)。

要给变量赋值时,可以这么写:变量名=值, 等号两边均不能有空格存在。为了避免混淆,可以使用{}给变量,如${num}。



四 管道/重定向

*  管道 (|) :将一个命令的输出作为另外一个命令的输入 :grep "hello" file.txt | wc -l 。 上述命令会在file.txt中搜索包含有”hello”的行并计算行数,这里grep命令的输出成了wc命令的

输入。

* 重定向:将命令的结果输出到文件,而不是标准输出(屏幕) > 写入文件并复盖旧文件,>> 加到文件的尾部,保留旧文件内容。

* 反短斜线:反短斜线可以将一个命令的输出作为其它命令的命令行参数。find . -mtime -1 -type f -print。上述命令可以查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果您想将所有查找到的文件打一个包,则可以使用以下脚本: 

#!/bin/sh

# The ticks are backticks (`) not normal quotes  ('):

tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`

* 单引号‘’:功能则最强。当你把字符串用单引号括起来时,外壳将忽视所有单引号中的特殊字符。

* 双引号“”:双引号的功能最弱。当你把字符串用双引号括起来时,外壳将忽略字符串中的空格,但其他的字符都将继续起作用。双引号在将多于一个单词的字符串赋给一个变量时尤其有用。

* 反斜杠\:反斜杠的功能和单引号一样,只是反斜杠每次只能使一个字符发生转义,而不是使整个字符串发生转义。



五 特殊字符

• 有些变量在启动外壳时就已经存在于系统中,你可以使用这些系统变量,并且可以赋予

新值:

$HOME 用户自己的目录。

$ PATH 执行命令时所搜寻的目录。

$TZ 时区。

$MAILCHECK 每隔多少秒检查是否有新的邮件。

$ P S 1 在外壳命令行的提示符。

$ P S 2 当命令尚未打完时,外壳要求再输入时的提示符。

$ M A N PATHman 指令的搜寻路径。

• 有些变量在执行外壳程序时系统就设置好了,并且你不能加以修改:

$ # 存储外壳程序中命令行参数的个数。

$ ? 存储上一个执行命令的返回值。

$ 0 存储外壳程序的程序名。

$ * 存储外壳程序的所有参数。

$ @ 存储所有命令行输入的参数,分别表示为(“$ 1” “$ 2” . . . )。shift 命令用来将存储在位置参数中的当前值左移一个位置。

$ $ 存储外壳程序的P I D。

$ ! 存储上一个后台执行命令的P I D。



六 关键字

1)if

if [ expression ]

then

commands

elif [ expression2 ]

then

commands

else

commands

fi

2)条件,条件之间可以使用&& 和||

-b file            若文件存在且是一个块特殊文件,则为真

-c file            
若文件存在且是一个字符特殊文件,则为真

-d file            
若文件存在且是一个目录,则为真

-e file            
若文件存在,则为真

-f file            
若文件存在且是一个规则文件,则为真

-g file            
若文件存在且设置了SGID位的值,则为真

-h file            
若文件存在且为一个符合链接,则为真

-k file            
若文件存在且设置了"sticky"位的值

-p file            
若文件存在且为一已命名管道,则为真

-r file            
若文件存在且可读,则为真

-s file            
若文件存在且其大小大于零,则为真

-u file            
若文件存在且设置了SUID位,则为真

-w file            
若文件存在且可写,则为真

-x file            
若文件存在且可执行,则为真

-o file            
若文件存在且被有效用户ID所拥有,则为真

-z string          string长度为0,则为真

-n string          
string长度不为0,则为真

string1 = string2  
若两个字符串相等,则为真

string1 != string2 
若两个字符串不相等,则为真

int1 -eq int2      int1等于int2,则为真

int1 -ne int2      
int1不等于int2,则为真

int1 -lt int2      
int1小于int2,则为真

int1 -le int2      
int1小于等于int2,则为真

int1 -gt int2      
int1大于int2,则为真

int1 -ge int2      
int1大于等于int2,则为真

!expr              expr为假则复合表达式为真。expr可以是任何有效的测试表达式

expr1 -a expr2     
expr1expr2都为真则整式为真

expr1 -o expr2     
expr1expr2有一个为真则整式为真


3)case

case string1 in

str1 )

commands ; ;

str2 )

commands ; ;

* )

commands ; ;

esac

4)for

for var1 in list

do

commands

done

5)while

while expression

do

statements

done 

6)until

until expression

do

commands

done

7)select

select menuitem [in list_of_items]

do

commands

done

 

七 子函数

fname () {

shellcommands

}

调用fname [parm1 parm2 parm3 ...]

 

#!/bin/sh
 
# verifycron - script checks a crontab file to ensure that it's
#    formatted properly.  Expects standard cron notation of
#       min hr dom mon dow CMD    
#    where min is 0-59, hr 0-23, dom is 1-31, mon is 1-12 (or names)
#    and dow is 0-7 (or names).  Fields can have ranges (a-e), lists
#    separated by commas (a,c,z), or an asterisk. Note that the step 
#    value notation of Vixie cron is not supported (e.g., 2-6/2).
 
 
validNum()
{
  # return 0 if valid, 1 if not. Specify number and maxvalue as args
  num=$1   max=$2
 
  if [ "$num" = "X" ] ; then
    return 0
  elif [ ! -z $(echo $num | sed 's/[[:digit:]]//g') ] ; then
    return 1
  elif [ $num -lt 0 -o $num -gt $max ] ; then
    return 1
  else
    return 0
  fi
}
 
validDay()
{
  # return 0 if a valid dayname, 1 otherwise
 
  case $(echo $1 | tr '[:upper:]' '[:lower:]') in
    sun*|mon*|tue*|wed*|thu*|fri*|sat*) return 0 ;;
    X) return 0 ;; # special case - it's an "*"
    *) return 1
  esac
}
 
validMon()
{
  # return 0 if a valid month name, 1 otherwise
 
   case $(echo $1 | tr '[:upper:]' '[:lower:]') in 
     jan*|feb*|mar*|apr*|may|jun*|jul*|aug*) return 0       ;;
     sep*|oct*|nov*|dec*)            return 0       ;;
     X) return 0 ;; # special case, it's an "*"
     *) return 1    ;;
   esac
}
 
fixvars()
{
  # translate all '*' into 'X' to bypass shell expansion hassles
  # save original as "sourceline" for error messages
 
  sourceline="$min $hour $dom $mon $dow $command"
   min=$(echo "$min" | tr '*' 'X')
  hour=$(echo "$hour" | tr '*' 'X')
   dom=$(echo "$dom" | tr '*' 'X')
   mon=$(echo "$mon" | tr '*' 'X')
   dow=$(echo "$dow" | tr '*' 'X')
}
 
if [ $# -ne 1 ] || [ ! -r $1 ] ; then
  echo "Usage: $0 usercrontabfile" >&2; exit 1
fi
 
lines=0  entries=0  totalerrors=0
 
while read min hour dom mon dow command
do
  lines="$(( $lines + 1 ))"
  errors=0
   
  if [ -z "$min" -o "${min%${min#?}}" = "#" ] ; then
    continue    # nothing to check
  elif [ ! -z $(echo ${min%${min#?}} | sed 's/[[:digit:]]//') ] ;  then
    continue    # first char not digit: skip!
  fi
 
  entries="$(($entries + 1))"
 
  fixvars
 
  #### Broken into fields, all '*' replaced with 'X' 
  # minute check
 
  for minslice in $(echo "$min" | sed 's/[,-]/ /g') ; do
    if ! validNum $minslice 60 ; then
      echo "Line ${lines}: Invalid minute value \"$minslice\""
      errors=1
    fi
  done
 
  # hour check
   
  for hrslice in $(echo "$hour" | sed 's/[,-]/ /g') ; do
    if ! validNum $hrslice 24 ; then
      echo "Line ${lines}: Invalid hour value \"$hrslice\""
      errors=1
    fi
  done
 
  # day of month check
 
  for domslice in $(echo $dom | sed 's/[,-]/ /g') ; do
    if ! validNum $domslice 31 ; then
      echo "Line ${lines}: Invalid day of month value \"$domslice\""
      errors=1
    fi
  done
 
  # month check
 
  for monslice in $(echo "$mon" | sed 's/[,-]/ /g') ; do
    if ! validNum $monslice 12 ; then
      if ! validMon "$monslice" ; then
        echo "Line ${lines}: Invalid month value \"$monslice\""
        errors=1
      fi
    fi
  done
 
  # day of week check
 
  for dowslice in $(echo "$dow" | sed 's/[,-]/ /g') ; do
    if ! validNum $dowslice 7 ; then
      if ! validDay $dowslice ; then
        echo "Line ${lines}: Invalid day of week value \"$dowslice\""
        errors=1
      fi
    fi
  done
 
  if [ $errors -gt 0 ] ; then
    echo ">>>> ${lines}: $sourceline"
    echo ""
    totalerrors="$(( $totalerrors + 1 ))"
  fi
done < $1
 
echo "Done. Found $totalerrors errors in $entries crontab entries."
 
exit 0
 

bash & sh

bash是 Bourne Again SHell 是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容Bourne shell,也就是说用Bourne shell的脚本不加修改可以在bash中执行。
sh是Bourne shell 这个是UNIX标准的默认shell,对它评价是concise简洁 compact紧凑  fast高效 有AT&T编写,属于系统管理shell。

iptables 常用策略 / centos 7

1、清空存在的策略
当你开始创建新的策略,你可能想清除所有的默认策略,和存在的策略,可以这么做:
iptables -F  或者iptables --flush
iptables -L -n
iptables -L -n -v
iptables -D INPUT 4
2,设置默认策略
默认链策略是ACCEPT,改变所有的链策略为DROP:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
3,阻止一个指定的ip
BLOCK_THIS_IP=“x.x.x.x"
iptables -A INPUT -s ”$BLOCK_THIS_IP“ -j DROP
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
4,允许SSH
允许所有通过eth0接口使用ssh协议连接本机:
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
5,允许某个网段通过ssh连接
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
6,允许http和https
允许所有进来的web流量:http协议的80端口
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
允许所有进来的web流量:https协议的443端口
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
7,多个策略联合一起
允许ssh,http,https:
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
8,允许SSH连接其他主机
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
9,允许SSH连接指定的网段
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
10,允许https出去
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
11,对web请求做负载均衡(每三个包,均衡到指定服务器,需要扩展iptables)
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
12,允许ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
13,允许ping远程
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
14,允许本地回环
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
15,允许内网访问外部网络
这个例子eth1 连接外部网络,eth0连接内部网络
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
16,允许DNS出去
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
17,允许NIS连接
NIS端口是动态的,当ypbind启动时它分配端口。
首先运行 rpcinfo -p 显示得到端口号,这个例子使用端口850,853。
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 853 -j ACCEPT
iptables -A INPUT -p udp --dport 853 -j ACCEPT
iptables -A INPUT -p tcp --dport 850 -j ACCEPT
iptables -A INPUT -p udp --dport 850 -j ACCEPT
上面的例子当ypbind重新启动时将失效,有2种解决方案:
(1)分配nis服务静态ip(2) 使用精妙的脚本
18,允许指定网段连接Rsync
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
19,允许mysql从指定的网段连接
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
20,允许sendmail或者postfix
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
21,允许IMAP和IMAPS
IMAP:
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
IMAPS:
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
22,允许POP3和POP3S
POP3:
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
POP3S:
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
23,预防DOS攻击
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
-m : 使用iptables扩展
--limit 25/minute : 限制分钟连接请求数
--limit-burst:触发阀值,一次涌入数据包数量
24,端口转发
来自442的都转到22端口
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
你还必须明确允许442端口
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
25,包丢弃日志
你也许想查看所有丢弃包的日志。
首先创建一个新链叫 LOGGING
iptables -N LOGGING
确保所有的连接跳到LOGGING
iptables -A INPUT -j LOGGING
记录这些包通过自定义名字 "log-prefix"
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped:" --log-level 7
最后丢弃这些数据包
iptables -A LOGGING -j DROP

26,常用

iptables --flush
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o lo -p all -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 21 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
iptables -A OUTPUT -p udp -m udp --dport 123 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p tcp -m tcp --dport 22 -j ACCEPT

26,一批示例

#查看iptables现有规则
iptables -L -n
#先允许所有,不然有可能会杯具
iptables -P INPUT ACCEPT
#清空所有默认规则
iptables -F
#清空所有自定义规则
iptables -X
#所有计数器归0
iptables -Z
#允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT
#开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#其他入站一律丢弃
iptables -P INPUT DROP
#所有出站一律绿灯
iptables -P OUTPUT ACCEPT
#所有转发一律丢弃
iptables -P FORWARD DROP

##BATCH:EXAMPLEs##
iptables -L -n
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

### 描述

iptables基础
①规则(rules):网络管理员预定义的条件
②链(chains): 是数据包传播的路径
③表(tables):内置3个表filter表,nat表,mangle表分别用于实现包过滤网络地址转换和包重构的功能
④filter表是系统默认的,INPUT表(进入的包),FORWORD(转发的包),OUTPUT(处理本地生成的包),filter表只能对包进行授受和丢弃的操作。
⑤nat表(网络地址转换),PREROUTING(修改即将到来的数据包),OUTPUT(修改在路由之前本地生成的数据包),POSTROUTING(修改即将出去的数据包)
⑥mangle表,PREROUTING,OUTPUT,FORWORD,POSTROUTING,INPUT

iptables命令格式
iptables [-t 表] -命令 匹配 操作 (大小写敏感)
动作选项
ACCEPT 接收数据包
DROP 丢弃数据包
REDIRECT 将数据包重新转向到本机或另一台主机的某一个端口,通常功能实现透明代理或对外开放内网的某些服务
SNAT 源地址转换
DNAT 目的地址转换
MASQUERADE IP伪装
LOG 日志功能

定义规则
①先拒绝所有的数据包,然后再允许需要的数据包
iptalbes -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
②查看nat表所有链的规则列表
iptables -t nat -L
③增加,插入,删除和替换规则
iptables [-t 表名] <-A|I|D|R> 链名 [规则编号] [-i|o 网卡名称] [-p 协议类型] [-s 源ip|源子网] [--sport 源端口号] [-d 目的IP|目标子网] [--dport 目标端口号] [-j 动作]
参数:
-A 增加
-I 插入
-D 删除
-R 替换

基于状态的匹配扩展(连接跟踪)
每个网络连接包括以下信息:源地址、目标地址、源端口、目的端口,称为套接字对(socket pairs);协议类型、连接状态(TCP协议)
和超时时间等。防火墙把这些信息称为状态(stateful)。
状态包过滤防火墙能在内存中维护一个跟踪状态的表,比简单包过滤防火墙具有更大的安全性,命令格式如下:
iptables -m state –-state [!]state [,state,state,state]
其中,state表是一个逗号分割的列表,用来指定连接状态,4种:
>NEW: 该包想要开始一个新的连接(重新连接或连接重定向)
>RELATED:该包是属于某个已经建立的连接所建立的新连接。举例:
FTP的数据传输连接和控制连接之间就是RELATED关系。
>ESTABLISHED:该包属于某个已经建立的连接。
>INVALID:该包不匹配于任何连接,通常这些包被DROP。

 

 

 

CentOS7默认的防火墙不是iptables,而是firewalle.

安装iptable iptable-service

#先检查是否安装了iptables
service iptables status
#安装iptables
yum install -y iptables
#升级iptables
yum update iptables
#安装iptables-services
yum install iptables-services

 

 

禁用/停止自带的firewalld服务

#停止firewalld服务
systemctl stop firewalld
#禁用firewalld服务
systemctl mask firewalld

 

设置现有规则

#查看iptables现有规则
iptables -L -n
#先允许所有,不然有可能会杯具
iptables -P INPUT ACCEPT
#清空所有默认规则
iptables -F
#清空所有自定义规则
iptables -X
#所有计数器归0
iptables -Z
#允许来自于lo接口的数据包(本地访问)
iptables -A INPUT -i lo -j ACCEPT
#开放22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#开放21端口(FTP)
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
#开放80端口(HTTP)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#开放443端口(HTTPS)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
#允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#其他入站一律丢弃
iptables -P INPUT DROP
#所有出站一律绿灯
iptables -P OUTPUT ACCEPT
#所有转发一律丢弃
iptables -P FORWARD DROP

 

其他规则设定

#如果要添加内网ip信任(接受其所有TCP请求)
iptables -A INPUT -p tcp -s 45.96.174.68 -j ACCEPT
#过滤所有非以上规则的请求
iptables -P INPUT DROP
#要封停一个IP,使用下面这条命令:
iptables -I INPUT -s ***.***.***.*** -j DROP
#要解封一个IP,使用下面这条命令:
iptables -D INPUT -s ***.***.***.*** -j DROP

 

保存规则设定

#保存上述规则
service iptables save

 

开启iptables服务

#注册iptables服务
#相当于以前的chkconfig iptables on
systemctl enable iptables.service
#开启服务
systemctl start iptables.service
#查看状态
systemctl status iptables.service

 

解决vsftpd在iptables开启后,无法使用被动模式的问题

1.首先在/etc/sysconfig/iptables-config中修改或者添加以下内容

#添加以下内容,注意顺序不能调换
IPTABLES_MODULES="ip_conntrack_ftp"
IPTABLES_MODULES="ip_nat_ftp"

2.重新设置iptables设置

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

以下为完整设置脚本

#!/bin/sh
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
service iptables save
systemctl restart iptables.service

 

原文: https://blog.csdn.net/l1028386804/article/details/50779761

 

 

..

 

 

postfix main.cf

一、设定邮件主机的识别身分(重要)

  myhostname 邮局系统的主机名:如果系统设置得当,应该不用设置,系统会以gethostname()取得

  mydomain 邮局系统的域名:预设会以myhostname第一个点之后的作为domain名称

  myorigin 从本机寄出邮件的域名名称:自动补齐资讯所用的,通常使用网域名称

  mydestination 本地网域-可接收邮件的主机名或域名:指Postfix应该视为「本地网域」的所有网域名称

  (本地网域的部份会后续在设定)

  myhostname = host.domain.tld

  mydomain = domain.tld

  myorigin = $mydomain

  二、设定 Postfix 能使用的网路介面(重要)

  (如果是对外服务的邮件主机,就必须要设定为all,预设为localhost)

  inet_interfaces = all

  inet_interfaces = $myhostname

  inet_interfaces = $myhostname, localhost

  inet_interfaces = localhost

  三、先设定简易的代转(Relay)管控

  3.1 mynetworks_style 提供三种简易设定型态

  class =>与伺服器位于同一级IP网路的主机都可以使用代转服务

  subnet =>所在网域的任一个IP都可以使用代转服务

  host =>仅开放localhost为信任?可代转的主机

  mynetworks_style = class

  mynetworks_style = subnet

  mynetworks_style = host

  3.2 mynetworks 明确设定可使用relay的主机范围

  (优先于mynetworks_style,建议采用此种设定法)

  mynetworks = 192.168.0.0/24, 192.168.1.0/24, 127.0.0.0/8

  mynetworks = $config_directory/mynetworks

  mynetworks = hash:/etc/postfix/network_table

  四、设定Postfix会收下信件的网域

  Postfix会收下四种特定网域的信件,除了main.cf中的设定外,

  也应该被正确的设置在DNS中的MX纪录中。

  (1)本地网域(local domain)=>由mydestination参数设定

  (2)代转网域(relay domains)=>由relay_domains参数设定

  (3)虚拟网域(virtual domains)之虚拟别名(virtual aliases)

  =>由 virtual_alias_domains参数设定

  (4)虚拟网域之虚拟信箱(virtual mailboxes)

  =>由 virtual_mailbox_domains参数设定

  (上列四种设定不应重复,网域已设为本地网域,就不应该出现在代转网域)

  4.1 设定本地网域

  mydestination = $myhostname, localhost.$mydomain

  mydestination = $myhostname, localhost.$mydomain, $mydomain

  mydestination = $myhostname, localhost.$mydomain, $mydomain,

  mail.$mydomain, www.$mydomain, ftp.$mydomain

  4.2 设定代转网域

  Postfix 预设会提供代转服务的设置:

  (代转服务=该网域并非由本Postfix MTA所管控,但可以代转发)

  - 从信任的客户端(指ip符合$mynetworks)寄出到任何目的地

  - 从非信任的客户端寄出到符合$relay_domains或其下次网域的目的地

  若信件终点站是relay_domains参数中的网址,被视为外地邮件,

  由 relay MDA来执行投递作业。

  relay_domains 预设值= $mydestination.(主机名称)

  4.3 设定虚拟别名?网域

  4.4 设定虚拟信箱?网域

  五、改写位址格式

  5.1 Postfix预设会以$myorigin或mydomain附加到不完整的电邮位址。

  5.2 正式位址

  另外提供了一种正式位址代换的机制 canonical map(正格表)

  (1)修改 /etc/postfix/canonical

  (2)再执行 postmap /etc/postfix/canonical

  (3)记得要重新载入 postfix reload

  正格表的撰写方式:

  eric@example.com eric.wu@example.com

  eric@example.com eric@oreilly.com

  canonical_maps = hash:/etc/postfix/canonical

  Postfix也提供额外的参数设置特定的位址

  sender_canonical_maps 仅修改发信者位址

  recipient_canonical_maps 仅修改收件者位址

  (适用顺序为:sender->recipient->canonical)

  5.3 伪装主机名称

  用于隐藏内部主机名称

  masquerade_domains = example.com

  5.4 改变投递位址

  拒收某人或某网域信件,并回覆一封告知

  relocated_maps = hash:/etc/postfix/relocated

  relocated 撰写范例:

  kdent@ora.com kdent@oreilly.com

  @example.com oreilly.com

  5.5 不明使用者

  拒绝不存在的本地帐户/「不明使用者」(unknown user)

  unknown_local_recipient_reject_code = 550

  unknown_local_recipient_reject_code = 450

  如果收信地址的人名部份,在任何对照表、别名表、系统帐户都查不出来,

  这个人会被视为「不明使用者」(unknown user),系统会拒收。

  如果希望蒐集这类信件,使用下列设定,并指定集中收集的信箱

  local_recipient_maps =

  luser_relay = someuser

  (上列第一个参数维持空白,第二个参数指定一个别名或实际帐户)

  5.6 chroot

  最安全的设置方式是使用改变根目录(chroot),但非常复杂;

  postfix安装时预设并未使用 chroot,记得去检查 master.cf档桉,

  建议先取消 chroot,除非您真的很厉害。

  六、一些针对邮件限制的特殊设定

  限制一封信最多可以有几位收信者,预设值是1000

  smtpd_recipient_limit = 1000

  限制单封信件的体积上限,预设值为 10 MB(改为20MB)

  message_size_limit = 20480000

七、别名档资料库设定(aliases)

  使用default_database_type参数决定资料库格式,预设为 hash

  alias_maps = hash:/etc/postfix/aliases

  alias_database = hash:/etc/postfix/aliases

  (安装时随附的别名档范本,已经预设了一组惯例别名,最后都指向root,

  仅需要设置 root 别名,指向一个平常会收取信件的帐户信箱即可)

  八、本地信件与信箱设置

  预设使用的信箱格式是mbox,下列的参数设置,如果结尾没有"/",

  就表示是使用mbox;如果结尾跟着"/",就是使用 maildir格式。

  (建议还是使用最通用的mbox,与其他程式的相容性最高)

  所有本地收件人的名称,都必须列在local_recipient_maps参数所指的表,

  预设值是指向Unix系统的密码档与别名表,通常不需要修改它。

  local_recipient_maps = proxy:unix:passwd.byname $aliase_maps

  信箱投递作业

  mail_spool_directory = /var/mail

  mail_spool_directory = /var/spool/mail

  可以要求 Postfix 将信件放在使用者的主目录下

  home_mailbox = Mailbox

  home_mailbox = Maildir/

  用于将邮件投递到信箱的外部命令(通常用来过滤防堵邮件)

  mailbox_command = /usr/bin/procmail

  mailbox_command = /some/where/procmail -a "$EXTENSION"

  用于执行信箱投递作业的传输服务

  mailbox_transport = lmtp:unix:/file/name

  mailbox_transport = cyrus

  八、启用 SASL 验证(服务于远端、外部网域使用的认证机制)

  决定 Postfix SMTP server 是否要支援 SASL 验证

  smtpd_sasl_auth_enable = yes

  设定信件收件的限制规则

  smtpd_recipient_restrictions = permit_mynetworks,

  permit_sasl_authenticated, reject_unauth_destination

  确认已经通过认证的网域(这条有点疑问...)

  smtpd_sasl_local_domain =

  限制某些登入的方式(拒绝匿名登入)

  smtpd_sasl_security_options = noanonymous

  九、邮件代转设定(交换站、入境、出境闸道)

  (下列程序示范如何设定 gw.abc.com,让它将邮件交给正确的内部伺服器)

  (1)hr.abc.com, sales.abc.com的DNS MX均指向 gw.abc.com

  (2)编辑gw的main.cf档,将子网域列入 relay_domains 参数

  relay_domains = hr.abc.com, sales.abc.com

  (3)设定正确的传输表(transport map)

  transport_maps = hash:/etc/postfix/transport

  (4)编辑传输表(编完记得postmap一下)

  hr.abc.com relay:[m1.abc.com]

  sales.abc.com relay:[m2.abc.com]

  (5)汇整m1,m2的合法信箱名单成一个受理名单,放在gw上

  relay_recipient_maps = hash:/etc/postfix/relay_recipients

  (怎么收集、更新,是个大问题)

  (6)postfix reload

  设定出境邮件闸道(将外地邮件交给闸道系统代为递送)

  relayhost = $mydomain

  relayhost = gateway.my.domain

  relayhost = uucphost

  relayhost = [an.ip.add.ress]

  拒绝不知名用户的代转 REJECTING UNKNOWN RELAY USERS

  (其实是将所有合法使用者放入一个名单中)

  relay_recipient_maps = hash:/etc/postfix/relay_recipients

  十、设定 Open Relay Data Base

  smtpd_client_restrictions = hash:/etc/postfix/access,

  reject_rbl_client relays.ordb.org,

  reject_rhsbl_client dsn.rfc-ignorant.org

  除错管理

  debug_peer_level = 2

  debug_peer_list = 127.0.0.1

  debug_peer_list = some.domain

  debugger_command =

  PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin

  xxgdb $daemon_directory/$process_name $process_id & sleep 5

  如果并未安装X-windows可以改用下列:

  debugger_command =

  PATH=/bin:/usr/bin:/usr/local/bin; export PATH; (echo cont;

  echo where) gdb $daemon_directory/$process_name $process_id2>&1

  >$config_directory/$process_name.$process_id.log & sleep 5

  其他、安装时的一些设置资讯

  sendmail_path = /usr/sbin/sendmail.postfix

  newaliases_path = /usr/bin/newaliases.postfix

  mailq_path = /usr/bin/mailq.postfix

  setgid_group = postdrop

  manpage_directory = /usr/share/man

  sample_directory = /usr/share/doc/postfix-2.0.16/samples

  readme_directory = /usr/share/doc/postfix-2.0.16/README_FILES

nginx Embedded Variables

The ngx_http_core_module module supports embedded variables with names matching the Apache Server variables. First of all, these are variables representing client request header fields, such as$http_user_agent, $http_cookie, and so on. Also there are other variables:

$arg_name
argument name in the request line
$args
arguments in the request line
$binary_remote_addr
client address in a binary form, value’s length is always 4 bytes
$body_bytes_sent
number of bytes sent to a client, not counting the response header; this variable is compatible with the “%B” parameter of the mod_log_config Apache module
$bytes_sent
number of bytes sent to a client (1.3.8, 1.2.5)
$connection
connection serial number (1.3.8, 1.2.5)
$connection_requests
current number of requests made through a connection (1.3.8, 1.2.5)
$content_length
“Content-Length” request header field
$content_type
“Content-Type” request header field
the name cookie
$document_root
root or alias directive’s value for the current request
$document_uri
same as $uri
$host
in this order of precedence: host name from the request line, or host name from the “Host” request header field, or the server name matching a request
$hostname
host name
$http_name
arbitrary request header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores
$https
on” if connection operates in SSL mode, or an empty string otherwise
$is_args
?” if a request line has arguments, or an empty string otherwise
$limit_rate
setting this variable enables response rate limiting; see limit_rate
$msec
current time in seconds with the milliseconds resolution (1.3.9, 1.2.6)
$nginx_version
nginx version
$pid
PID of the worker process
$pipe
p” if request was pipelined, “.” otherwise (1.3.12, 1.2.7)
$proxy_protocol_addr
client address from the PROXY protocol header, or an empty string otherwise (1.5.12)

The PROXY protocol must be previously enabled by setting the proxy_protocol parameter in thelisten directive.

$query_string
same as $args
$realpath_root
an absolute pathname corresponding to the root or alias directive’s value for the current request, with all symbolic links resolved to real paths
$remote_addr
client address
$remote_port
client port
$remote_user
user name supplied with the Basic authentication
$request
full original request line
$request_body
request body

The variable’s value is made available in locations processed by the proxy_pass,fastcgi_pass, uwsgi_pass, and scgi_pass directives.

$request_body_file
name of a temporary file with the request body

At the end of processing, the file needs to be removed. To always write the request body to a file, client_body_in_file_only needs to be enabled. When the name of a temporary file is passed in a proxied request or in a request to a FastCGI/uwsgi/SCGI server, passing the request body should be disabled by the proxy_pass_request_body off, fastcgi_pass_request_body off, uwsgi_pass_request_body off, or scgi_pass_request_body off directives, respectively.

$request_completion
OK” if a request has completed, or an empty string otherwise
$request_filename
file path for the current request, based on the root or alias directives, and the request URI
$request_length
request length (including request line, header, and request body) (1.3.12, 1.2.7)
$request_method
request method, usually “GET” or “POST
$request_time
request processing time in seconds with a milliseconds resolution (1.3.9, 1.2.6); time elapsed since the first bytes were read from the client
$request_uri
full original request URI (with arguments)
$scheme
request scheme, “http” or “https
$sent_http_name
arbitrary response header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores
$server_addr
an address of the server which accepted a request

Computing a value of this variable usually requires one system call. To avoid a system call, the listen directives must specify addresses and use the bind parameter.

$server_name
name of the server which accepted a request
$server_port
port of the server which accepted a request
$server_protocol
request protocol, usually “HTTP/1.0” or “HTTP/1.1
$status
response status (1.3.2, 1.2.2)
$tcpinfo_rtt, $tcpinfo_rttvar, $tcpinfo_snd_cwnd, $tcpinfo_rcv_space
information about the client TCP connection; available on systems that support the TCP_INFOsocket option
$time_iso8601
local time in the ISO 8601 standard format (1.3.12, 1.2.7)
$time_local
local time in the Common Log Format (1.3.12, 1.2.7)
$uri
current URI in request, normalized

The value of $uri may change during request processing, e.g. when doing internal redirects, or when using index files.