搭建vsftpd,并实现虚拟用户 ,基于centos7
1.首先关闭firewalld和selinux:
[root@vsftpd ~]#setenforce 0
[root@vsftpd ~]#systemctl stop firewalld
2.安装vsftpd和mysql及工具包:
[root@vsftpd ~]# yum -y install vsftpd mariadb-server mariadb-devel pam-devel
[root@vsftpd ~]# yum -y groupinstall "Development Tools" "Server Platform Development" #安装开发包组
3.启动服务:
[root@vsftpd ~]#systemctl start vsftpd.service mariadb.service #启动
[root@vsftpd ~]#systemctl enable vsftpd.service mariadb.service #设置开机自动启动
4.下载pam-mysql并编译安装:
[root@vsftpd ~]#wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
[root@vsftpd ~]#tar -xf pam_mysql-0.7RC1.tar.gz
[root@vsftpd ~]#cd pam_mysql-0.7RC1
[root@vsftpd pam_mysql-0.7RC1]#./configure --with-mysql=/usr --with-pam=/usr --with-pam-mods-dir=/usr/lib64/security/
[root@vsftpd pam_mysql-0.7RC1]#make & make install
注意:centos6 可以yum直接安装pam-msyql
5.创建数据库,授权用户,创建账号和密码:
修改mysql配置文件:/etc/my.cnf.d/server,在[myslqd]下面一行,添加下面三段参数:
skip_name_resolve=ON
innodb_file_per_table=ON
log_bin=mysql_bin
重启服务:[root@vsftpd ~]#systemctl restart mariadb.service vsftpd.service
打开mysql:[root@vsftpd ~]# mysql
注意:myslq命令虽然不分别大小写,但建议命令使用大写,这样容易分别
MariaDB [(none)]> CREATE DATABASE vsftpd;
Query OK, 1 row affected (0.00 sec) #创建数据库,
MariaDB [(none)]> GRANT ALL ON vsftpd.* TO 'vsftpd'@'127.0.0.1' IDENTIFIED BY 'vsftpd';
Query OK, 0 rows affected (0.00 sec) #创建用户vsftpd,密码也为'vsftpd' 并授权只能本地登录.
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec) #刷新权限
MariaDB [(none)]> exit #退出
Bye
测试用户是否能正常登录:
[root@vsftpd ~]#mysql -uvsftpd -h127.0.0.1 -pvsftpd
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 5
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)]> SHOW DATABASES; #显示所有数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| test |
| vsftpd |
+--------------------+
3 rows in set (0.00 sec)
MariaDB [(none)]> use vsftpd; #切换到指定数据库
Database changed
MariaDB [vsftpd]> CREATE TABLE users(id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,name VARCHAR(60) NOT NULL ,password CHAR(48) NOT NULL ,UNIQUE KEY(name));
Query OK, 0 rows affected (0.03 sec) #创建用于存放, 用户和密码的表,
MariaDB [vsftpd]> DESC users; #查看表结构
+----------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| name | varchar(60) | NO | UNI | NULL | |
| password | char(48) | NO | | NULL | |
+----------+------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
MariaDB [vsftpd]> INSERT INTO users(name,password)VALUES('test',PASSWORD('test')),('like',PASSWORD('like'));
Query OK, 2 rows affected (0.01 sec) #添加虚拟用户和密码
Records: 2 Duplicates: 0 Warnings: 0
MariaDB [vsftpd]> SELECT * FROM users; #查看刚才添加的用户
+----+-------+-------------------------------------------+
| id | name | password |
+----+-------+-------------------------------------------+
| 1 | test | *94BDCEBE19083CE2A1F959FD02F964C7AF4CFC29 |
| 2 | like | *4E2B4935BF22EC8D087E06FD59BD863114E453F0 |
+----+-------+-------------------------------------------+
2 rows in set (0.00 sec)
MariaDB [vsftpd]> exit
Bye
配置vsftpd相关参数:
[root@vsftpd ~]#mkdir /ftp/
[root@vsftpd ~]#useradd -d /ftp/vuser vuser #创建用户,指定家目录/ftp/vuser
[root@vsftpd ~]#chmod a-w /ftp/vuser/ #ftp用户家目录不能拥有写权限
[root@vsftpd ~]#mkdir /ftp/vuser/pub #创建ftp共享目录
[root@vsftpd ~]#chown vuser.vuser /ftp/vuser/pub #修改属组
[root@vsftpd ~]#vim /etc/pam.d/vsftpd.vusers #新建文件,并添加以下参数
auth required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
account required /usr/lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=127.0.0.1 db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2
[root@vsftpd ~]#cd /etc/vsftpd/
[root@vsftpd vsftpd]#cp vsftpd.conf{,.bak} #备份配置文件
[root@vsftpd vsftpd]#vim vsftpd.conf #修改或添加以下参数,下图所示
[root@vsftpd ~]mkdir /etc/vsftpd/vusers_config/ #创建虚拟用户配置目录
[root@vsftpd ~]vim /etc/vsftpd/vusers_config/test #创建虚拟用户配置文件,添加以下参数
anon_upload_enable=YES #上传权限
anon_mkdir_write_enable=YES #写权限,创建目录等
[root@vsftpd ~]vim /etc/vsftpd/vusers_config/like #重新再创建一个配置文件,
anon_upload_enable=YES #这次只添加一个上传权限,等下对比效果
[root@vsftpd ~] systemctl restart vsftpd
测试:
服务端ip地址:192.168.30.152
用客户端测试: 下图表示成功登录
下图是没有输入密码的结果:
测试权限是否正常
测试test用户,此用户拥有上传权限和写权限
测试写权限:
测试上传权限
测试like用户:
iptables介绍和使用:
Linux系统上的防火墙是由iptables/netfilter组成,其中iptables是规则的制定工具,工作在用户空间,它制定的规则送到内核空间,netfilter在内核协议框架中定义了5个位置通过钩子函数对进出的数据包进行过滤,
四表五链功能介绍:
链(内置):
INPUT: 通过路由表判断后目的地是本机,然后进入本机内部资源
OUTPUT: 由本机产生的数据向外部转发
FORWARD:通过路由表判断后目的地不是本机,然后通过路由转发到其他地方
PREROUTING:流入的数据包进入路由表之前
POSTROUTING:传出的数据包到达网卡出口前
表:
filter:过滤,防火墙(默认)
nat:network address translation:用户修改源ip或目标ip,也可以改端口
mangle:拆解报文,做出修改,并重新封装
raw:关闭net表上启用的连接追踪机制
表<-->链:
raw: PREROUTING OUTPUT
mangle: PREROUTING INPUT OUTPUT FORWARD POSTROUTING
nat: PREROUTING INPUT OUTPUT POSTROUTING
filter: INPUT FORWARD OUTPUT
报文流向:
流入本机:PREROUTING --> INPUT
由本机流出:OUTPUT-->POSRTOUTING
转发:PREROUTING -->FORWARD-->POSTROUTING
规则格式: iptables [-t table] COMMADN 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:numbers,以数字格式显示地址和端口号
-v:verbose,详细信息
-x:exactly,显示计数器结果的精确值
--line-numbers:显示规则的序号
列如:iptables -L INPUT #指定显示INPUT
iptables -vnL INPUT #显示详细信息
匹配条件:
基本匹配条件:无需加载任何模块,有iptables/netfilter自行提供:
-s:检查报文中的源ip地址是否符合此处指定的地址范围;
-d:检查报文的目标ip地址是否符合此处指定的地址范围;
所有地址:0.0.0.0/0
-p:{tcp|udp|icmp} ,不指定默认所有协议
-i:数据报文流入的接口,只能应用与数据报文流入的环节,只能应用PREROUTING,INPUT,FORWARD链
-o:数据报文流出的接口,只能应用与数据报文流入的环节,只能应用PREROUTING,INPUT,FORWARD链
扩展匹配条件:需要加载扩展模块,方可生效;
隐式扩展:不需要手动加载扩展模块,因为它们是对协议的扩展,所有,但凡使用-p指定了协议,就表示已经指明了要扩展的模块
tcp:
--sport[port] :匹配报文的源端口,可以是端口范围,连续端口可以这样写,列如 22:23
--dport[port] :匹配报文的目标端口,可以是端口范围
--tcp-flags mask comp
列如:--tcp-flags SYN,ACK,FIN,RST :要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,其余的必须为0
--syn :用户匹配第一次握手,相当于"--tcp-flags SYN,ACK,FIN,RST SYN"
例如:iptables -I INPUT -d 192.168.1.110 -p tcp --dport 22 -j ACCEPT
iptables -I OUTPUT -s 192.168.1.110 -p tcp --sport 22 -j ACCEPT
#开放本机ssh服务的22端口
udp:
--sport[port] :匹配报文的源端口,可以是端口范围
--dport[port] :匹配报文的目标端口,可以是端口范围
icmp:
--icmp-type
echo-request 8 #请求
ehco-reply 0 #回答
例如:iptables -I OUTPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -I INPUT -p icmp --icmp-type 0 -j ACCEPT
#可以ping通其他主机
iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -I OUTPUT -p icmp --icmp-type 0 -j ACCEPT
#可以被其他主机ping通,
显示扩展:必须使用 -m 选项指明要调用的扩展模块的扩展机制
1.multiport
以离散或连续的 方式定义端口匹配条件,最多15个
multiport --dports [port:port]:指定多个目标端口 ,离散端口以逗号",隔开,连续端口以冒号":"隔开
multiport --sports [port:port]:指定多个源端口
例如: iptables -I INPUT -d 192.168.1.110 -p tcp -m multiport --dports 22,80,443,3306 -j ACCEPT
iptables -I OUTPUT -s 192.168.1.110 -p tcp -m multiport --sports 22,80,443,3306 -j ACCEPT
#一次性开发 22,80,443,3306 等端口.
2.iprange
以连续地址块的方式来指明多个ip地址匹配条件
iprange --dst-range[ip范围]
iprange --src-range[ip范围]
例如: iptables -I OUTPUT 2 -s 192.168.1.110 -p tcp --sport 23 -m iprange --dst-range 192.168.1.10-192.168.1.20 -j ACCEPT
iptables -I INPUT 2 -d 192.168.1.110 -p tcp --dport 23 -m iprange --src-range 192.168.1.10-192.168.1.20 -j ACCEPT
#开启23端口,只允许192.168.1.110到192.168.1.120这个网段访问
3.time
--timestart hh:mm:ss #起始时间
--timestart hh:mm:ss #结束时间
--weekdays day[day,day....] #每周的那几天
--monthdays day[day,day,...] #每月内的那几日
--kerneltz #使用内核的配置的时区而默认的UTC,centos6 不用加这一项
例如:iptables -I INPUT 3 -d 192.168.1.110 -p tcp --dport 23 -m iprange --src-range 192.168.1.30-192.168.1.50 -m time --timestart 8:00:00 --timestop 17:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT
iptables -R OUTPUT 3 -s 192.168.1.110 -p tcp --sport 23 -m iprange --dst-range 192.168.1.30-192.168.1.50 -m time --timestart 8:00:00 --timestop 17:00:00 --weekdays 1,2,3,4,5 --kerneltz -j ACCEPT
#开启23端口,只允许192.168.1.110到192.168.1.120这个网段访问,而且只有一到星期五 8点到17点之间能被访问
4.string
--algo{kmp|bm}
--string "pattern"
--hex-string "pattern"
--from offset
--to offset
列如: iptables -I OUTPUT -s 192.168.1.110 -m string --algo kmp --string "过滤的内容" -j REJECT
#过滤指定出站内容,只需限制出站报文
5.connlimit
--connlimit-upto n
--connlimit-above n
列如:iptables -R INPUT 1 -d 192.168.1.110 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
#--connlimit-upto 2 :最大2个连接
#单ip并发连接限制,只需限制请求方
6.limit
--limit rete[/second|/minute|/hour|/day]
--limit-burst "number"
列如:iptables -I INPUT 4 -d 192.168.1.110 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 10/minute -j ACCEPT
# --limit-burst 5 :一次最多ping5个报文
# --limit 10/minute :平均一分钟十次
7.state
--state state
NEW: 新连接请求
ESTABLISHED:已建立的连接
INVALID:无法识别的连接
RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接
UNTRACKED:未追踪的连接
追踪的连接:
/proc/net/nf_conntrack
调整可记录的连接数量最大值;
/proc/sys/net/nf_conntrack_max
超长时长:
/proc/sys/net/netfliter/*timeout*
列如: iptables -A INPUT -d 192.168.1.110 -p tcp -m multiport --dports 22,3306,80,139,445,23 -m state --state NEW -j ACCEPT
#开放 22,3306,80,139,445,23 等端口,所有新连接入站
iptables -I INPUT -d 192.168.1.110 -m state --state ESTABLISHED -j ACCEPT
#开放所有已建立的请求入站
iptables -I OUTPUT -s 192.168.1.110 -m state --state ESTABLISHED -j ACCEPT
#开放所有以建立的请求出站
保存和载入规则:
保存规则:iptables-save >/etc/sysconfig/iptables
重载规则:iptables-restore </etc/sysconfig/iptables
-n :不清除原有规则
-t :仅分析生成规则集,但不提交
centos6:
保存规则:
service iptables save
规则保存于:/etc/sysconfig/iptables :覆盖保存
重载规则:
service iptables restart
默认重载:/etc/sysconfig/iptables
规则优化的思路:
(1)优先放行双方状态为ESTABLISHED的报文
(2)服务于不同类别的功能的规则,匹配的报文可能性更大的放前面
(3)服务于同一类别的功能的规则,匹配条件比较严的放在前面
(4)设置默认策略,白名单机制
1.iptables -P REJECT ,不建议修改默认策略,万一不小心 iptables -F ,ssh服务就被拒绝,这样服务器都连不上
2.建议在规则的最后定义规则作为默认策略,然后在开放需要使用的服务,这样提高服务器的安全性.
列如:iptables -A INPUT -j REJECT #拒绝所有流入本机报文
iptables -A OUTPUT -j REJECT #拒绝本机出去的报文
2.iptables: FORWARD
下图是配置forward拓展图
[root@master ~]# sysctl -w net.ipv4.ip_forward=1
#开启核心装发功能
[root@master ~]# iptables -A FORWARD -j REJECT
#先关闭转发功能,然后在自己定义规则
[root@master ~]# iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
#开放所有已建立的请求转发
[root@salve ~]# route add default gw 192.168.1.23
#设置默认网关为192.168.1.23
[root@public ~]# route add -net 192.168.1.0/24 gw 172.16.30.125 dev ens33
#添加网络网关,到达192.168.1.0这个网络,必须经由172.16.30.125网关
注意:如果没添加网络网关就只能收到请求报文,而无法响应
[root@master ~]# iptables -I FORWARD 2 -s 192.168.1.0/24 -j ACCEPT
#指定192.168.1.0/24,能访问外网
[root@master ~]# iptables -I FORWARD 3 -d 192.168.1.0/24 -j ACCEPT
#指定192.168.1.0/24,能被外网服务访问
[root@master ~]# iptables -I FORWARD 3 -d 192.168.1.22 -p tcp -m multiport --dports 22:23,443,80,3306 -j ACCEPT
#开放内网192.168.1.22 服务器; 22,23,443,80,3306端口,给所有主机访问
[root@master ~]#iptables-save /etc/sysconfig/iptables
#保存规则
注意:以上所有的操作是在一台有两张网卡服务器,一个内网地址,一个外网地址,然后配置规则FORWARD转发,使其他外网主机能访问内网的主机,然后内网主机也能访问外网
iptables:NAT地址装换:
NAT:network address translation
请求报文:有管理员定义
响应报文:有NAT的conntrack(连接追踪机制)机制自动实现
请求报文:
改源地址:SNAT
改目标地址:DNAT
iptables/netfilter
NAT定义在nat表:
PREROUTING,INPUT,OUTPUT,POSTROUTING
SNAT:POSTROUTING
DNAT:PREROUTING
target:
SNAT:
--to-source [ip地址]
DNAT:
--to-destination [IP地址][port]
MASQUERADE:
SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时
REDIRECT:(端口映射)
--to-ports [port]
[root@master ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.16.30.125
#源地址转换,用户隐藏客户端,把192.168.1.0/24网段内的所有主机的访问外界时,ip地址转换为172.16.30.125
[root@master ~]# iptables -t nat -A PREROUTING -d 172.16.30.125 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.22
#目标地址转换,用于隐藏服务器, 把访问172.16.30.125 tcp协议的80端口请求,转发给192.168.1.22
[root@slave~]# iptables -t nat -A PREROUTING -d 192.168.1.22 -p tcp --dport 80 -j REDIRECT --to-ports 8080
#做端口映射,把访问本机的80端口的请求转换为8080
注意:一台主机上面SNAT,DNAT一般不同时使用;目标地址装换范围越小越好,这样更好的隐藏服务器