搭建vsftpd,iptables介绍及使用

搭建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一般不同时使用;目标地址装换范围越小越好,这样更好的隐藏服务器
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值