PostgreSQL 的索引类型

PostgreSQL 提供了多种索引类型:B 树、hash、GiST 和 GIN,每种索引类型都有适合的应用场景,可以根据场景选择合适的索引以提高效率。

B 树

B 树适合相等判断和有序的区间查询,通常来说,经常使用这些查询时推荐使用 B 树索引: <、>、<=、>= 以及 =。

此外,对于判断字符串开头的 LIKE 和 ~ 查询也可以考虑使用 B 树索引。比如: col LIKE ‘foo%’ 或者 col ~ ‘^foo’。

B 树对内容进行了排序,并不保证总是快于遍历查询,但大多数情况下都很有效率。

hash 索引

hash 索引只适合相等判断,对于 = 以外的查询并没有优化效果。

GiST 索引

GiST 并不是一种索引,更像是多种索引策略的集合。PostgreSQL 默认的 GiST 支持多种二维几何图形, 并且支持一下比较查询:

  • <<
  • &<
  • &>
  • >>
  • <<|
  • &<|
  • |&>
  • |>>
  • @>
  • <@
  • ~=
  • &&>

GiST 索引也支持“邻近查询”,比如:

SELECT * FROM places ORDER BY location <-> point '(101,456)' LIMIT 10;

GIN

GIN 是一种反向索引,可以处理拥有多个 key 的数据,比如数组。 和 GiST 和 SP-GiST 一样,GIN 支持多种不同用户定义的索引策略, 根据索引策略的不同,能够优化的操作符也不尽相同。

比如,PostgreSQL 的标准实现中包含了支持一维数组 GIN 操作类,支持这些操作符的查询优化:

  • <@
  • @>
  • =
  • &&

(这些操作符的意义见 9.18) 标准实现中的 GIN 操作类更多课件文档 Table 61-1,更多 GIN 操作类可以在 contrib 集合中找到,第 61 章会更详细地介绍。

BRIN 索引(Block Range Index)存储了物理区块值概要。 和 GiST、SP-GIST 和 GIN 一样,BRIN 也支持多种不同的索引策略,能够使用的操作类也依索引策略而定。 对于线性短顺序,索引的数据相当于块区间行内最小和最大值。支持下面这些操作符的优化:

  • <
  • <=
  • =
  • >=
  • >

标准实现的 BRIN 操作类介绍见 Table 62-1,详情见 62 章。

参考:

官方文档 http://www.postgresql.org/docs/current/static/indexes-types.html

PostgreSQL删除pg_xlog日志

PostgreSQL的pg_xlog下有大量日志,空间不足,如何删除?

Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>ls
000000010000000000000008.00000028.backup  00000001000000000000009D  0000000100000000000000C9  0000000100000000000000F5  000000010000000100000021  00000001000000010000004D
000000010000000000000072                  00000001000000000000009E  0000000100000000000000CA  0000000100000000000000F6  000000010000000100000022  00000001000000010000004E
000000010000000000000073                  00000001000000000000009F  0000000100000000000000CB  0000000100000000000000F7  000000010000000100000023  00000001000000010000004F
......


Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>ll|wc -l
263


Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>du -sh /usr/local/pgsql/data/pg_xlog/
4.1G    /usr/local/pgsql/data/pg_xlog/

清理步骤:

pg_resetxlog用来清理WAL日志,当数据库服务启动的情况下,是不能使用的,所以执行之前需要停机。

(1)停机

Darren1:postgres:/usr/local/pgsql/bin:>pg_ctl stop -m fast

(2)查看NextXID和NextOID(发生checkpoint的时候,这两个值会发生改变)

Darren1:postgres:/usr/local/pgsql/bin:>pg_controldata
pg_control version number:            960
Catalog version number:              201608131
Database system identifier:          6446917631406040181
Database cluster state:              shut down
pg_control last modified:            Thu 27 Jul 2017 05:04:12 AM CST
Latest checkpoint location:          1/73000028
Prior checkpoint location:            1/720048F8
Latest checkpoint's REDO location:    1/73000028
Latest checkpoint's REDO WAL file:    000000010000000100000073
Latest checkpoint's TimeLineID:      1
Latest checkpoint's PrevTimeLineID:  1
Latest checkpoint's full_page_writes: on
Latest checkpoint's NextXID:          0:19545
Latest checkpoint's NextOID:          16646
......

(3)使用pg_resetxlog,指定oid和xid

Darren1:postgres:/usr/local/pgsql/bin:>pg_resetxlog -o 16646 -x 19545 -f /usr/local/pgsql/data/
Transaction log reset
Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>ll
-rw-------. 1 postgres dba      302 Jul 26 12:12 000000010000000000000008.00000028.backup
-rw-------. 1 postgres dba 16777216 Jul 27 05:07 000000010000000100000077
drwx------. 2 postgres dba    20480 Jul 27 05:07 archive_status
Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>du -sh /usr/local/pgsql/data/pg_xlog/
17M    /usr/local/pgsql/data/pg_xlog/

(4)启动数据库

Darren1:postgres:/usr/local/pgsql/data/pg_xlog:>pg_ctl start

postgresql只导出函数

/usr/local/postgresql/bin/pg_dump --p5432 -U ddpguser -s -Fc -v -f temp.dump database

/usr/local/postgresql/bin/pg_restore -l temp.dump

/usr/local/postgresql/bin/pg_restore -l temp.dump | grep FUNCTION > functionlist

/usr/local/postgresql/bin/pg_restore -L functionlist temp.dump > function.sql

单独导出函数命令:

/usr/local/postgresql/bin/pg_dump --p5432 -U ddpguser -s -Fc -v -f temp.dump database  #导出表结构

/usr/local/postgresql/bin/pg_restore -l temp.dump | grep FUNCTION > functionlist #过滤函数 FUNCTION可以指定某个函数名

/usr/local/postgresql/bin/pg_restore -L functionlist temp.dump > function.sql #导出所有函数

CentOS6安装postfix并设置sasl

postfix是一个流行的smtp服务器。在不采用ssl/tls加密的情况下,smtp服务器默认端口是25/TCP。下面介绍如何在CentOS6上安装postfix。

1. CentOS6默认已经安装了postfix.如果系统没有postfix的话,可以采用如下命令安装它。

[root@mail ~]# yum -y install postfix

2. 配置postfix的main.cf,配置smtp-auth采用dovecot的sasl功能。需要安装和配置dovecot,见下篇。

[root@mail ~]# vi /etc/postfix/main.cf
# 第75行: 去掉注释,并设置主机名。
myhostname = mail.opsky.top
# 第83行: 去掉注释,并设置域名。
mydomain = opsky.top
# 第99行: 去掉注释。
myorigin = $mydomain
# 第116行: 
inet_interfaces = all
# 第119行: 如果只使用ipv4,那么设置如下。
inet_protocols = ipv4
# 第164行: 配置可接收邮件的域名。
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# 第264行: 去掉注释,并设置本地网络号段.
mynetworks = 127.0.0.0/8, 10.0.0.0/24
# 第419行: 去掉注释,采用Maildir格式。
home_mailbox = Maildir/
# 第571行: 
smtpd_banner = $myhostname ESMTP
# 添加如下配置到文件末尾
# 一封邮件大小限制为10M
message_size_limit = 10485760
# 一个邮箱大小限制为1G
mailbox_size_limit = 1073741824
# 配置SMTP-Auth采用dovecot的sasl功能
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions = permit_mynetworks,permit_auth_destination,permit_sasl_authenticated,reject

main.cf配置完毕后,启动postfix,并设置自动启动。

[root@mail ~]# /etc/rc.d/init.d/postfix start 
Starting postfix: [  OK  ]
[root@mail ~]# chkconfig postfix on

3. 如果iptables在开启状态,那么设置iptables开放smtp的25端口。

[root@mail ~]# iptables -I INPUT 5 -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT

服务器搭建十一——Postfix 邮件服务器搭建

写在前面的话:
  已经三个多月,没有更新了,最近事情比较多。各种值班没有使用来写文章。也发生很多事情,想了很多事情吧。这篇文章也是很早之前就在做实验准备写了。先发一部分吧。

1. 测试环境

a)Centos 6.7 
b)测试软件postfix

2. 电子邮件原理

本文在将简要的记录,基于postfix、SASL、Dovecot搭建一个测试的邮件服务器。属于我学习的一个记录。现在搭建几乎每天都在使用电子邮件,你们对真正了解电子邮件原理的人不是特别多。电子邮件是怎么传输的呢?
  邮件系统:MUA (邮件用户代理) [其实就是客户端]、MTA(邮件传输代理)[服务器软件]、MDA(邮件投递代理)[从MTA接受邮件,放到本地的账户收件箱中]
  主要用到协议:SMTP (简单邮件传输协议)、POP(邮局协议)、IMAP(互联网邮件访问协议)
邮件传输过程:

未分类

  常用的邮件服务器软件:sendmail、postfix、Qmail
  在实际的系统中,MTA,MUA,MDA以及POP/IMAP服务器等组件均可以由不同软件承担,还包括账号管理,信箱管理,安全传输,以及web访问等。因此邮件系统的建立需要很多的软件集成。本文只是在使用postfix软件学习邮件服务器一些简单测试。
  简单邮件传输协议SMTP ——TCP/IP协议 传输层的协议 tcp 25
  邮局协议POP3 ——tcp 110 读取邮件时候使用的协议 客户端从服务器下载邮件
  Internet消息访问协议IMAP ——应用层协议 143端口 客户端和服务器 邮件读取协议(功能更多)

3. 软件安装

未分类

  通过上面可以查看系统默认已经安装postfix,并且已经在运行中,但是这个功能是不完善的,只有postfix服务提供了25端口,另一个与客户端连接的110端口还需其他软件。
  Postfix服务器的配置相当复杂,涉及到操作系统的用户认证、用户特权、数据库文件、DNS配置,还有web页面等等。本文只是对简单的配置入手,后续还需要学习。
  下面的是postfix源码安装时候下载地址。postfix
  Postfix 没有认知模块所以需要安装SASL配合认证

未分类

./configure --disable-anon --enable-login --enable-ntlm --with-saslauthd=/var/run/saslauthd

未分类

因为连接了外网,我是只有yum install gcc -y安装

未分类

  自己编译安装时候还是出现报错,查询写资料说是头文件造成的,需要修改些参数。但是具体操作我没有做,因为我发现系统是已经安装了cyrus-sasl 版本比我下载低了点。还有我使用系统是64位lib文件大部分都是在lib64中而不是lib中,这个需要特别注意

未分类

在安装问sasl和postfix可以检测下postfix是否使用了sasl2
  

ldd /usr/sbin/postconf

测试sasl和postfix是否配合

未分类

运行sasl

未分类

验证sasl

未分类

运行postfix
  
测试端口也正常

未分类

但是不能直接使用明文的用户名密码登录需要是 base64加密
  

root: cm9vdA==   1qaz1qaz: MXFhejFxYXo=

未分类

4. 配置环境

未分类

使用smtp的sasl验证时候需要在main.cf中加入

smtpd_recipient_restrictions =         permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,reject_non_fqdn_recipient
smtpd_sasl_application_name = smtpd

重启sasl和postfix。

再使用base64加密用户名和密码就,可以验证登录成功。

在main.cf主配置文件主要有以下内容需要注意:(后续在写客户端登录 web界面 等等在写吧 还有配置文件的,简单概述)

centos 7 vps 发送gmail邮件(通过postfix与mailx)

用于发送邮件的邮箱必须先开启低安全性登录。

未分类

postfix就是打算替代sendmail的,sendmail删了吧。

yum remove -y sendmail

安装postfix及支持

yum install -y postfix mailx cyrus-sasl-plain

把发邮件的邮箱的账号密码替换后执行。

echo "[smtp.gmail.com]:587 [email protected]:xxxxxxxxx" > /etc/postfix/sasl_passwd

生成sasl_passwd.db

postmap hash:/etc/postfix/sasl_passwd

修改证书年限

cd /etc/ssl/certs/
vi Makefile
#把365改36500,有效期一百年,嘿嘿之后可以按需求改回来。

制作证书及ssl密钥,并移动

make server.pem
mv server.pem /etc/postfix/

修改postfix配置文件 /etc/postfix/main.cf ,清空替换成如下。

relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/postfix/server.pem
smtp_use_tls = yes

重启postfix

/bin/systemctl restart postfix.service

配置完成

可以通过下面命令查看postfix活动日志,排错就靠它了。

tail -f /var/log/maillog

发送测试邮件xxxx为收信地址

echo | mail -s 'is is a test l' [email protected]

如果成功那就是成功啦。

postfix 日常维护队列管理[邮件服务器维护]

example textpostfix有四种不同的邮件队列,并且由队列管理进程统一进行管理:

  • maildrop:本地邮件放置在maildrop中,同时也被拷贝到incoming中。

  • incoming:放置正在到达或队列管理进程尚未发现的邮件。

  • active:放置队列管理进程已经打开了并正准备投递的邮件,该队列有长度的限制。

  • deferred:放置不能被投递的邮件。

postfix日常维护

启动postfix

postfix start

停止postfix

postfix stop

重新读取postfix配置文件

postfix reload

立即投递队列中所有邮件(慎用)

postfix flush

查看队列邮件

postqueue -p
mailq
postqueue -p |tail

使用postsuper 来维护队列。

一般是先用mailq查看队列里的邮件,找到对应的id,然后用postsuper -d来删除。

例如id是0EAF3A9B 那么postsuper -d 0EAF3A9B

Q: 删除邮件队列
A: mailq | tail +2 | awk 'BEGIN { RS = "" } / [email protected]$/ { print $1 }' | tr -d '*!' | postsuper -d -

详细要看mailq和postsuper的用法修复队列以及任何权限错误

postfix check

查看邮件系统日志

tail -f /var/log/maillog 
  • 显示信件列表:postqueue -p

  • 显示信件內容:postcat -q Queue_ID

  • 刪除各別信件:postsuper -d Queue_ID

  • 全部刪除:postsuper -d ALL

  • 扣住信件:postsuper -h Queue_ID

  • 回复:postsuper -H Queue_ID

重新排程:

postsuper -r Queue_ID
postsuper -r ALL

清除信件:

postqueue -f (全部)
postqueue -s 主机名称(个别对象)

要查看Postfix的当前主要配置文件的存放路径:

postconf -n
  • 系统日志:tail -f /var/log/messages

  • 邮件日志:tail -f /var/log/maillog

  • clamd相关:tail -f /var/log/clamav/clamd.log  tail -f /var/log/clamav/freshclam.log

  • maildrop相关:tail -f /var/log/maildrop.log

  • apache相关:tail -f /usr/local/httpd/logs/error_log  tail -f /usr/local/httpd/logs/suexec_log

  • mysql相关:tail -f /usr/local/mysql/data/linux.linux.com.err

  • 测试amavisd:amavisd -d config debug-sa

  • 测试spam:spamassassin -D –lint

  • 测试maildrop:maildrop -V 10 [email protected]

postsuper -d ALL 这样就删除所有邮件啦

用活firewalld防火墙中的zone

firewalld中zone的含义学生前面已经给大家介绍过了,说白了一个zone就是一套规则集。可是什么时候该用哪个zone、每个zone中的规则具体是怎么设置呢?下面学生就来给大家详细讲解。

名词解释

在具体介绍zone之前学生先给大家介绍几个相关的名词,因为如果不理解这几个名词zone就无从入手。

  • target:目标,这个前面学生也已经给大家介绍过了,可以理解为默认行为,有四个可选值:default、ACCEPT、%%REJECT%%、DROP,如果不设置默认为default

  • service:这个在前面学生已经给大家解释过了,他表示一个服务

  • port:端口,使用port可以不通过service而直接对端口进行设置

  • interface:接口,可以理解为网卡

  • source:源地址,可以是ip地址也可以是ip地址段

  • icmp-block:icmp报文阻塞,可以按照icmp类型进行设置

  • masquerade:ip地址伪装,也就是按照源网卡地址进行NAT转发

  • forward-port:端口转发

  • rule:自定义规则

哪个zone在起作用

我们知道每个zone就是一套规则集,但是有那么多zone,对于一个具体的请求来说应该使用哪个zone(哪套规则)来处理呢?这个问题至关重要,如果这点不弄明白其他的都是空中楼阁,即使规则设置的再好,不知道怎样用、在哪里用也不行。

对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:

1、source,也就是源地址

2、interface,接收请求的网卡

3、firewalld.conf中配置的默认zone

这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是学生在前面给大家讲过的在firewalld.conf中配置的默认zone。

好了,我们现在知道其原理了,下面学生就给大家介绍每一种方式所对应的配置方法。

配置source

source是在zone的xml文件中配置的,其格式为

<zone>
<source address="address[/mask]"/>
</zone>

只要我们将source节点放入相应的zone配置文件中就可以了,节点的address属性就是源地址,不过我们要注意相同的source节点只可以在一个zone中进行配置,也就是说同一个源地址只能对于一个zone,另外,直接编辑xml文件之后还需要reload才可以起作用,这些学生前面已经给大家讲过,这里就不再重述了。

另外,我们当然也可以使用firewall-cmd命令进行配置,这里主要有五个相关命令(参数)

firewall-cmd [--permanent] [--zone=zone] --list-sources
firewall-cmd [--permanent] [--zone=zone] --query-source=source[/mask]
firewall-cmd [--permanent] [--zone=zone] --add-source=source[/mask]
firewall-cmd [--zone=zone] --change-source=source[/mask]
firewall-cmd [--permanent] [--zone=zone] --remove-source=source[/mask]

我们分别来介绍一下

  • –list-sources:用于列出指定zone的所有绑定的source地址

  • –query-source:用于查询指定zone是否跟指定source地址进行了绑定

  • –add-source:用于将一个source地址绑定到指定的zone(只可绑定一次,第二次绑定到不同的zone会报错)

  • –change-source:用于改变source地址所绑定的zone,如果原来没有绑定则进行绑定,这样就跟–add-source的作用一样了

  • –remove-source:用于删除source地址跟zone的绑定

另外,大家可以看到上面的命令中有两个可选参数:–permanent和–zone,–permanent学生在前面已经给大家介绍过了,表示是否存储到配置文件中(如果存储到配置文件中这不会立即生效),–zone用于指定所要设置的zone,如果不指定则使用默认zone。

我们来看个例子

[[email protected] ~]# firewall-cmd --zone=drop --change-source=1.2.3.4

这样就可以将1.2.3.4绑定到drop这个zone中了,如果没有修改过drop规则的话所有来自1.2.3.4这个ip的连接将会被drop。

至于什么时候使用add什么时候使用change,如果我们就是想将某源地址绑定到指定的zone那么最好使用change,而如果想在源地址没绑定的时候进行绑定,如果已经绑定过则不绑定那么就使用add。

配置interface

interface有两个可以配置的位置:1、zone所对应的xml配置文件2、网卡配置文件(也就是ifcfg-*文件)。

第一种配置跟source大同小异,学生这里就不再细述了,interface在zone配置文件中的节点为

<zone>
<interface name="string"/>
</zone>

相关的firewall-cmd命令为

firewall-cmd [--permanent] [--zone=zone] --list-interfaces
firewall-cmd [--permanent] [--zone=zone] --add-interface=interface
firewall-cmd [--zone=zone] --change-interface=interface
firewall-cmd [--permanent] [--zone=zone] --query-interface=interface
firewall-cmd [--permanent] [--zone=zone] --remove-interface=interface

另外,我们还可以在网卡配置文件中进行配置,比如可以在ifcfg-em1文件中添加下面的配置

ZONE=public

这行配置就相当于下面的命令

[[email protected] ~]# firewall-cmd --zone=public --change-interface=em1

这样配置之后来自em1的连接就会使用public这个zone进行管理(如果source匹配了其他的zone除外)。

配置默认zone

默认zone的配置学生前面已经给大家介绍过了,他是通过firewalld.conf配置文件的DefaultZone配置项来配置的,当然也可以使用firewall-cmd命令来配置

firewall-cmd --set-default-zone=zone

另外还可以通过–get-default-zone来获取默认zone的值。

查看当前起作用的zone

我们可以使用下面的命令来查看当前所有起作用的zone

firewall-cmd --get-active-zones

这个命令会返回所有绑定了source、interface以及默认的zone,并会说明在什么情况下使用。

反向查询

firewalld还给我们提供了反向查询的命令,也就是根据source或者interface查询所对应的zone,其命令如下

firewall-cmd --get-zone-of-interface=interface
firewall-cmd --get-zone-of-source=source[/mask]

有了这两个命令我们就可以检查我们的设置是否正确了。

好了,现在大家就明白了一个接收到的请求具体使用哪个zone了,那么zone具体的规则怎么配置呢?下面学生就来给大家详细介绍。

zone规则配置

target

zone规则中首先最重要的是target的设置,他默认可以取四个值:default、ACCEPT、%%REJECT%%、DROP,其含义很容易理解,这里学生就不介绍了,下面来说怎么配置。

在xml文件中target是zone节点的一个属性,比如drop.xml中为

<zone target="DROP">

block.xml中为

<zone target="%%REJECT%%">

如果使用firewall-cmd命令来操作,命令如下

firewall-cmd --permanent [--zone=zone] --get-target
firewall-cmd --permanent [--zone=zone] --set-target=target

我们要特别注意,这里的–permanent不是可选的,也就是说使用firewall-cmd命令也不可以让他直接生效,也需要reload才可以。

service

service学生在前面也已经给大家介绍过了,他的配置和我们上面所介绍的source基本相同,只不过同一个service可以配置到多个不同的zone中,当然也就不需要–change命令了,他在zone配置文件中的节点为

<zone>
<service name="string"/>
</zone>

相应的配置命令为

firewall-cmd [--permanent] [--zone=zone] --list-services
firewall-cmd [--permanent] [--zone=zone] --add-service=service [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-service=service
firewall-cmd [--permanent] [--zone=zone] --query-service=service

具体每个命令的含义大家对照上面的source很容易就理解了,不过这里的–add命令中多了一个–timeout选项,学生这里给大家介绍一下。

–add-service中的–timeout的含义是这样的:添加一个服务,但是不是一直生效而是生效一段时间,过期之后自动删除。

这个选项非常有用,比如我们想暂时开放一个端口进行一些特殊的操作(比如远程调试),等处理完成后再关闭,不过有时候我们处理完之后就忘记关闭了,而现在的–timeout选项就可以帮我们很好地解决这个问题,我们在打开的时候就可以直接设置一个时间,到时间之后他自动就可以关闭了。另外,这个参数还有更有用的用法,学生会在下面给大家讲到。当然–timeout和–permanent是不可以一起使用的。

另外,这里我们主要讲的是怎么在zone中使用service,而service自己的配置学生下节再给大家详细介绍。

port

port是直接对端口的操作,他和service非常相似,所以这里也不详细介绍了,port在zone中的配置节点为

<zone>
<port port="portid[-portid]" protocol="tcp|udp"/>
</zone>

相应命令为

firewall-cmd [--permanent] [--zone=zone] --list-ports
firewall-cmd [--permanent] [--zone=zone] --add-port=portid[-portid]/protocol [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-port=portid[-portid]/protocol
firewall-cmd [--permanent] [--zone=zone] --query-port=portid[-portid]/protocol
icmp-block

icmp-block是按照icmp的类型进行设置阻塞,比如我们不想接受ping报文就可以使用下面的命令来设置

[[email protected] ~]# firewall-cmd --add-icmp-block=echo-request

当然,如果需要长久保存就需要加–permanent选项,不过那样就需要reload才能生效。

icmp-block在zone配置文件中的节点为

<zone>
<icmp-block name="string"/>
</zone>

相应操作命令为

firewall-cmd [--permanent] [--zone=zone] --list-icmp-blocks
firewall-cmd [--permanent] [--zone=zone] --add-icmp-block=icmptype [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-icmp-block=icmptype
firewall-cmd [--permanent] [--zone=zone] --query-icmp-block=icmptype

masquerade

masquerade大家应该都比较熟悉,其作用就是ip地址伪装,也就是NAT转发中的一种,具体处理方式是将接收到的请求的源地址设置为转发请求网卡的地址,这在路由器等相关设备中非常重要,比如大家很多都使用的是路由器连接的局域网,而想上互联网就得将我们的ip地址给修改一下,要不大家都是192.168.1.XXX的内网地址,那请求怎么能正确返回呢?所以在路由器中将请求实际发送到互联网的时候就会将请求的源地址设置为路由器的外网地址,这样请求就能正确地返回给路由器了,然后路由器再根据记录返回给我们发送请求的主机了,这就是masquerade。

其设置非常简单,在zone中是一个没有参数(属性)的节点

<zone>
<masquerade/>
</zone>

操作命令为

firewall-cmd [--permanent] [--zone=zone] --add-masquerade [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-masquerade
firewall-cmd [--permanent] [--zone=zone] --query-masquerade

forward-port

这项也非常容易理解,他是进行端口转发的,比如我们要将在80端口接收到tcp请求转发到8080端口可以使用下面的命令

[[email protected] ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080

forward-port还支持范围转发,比如我们还可以将80到85端口的所有请求都转发到8080端口,这时只需要将上面命令中的port修改为80-85即可。

在zone配置文件中节点如下

<zone>
<forward-port port="portid[-portid]" protocol="tcp|udp" [to-port="portid[-portid]"] [to-addr="ipv4address"]/>
</zone>

相关操作命令如下

firewall-cmd [--permanent] [--zone=zone] --list-forward-ports
firewall-cmd [--permanent] [--zone=zone] --add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]][--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]
firewall-cmd [--permanent] [--zone=zone] --query-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]]

rule

rule可以用来定义一条复杂的规则,其在zone配置文件中的节点定义如下

<zone>
<rule [family="ipv4|ipv6"]>
[ <source address="address[/mask]" [invert="bool"]/> ]
[ <destination address="address[/mask]" [invert="bool"]/> ]
[
<service name="string"/> |
<port port="portid[-portid]" protocol="tcp|udp"/> |
<protocol value="protocol"/> |
<icmp-block name="icmptype"/> |
<masquerade/> |
<forward-port port="portid[-portid]" protocol="tcp|udp" [to-port="portid[-portid]"] [to-addr="address"]/>
]
[ <log [prefix="prefixtext"] [level="emerg|alert|crit|err|warn|notice|info|debug"]/> [<limit value="rate/duration"/>] </log> ]
[ <audit> [<limit value="rate/duration"/>] </audit> ]
[ <accept/> | <reject [type="rejecttype"]/> | <drop/> ]
</rule>
</zone>

可以看到这里一条rule的配置的配置项非常多,比zone本身还多出了destination、log、audit等配置项。其实这里的rule就相当于使用iptables时的一条规则。rule的操作命令如下

firewall-cmd [--permanent] [--zone=zone] --list-rich-rules
firewall-cmd [--permanent] [--zone=zone] --add-rich-rule='rule' [--timeout=seconds]
firewall-cmd [--permanent] [--zone=zone] --remove-rich-rule='rule'
firewall-cmd [--permanent] [--zone=zone] --query-rich-rule='rule'

这里的参数’rule’代表一条规则语句,语句结构就是直接按照上面学生给大家的节点结构去掉尖括号来书写就可以了,比如要设置地址为1.2.3.4的source就可以写成source address=”1.2.3.4″,也就是直接写标签名,然后跟着写属性就可以了,我们来看个例子

[[email protected] ~]# firewall-cmd --add-rich-rule='rule family="ipv4" source address="1.2.3.4" drop'

这条规则就会将1.2.3.4这个源地址的连接全部给drop掉。

使用rule结合–timeout我们可以实现一些非常好玩和有用的功能,比如我们可以写个自动化脚本,当发现有异常的连接时就可以添加一条rule将其相应的地址drop掉,而且还可以使用–timeout给设置个时间段,过了之后再自动开放!

解决CentOS7出现的”Failed to start firewalld.service”问题

如果我们从CentOS6过渡到CentOS7系统来的话,会发现原来的iptables被firewalld取代,而且相应的命令格式也稍微有些变化。今天老左有在设置添加放行端口的时候的出现”FirewallD is not running”的错误提示,应该是没有开启firewalld导致的。

未分类

解决CentOS7出现的”Failed to start firewalld.service”问题
既然没有启动,于是就执行”systemctl start firewalld”启动,但是又出现”Failed to start firewalld.service: Unit is masked.”错误。继续找解决方法,然后输入”systemctl unmask firewalld.service”。

未分类

解决CentOS7出现的”Failed to start firewalld.service”问题
然后再启动”systemctl start firewalld.service”即可解决问题没有报错。

centos7下安装iptables防火墙(关闭firewalld)

说明:centos7默认使用的firewalld防火墙,由于习惯使用iptables做防火墙,所以在安装好centos7系统后,会将默认的firewall关闭,并另安装iptables进行防火墙规则设定

系统操作环境centos7

[root@serve1 ~]# cat /etc/redhat-release    
CentOS Linux release 7.4.1708 (Core)

关闭firewalld防火墙

systemctl stop firewalld    #关闭firewalld防火墙
systemctl disable firewalld    #禁止开机自启

安装iptables防火墙并开启

yum install iptables-services    #安装iptables防火墙
systemctl start iptables    #启动
systemctl enable iptables    #开机自启

关闭SELinux

vim /etc/selinux/config
SELINUX=disabled    #把enforcing改为disabled
setenforce 0     #即时生效