1、搭建vsftpd,并实现虚拟用户
我们登录FTP有三种方式,匿名登录、本地用户登录和虚拟用户登录。
匿名登录:在登录FTP时使用默认的用户名,一般是ftp或anonymous。
本地用户登录:使用系统用户登录,在/etc/passwd中。
虚拟用户登录:这是FTP专有用户,有两种方式实现虚拟用户,本地数据文件和数据库服务器。
FTP虚拟用户是FTP服务器的专有用户,使用虚拟用户登录FTP,只能访问FTP服务器提供的资源,大大增强了系统的安全。
创建vsftpd使用的系统用户,主目录为/home/vsftpd,禁止ssh登录。创建之后所有虚拟用户使用这个系统用户访问文件。
useradd -s /sbin/nologin vsftpd
创建虚拟用户主目录,比如虚拟用户叫zhangsan,执行下面的命令。
mkdir -p /home/vsftpd/zhangsan
1. 添加虚拟用户口令文件
vim /etc/vsftpd/vftpuser.list
添加虚拟用户名和密码,一行用户名,一行密码,以此类推。奇数行为用户名,偶数行为密码。
zhangsan
123456
2. 生成虚拟用户口令认证文件
将刚添加的vftpuser.list虚拟用户口令文件转换成系统识别的口令认证文件。
首先查看系统有没有安装生成口令认证文件所需的软件db4-utils。
#安装db4工具
# yum install db4 –y
下面使用db_load命令生成虚拟用户口令认证文件。
db_load -T -t hash -f /etc/vsftpd/vftpuser.list /etc/vsftpd/vftpuser.db
chmod 600 /etc/vsftpd/vftpuser.db
3. 编辑vsftpd的PAM认证文件
在/etc/pam.d目录下,
vi /etc/pam.d/vsftpd
将里面其他的都注释掉,添加下面这两行:
auth required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser (注意数据库文件无须.db名称后缀)
account required /lib64/security/pam_userdb.so db=/etc/vsftpd/vftpuser (注意数据库文件无须.db名称后缀)
创建虚拟 用户专用配置文件
mkdir /etc/vsftpd/userconf
vim /etc/vsftpd/userconf/zhangsan
local_root=/home/vsftpd/zhangsan/
write_enable=YES
anon_umask=022
anon_world_readable_only=NO
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
4. 建立本地映射用户并设置宿主目录权限
所有的FTP虚拟用户需要使用一个系统用户,这个系统用户不需要密码。
useradd -s /sbin/nologin vsftpd
chmod 700 /home/vsftpd
5. 配置vsftpd.conf(设置虚拟用户配置项)
vim /etc/vsftpd/vsftpd.conf
guest_enable=YES #开启虚拟用户
guest_username=vftpuser #FTP虚拟用户对应的系统用户
pam_service_name=vsftpd #PAM认证文件
配置介绍:
anonymous_enable=NO 禁止匿名用户登录
#启用本地系统用户,包括虚拟用户
local_enable=YES
chroot_local_user=YES 禁止用户访问除主目录以外的目录
ascii_upload_enable=YES
ascii_download_enable=YES 设定支持ASCII模式的上传和下载功能
guest_enable=YES 启动虚拟用户
guest_username=vsftpd 虚拟用户使用的系统用户名
user_config_dir=/etc/vsftpd/userconf 虚拟用户使用的配置文件目录
allow_writeable_chroot=YES
最新版的vsftpd为了安全必须用户主目录(也就是/home/vsftpd/zhangsan)没有写权限,才能登录,或者使用allow_writeable_chroot=YES
最后重启服务使配置生效
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
-n 不清除原有规则
-t :仅检查分析生成的规则集是否有语法错误
在centos6中
保存规则service iptables save 会将保存到/etc/sysconfig/iptables文件中覆盖保存
重载文件中的规则:service iptables restart