FTP:File Transfer Protocol,监听在21/tcp,是在应用层实现的。
FTP有两个信道:
   第一个是命连接,一直处于连接。
   第二个是数据连接,按需建立的。
FTP有两个工作模式:
      一个是主动模式使用port在这个模式下端口是20/tcp。
       一个是被动模块使用pasv,随机的端口
每个数据接口都是独立的,使用哪种工作模式是取决于客户端的,是有客户

端发起的
ftp的相关常见的软件:
    客户端:ftp,lftp,
      windows:flashfxp,cuteftp,filezila;
      linux:gftp
    服务器端:filezilla
      linux;vsftpd,proftpd,pureftp,wuftpd;
      windows:servu
vsftpd:
     安全性检查规则非常严格;轻量级、高性能;支持虚拟用户
ftp用户类型:
         匿名用户(ftp,家目录文件/var/ftp)
  系统用户(各自家目录)
  虚拟用户(映射为一个系统用户)
共享文件系统,权限
         文件系统权限
  共享权限,是交集
ftp的数据传输模式:
       二进制模式
       文本模式
将所有用户都禁锢在家目录下命令: chroot_local_user=YES
只禁锢某些用户:
  chroot_list_enable=YES
  chroot_list_file=/path/to/somefile
tcpdump是过滤条件
tcpdump的语法:
tcpdump [options] [Protocol] [Direction] [Host(s)] [Value]

[Logical Operations] [Other expression]

Protocol(协议):
Values(取值): ether, fddi, ip, arp, rarp, decnet, lat, sca,

moprc, mopdl, tcp and udp.

Direction(流向):
Values(取值): src, dst, src and dst, src or dst;默认是src or dst

Host(s)(主机):
Values(替代关键字): net, port, host, portrange.默认是host
Logical Operations:
Values(取值):and &&,or||,not!.

常用选项:
-i any : 指定监听的接口,如:eth0
-n:不反解主机名称
-nn:即不反解主机名称也不反解域名
-X:捕获到的报文即显示十六机制还有文本格式
-XX:还显示以太网首部
-c #:只抓#就停止了

如何让vsftpd支持虚拟用户:

1.建立虚拟FTP用户的帐号数据库文件
建立虚拟用户的账户名、密码列表
 奇数行为帐号名
 偶数行为上一行中帐号的密码
转化为Berkeley DB格式的数据文件
 db_load 转换工具
 需安装db4-utils软件包
 
[root@filesvr ~]# vim /etc/vsftpd/vusers.list
ni
2345
hao
3456
[root@filesvr ~]# cd /etc/vsftpd/
[root@filesvr vsftpd]# db_load -T -t hash -f vusers.list  

vusers.db
[root@filesvr vsftpd]# file vusers.db
vusers.db: Berkeley DB (Hash, version 8, native byte-order)
[root@filesvr vsftpd]# chown 600 /etc/vsftpd/vusers.*

2.创建FTP根目录及虚拟用户映射的系统用户
[root@filesvr ~]# mkdir /var/ftproot
[root@filesvr ~]# useradd -d /var/ftproot virtual
[root@filesvr ~]# chmod 755 /var/ftproot/

3.建立支持虚拟用户的PAM认证文件
[root@filesvr ~]# vim /etc/pam.d/vsftpd.vu
#%PAM-1.0
auth       required     pam_userdb.so db=/etc/vsftpd/vusers
account    required     pam_userdb.so db=/etc/vsftpd/vusers

4.在vsftpd.conf文件中添加支持配置
[root@filesvr ~]# vim  /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
anon_umask=022
guest_enable=YES
guest_username=virtual
pam_service_name=vsftpd.vu

5.为个别虚拟用户建立独立的配置文件
在vsftpd.conf文件中添加用户配置目录支持
 user_config_dir=/etc/vsftpd/vusers_dir
为用户fedora、gentoo建立独立的配置目录及文件
 配置文件名与用户名同名
[root@filesvr ~]# mkdir /etc/vsftpd/vusers_dir/
[root@filesvr ~]# cd /etc/vsftpd/vusers_dir/
[root@filesvr vusers_dir]# touch fedora
[root@filesvr vusers_dir]# vim gentoo
anon_upload_enable=YES
anon_mkdir_write_enable=YES

6.重新加载vsftpd配置
service vsftpd reload
7.使用虚拟FTP账户访问测试
 分别用fedora、gentoo用户登录FTP服务器进行下载、上传测试
 fedora用户可以登录,并可以浏览、下载文件,但无法上传
 gentoo用户可以登录,并可以浏览、下载文件,也可以上传
 匿名用户或其他系统用户将不能登录

NFS SERVER监听在2049/tcp 2049/udp是固定的存在,NFS:基于内核工作的.
nfs-utils rpm包提供:两个脚本:/etc/rc.d/init.d->nfs和nfslock
/etc/exports:nfs文件系统共享定义配置文件

nfs启动三个服务器;nfsd,rpc.mountd,rpc.quotad
nfs所有的定义都是在/etc/exports中实现的.
例如;/data    172.16.0.0/24(访问属性)   10.0.0.0/8(访问属性)
客户端列表间用空白分隔
多个属性间用逗号分隔
某客户端和其属性之间不能有其他任意字符,而且直接跟上用小括号括起

来的属性列表

客户端列表的表达方法:
1、单个主机
     IP或主机名
2、通配符
    *,?
 *.magedu.com
3、网络地址
      掩码格式可使用完全格式;172.16.0.0/255.255.0.0
   也可使用CIDR格式:172.16.0.0/16
属性:
   ro
   rw
   sync
   async
   root_squash
   all_aquash
   no_root_squashs
管理导出:
 ecportfs
     -a:导出所有
     -r:重新导出
     -u:取消导出  -u CLIENT:DIRECTORY
     -v:显示导出过程
     -rva:重新导出所有
 
查看导出;
    showmount + SERVER
 -a:显示某服务导出的文件系统被任何客户挂载使用的情况列表
        -e:显示某SERVER上导出的所有的文件系统
        -d:显示当前服务器导出的所有文件系统中至少被某一个客户挂载

使用文件系统


数组:连接的内存空间,存储多个数据,统一命名的多个变量,这些变量

的内存空间通常是连续的
元素:使用数组下标 ${ARR}

引用数组中的元素个数:
${#array(*)}
${#array(@)}
引用数组中的每一个元素:
${array(*)}
${array(@)}
赋值方法1:AA[0]=jerry AA[2]=jerrys
赋值方法2:
AA=("jerry black" "tom obama" wendy natasha)
AA=([0]=jerry [1]=tom [2]=wendy [6]=natasha)
返回某元素中字符的个数:${#ARRAY[index]}
${#array}

arrayZ=( one two three four five five )
# 提取尾部的子串
echo ${arrayZ[@]:0} # one two three four five five
# 所有的元素.
echo ${arrayZ[@]:1} # two three four five five
# 在第一个元素 element[0]后面的所有元素.
echo ${arrayZ[@]:1:2} # two three
# 只提取在元素 element[0]后面的两个元素.

“$ *”是一个字符串,包含所有的位置参数,隔开了第一个字符的价值IFS

环境变量(内部字段分隔符),这是一个空间,默认选项卡,和换行符。另一方

面,“$ @”等于" $ 1 " " $ 2 "…" $ N,其中N是位置参数的数量。也就

是说,它等于N
单独的双引号字符串,用空格分开。
${ARRAY[*]} "a b c d e"
${ARRAY[@]} "a" "b" "c" "d" "e"

例如:
随机从同学们中选择1位回答问题。
#!/bin/bash
#
declare -a STU
declare -i number
STU=( Leichuanhu 'Gaofuchao' 'Zhaoyong' 'Yaobaowei' 'Liudongyang'

'Sunhaibo' 'Zhangxiangbo' 'Kongshiyi' 'Yangjing' Jinpengfei

Wangdan YX MFQ LZF GHW YHB )
#randomize;
#I=`rand()%16+1`
number=$RANDOM*16/32768
echo "${STU[$number]} $number"

写一个脚本:
打印九九乘法表。
#!/bin/bash
declare -i;
for (( i=1; i<10; i++ ));do
          for (( j=1; j<=i; j++ )); do

                  let "temp=i * j"
                  echo -en "$j*$i=$temp\t"
                done
           echo ""

done

写一个脚本:
找出一组数据中的最大数。这组数据随机生成,并用数组保存。找出的过

程用函数实现。
#!bin/bash
#
declare -i MAX=0
read -p "The number of random numbers:" ROM
for I in 'seq 0 $[$ROM-1]'; do
  ROMNUBER[$I]=$RANDOM
done
echo $ROMNUBER[@])

function FINDMAX() {
declare -a NUMBERS=($@)
for I in ${NUMBERS[@]};do
     if [ $MAX -lt $I ];then
         MAX=$I
      fi
done
}

FINDMAX ${ROMUNBER[@]}
echo $MAX


FIREWALL:防火墙
   工作在网络或主机的边缘,对进出的数据包根据定义的规则进行检查,

并做出相应处理的一套组件
  
数据包的检查规则: 
    匹配条件和处理办法
     匹配条件:
  帧首部、IP首部、TCP首部、应用层首部
         TP:源IP,目标IP
  TCP;源端口,目标端口,TCP标志位(URG;紧急,ACK,确

认号,PSH:推送,RST:重置,SYN:同步位,FIN:结束位;)
                TCP有限状态机:CLOSED,LISTEN,SYN_SENT(送

出),SYN_RECV(接受),ESTABLISHED(已建立),FIN_WAIT1,

CLOSE_WAIT,FIN_WAT2,LAST_ACK确认回答),TIME_WAIT

(2MSL,2*120S),CLOSED;
软件:在主机上的内核中的TCP/IP协议栈上附加一套规则   

 
规则需自己定义;
firewall防火墙的类型:
   包过滤型防火墙:234层。根据数据包的属性进行检查(IP/TCP),安全

差,效率高
      简单包过滤
      带状态检测包过滤,连接状态,应该是网络层具备的基础
   应用层网关防火墙:对特定的应用层协议做检查,更安全,效率低
firewall硬件防火墙:
     netscreen,checkpoint
linux内核
     TCP/IP:网络子系统(打开网络转

发:/proc/sys/net/ipv4/ip_forward)
netfilter:内核中,网络防火墙的框架,
源地址转换:SNAT
目标地址转换:DNAT
端口地址转换:PNAT
五个链:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
防火墙的功能:
   filter:过滤
   nat:地址转换
   mangle:拆开修改封装
   raw

流向:
   到本机:PREROUTING-->INPUT
   转发:  PREROUTING-->FORWARD-->POSTROUTING
   本机发出:OUTPUT-->POSTROUTING
TABLE表;
raw的工作地方:PREROUTING,OUTPUT
mangle的工作地方:PREROUTING,OUTPUT,POSTROUTING,INPUT,FORWARD
NAT的工作地方:PREROUTING,OUTPUT,POSTROUTING
FILTER的工作地方:INPUT,FORWARD,OUTPUT

filter;
  匹配条件:
         netfilter,检查模块,有额外的扩展模块和核心模块
  处理动作:
         ACCEPT:放行;
   DROP,REJECT:拒绝;DROP是悄悄丢弃,REJECT是声明

的丢弃,一般不用的;
   REDIRECT  重定向
   DNAT
   SNAT
   MASQUERADE  伪装
   LOG日志
   RETURN返回
自定义链

iptables是制定规则的命令,语法如下:
[-t TABLE] COMMAND CHAIN [CRETIRIA] -j ACTION
指定表名规则管理的机制后面是链匹配条件跳转到动作上。

-t:有四个等级
     raw
     mangle
     nat
     filter:默认

COMMAND;对链,或者对链中的规则进行管理操作
链中规则:
     -A:  添加
     -I#: 标示插入第几条
      -R#: 替换
       -D#:删除
     -D CRETERIA链中的规则

链管理:
   -N:新建一个自定义链
   -X;删除一个自定义的空链
   -E:重命名一条自定义链
   -F:清空指定链,如果不指定链,则清空整个表中的所有链
   -P:设定链的默认策略
   -Z:置零,对规则生效,每条规则,包括默认策略都有两个计数器:一

个是被本规则匹配到的所有数据包的个数;另一个是被规则匹配到的所有

数据包的大小之和;
查看:
   -L:查看
   -v:详细查看
   --line-numbers:显示规则的行号的
   -x:显示精确值
   -n:不要对地址和端口进行反解,显示数字地址
-j SNAT  跳转
     --to-source
    -j MASQUERADE地址伪装

iptables有两个脚本:
服务脚本:/etc/rc.d/init.d/iptables
脚本配置文件:/etc/sysconfig/iptables-config
因为iptables写的规则是立即生效但是重启后就无效了,所以规则的保存

位置:/etc/sysconfig/iptables


匹配条件:
通用匹配
      -s:源地址
      -d:目录地址
       IP
    NETWORK/MASK
    !
      -p:指定协议{icmp|tcp|udp}
   -i:流入接口 IN_INTERFACE
   -o:出去的接口  OUT_INTERFACE
扩展匹配
    隐式扩展
         -p tcp
     --sport 源端口,可以指定连续的一片端口
            --dport 目标端口
             --tcp-fiags 标志位 SYN,ACK,RST SYN 为1的是空格之后的

那个位
              --syn:是SYN,ACK,RST,FIN SYN的简写
   -p udp
       --sport 源端口
        --dport 目标端口
    -p icmp
     --icmp-type
        0:echo-reply  拼别人,回应报文是0
        8:echo-request 别人拼,请求报文
  显式扩展:
         netfilter扩展模块引入的扩展,用于扩展匹配条件,通常需要

额外专用选项来定义,/lib/iptadles
 -m state:用于实现链接的状态检测
  --state
              NEW,ESTABLISHED
   RELATED,专门为FTP这样的协议准备的,跟另外的连接有关联的
  -m multiport
        --source-ports
       --destination-po
         /lib/iptables
             -m limit:限制
                 --limit 速率 rate
    --limit-burst 峰值 number
   -m connlimit 限制ip请求的
 [!] --connlimit-above n 多于n表示满足条件,表示应该不允许
         -m iprange 限制IP的一段
             --src-range ip-ip
              --dst-range ip-ip  
例如:-m iprange --src-range 172.16.100.1-172.16.100.100
       -m mac
     --mac-source address
       匹配物理地址。必须是XX:XX:XX:XX:XX这样的格式。注意它只对来

自以太设备并进入PREROUTING、FORWORD和INPUT链的包有效。
 -m string 指定字符
      --algo {bm|kmp}
   --string "PATTERN"
 -m  recent
         --second 秒 这个选项必须结合使用,rcheck或--update

    --set 设置 这将添加的源地址的包列表
   --name 名字 指定要使用的命令列表。如果没有提供名

称然后将使用默认
   --update 更新
   --rcheck 检查源地址的数据包是目前在列表中。
 -m time指定时间
         --datestart  开始日期
  --datestop  停止日期
  --timestart 起始时间
  --timestop  停止时间
  --weekdays  工作日
 -m layer7
     --l7proto
 -m log
       为匹配的包开启内核记录。当在规则中设置了这一选项后,linux

内核会通过printk()打印一些关于全部匹配包的信息(诸如IP包头字段等)
         --log-level level 记录级别(数字或参看 syslog.conf(5))。
         --log-prefix prefix
在纪录信息前加上特定的前缀:最多14个字母长,用来和记录中其他信息

区别。
         --log-tcp-sequence
  记录TCP序列号。如果记录能被用户读取那么这将存在安全隐患。
         --log-tcp-options  记录来自TCP包头部的选项。
        --log-ip-options   记录来自IP包头部的选项


调用:例如iptables -A INPUT -d 172.16.100.1 -j clean_in
返回主链:iptables -A INPUT -d 172.16.100.1 -j RETURN
同一个主机上不能使用同网段的网卡
MASQUERADE:自动选择一个合适地址作为转换后的源地址