(第十三周作业)
1、搭建vsftpd,并实现虚拟用户
root用户登录
# yum install vsftpd -y
安装完后可以使用以下命令来启停vsftpd服务
# service vsftpd start
# service vsftpd stop
# service vsftpd restart
它的配置文件目录为/etc/vsftpd/,该目录下有主配置文件vsftpd.conf,接下就以实现虚拟用户功能来配置一下vsftpd
虚拟用户就是系统当中不存在的实体用户,它只能访问和使用ftp资源,但不允许访问系统的其他资源。虚拟用户的认证使用口令库文件
(1)编写虚拟用户的账户和密码数据库文件
编写一文本文件,奇数行为账户,偶数行为密码。
# vi /etc/vsftpd/vusers.list
用户名1
密码1
用户名2
密码2
……
安装db4工具来把文本文件转换成二进制数据库文件
# yum install db4-utils -y
# db_load -T -t hash -f vusers.list vusers.db
# chmod 600 /etc/vsftpd/vusers.*
(2)创建ftp根目录和虚拟用户映射的系统用户
# mkdir /var/ftproot
# useradd -d /var/ftproot -s /sbin/nologin virtual
# chmod 755 /var/ftproot
(3)创建支持虚拟用户的PAM认证文件
# vi /etc/pam.d/vsftpd
auth required pam_userdb.so db=/etc/vsftpd/vusers
account required pam_userdb.so db=/etc/vsftpd/vusers
这里指向数据库文件名时,不要加后缀
(4)修改主配置文件
# vi /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #禁用匿名用户
local_enable=YES #启用本地用户
write_enable=YES #本地用户可以可写
anon_umask=022 #匿名用户创建文件的掩码权限
chroot_local_user=YES #禁锢本地用户不能超出其家目录
guest_enable=YES # 启用guest用户
guest_username=virtual #虚拟用户映射的系统用户名
pam_service_name=vsftpd #虚拟用户的pam文件名,不需要路径
(5)创建虚拟用户配置文件
# mkdir /etc/vsftpd/vusers_dir 创建虚拟用户配置文件目录
在主配置文件中开启虚拟用户,并指定虚拟用户配置文件目录
# vi /etc/vsftpd/vsftpd.conf
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vusers_dir
在虚拟用户配置文件目录中为个别用户创建独立的配置文件
# vi /etc/vsftpd/vusers_dir/user1
anon_upload_enable=YES
anon_mkdir_enable=YES
(6)重启vsftpd来重新加载
# service vsftpd restart
(7)测试过程
发现报错
226 transfer done but failed to open directory
需要把selinux关掉。
# vi /etc/selinux/config
SELINUX=disabled
重启# reboot
发现报错:500 OOPS: vsftpd: refusing to run with writable root inside chroot()
如果启用chroot,必须保证ftp根目录不可写,这样对于ftp根直接为网站根目录的用户不方便
# chmod a-x /var/ftproot
然后如果需要在ftp根目录下创建目录或文件。请自行创建。
2、简述iptales四表五链及详细介绍iptables命令使用方法。
Linux系统上的防火墙是由iptables/netfilter组成,其中iptables是规则的制定工具,工作在用户空间,它制定的规则送到内核空间,netfilter在内核协议框架中定义了5个位置通过钩子函数对进出的数据包进行过滤。
iptables四表为filter , nat ,mangle , raw 。默认表是flter,表的处理优先级为:raw ,mangle,nat,filter。
filter:一般的过滤功能;
nat: 用于nat功能(地址转换、映射、端口映射等)
mangle:用于对特定数据包的修改(使用情况少)
raw: 一般是为了不再让iptables做数据包的链接跟踪处理,从而提高性能。
五个链分别是:
INPUT: 通过路由表判断后目的地是本机,然后进入本机内部资源
OUTPUT: 由本机产生的数据向外部转发
FORWARD:通过路由表判断后目的地不是本机,然后通过路由转发到其他地方
PREROUTING:流入的数据包进入路由表之前
POSTROUTING:传出的数据包到达网卡出口前
四个表对应的链分别为:
filter: INPUT , OUTPUT , FORWARD
nat: PREROUTING , POSTROUTING FORWARD
mangle: INPUT OUTPUT PREROUTING , POSTROUTING FORWARD
raw: PREROUTING OUTPUT
iptables的语法格式:
iptables [-t TABLE ] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-target-options]
-t TABLE: 默认为filter ,可以是filter ,nat ,mangle, raw
COMMAND有以下几种:
(1)查看:-L list列出指定链上所有的规则,有以下几条子选项
-n : numberic 以数字格式显示地址与端口号,例如任意地址不加-n显示为anywhere 加-n显示为0.0.0.0/0
-v : verbose显示详细信息 , -vv -vvv显示的信息更为详细
-x: 显示计数器结果的精确值,不加的话显示四舍五入的值,但是更有可读性
--line-numbers: 显示规则的序号
(2)链管理:
-N: new,定义一台新的自定义规则链
-X:delete 删除一条自定义规则链(仅能删除自定义的 引用计数为0的 空的 链)
-E: 重命名自定义链(仅能重命名引用计数为0的自定义链)
-P:policy 设置默认策略,对于filter表中的链来说,以三种策略:ACCEPT / DROP / REJECT
(3)规则管理
-A: append 在最后一条规则之后,追加规则
-I: insert 插入规则,要指定位置,不指定位置则在第一条前插入规则
-D: delete 删除规则,指定规则序号或规则本身来进行删除
-R: replace 替换规则,替换指定链上的指定规则
-F: flush 清空指定链上的规则
-Z: zero 计数器置零,每条规则对匹配的报文个数和报文的大小之和进行统计。
CHAIN 就是链,参考之前的链与表的关系
匹配条件:
基本匹配条件:无需加载任何模块,由iptables/netfilter来提供
[!] -s: 检查报文中的源IP地址是否符合对应IP或网络地址范围 ,前加“!"表示条件取反(下同)
如:0.0.0.0/0表示所有地址,其他地址网段可以用CIDR方式书写
[!] -d: 检查报文中的目标IP地址是否符合对应IP或网络地址范围
[!] -p: 网络协议,常见的有tcp / udp /icmp
[!] -i :数据报文流入的接口(即哪张网卡),只能应用于 INPUT PREROUTING , FORWARD 链
[!] -o :数据报文流出的接口(即哪张网卡),只能应用于OUTPUT POSTROUTING FORWARD链
扩展匹配条件:
隐式扩展:使用-p指定了协议后,隐式包含了一些扩展选项
tcp协议:
[!] --source-port 或 --sport port[:port] 匹配报文的源端口,可以是端口范围两个port之间用“:”隔开
[!] --destination-port 或 --dport port[:port] 匹配报文的目标端口,可以是端口范围
[!] --tcp-flags 检查的标志位列表 必须为1的标志位列表 用于匹配报文的标志位,如果标志位出现在第一列表中,而没有出现在第二列表中,则必须为0。第二列表是第一列表的子集。
[!] --syn 用于匹配第一次握手,相当于"--tcp-flags SYN,ACK,FIN,RST SYN"
udp协议:
[!] --source-port 或 --sport port[:port] 匹配报文的源端口,可以是端口范围两个port之间用“:”隔开
[!] --destination-port 或 --dport port[:port] 匹配报文的目标端口,可以是端口范围
icmp协议:
[!] --icmp-type {type[/code]| typename}
echo-request : 8
echo-replay : 0
显式扩展:使用-m来指明要调用的扩展模块, -m 模块名 模块对应选项,常用的模块名举例如下:
multiport:
以离散方式来指定端口号列表
[!] --source-port 或 --sport port,port,port ....指定多个源端口
[!] --destination-port 或 --dport port,port,port ..指定多个目标端口
iprange:指定IP地址范围
[!} --src-range fromIP[-toIP] 来源IP范围
[!} --dst-range fromIP[-toIP] 目标IP范围
time: 指定日期时间范围
--timestart hh:mm[:ss] 开始时间
--timestop hh:mm[:ss] 结束时间
[!] --weekdays day,day..... 周几
[!] --monthdays day,day,.... 每月内的几日
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 开始日期和时间
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束日期和时间
--kerneltz 使用内核配置的时区,而不是默认的UTC
string: 匹配报文中的字符串
--algo {bm|kmp} 必选项 指定匹配字符串的算法
[!] --string 模式字符串
[!] --hex-string 16进制编码的模式字符串
--from offset 指定开始检查的位置
--to offset 指定结束检查的位置
connlimit :单IP的并发连接数限制
--connlimit-upto n 连接数小于等于n
--connlimit-above n 连接数大于等于n
limit :使用令牌桶过滤器,指定令牌生成速率
--limit-burst n 令牌桶的大小
--limit n[/second|/minute|/hour|/day] 限制每秒多少个包(每分钟/小时/天多少个包)
state: 连接追踪记录,在并发访问量大的主机不要开启
追踪到的连接:/proc/net/nf_conntrack
调整可记录的连接数量最大值:/proc/sys/net/nf_conntrack_max
超时时长:/proc/sys/net/netfilter/* timeout *
[!] --state 状态
这里的状态可以为以下几种:
NEW:新连接请求
ESTABLISHED:已建立的连接
INVALID:未识别的连接
RELATED:相关联连接,附属于某个已存在连接的新请求
UNTRACKED:未追踪的连接
-j targetname 跳转的目标或处理动作:
基本处理动作:
ACCEPT:接受
DROP: 丢弃
扩展处理动作:
REJECT:拒绝
--reject-with type 定义拒绝类型
LOG 日志记录,默认保存在/var/log/messages文件中,
--log-level 日志级别
--log-prefix 日志前缀
RETURN
从自定义链返回原链继续检查规则
自定义链名作为目标
自定义链中的规则如果都不匹配时,再返回原链继续检查原链上的规则
其它命令
iptables-save > filename 保存iptables内容到某一文件中
iptables-restore <filename 从某文件中恢复iptables规则(无法恢复加载模块的内容)
-n 不清除原有规则
-t :仅检查分析生成的规则集是否有语法错误
在centos6中
保存规则service iptables save 会将保存到/etc/sysconfig/iptables文件中覆盖保存
重载文件中的规则:service iptables restart