1、搭建vsftpd,并实现虚拟用户
准备环境:
yum -y install mariadb-devel pam-devel vsftpd ftp mariadb-server
yum -y groupinstall "Development Tools"
下载pam_mysql-0.7RC1.tar.gz并安装:
wget http://www.huzs.net/soft/vsftpd/pam_mysql-0.7RC1.tar.gz
tar xvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1/
./configure --with-pam-mods-dir=/lib64/security/ --with-mysql=/usr --with-pam=/usr
make && make install
编辑mariadb的配置文件:
vim /etc/my.cnf
[mysqld]
log_bin=mysql-bin
innodb_file_per_table=ON
skip_name_resolve=ON
准备数据库及相关表:
systemctl start mariadb
mysql
create database vsftpd;
grant select on vsftpd.* to vsftpd@'192.168.%.%' identified by 'vsftpd';
flush privileges;
use vsftpd;
CREATE TABLE users (id INT unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,name CHAR(50) NOT NULL,password CHAR(48) NOT NULL,unique key(name));
添加虚拟用户:
INSERT INTO users(name,password) values('dabao',password('dabao')),('erbao',password('erbao'));
exit
mysql -uvsftpd -pvsftpd -h127.0.0.1 ##测试mariadb的用户vsftpd能否正常登入
use vsftpd
exit
建立虚拟用户映射的系统用户及对应的目录:
useradd -d /ftproot/vuser vuser
mkdir /ftproot/vuser/pub -p
mkdir /ftproot/vuser/upload -p
chown vuser.vuser /ftproot/vuser
chmod a-w /ftproot/vuser
设置selinux:
restorecon -R /lib64/security
setsebool -P ftpd_connect_db 1
setsebool -P ftp_home_dir 1
chcon -R -t public_content_rw_t /ftproot/vuser
建立pam认证所需文件:
vim /etc/pam.d/vsftpd.mysql
auth required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd
host=192.168.255.130 db=vsftpd table=users usercolumn=name
passwdcolumn=password crypt=2
account required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd
host=192.168.255.130 db=vsftpd table=users usercolumn=name
passwdcolumn=password crypt=2
修改vsftpd的配置文件,使用mariadb认证:
vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
anon_upload_enable=NO
anon_mkdir_write_enable=NO
local_enable=YES
write_enable=YES
listen=YES
pam_service_name=vsftpd.mysql
guest_enable=YES
guest_username=vuser
anon_world_readable_only=NO ##ftp客户端无法看到文件:226 Transfer done,selinux已关闭情况下
use_localtime=YES
为虚拟用户设置不同的访问权限:
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_config/
mkdir /etc/vsftpd/vusers_config/
vim /etc/vsftpd/vusers_config/dabao
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
vim /etc/vsftpd/vusers_config/erbao
anon_upload_enable=YES
systemctl restart vsftpd
虚拟用户登录测试:
ftp 192.168.255.130
dabao
dabao
cd upload
put issue
mkdir issue
2、简述iptales四表五链及详细介绍iptables命令使用方法
iptables按用途和功能对其分类四个表,这四个表又由五个链组成。这四个表分别为:filter、nat、mangle、raw,默认是filter,表的处理优先级依次是:raw、mangle、nat、filter。每个表所处理的功能分别是:
filter表: 过滤规则表, 根据预定义的规则过滤符合条件的数据包
nat表: network address translation 地址转换规则表
mangle: 修改数据标记位规则表
raw:关闭NAT表上启用的连接跟踪机制, 加快封包穿越防火墙速度
五个链分别是:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING。
INPUT:通过路由表判断后目的地是本机,然后进入本机内部资源;
OUTPUT:由本机产生的数据向外部转发;
FORWARD:通过路由表判断后目的地不是本机,然后通过路由转发到其他地方;
PREROUTING:流入的数据包进入路由表之前;
POSTROUTING:传出的数据包到达网卡出口前。
四个表中每个表对应的链分别为:
filter:INPUT、 OUTPUT、 FORWARD;
nat: PREROUTING、POSTROUTING、 FORWARD;
mangle:INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING;
raw:PREROUTING、OUTPUT。

iptables的语法格式:
iptables [-t TABLE] SUBCOMMAND CHAIN CRETERIA -j TARGET
-t TABLE:默认为filter,共有filter,nat,mangle,raw四个可用
SUBCOMMAND:对链的管理:
-N: new, 自定义一条新的规则链。
-X: delete,删除自定义的空的规则链。
-P: Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受;DROP:丢 弃;REJECT:拒绝。
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除。
iptables规则管理:包括添加、插入、删除、替换、查看等
-A: append,追加
-I: insert, 插入,要指明插入至的规则编号,默认为第一条
-D: delete,删除
(1) 指明规则序号
(2) 指明规则本身
-R: replace,替换指定链上的指定规则编号
-F: flush,清空指定的规则链
-Z: zero,置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
查看:
-L: list, 列出指定鏈上的所有规则,本选项须置后
-n: numberic,以数字格式显示地址和端口号
-v: verbose,详细信息
-vv 更详细
-x: exactly,显示计数器结果的精确值,而非单位转换后的易读值
--line-numbers:显示规则的序号
chain: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
匹配条件:
1、基本匹配条件:无需加载模块,由iptables/netfilter自行提供
[!] -s, --source address[/mask][,...]:源IP地址或范围
[!] -d, --destination address[/mask][,...]:目标IP地址或范围
[!] -p, --protocol protocol:指定协议,可使用数字如0(all)
protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“
[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、 FORWARD、 PREROUTING链
[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、 OUTPUT、 POSTROUTING链
2、扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块。
tcp协议的扩展选项:
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为范围
[!] --tcp-flags mask comp
mask 需检查的标志位列表,用,分隔。例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
[!] --syn:用于匹配第一次握手,相当于: --tcp-flags SYN,ACK,FIN,RST SYN
udp协议的扩展选项:
[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围
icmp协议的扩展选项:
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块。
1、 multiport扩展
以离散方式定义多端口匹配,最多指定15个端口:
[!] --source-ports,--sports port[,port|,port:port]... 指定多个源端口
[!] --destination-ports,--dports port[,port|,port:port]... 指定多个目标端口
[!] --ports port[,port|,port:port]... 多个源或目标端口
2、 iprange扩展
指明连续的(但一般不是整个网络)ip地址范围:
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
3、 mac扩展
指明源MAC地址,适用于: PREROUTING, FORWARD, INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
4、 string扩展
对报文中的应用层数据做字符串模式匹配检测:
--algo {bm|kmp} 字符串匹配检测算法
bm: Boyer-Moore
kmp: Knuth-Pratt-Morris
--from offset 开始偏移
--to offset 结束偏移
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式, 16进制格式
5、 time扩展
根据将报文到达的时间与指定的时间范围进行匹配:
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss] 时间
--timestop hh:mm[:ss]
[!] --monthdays day[,day...] 每个月的几号
[!] --weekdays day[,day...] 星期几, 1 – 7 分别表示星期一到星期日
6、 connlimit扩展
根据每客户端IP做并发连接数数量匹配,可防止CC(Challenge Collapsar挑战黑洞)攻击:
--connlimit-upto #:连接的数量小于等于#时匹配
--connlimit-above #:连接的数量大于#时匹配
通常分别与默认的拒绝或允许策略配合使用
7、 limit扩展
基于收发报文的速率做匹配,令牌桶过滤器:
--limit #[/second|/minute|/hour|/day]
--limit-burst number
8、 state扩展
根据”连接追踪机制“去检查连接的状态,较耗资源,conntrack机制:追踪本机上的请求和响应之间的关系。状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一 次发出的请求
ESTABLISHED: NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的 通信状态
RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间 的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
[!] --state state
/proc/net/nf_conntrack 已经追踪到的并记录下来的连接信息库
/proc/sys/net/nf_conntrack_max 调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/netfilter/ 不同的协议的连接追踪时长
注意: CentOS7 需要加载模块: modprobe nf_conntrack
Target:
ACCEPT,DROP,REJECT,RETURN,LOG,SNAT,DNAT,REDIRECT,MASQUERADE...
LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前,并将日志记录在/var/log/messages系统日志中
--log-level level 级别: debug, info, notice, warning, error, crit,alert,emerg
--log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
示例:
增加一条允许进入,源地址为172.16.0.0的网段,访问目标地址172.16.0.67,目的端口为22的策略:
iptables -I INPUT -s 172.16.0.0/16 -d 172.16.0.67 -p tcp --dport 22 -j ACCEPT
增加一条允许出口,源地址为172.16.0.67的,源端口为22,访问目标地址为172.16.0.0的网段的策略:
iptables -I OUTPUT -s 172.16.0.67 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
拒绝从网卡ens33进入:
iptables -A INPUT -i ens33 -j REJECT
拒绝从网卡ens33出去:
iptables -A OUTPUT -o ens33 -j REJECT
允许到目标地址为172.16.0.67,且端口为137,138的数据流进入:
iptables -I INPUT -d 172.16.0.67 -p udp --dport 137:138 -j ACCEPT
允许到目标地址为172.16.0.67,且端口为22,80,139,445的数据流进入:
iptables -R INPUT 2 -d 172.16.0.67 -p tcp -m multiport --dports 22,80,139,445 -j ACCEPT
允许源地址为172.16.0.60-172.16.0.70之间的IP数据流进入目标地址为172.16.0.67,且端口为23:
iptables -I INPUT 3 -d 172.16.0.67 -p tcp --dport 23 -m iprange --src-rang 172.16.0.60-172.16.0.70 -j ACCEPT
允许源地址为172.16.0.60-172.16.0.70之间的IP,并且时间为周一到周五的早上10点到下午4点的数据流进入目标地址为172.16.0.67,且端口为23:
iptables -R INPUT 3 -d 172.16.0.67 -p tcp --dport 23 -m iprange --src-rang 172.16.0.60-172.16.0.70 -m time --timestart 10:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT
拒绝源地址为172.16.0.67的IP,带有字符串 gay 的数据流出去:
iptables -I OUTPUT -s 172.16.0.67 -m string --algo kmp --string "gay" -j REJECT
允许源地址为172.16.0.0的网段进入目标地址为172.16.0.67,端口为3306的数据流进入,同时限制进入的每个IP的并发连接数为2个:
iptables -R INPUT 2 -d 172.16.0.67 -s 172.16.0.0/16 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
允许连接状态为ESTABLISHED,RELATED的数据流访问目标为172.16.0.67:
iptables -R INPUT 1 -d 172.16.0.67 -m state --state ESTABLISHED,RELATED -j ACCEPT
允许连接状态NEW的数据流访问目标为172.16.0.67,端口为23,并且在日志里增加access telnet前缀信息:
iptables -I INPUT 3 -d 172.16.0.67 -p tcp --dport 23 -m state --state NEW -j LOG --log-prefix "access telnet"