1、搭建vsftpd,并实现虚拟用户
在这里我们创建基于MYSQL验证的vsftpd虚拟用户
1.安装必要的包组mariadb-devel pam-devel vsftpd ,因为centos7:无对应rpm包,需手动编译安装 pam_mysql-0.7RC1.tar.gz
[root@localhost pub]#yum -y install mariadb-devel pam-devel vsftpd pam_mysql
[root@localhost pub]#yum -y groupinstall "Development Tools"
[root@localhost pub]# tar xvf pam_mysql-0.7RC1.tar.gz
[root@localhost pub]# cd pam_mysql-0.7RC1/
[root@localhost pub]# ./configure --with-pam-mods-dir=/lib64/security --with-mysql=/usr -with-pam=/usr
[root@localhost pub]# make && make install
[root@localhost pub]#systemctl start mariadb.service
[root@localhost pub]#systemctl start vsftpd.service
2.创建数据库用户
MariaDB [(none)]> GRANT all ON vsftpd.* TO vsftpd@localhost IDENTIFIED BY 'magedu';
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> GRANT all ON vsftpd.* TO vsftpd@127.0.0.1 IDENTIFIED BY 'magedu';
Query OK, 0 rows affected (0.02 sec)
3.建立用户表
MariaDB [(none)]> USE vsftpd;
MariaDB [vsftpd]> CREATE TABLE users ( id INT AUTO_INCREMENT NOT NULL PRIMARY KEY, name CHAR(50) BINARY NOT NULL, password CHAR(48) BINARY NOT NULL );
MariaDB [vsftpd]> DESC users;
+----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(50) | NO | | NULL | |
| password | char(48) | NO | | NULL | |
+----------+----------+------+-----+---------+----------------+
4.测试连接,添加认证用户
[root@localhost /]# mysql -uvsftpd -hlocalhost -pmagedu
MariaDB [vsftpd]> INSERT INTO users(name,password) values('wang',password('magedu'));
MariaDB [vsftpd]> INSERT INTO users(name,password) values('mage',password('magedu'));
5.建立认证配置文件
[root@localhost /]# vi /etc/pam.d/vsftpd.mysql
auth required pam_mysql.so user=vsftpd passwd=magedu host=localhost db=vsftpd table=users usercolumn=n
ame passwdcolumn=password crypt=2
account required pam_mysql.so user=vsftpd passwd=magedu host=localhost db=vsftpd table=users usercolum
n=name passwdcolumn=password crypt=2
6.建立虚拟用户映射的系统用户及对应的目录
[root@localhost /]# useradd -s /sbin/nologin -d /var/ftproot vuser
[root@localhost var]# chmod a-w /var/ftproot/
7.修改配置文件,加入下面两项
[root@localhost var]# vi /etc/vsftpd/vsftpd.conf
guest_enable=YES
guest_username=vuser
8.使认证用户拥有不同的权限
配置vsftpd为虚拟用户使用配置文件目录
vim /etc/vsftpd/vsftpd.conf
user_config_dir=/etc/vsftpd/vusers_config
创建所需要目录,并为虚拟用户提供配置文件
mkdir /etc/vsftpd/vusers_config/
cd /etc/vsftpd/vusers_config/
touch wang mage
配置文内容为
anon_upload_enable={YES|NO}
anon_mkdir_write_enable={YES|NO}
anon_other_write_enable={YES|NO}
local_root=/var/ftproot
9.测试登录成功
[root@localhost var]# ftp 192.168.164.146
Connected to 192.168.164.146 (192.168.164.146).
220 (vsFTPd 3.0.2)
Name (192.168.164.146:root): wang
331 Please specify the password.
Password:
230 Login successful.
[root@localhost vusers_config]# ftp 192.168.164.146
Connected to 192.168.164.146 (192.168.164.146).
220 (vsFTPd 3.0.2)
Name (192.168.164.146:root): mage
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
2、简述iptales四表五链及详细介绍iptables命令使用方法
- iptales是Linux内核自带的一个防火墙工具,是一个包过滤的防火墙,通过它用户可以自行设置过滤规则,工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件;
- iptables可以实现主机防火墙及网络防火墙
- iptables的组成:四表五链
表名 | 含义 |
---|---|
filter表: | 过滤规则表,根据预定义的规则过滤符合条件的数据包 |
nat表: | network address translation 地址转换规则表 |
mangle: | 修改数据标记位规则表 ,拆解报文,做出修改 |
raw: | 关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度 |
security: | 用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现 |
- 五链:
链名 | Value |
---|---|
INPUT | 输入 |
OUTPUT | 输出 |
FORWARD | 转发 |
PREROUTING | 预处理,在input之前 |
POSTROUTING | 路由选择 |
- 表与链的对应关系:
表明(功能) | 链名 |
---|---|
raw: | PREROUTING, OUTPUT |
mangle: | PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING |
nat: | PREROUTING,[INPUT,]OUTPUT,POSTROUTING |
filter: | INPUT,FORWARD,OUTPUT |
内核中数据包的传输过程 :
- 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的 IP判断是否需要转送出去
- 如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包 到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些 数据包经过OUTPUT链,然后到达POSTROUTING链输出
- 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过 FORWARD链,然后到达POSTROUTING链输出
IP tables使用规则:
- 规则组成:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
匹配条件: | 基本匹配条件:内建 |
扩展匹配条件:由扩展模块定义; | |
处理动作: | 基本处理动作:内建 |
扩展处理动作:由扩展模块定义; | |
自定义处理机制:自定义链 |
-
iptables的链:内置链和自定义链
内置链:对应于hook function,5个链
自定义链接:用于内置链的扩展和补充,可实现更灵活的规则管理机制; -
链:链上的规则次序,即为检查的次序;因此,隐含一定的应用法则:
(1) 同类规则(访问同一应用),匹配范围小的放上面;
(2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
(3) 将那些可由一条规则描述的多个规则合并起来;
(4) 设置默认策略;
iptables命令:
- 规则格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
参数 | 含义 |
---|---|
-t table: | 指定表名,可以是raw, mangle, nat, 默认是[filter] |
- COMMAND :链管理;规则管理,查看
链管理
参数 | 含义 |
---|---|
-N:new, | 自定义一条新的规则链; |
-X: delete | 删除自定义的规则链;注意:仅能删除 用户自定义的 引用计数为0的空的链; |
-P:Policy | 设置默认策略;对filter表中的链而言,其默认策略有: |
ACCEPT: | 接受 |
DROP: | 丢弃 |
REJECT: | 拒绝 |
-E: | 重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除; |
规则管理:
参数 | 含义 |
---|---|
-A:append | 追加 |
-I:insert, | 插入,要指明位置,省略时表示第一条; |
-D:delete, | 删除;(1) 指明规则序号;(2) 指明规则本身; |
-R: | replace,替换指定链上的指定规则; |
-F:flush, | 清空指定的规则链; |
-Z:zero, | 置零;iptables的每条规则都有两个计数器: (1) 匹配到的报文的个数;(2) 匹配到的所有报文的大小之和; |
查看:
参数 | 含义 |
---|---|
-L:list, | 列出指定鏈上的所有规则; |
-n:numberic, | 以数字格式显示地址和端口号; |
-v:verbose, | 详细信息;-vv, -vvv |
-x:exactly, | 显示计数器结果的精确值; |
–line-numbers: | 显示规则的序号; |
- chain:指定链名PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
[-m matchname [per-match-options]]
匹配条件:
- 基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
参数 | 含义 |
---|---|
-s, --source address[/mask][,…]: | 检查报文中的源IP地址是否符合此处指定的地址或范围; |
-d, --destination address[/mask][,…]: | 检查报文中的目标IP地址是否符合此处指定的地址或范围;所有地址:0.0.0.0/0 |
-p, --protocol protocol | protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or “all”{tcp |
-i, --in-interface name: | 数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链; |
-o, --out-interface name: | 数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链; |
- 扩展匹配条件
隐式扩展:在使用-p选项指明了特定的协议时,无需再同时使用-m选项指明扩展模块的扩展机制;
参数 | 含义 |
---|---|
–source-port, --sport port[:port]: | 匹配报文的源端口;可以是端口范围; |
–destination-port,–dport port[:port]: | 匹配报文的目标端口;可以是端口范围; |
–tcp-flags mask comp | 例如 SYN,ACK,FIN,RSTSYN,例如:“–tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0; |
–syn: | 用于匹配第一次握手,相当于”–tcp-flags SYN,ACK,FIN,RST SYN“; |
–icmp-type {type[/code]或typename} | 可以是8或0类型,8指发送报文,0指接收报文 |
显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;
参数 | 含义 |
---|---|
multiport | 以离散或连续的 方式定义多端口匹配条件,最多15个;例 iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT |
iprange | 以连续地址块的方式来指明多IP地址匹配条件;例iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT |
time | 以某一时间段作为参数,可以是禁止或允许 |
string | 匹配字符串,例 iptables -I OUTPUT -m string --algo bm --string “gay” -j REJECT |
connlimit | 最大并发数控制,–connlimit-upto n(上限)–connlimit-above n(下限),例iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT |
limit | 速率限制,限制本机某tcp服务接收新请求的速率:–syn, -m limit |
state | 状态匹配,NEW: 新连接请求;ESTABLISHED:已建立的连接;INVALID:无法识别的连接; |
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;UNTRACKED:未追踪的连接; |
-j targetname [per-target-options]
- 处理动作:
参数 | 含义 |
---|---|
-j targetname [per-target-options] | ACCEPT,允许 |
DROP,丢弃,不回复应答报文 | |
REJECT,拒绝,要回复应答报文 | |
LOG。写入到日志中 | |
RETURN:返回调用者; | |
自定义链做为target: |
- 保存和载入规则:
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重载:iptabls-restore < /PATH/FROM/SOME_RULE_FILE
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交 - SNAT:改源地址,主要用于隐藏源主机,便于内网访问公网
- DNAT:改目的地址,隐藏目的主机,用于外网访问内网