分类: LINUX
2012-09-06 10:26:38
FTP
(file transport protocol文件传输协议)
1,2种工作模式:
主动模式:使用端口20和21
被动模式:使用端口21和随机端口
2,安装包:vsftpd。。。。。。。(very secure ftp非常安全的ftp)
3,配置文件:/etc/vsftpd/vsftpd.conf
4,默认匿名用户根目录/var/ftp/pub
用户默认根目录为用户自身家目录;
第一季
----------------------------------配置文件
打开/etc/vsftpd/vsftpd.conf文件
Anon_anble=YES 全局下允许匿名用户登陆
anon_max_rate= 匿名用户下载最大速度
anon_root= 指定匿名用户登录ftp后的家目录
anon_upload_enable=YES 是否允许匿名用户上传
anon_mkdir_write_enable=YES是否允许匿名用户创建文件夹
anon_mkdir_write_enable=YES 匿名用户可以在一个具备写权限的目录中创建目录
anon_world_readable_only=YES 匿名用户只具备下载权限
local_enable=YES 全局下允许本地用户登陆
write_enable=YES 全局允许本地用户具有写入权限
local_umask=022 本地用户上传文件的umask值为644
dirmessage_enable=YES 设置用户切换到一个目录时显示目录切换信息
xferlog_enable=YES 开启日志
connect_from_port_20=YES 连接端口
chown_uploads=YES 是否更改(锁定)上传文件的拥有人
chown_username=whoever 将上传的文件拥有人改为(与上面的结合使用)
xferlog_file=/var/log/vsftpd.log
xferlog_std_format=YES 传输日志文件将以标准xferlog的格式书写,默认为/var/log/xferlog
idle_session_timeout=600 空闲时间超时
data_connection_timeout=120 数据连接时间超时
ascii_upload_enable=YES 是否可用ASCII模式上传
ascii_download_enable=YES 是否可用ASCII模式下载
ftpd_banner=Welcome to blah FTP service. 设置登陆信息
eny_email_enable=YES
(default follows)
banned_email_file=/etc/vsftpd/banned_emails
chroot_local_user=YES 本地所有用户锁定在登陆目录不能跳转
chroot_list_enable=YES 开启用户目录锁定
(default follows)
chroot_list_file=/etc/vsftpd/chroot_list 写在chroot_list中的用户不能跳出家目录
listen=YES
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES 是否允许使用wrapers控制
dirlist_enable=YES 默认是允许列出共享目录下的目录的
hide_ids=NO 默认是不隐藏文件的拥有人和拥有组,改为yes后将看到所有文件的拥有人和拥有组变为ftp
force_dot_file=NO 默认不显示隐藏文件(即。开头文件)
cmds_allowed =YES 默认允许登录ftp后运行命令
Listen_port=21 监听端口
ftp_data_port=20 指定数据通道端口
pasv_enable=YES 默认为pasv被动模式
pasv_min_port= 指定pasv模式下端口的范围
pasv_max_port=
port_enable = NO 模式改为主动模式
guest_enable=YES 所有非匿名用户被映射为一个特定的本地用户(虚拟用户)
guest_username= 设置虚拟用户的用户名
one_proces_model =YES 每个ip单一进程模式
user_config_dir = 指定用户个人配置
第二季
------------------具体参数使用
参数一:因为匿名用户登陆后默认是在/var/ftp/pub下,本地用户登陆后默认是在自己的家目中中,那么我们可以更改他们登陆的家目录么?
答案是肯定的,首先指定匿名用户登陆的家目录:anon_root=/data
指定本地用户登陆的家目录:local_root=/data
我们把匿名用户和本地用户锁定在了/data/目录中;
然后重启服务测试:
匿名用户
本地用户:
参数二:锁定家目录不允许跳出
chroot_local_user=YES 本地所有用户锁定在登陆目录不能跳转
chroot_list_enable=YES 开启用户目录锁定
chroot_list_file=/etc/vsftpd/chroot_list 写在chroot_list中的用户不能跳出家目录
首先我们把第一个注释掉(默认都是注释的)
然后下面2个开启,在/etc/vsftpd/下面建一个文件chroot_list
如果要限制用户不能跳出家目录,就将用户写到chroot_list里面,一个用户一行
重启服务
测试:
这里可以看到怎么切换都没有跳出目录;
但是问题来了,如果要限制非常多的用户不能跳出,那要写入chroot_list的内容就太多了,但是我们可以反向管理,允许所有人不能跳出,仅仅几个人可以跳出;
这里就用到了刚刚第一个被注释的参数:chroot_local_user=YES
它的意思是,如果启用这个参数,则默认所有本地用户不能跳出,但是写在chroot_list中的用户可以跳出
这里我们来测试一下,把user1写到chroot_list中,
重启服务:
可以看出user1用户已经可以切换目录了;
参数三:chown_uploads=YES 是否更改(锁定)上传文件的拥有人
chown_username=whoever 将上传的文件拥有人改为(与上面的结合使用)
ftpd_banner=Welcome to blah FTP service. 设置登陆信息
这里我们先看一下登陆时的显示信息:
这里可以看到vsFTPd 2.2.2是ftp的版本信息,那么我们可以通过更改第三个参数来设置,我们改为:hello ,connect me please!
然后重启服务
可以看到登陆信息已经更改;
然后我们来看,用户上传文件后,文件的拥有人是谁,
先用匿名用户上传一个文件:
然后查看一下文件22的拥有人:
可以看到文件的拥有人为ftp
那么我们可以限制让文件拥有人变为root
更改
chown_uploads=YES
chown_username=root
然后重启服务测试:
这里可以看到文件拥有人已经变成了root
参数四:
用户下载限速(有点像迅雷普通用户和vip用户下载速度不一样的的情况)
1,全局限速:
Local_max_rate=50000(单位为byte)
这里我们限速为50kb,下面来测试一下,我在/var/ftp/pub里面建立一个大小为100M的文件test,然后下载:
这时我们来下载这个文件
可以看到下载的速度为202897.84kb/s,也就说在20M/s左右,下面我们连限制他的速度在100kb左右,
1,在主配置文件里面加入user_config_dir=/etc/vsfptd/(这个目录可以自己指定)
2,之前的全局限速配置不要改
3,将vsftpd.conf文件复制到上面指定的目录/etc/vsftpd中并改名,如果对user1用户限制就改名为user1,
4,编辑user1文件,添加local_max_root=100000
5,重启服务
看组图:
主配置文件:
将vsftpd.conf文件复制为user1:
编辑user1文件:
测试:
可以看到速度仅仅100kb左右,这样就对个人进行限速成功了
在selinux关闭的情况下:
问题一:
指定用户访问
在vsftpd.conf配置文件里面,最下面有个参数
1,Userlist_enable=YES
如果配置文件中仅只有这一条配置,那么只要是在/etc/vsftpd下的user_list文件中写入用户名,那么被写入的用户将不能访问ftp
2,如果配置文件中同时有userlist_enable 和userlist_deny
那么要分情况了,分2种情况
情况一:
如果要求仅几个能访问,其他都不能访问,(即只能几个指定的能访问,其别的都不能访问)
那么就要这样写:userlist_enable=YES
Userlist_deny=NO
然后在/etc/vsftpd下的user_list文件中加入你指定的可以访问的用户名(其实是登陆名或者说是你本地建立的用户名,如user1 user2.。)
不管ftpusers文件,那么仅有写入到user_list 中的用户可以访问,其他用户都不能访问
情况二:
如果要求仅仅几个指定的用户不能访问(其实是登录名或者本地建立的用户),其他都能访问
那么这样写:userlist_enable=NO
Userlist_deny=YES
然后在/etc/vsftpd的ftpusers文件中加入拒绝的用户名,不用管user_list文件,那么除了加入ftpuser中的用户不能访问,其别的都可以访问
问题二:
如果要拒绝一些网段的机器访问ftp服务器(注意这里一些机器访问ftp时,登陆还是需要问题一里面的用户名和密码的)
这个就跟user_list ftpusers文件没关系了,而是要在防火墙里面设置或者/etc/hosts.allow 和/etc/host.deny里面来设置
如果仅拒绝一些网段的访问,那么就只需要在/etc/hosts.deny里面加入
Vsftpd: 域名或者网段
也可以在/etc/hosts.allow里面加入
Vsftpd: 域名或者网段 :DENY
如果仅允许一些网段的访问
那么可以在/etc/hosts.allow里面加入
Vsftpd :域名或者网段
然后在/etc/hosts.deny里面加入
Vsftpd: all
或者仅仅在/etc/hosts.deny中加入
Vsftpd:域名或者网段:ALLOW
问题三:
关于用户上传和下载问题
1,对于匿名用户
一般如果不在vsftpd.conf配置文件里面指定匿名用户登陆ftp的根目录
那么默认就是在/var/ftp下的
在不更改任何配置的情况下匿名用户是可以访问和下载的,但是没有上传和创建目录的权限
如果我们要有上传和创建目录的权限,那么
首先,在配置文件中去掉anon_upload_enable=YES(允许上传)和anon_mkdir_write_enable=YES(可以创建目录)的注释
很多人认为这样就对ftp服务器有上传和创建目录的权限了,但是他们错了
因为你还要考虑ftp共享出来的目录的权限
所以你必须要对共享的目录具有wrx的权限,所以这里最好的办法就是把共享目录的拥有人改为ftp(chown ftp /var/ftp/pub这样我们就共享了pub目录,)
注意,这里千万不要写成chown ftp /var/ftp了 如果这样他会提示匿名用不不能具有root的权限,因为这里/var/ftp是匿名用户的根目录,而不是共享目录,这样以后匿名用户就具有上传和创建目录的权限了
2,对于本地用户
一般如果不在vsftpd.conf配置文件里面指定用户的ftp根目录,那么默认就是用户自己的家目录
那么当用户访问ftp服务器的时候,你会发现用户有上传和下载的权限,这时因为用户对自己家目录用户所有权限的
但是如果你限定了用户的根目录后,你会发现你没了上传的权限,那是因为共享目录的权限问题
例如我们将用户的根目录限定为/var/ftp,那么我们就要在配置文件中加一个条目: local_root=/etc/ftp
这样就改变了用户的家目录了,然后我们把pub共享给用户,但是这里我们不能像匿名用户那样直接把pub目录的拥有人改为用户,因为这样就会导致匿名用户失去了上传等权限了,所以这里我们可以把pub的other权限改一下
Chmod o+w pub 然后就可以具有上传权限了 或者将pub的组改为用户所在的组,然后改pub的组权限
这样就解决问题了
在开启selinux情况下
如果在没开启selinux情况下都满足了需求,那么开启selinux后
1,对于匿名用户
开启selinux后,你会发现在没selinux的情况下可以上传和建立目录的权限,但是开启selinux后却不能了,这是因为selinux挡住了,这里我们要更改一下布尔值 setsebool –P allow_ftpd_anon_write on
这样你就可以上传和创建目录了
2,对于用户
如果不更改配置文件,那么用户的根目录就是自己的家目录,但是开启selinux你会发现登陆不能成功,那么我们就要改一下布尔值
Setsebool –P ftp_home_dir on
这样就可以了
但是如果改变了根目录后,你会发现共享出来的文件你都不能下载,那么可以改content值来实现
这里我们可以 man ftpd_selinux来看一下
所以这里我们可以chcon –t –R public_content_rw_t /var/ftp/pub
Setsebool –P allow_ftpd_full_access on
这样就可以了
-------------------------------FTP 相关防火墙
大多数的TCP服务是使用单个的连接,一般是客户向服务器的一个周知端口发起连接,然后使用这个连接进行通讯。但FTP协议却是例外,它使用双向的多个连接 ,而且使用的端口很难预计。
FTP连接包括:
一个控制连接 (control connection)
这个连接用于传递客户端的命令和服务器端对命令的响应。它使用周知的TCP 21端口,生存期是整个FTP会话时间。
N个数据连接 (data connection)
这些连接用于传输文件和其它数据,例如:目录列表等。这种连接在需要数据传输时建立,而一旦数据传输完毕就关闭,每次使用的端口也不一定相同。而且,这种数据连接既可能是客户端发起的,也可能是服务器端发起的。 FTP协议使用一个标准的端口20作为ftp-data端口,但是这个端口只用于连接的源地址是服务器端的情况,在这个端口上根本就没有监听进程。
主动与被动模式
FTP的数据连接和控制连接的方向一般是相反的,即服务器向客户端发起一个用于数据传输的连接。连接的端口是由服务器端和客户端协商确定的,这就是vsftpd的主动模式(port mod)。FTP协议 的这个特征对iptables防火墙和NAT的配置增加了很多困难。在FTP被动模式 (passive mod)下,数据连接是由客户程序发起的,和主动模式相反。
选择模式的原则
1、client 没有防火墙时,用主动模式连接即可
2、server 没有防火墙时,用被动模式即可
3、双方都有防火墙时,vsftpd 设置被动模式高端口范围,server 打开那段范围,client 用被动模式连接即可
是否采取被动模式取决于客户程序,在ftp命令行中使用passive命令就可以关闭/打开被动模式。
在xp命令行模式下使用ftp命令连接ftp服务器,用的是主动模式。浏览器方式下连接ftp服务器,可以修改访问使用的模式。
iptables中配置vsftp
问题:配置iptables后,能够登录到vsftpd服务器,但ls列目录失败(超时)。
分析:
主动模式 下,客户连接 TCP/21,服务器通过 TCP/20 连接客户的随机端口
――――这种情况下,通过状态防火墙可以解决 iptables -A INPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT或者如下:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dport 20,21 -m state --state NEW -j ACCEPT
NEW: 该包想要开始一个新的连接(重新连接或连接重定向)
RELATED:该包是属于某个已经建立的连接所建立的新连接。如FTP的数据传输连接和控制连接之间就是RELATED关系。
ESTABLISHED:该包属于某个已经建立的连接。
INVALID:该包不匹配于任何连接,通常这些包被DROP。
被动模式下,客户连接 TCP/21,客户再通过其他端口连接服务器的随机端口,卡住的原因,是因为服务器在被动模式下没有打开临时端口让 client 连过来。
临时打洞的方法:
优点:不影响ftp配置;缺点: 客户会感觉到连接有些延迟。原因参见ip_conntract的实现原理
在/etc/modprobe.conf中添加
alias ip_conntrack ip_conntract_ftp ip_nat_ftp
在/etc/rc.local中添加
/sbin/modprobe ip_conntract
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
限制被动模式连接端口的方法:
· 优点:对连接速度没有影响。缺点:限制了客户端并发连接的数量。
在/etc/vsftpd/vsftpd.conf中添加
pasv_enable=YES
pasv_min_port=2222
pasv_max_port=2225
iptables中开放这段端口
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 21 -j ACCEPT
-A INPUT -p tcp --dport 2222:2225 -j ACCEPT