1.搭建vsftpd服务器

1.安装vsftpd服务


[root@centos7 ~]#yum install -y vsftpd

2.启动服务

[root@centos7 ~]#systemctl start vsftpd
[root@centos7 ~]#ss -ntl
State      Recv-Q Send-Q           Local Address:Port                          Peer Address:Port              
LISTEN     0      128                          *:111                                      *:*                  
LISTEN     0      5                192.168.122.1:53                                       *:*                  
LISTEN     0      128                          *:22                                       *:*                  
LISTEN     0      128                  127.0.0.1:631                                      *:*                  
LISTEN     0      100                  127.0.0.1:25                                       *:*                  
LISTEN     0      128                          *:43550                                    *:*                  
LISTEN     0      128                         :::111                                     :::*                  
LISTEN     0      128                         :::80                                      :::*                  
LISTEN     0      32                          :::21                                      :::*                  
LISTEN     0      128                         :::22                                      :::*                  
LISTEN     0      128                        ::1:631                                     :::*                  
LISTEN     0      100                        ::1:25                                      :::*                  
LISTEN     0      128                         :::46052                                 :::*   

3.测试

[root@localhost ~]# lftp 192.168.0.109
lftp 192.168.0.109:~> ls
drwxr-xr-x    2 0        0              18 Feb 17 06:19 pub

4.编辑基本设置

[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
 anonymous_enable=NO    #关闭匿名用户登陆

5.创建虚拟用户名字密码文件(该文件使用完删除)

[root@centos7 ~]#vim user.txt    #一行用户一行密码
dcrfan
centos
admin
centos
normal
centos

6.在/etc/vsftpd/ 建立数据文件

[root@centos7 ~]#cd /etc/vsftpd/
[root@centos7 vsftpd]#db_load -T -t hash -f /root/user.txt vuser.db  #生成数据类文件
[root@centos7 vsftpd]#chmod 600 vuser.db   #让文件更加安全
[root@centos7 vsftpd]#ll vuser.db  
-rw------- 1 root root 12288 Feb 17 14:39 vuser.db

7.创建一个虚拟用户映射到的系统用户

[root@centos7 vsftpd]#useradd -d /var/ftpshare -s /sbin/nologin vuser
[root@centos7 vsftpd]#chmod +rx /var/ftpshare
[root@centos7 vsftpd]#chmod -w /var/ftpshare   #去掉根共享目录w权限

8.创建文件夹,并设定权限

[root@centos7 vsftpd]#mkdir /var/ftpshare/upload
[root@centos7 vsftpd]#mkdir /var/ftpshare/download
[root@centos7 vsftpd]#setfacl -m u:vuser:rwx /var/ftpshare/{upload,download}  #给用户vuser赋予目录权限

9.手动创建pam配置文件,使pam文件使用vuser.db

[root@centos7 vsftpd]#vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vuser      
account required pam_userdb.so db=/etc/vsftpd/vuser

10.在vsftpd配置中加入引用pam配置文件验证

[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
guest_enable=YES  #所有系统用户都映射成guest用户
guest_username=vuser  #映射成用户名字
pam_service_name=vsftpd.db  #指定pam配置文件
user_config_dir=/etc/vsftpd/vuser.d   #指定每个用户的子配置文件位置

11.为不同用户创建权限控制(文件名字就是虚拟用户名字)

[root@centos7 vsftpd]#mkdir /etc/vsftpd/vuser.d
vim admin
anon_upload_enable=YES   #允许匿名用户上传
anon_mkdir_write_enable=YES  #允许匿名用户创建目录
anon_other_write_enable=YES  #匿名可删除和修改上传的文件

vim dcrfan
anon_upload_enable=YES      

vim normal
anon_max_rate=102400    #限制匿名用户传输速率上限100k

12.测试admin账号

[root@localhost ~]# lftp -u admin 192.168.0.109
Password: 
lftp [email protected]:~> ls        
drwxrwxr-x    2 0        0               6 Feb 17 06:53 download
drwxrwxr-x    2 0        0               6 Feb 17 06:53 upload
lftp [email protected]:/> cd download
cd ok, cwd=/download
lftp [email protected]:/download> mkdir test    #可以创建目录
mkdir ok, test' created
lftp [email protected]:/download> put ks7.cfg   #可以上传文件
1072 bytes transferred
lftp [email protected]:/download> ls
-rw-------    1 5002     5002         1072 Feb 17 07:40 ks7.cfg
drwx------    2 5002     5002            6 Feb 17 07:39 test
lftp [email protected]:/download> ls         
-rw-r--r--    1 0        0               0 Feb 17 07:43 hh
-rw-------    1 5002     5002         1072 Feb 17 07:40 ks7.cfg
drwx------    2 5002     5002            6 Feb 17 07:39 test
lftp [email protected]:/download> get hh     #可以下载文件
lftp [email protected]:/download> !ls
anaconda-ks.cfg  Documents  hh                    ks6.cfg  Music     Public     Videos
Desktop          Downloads  initial-setup-ks.cfg  ks7.cfg  Pictures  Templates

13.测试dcrfan用户

[root@localhost ~]# lftp  -u dcrfan 192.168.0.109
Password: 
lftp [email protected]:~> ls       
drwxrwxr-x    3 0        0              43 Feb 17 07:43 download
drwxrwxr-x    2 0        0               6 Feb 17 06:53 upload
lftp [email protected]:/> cd upload
lftp [email protected]:/upload> mkdir test        #创建目录失败
mkdir: Access failed: 550 Permission denied. (test)
lftp [email protected]:/upload> put ks6.cfg 
1092 bytes transferred
lftp [email protected]:/upload> cd /download/
lftp [email protected]:/download> get bigtest                  #传输速率没限制
104857600 bytes transferred in 1 second (95.60M/s)

14.测试normal用户

[root@localhost ~]# lftp  -u normal 192.168.0.109
Password: 
lftp [email protected]:~> ls       
drwxrwxr-x    3 0        0              58 Feb 17 07:58 download
drwxrwxr-x    2 0        0              21 Feb 17 07:49 upload
lftp [email protected]:/> cd download
lftp [email protected]:/download> put ks6.cfg    #不可以上传文件
put: Access failed: 550 Permission denied. (ks6.cfg)
lftp [email protected]:/download> ls
-rw-r--r--    1 0        0        104857600 Feb 17 07:58 bigtest
-rw-r--r--    1 0        0               0 Feb 17 07:43 hh
-rw-------    1 5002     5002         1072 Feb 17 07:40 ks7.cfg
drwx------    2 5002     5002            6 Feb 17 07:39 test
lftp [email protected]:/download> get bigtest       #传输速率被限制在100k以下
'bigtest' at 6684672 (6%) 99.0K/s eta:18m [Receiving data] 

2.iptables四表五链

1.Netfilter是集成内核中的防火墙,iptables是防火墙管理工具
iptables由四个表和五个链以及一些规则组成
2.四个表分别是filter、nat、mangle、raw

-filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包 
-nat表:network address translation 地址转换规则表   (修改目标地址 源地址) 
-mangle:修改数据标记位规则表    (打标签分类)
-Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度 (使用比较少)

3.五个内置链chain INPUT OUTPUT FORWARD PREROUTING POSTROUTING (5个检查点)

-PREROUTING:数据包进入路由表之前  (一般dnat、REDIRECT端口转发规则应用)
-INPUT:通过路由表后目的地为本机
-FORWARD:通过路由表后,目的地不为本机 (网络防火墙filter应用地方)
-OUTPUT:由本机产生,向外转发
-POSTROUTIONG:发送到网卡接口之前   (一般snat规则应用)

3.iptables基本用法

1.systemctl stop firewalld 或者 service iptables stop 禁用系统默认规则
CentOS 6 service iptables save 将规则覆盖保存至/etc/sysconfig/iptables文件中
CentOS 7 可用下面方法保存规则

iptables  -S > /PATH/TO/SOME_RULES_FILE
iptables-save  >  /PATH/TO/SOME_RULES_FILE

centos7开机自动重载规则文件中的规则:

/etc/rc.d/rc.local文件添加 
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE 
并加执行权限

2.iptables -nvL 查看所有规则 --line-numbers 查看规则的序号 -x 显示精确数字 -S 显示命令格式规则

3.基本格式


iptables   [-t table]   SUBCOMMAND   chain   [-m matchname [per-match-options]]   -j targetname [per-targetoptions] 

注意事项:默认表为filter,多条规则 前面优先生效,且chain 必须大写,iptables -A INPUT -i lo -j ACCEPT 让自己能访问自己 通常都要设定

4.基本选项

-Z  统计数据包清零
-F 清理规则
-t 指定表    (默认filter表)
-A chain 追加 
-D 删除记录    如 -D INPUT 1
-I chain 插入  默认第一条  如-I INPUT 2  放在第二条
-R 修改规则    如 -R  INPUT 2
-P chain 动作  设置默认规则  (不推荐使用)
-s 源地址
-d 目标地址
-p 指定协议 可使用数字如0(all)  protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or all     参看:/etc/protocols 
-i  报文流入接口   只应用于INPUT、FORWARD、PREROUTING链 
-o  报文流出接口    只应用于INPUT、FORWARD、PREROUTING链 
-j 指定动作  ACCEPT,DROP,REJECT,RETURN, LOG, SNAT, DNAT, REDIRECT, MASQUERADE等

5.定义自定义链

-N:new, 自定义一条新的规则链  
-X:delete,删除自定义的空的规则链  
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也 不能被删除

定义顺序:
a.先定义chain名字
iptables -N WEB
b.定义一系列规则
iptables -A WEB -p tcp -m multiport --dports 80,443 -j ACCEPT
c.用-j把自定义规则放在系统某个chain中
iptables -I INPUT -s 192.168.30.0/24 -j WEB
删除要反着一步一步来
iptables -D INPUT 1
iptables -D WEB 1
iptables -X WEB

6.记录日志功能
LOG: 非中断target,本身不拒绝和允许,放在拒绝和允许规则前 并将日志记录在/var/log/messages系统日志中

--log-level level    级别: emerg, alert, crit, error, warning, notice, info or debug  
--log-prefix prefix 日志前缀,用于区别不同的日志,最多 29个字


iptables -I INPUT  -s 10.0.1.0/24 -p tcp -m multiport -dports 80,21,22,23 -m state --state NEW -j LOG --logprefix "new connections: " 

7.隐式扩展用法:不需要指定模块名
a. tcp协议的扩展选项

--sport port[:port]:匹配报文源端口,可以为端口范围  -p tcp --sport 22    范围 700:800
--dport port[:port]:匹配报文目标端口,可以为范围   -p tcp --dport 445  
--tcp-flags  mask  comp     
 #mask 需检查的标志位列表,用,分隔     例如 SYN,ACK,FIN,RST     
#comp 在mask列表中必须为1的标志位列表,无指定则必须为 0,用,分隔  
--tcp-flags  SYN,ACK,FIN,RST  SYN  
表示要检查 的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下 的必须为0 
 --syn:用于匹配第一次握手  相当于:--tcp-flags  SYN,ACK,FIN,RST  SYN 

b. udp

--sport port[:port]:匹配报文的 源端口;可以是端口范围
--dport port[:port]:匹配报 文的目标端口;可以是端口范围 

c.icmp

--icmp-type {type[/code]|typename}    
type/code   
0  echo-reply   icmp应答报文   
8   echo-request icmp请求报文 
如 -p icmp --icmp-type 8  来拒绝请求报文

8.显式扩展:必须使用-m选项指明模块名
a、multiport扩展
以离散方式定义多端口匹配,最多指定15个端口

--sports port[,port|,port:port]...   指定多个源端口 
--dports port[,port|,port:port]...         指定多个目标端口
--ports port[,port|,port:port]...多个源或目标端口 
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT 

b、iprange扩展
指明连续的(但一般不是整个网络)ip地址范围

--src-range from[-to] 源IP地址范围 
--dst-range from[-to] 目标IP地址范围 
 iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP 

c、mac扩展
指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT chains 只适合进来的包,所以没有目标地址

--mac-source XX:XX:XX:XX:XX:XX   源MAC
iptables -A INPUT -s 172.16.0.100 -m mac  --macsource 00:50:56:12:34:56 -j ACCEPT   并且关系 
iptables -A INPUT -s 172.16.0.100  -j REJECT 

d、string扩展
对报文中的应用层数据做字符串模式匹配检测

 --algo {bm|kmp}:字符串匹配检测算法  (指定一个算法)
--from offset  开始偏移 (可以不写)
--to offset    结束偏移 (可以不写)
--string pattern:要检测的字符串模式 
--hex-string pattern:要检测字符串模式,16进制格式 
iptables -A OUTPUT -s 172.16.100.10  -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT 

一般在FORWARD中设置

e、time扩展
根据将报文到达的时间与指定的时间范围进行匹配

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]  日期 
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 
--timestart hh:mm[:ss]        时间 
--timestop hh:mm[:ss] 
--monthdays day[,day...]   每个月的几号 
--weekdays day[,day...]   星期几 

--kerneltz:内核时区,CentOS7系统默认为UTC,需要换算
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP 

f、connlimit扩展
根据每客户端IP做并发连接数数量匹配 可防止CC(Challenge Collapsar挑战黑洞)***

--connlimit-upto n:连接的数量小于等于n时匹配 
--connlimit-above n:连接的数量大于n时匹配 
通常分别与默认的拒绝或允许策略配合使用
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT 

g、limit扩展
基于收发报文的速率做匹配

--limit rate[/second|/minute|/hour|/day] 
--limit-burst number  设定初始值
iptables -I INPUT  -p icmp --icmptype 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT   (限制icmp请求包。前5个不限制。后面每分钟3个)
iptables -I INPUT 2 -p icmp -j REJECT  不满足拒绝

h、state扩展
根据”连接追踪机制“去检查连接的状态,较耗资源

NEW:新发出请求;将其识别为第一次发出的请求 
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态  (第一次后的状态)
RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之间的关系  (相关的)
INVALID:无效的连接,如flag标记不正确  
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪 
iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport -dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT 
iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport -sports 22,80 -m state --state ESTABLISHED -j ACCEPT 

应用
被动模式开放ftp

modprobe nf_conntrack_ftp   加载跟踪模块 
iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT  开放相关端口功能
iptables -A INPUT -p tcp --dport 21 -m state -state NEW -j ACCEPT   开放21端口 

9.SNAT实现(局域网访问外部网络技术)
作用链POSTROUTING,INPUT
让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
请求报文:修改源IP

iptables -t nat -A POSTROUTING -s LocalNET (被替换源地址) -j SNAT --to-source ExtIP (要替换外网源地址)
如
iptables -t nat -A POSTROUTING -s 10.0.1.0/24  -j SNAT --to-source 172.18.1.6-172.18.1.9 
MASQUERADE:动态IP,如拨号网络 
如
iptables -t nat -A POSTROUTING -s 10.0.1.0/24  -j SNAT --to-source MASQUERADE

10.DNAT实现(发布给外部网络访问的服务)
作用链PREROUTING , OUTPUT
把本地网络中的主机上的某服务开放给外部网络访问(发 布服务和端口映射),但隐藏真实IP
请求报文:修改目标IP


iptables -t nat -A PREROUTING -d ExtIP(外网地址) -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT] (内网地址或端口)
如
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --todestination 10.0.1.22 
 iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --todestination 10.0.1.22:8080 

11.实现端口转发REDIRECT
可用于:PREROUTING OUTPUT 自定义链

--to-ports port[-port] 
iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080 
把用户访问80端口转发到8080

12.PNAT: port nat,端口和IP都进行修改 (利用端口号来区分是哪个用户发出来请求)一般配合SNAT