vsftpd、iptables

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链转发出去的,整个过程我们可以按照下图理解:


vsftpd、iptables_第1张图片
报文流向

所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING

  • 链的概念
    现在,我们想象一下,这些"关卡"在iptables中为什么被称作"链"呢?我们知道,防火墙的作用就在于对经过的报文匹配"规则",然后执行对应的"动作",所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了"链",所以,我们把每一个"关卡"想象成如下图中的模样 ,这样来说,把他们称为"链"更为合适,每个经过这个"关卡"的报文,都要将这条"链"上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。
    5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
    • PREROUTING:数据包进入路由表之前
    • INPUT:通过路由表后目的地为本机
    • FORWARD:通过路由表后,目的地不为本机
    • OUTPUT:由本机产生,向外转发
    • POSTROUTIONG:发送到网卡接口之前。
vsftpd、iptables_第2张图片
  • 表的概念
    我们再想想另外一个问题,我们对每个"链"上都放置了一串规则,但是这些规则有些很相似,比如,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


      vsftpd、iptables_第3张图片
      表链关系

数据流向基本步骤如下:

  1. 数据包到达网络接口,比如 eth0。
  2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。
  3. 如果进行了连接跟踪,在此处理。
  4. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。
  5. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。
  6. 决定路由,看是交给本地主机还是转发给其它主机。

到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过:

  1. 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。
  2. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。
  3. 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。
  4. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
  5. 进入出去的网络接口。完毕。

另一种情况是,数据包就是发给本地主机的,那么它会依次穿过:

  1. 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。
  2. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
  3. 交给本地主机的应用程序进行处理。
  4. 处理完毕后进行路由决定,看该往那里发出。
  5. 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。
  6. 连接跟踪对本地的数据包进行处理。
  7. 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。
  8. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。
  9. 再次进行路由决定。
  10. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
  11. 进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。
  12. 进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。
  13. 进入出去的网络接口。完毕。
  • 查看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
    

你可能感兴趣的:(vsftpd、iptables)