vsftp&iptables

1、搭建vsftpd,并实现虚拟用户

一、安装所需要程序

# yum groupinstall -y "Development Tools" "Server PlatformDevelopment"

# yum -y install  mariadb-devel mariadb-server vsftpd lftp ftp pam-devel

启动服务:

# systemctl start mariadb.service

编译安装pam_mysql

# Install required build packages

yum install make gcc-c++ autoconf automake libtool rpm-build pam-devel mysql-devel openssl-devel

# Download the fedora source rpm

wget "ftp://ftp.pbone.net/mirror/archive.fedoraproject.org/fedora-secondary/releases/23/Everything/source/SRPMS/p/pam_mysql-0.7-0.20.rc1.fc23.src.rpm"

# Rebuild the RPM, it should say "Wrote blah blah.rpm" at the end

rpmbuild --rebuild pam_mysql-0.7-0.20.rc1.fc23.src.rpm

# Install the Centos Specific RPM

yum localinstall /home/you/rpmbuild/RPMS/x86_64/pam_mysql-0.7-0.20.rc1.el7.centos.x86_64.rpm

[root@node1 x86_64]# rpm -ql pam_mysql

/lib64/security/pam_mysql.so

二、创建虚拟用户账号

1.准备数据库及相关表

首先请确保mysql服务已经正常启动。而后,按需要建立存储虚拟用户的数据库即可,这里将其创建为vsftpd数据库。

mysql> create database vsftpd;

mysql> grant select on vsftpd.* to vsftpd@localhost identified by 'vsftpd';

mysql> grant select on vsftpd.* to [email protected] identified by 'vsftpd';

mysql> flush privileges;

mysql> use vsftpd;

mysql> create table users (

id int AUTO_INCREMENT NOT NULL,

name char(20) binary NOT NULL,

password char(48) binary NOT NULL,

primary key(id)

);

2、添加测试的虚拟用户

根据需要添加所需要的用户,需要说明的是,这里将其密码为了安全起见应该使用PASSWORD函数加密后存储。

mysql> insert into users(name,password) values('abc1',password('abc1'));

mysql> insert into users(name,password) values('abc2',password(abc2'));

三、配置vsftpd

1.建立pam认证所需文件

#vi /etc/pam.d/vsftpd.mysql

添加如下两行

auth required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

account required /lib64/security/pam_mysql.so user=vsftpd passwd=vsftpd host=localhost db=vsftpd table=users usercolumn=name passwdcolumn=password crypt=2

注意:由于mysql的安装方式不同,pam_mysql.so基于unix sock连接mysql服务器时可能会出问题,此时,建议授权一个可远程连接的mysql并访问vsftpd数据库的用户。

2.修改vsftpd的配置文件,使其适应mysql认证

建立虚拟用户映射的系统用户及对应的目录

# useradd -s /sbin/nologin -d /var/ftproot/vuser vuser

# mkdir /var/ftproot/vuser/pub

# chmod a-w /var/ftproot/vuser

请确保/etc/vsftpd.conf中已经启用了以下选项

anonymous_enable=NO

local_enable=YES

write_enable=YES

anon_upload_enable=NO

anon_mkdir_write_enable=NO

chroot_local_user=YES

而后添加以下选项

guest_enable=YES

guest_username=vuser

并确保pam_service_name选项的值如下所示

pam_service_name=vsftpd.mysql

四、启动vsftpd服务

# service vsftpd start

# chkconfig vsftpd on

五、配置虚拟用户具有不同的访问权限

vsftpd可以在配置文件目录中为每个用户提供单独的配置文件以定义其ftp服务访问权限,每个虚拟用户的配置文件名同虚拟用户的用户名。配置文件目录可以是任意未使用目录,只需要在vsftpd.conf指定其路径及名称即可。

1、配置vsftpd为虚拟用户使用配置文件目录

# vim vsftpd.conf

添加如下选项

user_config_dir=/etc/vsftpd/vusers_config

2、创建所需要目录,并为虚拟用户提供配置文件

# mkdir /etc/vsftpd/vusers_config/

# cd /etc/vsftpd/vusers_config/

# touch abc1 abc2

3、配置虚拟用户的访问权限

虚拟用户对vsftpd服务的访问权限是通过匿名用户的相关指令进行的。比如,如果需要让tom用户具有上传文件的权限,可以修改/etc/vsftpd/vusers_config/tom文件,在里面添加如下选项即可。

local_root=/var/ftproot

anon_upload_enable={YES|NO}

anon_mkdir_write_enable={YES|NO}

anon_other_write_enable={YES|NO}

2、简述iptales四表五链及详细介绍iptables命令使用方法

iptales四表

filter:过滤,防火墙;

nat:network address translation;用于修改源IP或目标IP,也可以改端口;

mangle:拆解报文,做出修改,并重新封装起来;

raw:关闭nat表上启用的连接追踪机制;

五链

filter:过滤,防火墙;

nat:network address translation;用于修改源IP或目标IP,也可以改端口;

mangle:拆解报文,做出修改,并重新封装起来;

raw:关闭nat表上启用的连接追踪机制;

表上可以使用的链

raw:PREROUTING, OUTPUT

mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING

filter:INPUT,FORWARD,OUTPUT

报文流向:

流入本机:PREROUTING --> INPUT

由本机流出:OUTPUT --> POSTROUTING

转发:PREROUTING --> FORWARD --> POSTROUTING

iptables命令:

高度模块化,由诸多扩展模块实现其检查条件或处理动作的定义;

/usr/lib64/xtables/

IPv6:libip6t_

IPv4:libipt_, libxt_

iptables [-t table] {-A|-C|-D} chain rule-specification

iptables [-t table] -I chain [rulenum] rule-specification

iptables [-t table] -R chain rulenum rule-specification

iptables [-t table] -D chain rulenum

iptables [-t table] -S [chain [rulenum]]

iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]

iptables [-t table] -N chain

iptables [-t table] -X  [chain]

iptables [-t table] -P chain target

iptables [-t table] -E old-chain-name new-chain-name

rule-specification = [matches...]  [target]

match = -m matchname [per-match-options]

target = -j targetname [per-target-options]

规则格式:iptables  [-t table]  COMMAND  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:numberic,以数字格式显示地址和端口号;

-v:verbose,详细信息;

-vv, -vvv

-x:exactly,显示计数器结果的精确值;

--line-numbers:显示规则的序号;

chain:

PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING

匹配条件:

基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;

[!] -s, --source  address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;

[!] -d, --destination address[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;

所有地址:0.0.0.0/0

[!] -p, --protocol protocol

protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or  "all"

{tcp|udp|icmp}

[!] -i, --in-interface name:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;

[!] -o, --out-interface name:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;

处理动作:

-j targetname [per-target-options]

ACCEPT

DROP

REJECT

显式扩展:必须要手动加载扩展模块, [-m matchname [per-match-options]];

显式扩展:必须使用-m选项指明要调用的扩展模块的扩展机制;

1、multiport

This  module  matches  a  set  of  source  or  destination  ports. Up  to 15 ports can be specified.  A port range (port:port) counts as two ports.  It can only be used in conjunction with one of the following protocols: tcp,  udp, udplite, dccp and sctp.

以离散或连续的 方式定义多端口匹配条件,最多15个;

[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口;

[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;

# iptables -I INPUT  -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT

2、iprange

以连续地址块的方式来指明多IP地址匹配条件;

[!] --src-range from[-to]

[!] --dst-range from[-to]

# iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT

3、time

This  matches  if the packet arrival time/date is within a given range.

--timestart hh:mm[:ss]

--timestop hh:mm[:ss]

[!] --weekdays day[,day...]

[!] --monthdays day[,day...]

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

--kerneltz:使用内核配置的时区而非默认的UTC;

4、string

This modules matches a given string by using some pattern matching strategy.

--algo {bm|kmp}

[!] --string pattern

[!] --hex-string pattern

--from offset

--to offset

~]# iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT

5、connlimit

Allows  you  to  restrict  the  number  of parallel connections to a server per client IP address (or client address block).

--connlimit-upto n

--connlimit-above n

~]# iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT

6、limit

This  module  matches  at  a limited rate using a token bucket filter.

--limit rate[/second|/minute|/hour|/day]

--limit-burst number

~]# iptables -I OUTPUT -s 172.16.0.7 -p icmp --icmp-type 0 -j ACCEPT

限制本机某tcp服务接收新请求的速率:--syn, -m limit

7、state

The "state" extension is a subset of the "conntrack" module.  "state" allows access to the connection tracking state for this packet.

[!] --state state

INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED.

NEW: 新连接请求;

ESTABLISHED:已建立的连接;

INVALID:无法识别的连接;

RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;

UNTRACKED:未追踪的连接;

state扩展:

内核模块装载:

nf_conntrack

nf_conntrack_ipv4

手动装载:

nf_conntrack_ftp

追踪到的连接:

/proc/net/nf_conntrack

调整可记录的连接数量最大值:

/proc/sys/net/nf_conntrack_max

超时时长:

/proc/sys/net/netfilter/*timeout*

处理动作(跳转目标):

-j targetname [per-target-options]

简单target:

ACCEPT, DROP

扩展target:

REJECT

This is used to send back an error packet in response to the matched packet: otherwise it is equivalent to  DROP  so it  is  a  terminating  TARGET,  ending  rule traversal.

--reject-with type

The type given can be icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreach‐ able, icmp-net-prohibited, icmp-host-prohibited, or icmp-admin-prohibited (*), which return  the  appropriate ICMP  error  message (icmp-port-unreachable is the default).

LOG

Turn  on  kernel  logging of matching packets.

--log-level

--log-prefix

默认日志保存于/var/log/messages

RETURN:

返回调用者;

自定义链做为target:

你可能感兴趣的:(vsftp&iptables)