1、搭建vsftpd,并实现虚拟用户
VSFTP介绍
VSFTP(Very Secure FTP)是一种在Unix/Linux中非常安全且快速稳定的FTP服务器,目前已经被许多大型站点所采用,如ftp.redhat.com,ftp.gnome.org等。
在vsftpd服务器中支持3类用户,分别是匿名用户,本地用户,和虚拟账户。用途及区别如下。
1)、匿名用户:名为anonymous 或ftp 的FTP 用户,匿名FTP 用户登录后将FTP 服务器中的/var/ftp 作为FTP 根目录。匿名用户通常用于提供公共文件的下载,如架设公共软件下载的FTP 服务器,所有人都可以使用匿名用户进行软件下载。
2)、本地用户:账号是系统用户账号(/etc/passwd),使用FTP 本地用户账号登录FTP 服务器后,登录目录为本地用户的宿主目录。本地FTP用户账号通常和Web 服务器一起提供虚拟主机服务,作为网页虚拟主机更新网页的途径。
3)、虚拟用户:账号是为了保证FTP 服务器的安全性,由vsftpd 服务器提供的非系统用户账号,相对于FTP的本地用户来说,虚拟用户只是FTP服务器的专有用户,虚拟用户只能访问FTP服务器所提供的资源。虚拟用户FTP 登录后将把指定的目录作为FTP 根目录。虚拟用户与本地用户具有类似的功能,由于虚拟用户账号具有较高的安全性,可以替代本地用户账号使用。
下面介绍在vsftpd虚拟用户应用的配置过程
- vsftpd程序安装
[root@node01 ~]# yum -y install vsftpd [root@node01 ~]# systemctl start vsftpd
- 设置匿名用户可访问ftp
[root@node01 vsftpd]# vim /etc/vsftpd/vsftpd.conf anonymous_enable=YES
- 设置本地用户登录并禁锢只能在其家目录访问
这里以xp账号为例 [root@node01 vsftpd]# getent passwd xp xp:x:4011:4011::/home/xp:/bin/bash 1、/home/xp 取消家目录写权限 [root@node01 home]# chmod a-w xp 2、编辑配置文件仅允许xp用户访问 [root@node01 vsftpd]# vim vsftpd.conf chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list [root@node01 vsftpd]# echo xp > /etc/vsftpd/chroot_list
- 设置虚拟用户访问ftp并实现权限划分
- 用户账号存储方式
文件、数据库(Mariadb、Redis、...) - vsftpd认证方式
托管给pam - 这里采用Mariadb存储的方式进行认证
由于要连接数据库所以需要安装mariadb-devel工具,同理也需要安装pam-devel工具 [root@node01 ~]# yum install mariadb-devel pam-devel
- 安装配置Mariadb
在node2(10.192.2.221)上安装 [root@node02 ~]# yum -y install mariadb-server [root@node02 ~]# vim /etc/my.cnf.d/server.cnf [mysqld] skip_name_resolve=ON innodb_file_per_table=ON log_bin=mysql-bin [root@node02 ~]# systemctl restart mariadb [root@node02 ~]# mysql MariaDB [(none)]> CREATE DATABASES vsftp_users; MariaDB [(none)]> use vsftp_users MariaDB [vsftp_users]> GRANT SELECT ON vsftp_users.* TO vsftpd@'10.192.2.222' IDENTIFIED BY 'vsftpd'; MariaDB [vsftp_users]> FLUSH PRIVILEGES; MariaDB [vsftp_users]> CREATE TABLE users(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,name VARCHAR(100) NOT NULL,password CHAR(48) NOT NULL,UNIQUE KEY(name)); MariaDB [vsftp_users]> INSERT INTO users(name,password) VALUES ('zhangsan',PASSWORD('zhangsan')),('lisi',PASSWORD('lisi')); 以上创建了2个用户,并授权vsftpd数据库能够被10.192.2.222服务器访问查询权限 以下是在node1(10.192.2.222)上登录node2数据库服务器测试 [root@node01 ~]# mysql -uvsftpd -h10.192.2.221 -pvsftpd Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 7 Server version: 5.5.60-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> SELECT * FROM vsftp_users.users; +----+----------+-------------------------------------------+ | id | name | password | +----+----------+-------------------------------------------+ | 1 | zhangsan | *D550CDE8CF0F249C0520BF8CFC424D082D87FEF9 | | 2 | lisi | *E070B7FA2C5695131724E1F395E227147223EF12 | +----+----------+-------------------------------------------+ 2 rows in set (0.00 sec)
- 下载安装pam-mysql
下载地址:https://sourceforge.net/projects/pam-mysql/
[root@node01 ~]# tar -xzvf pam_mysql-0.7RC1.tar.gz [root@node01 ~]# cd pam_mysql-0.7RC1 [root@node01 pam_mysql-0.7RC1]# ./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security/ [root@node01 pam_mysql-0.7RC1]# make && make install
- 创建虚拟用户,并配置pam认证连接数据库
创建虚拟用户 [root@node01 ~]# mkdir -p /ftproot [root@node01 ~]# useradd -d /ftproot/vuser/ -s /sbin/nologin vuser [root@node01 ~]# cd /ftproot/ [root@node01 ftproot]# chmod -w vuser 配置vsftpd配置文件 [root@node01 ftproot]# vim /etc/vsftpd/vsftpd.conf pam_service_name=vsftpd.vuser ##pam认证文件 guest_enable=YES guest_username=vuser user_config_dir=/etc/vsftpd/vuser_config/ 配置vsftpd使用pam认证文件 [root@node01 ftproot]# vim /etc/pam.d/vsftpd.vuser auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=10.192.2.221 db=vsftp_users table=users usercolumn=name passwdcolumn=password crypt=2 account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=10.192.2.221 db=vsftp_users table=users usercolumn=name passwdcolumn=password crypt=2 配置用户权限文件 [root@node01 ~]# mkdir -p /etc/vsftpd/vuser_config/ [root@node01 ~]# cd /etc/vsftpd/vuser_config/ [root@node01 vuser_config]# vim zhangsan anon_upload_enable=YES anon_mkdir_write_enable=YES anon_other_write_enable=YES #张三有创建、删除、上传文件权限 [root@node01 vuser_config]# vim lisi anon_upload_enable=YES #李四只有上传文件权限
- 用户账号存储方式
2、简述iptales四表五链及详细介绍iptables命令使用方法
- iptables理论基础
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
1、网络地址转换(Network Address Translate)
2、数据包内容修改
3、以及数据包过滤的防火墙功能
所以说,虽然我们使用service iptables start启动iptables"服务",但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。
我们知道iptables是按照规则来办事的,我们就来说说规则(rules),规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
这样说可能并不容易理解,我们来换个容易理解的角度,当客户端访问服务器的web服务时,客户端发送报文到网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的信息会通过内核的TCP协议传输到用户空间中的web服务中,而此时,客户端报文的目标终点为web服务所监听的套接字(IP:Port)上,当web服务需要响应客户端请求时,web服务发出的响应报文的目标终点则为客户端,这个时候,web服务所监听的IP与端口反而变成了原点,我们说过,netfilter才是真正的防火墙,它是内核的一部分,所以,如果我们想要防火墙能够达到"防火"的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是,就出现了input关卡和output关卡,而这些关卡在iptables中不被称为"关卡",而被称为"链"。
其实我们上面描述的场景并不完善,因为客户端发来的报文访问的目标地址可能并不是本机,而是其他服务器,当本机的内核支持IP_FORWARD时,我们可以将报文转发给其他服务器,所以,这个时候,我们就会提到iptables中的其他"关卡",也就是其他"链",他们就是 "路由前"、"转发"、"路由后",他们的英文名是
PREROUTING、FORWARD、POSTROUTING也就是说,当我们启用了防火墙功能时,报文需要经过如下关卡,也就是说,根据实际情况的不同,报文经过"链"可能不同。如果报文需要转发,那么报文则不会经过input链发往用户空间,而是直接在内核空间中经过forward链和postrouting链转发出去的,整个过程我们可以按照下图理解:
所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING
- 链的概念
现在,我们想象一下,这些"关卡"在iptables中为什么被称作"链"呢?我们知道,防火墙的作用就在于对经过的报文匹配"规则",然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",所以,我们把每一个"关卡"想象成如下图中的模样 ,这样来说,把他们称为"链"更为合适,每个经过这个"关卡"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。
5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。- PREROUTING:数据包进入路由表之前
- INPUT:通过路由表后目的地为本机
- FORWARD:通过路由表后,目的地不为本机
- OUTPUT:由本机产生,向外转发
- POSTROUTIONG:发送到网卡接口之前。
-
表的概念
我们再想想另外一个问题,我们对每个"链"上都放置了一串规则,但是这些规则有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们是不是能把实现相同功能的规则放在一起呢,必须能的。我们把具有相同功能的规则的集合叫做"表",所以说,不同功能的规则,我们可以放置在不同的表中进行管理,而iptables已经为我们定义了4种表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4种功能的范围,所以,学习iptables之前,我们必须先搞明白每种表的作用。
iptables为我们提供了如下规则的分类,或者说,iptables为我们提供了如下"四张表"- filter表:负责过滤功能,防火墙;内核模块:iptables_filter
- nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
- mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle
- raw表:关闭nat表上启用的连接追踪机制;iptable_raw
也就是说,我们自定义的所有规则,都是这四种分类中的规则,或者说,所有规则都存在于这4张"表"中。
-
表链关系
但是我们需要注意的是,某些"链"中注定不会包含"某类规则",就像某些"关卡"天生就不具备某些功能一样,比如,A"关卡"只负责打击陆地敌人,没有防空能力,B"关卡"只负责打击空中敌人,没有防御步兵的能力,C"关卡"可能比较NB,既能防空,也能防御陆地敌人,D"关卡"最屌,海陆空都能防。那让我们来看看,每个"关卡"都有哪些能力,或者说,让我们看看每个"链"上的规则都存在于哪些"表"中。
表(功能)<--> 链(钩子):raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT
mangle 表中的规则可以被哪些链使用:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat 表中的规则可以被哪些链使用:PREROUTING,OUTPUT,POSTROUTING(centos7中还有INPUT,centos6中没有)
-
filter 表中的规则可以被哪些链使用:INPUT,FORWARD,OUTPUT
数据流向基本步骤如下:
- 数据包到达网络接口,比如 eth0。
- 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。
- 如果进行了连接跟踪,在此处理。
- 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
- 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。
- 决定路由,看是交给本地主机还是转发给其它主机。
到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过:
- 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
- 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。
- 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
- 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
- 进入出去的网络接口。完毕。
另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:
- 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。
- 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
- 交给本地主机的应用程序进行处理。
- 处理完毕后进行路由决定,看该往那里发出。
- 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。
- 连接跟踪对本地的数据包进行处理。
- 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。
- 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。
- 再次进行路由决定。
- 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
- 进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
- 进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。
- 进入出去的网络接口。完毕。
-
查看iptables表的规则
-
iptables -t 表名 -L
查看对应表的所有规则,-t选项指定要操作的表,省略"-t 表名"时,默认表示操作filter表,-L表示列出规则,即查看规则 -
iptables -t 表名 -L 链名
查看指定表的指定链中的规则 -
iptables -t 表名 -v -L
查看指定表的所有规则,并且显示更详细的信息(更多字段),-v表示verbose,表示详细的,冗长的,当使用-v选项时,会显示出"计数器"的信息,由于上例中使用的选项都是短选项,所以一般简写为iptables -t 表名 -vL -
iptables -t 表名 -n -L
表示查看表的所有规则,并且在显示规则时,不对规则中的IP或者端口进行名称反解,-n选项表示不解析IP地址 -
iptables --line-numbers -t 表名 -L
表示查看表的所有规则,并且显示规则的序号,--line-numbers选项表示显示规则的序号,注意,此选项为长选项,不能与其他短选项合并,不过此选项可以简写为--line,注意,简写后仍然是两条横杠,仍然是长选项 -
iptables -t 表名 -v -x -L
表示查看表中的所有规则,并且显示更详细的信息(-v选项),不过,计数器中的信息显示为精确的计数值,而不是显示为经过可读优化的计数值,-x选项表示显示计数器的精确值 -
iptables --line -t filter -nvxL
实际使用中,为了方便,往往会将短选项进行合并,所以,如果将上述选项都糅合在一起,可以写成如下命令,此处以filter表为例。 iptables --line -t filter -nvxL INPUT
-
-
管理iptables表的规则
-
添加规则:添加规则时,规则的顺序非常重要
-
命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作 -示例:# iptables -t filter -A INPUT -s 10.192.2.222 -j DROP
在指定表的指定链的尾部添加一条规则,-A选项表示在对应链的末尾添加规则,省略-t选项时,表示默认操作filter表中的规则 -
命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动作 -示例:# iptables -t filter -I INPUT -s 10.192.2.222 -j ACCEPT
在指定表的指定链的首部添加一条规则,-I选型表示在对应链的开头添加规则 -
命令语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作 -示例:# iptables -t filter -I INPUT 5 -s 10.192.2.222 -j REJECT
在指定表的指定链的指定位置添加一条规则,这里在INPUT的第5条规则位置处添加规则
-
-
删除规则:如果没有保存规则,删除规则时请慎重
-
命令语法:iptables -t 表名 -D 链名 规则序号 -示例:# iptables -t filter -D INPUT 3
按照规则序号删除规则,删除指定表的指定链的指定规则,-D选项表示删除对应链中的规则 -
命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动作示例:iptables -t filter -D INPUT -s 10.192.2.222 -j DROP
按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则,上述示例表示删除filter表中INPUT链中源地址为10.192.2.222并且动作为DROP的规则。 -
命令语法:iptables -t 表名 -F 链名 -示例:# iptables -t filter -F INPUT
删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则,执行时需三思。 -
命令语法:iptables -t 表名 -F -示例:# iptables -t filter -F
删除指定表中的所有规则,执行时需三思
-
-
修改规则:如果使用-R选项修改规则中的动作,那么必须指明原规则中的原匹配条件,例如源IP,目标IP等。
-
命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作 -示例:# iptables -t filter -R INPUT 3 -s 10.192.2.222 -j ACCEPT
上述示例表示修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT, -s 10.192.2.222为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为0.0.0.0/0 -
命令语法:iptables -t 表名 -P 链名 动作 -示例:# iptables -t filter -P FORWARD ACCEPT
设置指定表的指定链的默认策略(默认动作)
-
-
保存规则
-
service iptables save
表示将iptables规则保存至/etc/sysconfig/iptables文件中,如果为保存重启服务规则将丢失 -
iptables-save > /etc/sysconfig/iptables
centos7中使用默认使用firewalld,如果想要使用上述命令保存规则,需要安装iptables-services,表示将规则保存到指定文件 -
iptables-restore < /etc/sysconfig/iptables
可以使用如下命令从指定的文件载入规则,注意:重载规则时,文件中的规则将会覆盖现有规则
-
-
-
匹配条件
-
基本匹配条件
示例如下 -s用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。 iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT -d用于匹配报文的目标地址,可以同时指定多个目标地址,每个IP之间用逗号隔开,也可以指定为一个网段 iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP iptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPT iptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT -p用于匹配报文的协议类型,可以匹配的协议类型tcp、udp、udplite、icmp、esp、ah、sctp等(centos7中还支持icmpv6、mh) iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT iptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT -i用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在OUTPUT链与POSTROUTING链中不能使用此选项 iptables -t filter -I INPUT -p icmp -i eth0 -j DROP iptables -t filter -I INPUT -p icmp ! -i eth0 -j DROP -o用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在INPUT链与PREROUTING链中不能使用此选项 iptables -t filter -I OUTPUT -p icmp -o eth0 -j DROP iptables -t filter -I OUTPUT -p icmp ! -o eth0 -j DROP
-
扩展匹配条件
tcp扩展模块 常用的扩展匹配条件如下: -p tcp -m tcp --sport 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围 -p udp -m udp --dport 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围 示例如下 iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPT multiport扩展模块 常用的扩展匹配条件如下: -p tcp -m multiport --sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开 -p udp -m multiport --dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开 iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECT iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT iprange模块 包含的扩展匹配条件如下 --src-range:指定连续的源地址范围 --dst-range:指定连续的目标地址范围 iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROP iptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROP iptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP string模块 常用扩展匹配条件如下 --algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。 --string:指定需要匹配的字符串 iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT iptables -t filter -I INPUT -p tcp --sport 80 -m string --algo bm --string "OOXX" -j REJECT time模块 常用扩展匹配条件如下 --timestart:用于指定时间范围的开始时间,不可取反 --timestop:用于指定时间范围的结束时间,不可取反 --weekdays:用于指定"星期几",可取反 --monthdays:用于指定"几号",可取反 --datestart:用于指定日期范围的开始日期,不可取反 --datestop:用于指定日期范围的结束时间,不可取反 iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time ! --monthdays 22,23 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT connlimit 模块 常用的扩展匹配条件如下 --connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。 --connlimit-mask:此选项不能单独使用,在使用--connlimit-above选项时,配合此选项,则可以针对"某类IP段内的一定数量的IP"进行连接数量的限制,如果不明白可以参考上文的详细解释。 iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT limit模块 常用的扩展匹配条件如下 --limit-burst:类比"令牌桶"算法,此选项用于指定令牌桶中令牌的最大数量 --limit:类比"令牌桶"算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。 iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT iptables -t filter -A INPUT -p icmp -j REJECT --tcp-flags模块 iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT、 --syn模块 iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT icmp扩展 常用的扩展匹配条件 --icmp-type: 匹配icmp报文的具体类型 iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECT iptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECT iptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECT iptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT
-
-
state扩展:即为解决安全,又为解决高效
对于state模块的连接而言,"连接"其中的报文可以分为5种状态,报文状态可以为NEW、ESTABLISHED、RELATED、INVALID、UNTRACKED- NEW:连接中的第一个包,状态就是NEW,我们可以理解为新连接的第一个包的状态为NEW。
- ESTABLISHED:我们可以把NEW状态包后面的包的状态理解为ESTABLISHED,表示连接已建立。
- RELATED:相关联报文连接,如FTP"数据连接"中的报文与"命令连接"是有"关系"的。
- INVALID:如果一个包没有办法被识别,或者这个包没有任何状态,那么这个包的状态就是INVALID,我们可以主动屏蔽状态为INVALID的报文
- UNTRACKED:报文的状态为untracked时,表示报文未被追踪,当报文的状态为Untracked时通常表示无法找到相关的连接。
- 示例允许NEW,ESTABLISHED
[root@node01 ~]# iptables -I INPUT -m state --state NEW,ESTABLISHED -j ACCEPT [root@node01 ~]# iptables -A INPUT -j REJECT
-
iptables的黑白名单机制
前文中一直在强调一个概念:报文在经过iptables的链时,会匹配链中的规则,遇到匹配的规则时,就执行对应的动作,如果链中的规则都无法匹配到当前报文,则使用链的默认策略(默认动作),链的默认策略通常设置为ACCEPT或者DROP。
那么,当链的默认策略设置为ACCEPT时,如果对应的链中没有配置任何规则,就表示接受所有的报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被接受。
同理,当链的默认策略设置为DROP时,如果对应的链中没有配置任何规则,就表示拒绝所有报文,如果对应的链中存在规则,但是这些规则没有匹配到报文,报文还是会被拒绝。
所以,当链的默认策略设置为ACCEPT时,按照道理来说,我们在链中配置规则时,对应的动作应该设置为DROP或者REJECT,为什么呢?
因为默认策略已经为ACCEPT了,如果我们在设置规则时,对应动作仍然为ACCEPT,那么所有报文都会被放行了,因为不管报文是否被规则匹配到都会被ACCEPT,所以就失去了访问控制的意义。
所以,当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是"黑名单"机制。
同理,当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是"白名单"机制。
如果使用白名单机制,我们就要把所有人都当做坏人,只放行好人。
如果使用黑名单机制,我们就要把所有人都当成好人,只拒绝坏人。
白名单机制似乎更加安全一些,黑名单机制似乎更加灵活一些。- 建立一个INPUT白名单
先清空防火墙规则 [root@node01 ~]# iptables -F 查看防火墙规则 [root@node01 ~]# iptables -L Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 放通22号端口供ssh访问 [root@node01 ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT 在添加拒绝规则 [root@node01 ~]# iptables -A INPUT -j REJECT 查看INPUT规则 [root@node01 ~]# iptables -L INPUT Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp dpt:ssh REJECT all -- anywhere anywhere reject-with icmp-port-unreachable