root@remote:/# uname -r 3.16.0-4-amd64 root@remote:/e# lsb_release No LSB modules are available. root@remote:/# lsb_release -a No LSB modules are available. Distributor ID: Debian Description: Debian GNU/Linux 8.6 (jessie) Release: 8.6 Codename: jessie
hubery@remote:~$ sudo apt-get install vsftpd ftp -y
html
重启vsftpd后才能使得更改的配置生效sudo systemctl restart vsftpd
默认配置:linux
hubery@remote:~$ cat /etc/vsftpd.conf | grep -v "^#" | grep -v "^$" listen=NO listen_ipv6=YES anonymous_enable=NO local_enable=YES dirmessage_enable=YES use_localtime=YES xferlog_enable=YES connect_from_port_20=YES secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key ssl_enable=NO
此时vsftpd已经在运行:shell
hubery@remote:~$ sudo systemctl status vsftpd.service ● vsftpd.service - vsftpd FTP server Loaded: loaded (/lib/systemd/system/vsftpd.service; enabled) Active: active (running) since 四 2016-12-29 02:55:14 EST; 5min ago Main PID: 17653 (vsftpd) CGroup: /system.slice/vsftpd.service └─17653 /usr/sbin/vsftpd /etc/vsftpd.conf 12月 29 02:55:14 remote systemd[1]: Started vsftpd FTP server. hubery@remote:~$ sudo netstat -lpn | grep vsftpd tcp6 0 0 :::21 :::* LISTEN 17653/vsftpd
vsftp使用系统用户来登录,任何能够登陆系统的用户均可以登录vsftpd浏览器
hubery@remote:~$ ftp localhost Connected to localhost. 220 (vsFTPd 3.0.2) Name (localhost:hubery): 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> 221 Goodbye.
可是为了安全,咱们建立普通用户,这个用户能够登陆vsfptd,可是不能SSH登录系统安全
hubery@remote:~$ sudo bash -c "echo '/bin/false' >> /etc/shells" hubery@remote:~$ sudo useradd -m jack -s /bin/false hubery@remote:~$ sudo passwd jack Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully hubery@remote:~$ ls ~jack hubery@remote:~$ sudo dd if=/dev/zero of=~jack/file.64MB bs=1M count=64 64+0 records in 64+0 records out 67108864 bytes (67 MB) copied, 0.0278935 s, 2.4 GB/s hubery@remote:~$ ls -lh ~jack total 64M -rw-r--r-- 1 root root 64M 12月 29 03:14 file.64MB hubery@remote:~$ su jack Password: hubery@remote:~$ echo $? 1
hubery@remote:~$ ftp -d -v localhost Connected to localhost. 220 (vsFTPd 3.0.2) ftp: setsockopt: Bad file descriptor Name (localhost:hubery): jack ---> USER jack 331 Please specify the password. Password: ---> PASS XXXX 500 OOPS: vsftpd: refusing to run with writable root inside chroot() Login failed. ---> SYST 421 Service not available, remote server has closed connection ftp> ---> QUIT 221 Goodbye.
配置文件/etc/vsftpd.conf添加一行allow_writeable_chroot=YES
,重启vsftpdbash
hubery@remote:~$ cd tmp/ hubery@remote:~/tmp$ dd if=/dev/zero of=file.32MB bs=1M count=16 16+0 records in 16+0 records out 16777216 bytes (17 MB) copied, 0.0147825 s, 1.1 GB/s hubery@remote:~/tmp$ ls file.32MB hubery@remote:~/tmp$ ftp -d -v localhost Connected to localhost. 220 (vsFTPd 3.0.2) ftp: setsockopt: Bad file descriptor Name (localhost:hubery): jack ---> USER jack 331 Please specify the password. Password: ---> PASS XXXX 230 Login successful. ---> SYST 215 UNIX Type: L8 Remote system type is UNIX. Using binary mode to transfer files. ftp> ls ftp: setsockopt (ignored): Permission denied ---> EPRT |2|::1|59080| 200 EPRT command successful. Consider using EPSV. ---> LIST 150 Here comes the directory listing. -rw-r--r-- 1 0 0 67108864 Dec 29 03:14 file.64MB 226 Directory send OK. ftp> !ls /bin/bash file.32M ftp> ---> QUIT 221 Goodbye.
FTP两种模式的区别:
(1)PORT(主动)模式服务器
所谓主动模式,指的是FTP服务器“主动”去链接客户端的数据端口来传输数据,其过程具体来讲就是:客户端从一个任意的非特权端口N(N>1024)链接到FTP服务器的命令端口(即tcp 21端口),紧接着客户端开始监听端口N+1,并发送FTP命令“port N+1”到FTP服务器。而后服务器会从它本身的数据端口(20)“主动”链接到客户端指定的数据端口(N+1),这样客户端就能够和ftp服务器创建数据传输通道了。网络
(2)PASV(被动)模式并发
所谓被动模式,指的是FTP服务器“被动”等待客户端来链接本身的数据端口,其过程具体是:当开启一个FTP链接时,客户端打开两个任意的非特权本地端口(N >1024和N+1)。第一个端口链接服务器的21端口,但与主动方式的FTP不一样,客户端不会提交PORT命令并容许服务器来回连它的数据端口,而是提交PASV命令。这样作的结果是服务器会开启一个任意的非特权端口(P > 1024),并发送PORT P命令给客户端。而后客户端发起从本地端口N+1到服务器的端口P的链接用来传送数据。(注意此模式下的FTP服务器不须要开启tcp 20端口了)app
两种模式的比较:
(1)PORT(主动)模式模式只要开启服务器的21和20端口,而PASV(被动)模式须要开启服务器大于1024全部tcp端口和21端口。
(2)从网络安全的角度来看的话彷佛ftp PORT模式更安全,而ftp PASV更不安全,那么为何RFC要在ftp PORT基础再制定一个ftp PASV模式呢?其实RFC制定ftp PASV模式的主要目的是为了数据传输安全角度出发的,由于ftp port使用固定20端口进行传输数据,那么做为黑客很容使用sniffer等探嗅器抓取ftp数据,这样一来经过ftp PORT模式传输数据很容易被黑客窃取,所以使用PASV方式来架设ftp server是最安全绝佳方案。
所以:若是只是简单的为了文件共享,彻底能够禁用PASV模式,解除开放大量端口的威胁,同时也为防火墙的设置带来便利。
不幸的是,FTP工具或者浏览器默认使用的都是PASV模式链接FTP服务器,所以,必需要使vsftpd在开启了防火墙的状况下,也可以支持PASV模式进行数据访问。
iptables配置: 主动模式使用20端口来传输数据,须要同时打开
hubery@remote:~$ sudo iptalbes -I INPUT 4 -m state --state NEW -p tcp --dport 21 -j ACCEPT hubery@remote:~$ sudo iptalbes -I INPUT 4 -m state --state NEW -p tcp --dport 20 -j ACCEPT
尽管如此,因为vsftpd须要主动链接ftp客户端监听的端口,致使部分操做失败。这样就须要关闭客户端所在机器的防火墙www@localhost:~$ sudo iptables -F
ftp> ls ftp: setsockopt (ignored): Permission denied ---> PORT 192,168,0,156,86,3 200 PORT command successful. Consider using PASV. ---> LIST 425 Failed to establish connection.
由于主动模式下须要关闭客户机的防火墙,加上使用固定端口20传输数据易被抓取,被动模式才是被普遍采用的模式。默认状态下,vsftpd使用任意非特权端口传输数据,这里给它限定一个范围7000~800,在配置文件后添加下面两句。
pasv_enable=yes pasv_min_port=7000 pasv_max_port=8000
并配置防火墙sudo iptables -I INPUT 4 -p tcp --dport 7000:8000 -j ACCEPT' 加载内核模块(可能不是必选项), ```bash root@remote:/# modprobe ip_conntrack_ftp root@remote:/# modprobe ip_nat_ftp ``` 永久加载须要在
/etc/modules-load.d/modules.conf文件尾添加 ``` ip_conntrack_ftp ip_nat_ftp ``` ftp被动模式链接
ftp -p remoteIP####(6)配置SSL安全链接 编辑
/etc/vsftpd.conf`去注释或添加
pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key ssl_enable=YES force_local_data_ssl=NO force_local_logins_ssl=NO require_cert=NO
配置以后:
root@remote:/# cat /etc/vsftpd.conf | grep -v "^#" | grep -v "^$" listen=NO listen_ipv6=YES anonymous_enable=NO local_enable=YES write_enable=YES local_umask=022 dirmessage_enable=YES use_localtime=YES xferlog_enable=YES connect_from_port_20=YES ascii_upload_enable=YES ascii_download_enable=YES ftpd_banner=Welcome to blah FTP service. chroot_local_user=YES secure_chroot_dir=/var/run/vsftpd/empty pam_service_name=vsftpd rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key ssl_enable=YES force_local_data_ssl=NO force_local_logins_ssl=NO require_cert=NO allow_writeable_chroot=YES pasv_enable=yes pasv_min_port=7000 pasv_max_port=8000
参考:
vsftpd doc
vsftpd的主动模式与被动模式
vsftpd被动模式配置
vsftpd:500 OOPS: vsftpd: refusing to run with writable root inside chroot ()错误的解决方法
Installing and configuring FTP server vsftpd.
vsftpd与/bin/false、/sbin/nologin