事情是这样的,我搭的VSFTP服务器在一次重启后竟然外界连不上了,进去系统查看发现服务在正常运行着;内部也可登上排查发现是防火墙iptables的坑。
原来这个iptables规则是临时的,需要写入并save,不然重启后规则就清空了,造成外界无法登陆。
先说解决办法:
iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A OUTPUT -p tcp --dport 20 -j ACCEPT iptables -A OUTPUT -p tcp --dport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 20 -j ACCEPT
再重启vsftp:
systemctl restart vsftpd.service
按理说这样就可以解决了。为了防止下次重启被清空,我们可以保存一下子。
iptables防火墙规则的保存与恢复
iptables-save把规则保存到文件中,再由目录rc.d下的脚本(/etc/rc.d/init.d/iptables)自动装载
使用命令 iptables-save 来保存规则。一般用
iptables-save > /etc/sysconfig/iptables
生成保存规则的文件 /etc/sysconfig/iptables,
也可以用
service iptables save
它能把规则自动保存在/etc/sysconfig/iptables中。
当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。
当然系统版本不同稍有出入,我用:
iptables-save > /etc/iptables.up.rules
插一段小序曲:
当在网上搜索解决方案时,有关于FTP服务的两种工作模式的说法,但我遇到的不是这个问题,但也记录一下,避免遇到
•port方式(主动模式), 连接过程:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时, 客户端在命令链路上用PORT命令告诉服务器:“我打开了***X端口,你过来连接我”。于是服务器从20端口向客户端的***X端口发送连接请求,建立一条数据链路来传送数据。 •pasv方式 ( 被动模式 ), 连接过程:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时, 服务器在命令链路上用PASV命令告诉客户端:“我打开了***X端口,你过来连接我”。于是客户端向服务器的***X端口发送连接请求,建立一条数据链 路来传送数据。 由于服务器上的FTP进行TCP/IP筛选,仅允许特定的端口可以被客户端连接,所以无法使用PASV方式。找到了原因,解决办法也很简单,只需要关闭客户端的PASV方式,强制其用PORT方式访问服务器即可。 客户端登录FTP服务器后,用passive命令关闭客户端的PASV方式,如下: 代码如下
ftp> passive
Passive mode off.
#再次执行该命令就可以启用PASV模式。
所以说要是你不小心开启了passive模式,除了关还有一个办法将就是再开端口给iptables
在iptables里设置允许访问ftp(建立连接,数据传输)
修改ftp配置文件,指定用于数据传输的端口范围为40001-41000,在配置文件最后添加如下两行:
pasv_min_port=40001 pasv_max_port=41000
-A INPUT -p tcp --dport 40001:41000 -j ACCEPT -A OUTPUT -p tcp --dport 40001:41000 -j ACCEPT