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 admin@192.168.0.109:~> ls
- drwxrwxr-x 2 0 0 6 Feb 17 06:53 download
- drwxrwxr-x 2 0 0 6 Feb 17 06:53 upload
- lftp admin@192.168.0.109:/> cd download
- cd ok, cwd=/download
- lftp admin@192.168.0.109:/download> mkdir test #可以创建目录
- mkdir ok, test' created
- lftp admin@192.168.0.109:/download> put ks7.cfg #可以上传文件
- 1072 bytes transferred
- lftp admin@192.168.0.109:/download> ls
- -rw------- 1 5002 5002 1072 Feb 17 07:40 ks7.cfg
- drwx------ 2 5002 5002 6 Feb 17 07:39 test
- lftp admin@192.168.0.109:/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 admin@192.168.0.109:/download> get hh #可以下载文件
- lftp admin@192.168.0.109:/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 dcrfan@192.168.0.109:~> ls
- drwxrwxr-x 3 0 0 43 Feb 17 07:43 download
- drwxrwxr-x 2 0 0 6 Feb 17 06:53 upload
- lftp dcrfan@192.168.0.109:/> cd upload
- lftp dcrfan@192.168.0.109:/upload> mkdir test #创建目录失败
- mkdir: Access failed: 550 Permission denied. (test)
- lftp dcrfan@192.168.0.109:/upload> put ks6.cfg
- 1092 bytes transferred
- lftp dcrfan@192.168.0.109:/upload> cd /download/
- lftp dcrfan@192.168.0.109:/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 normal@192.168.0.109:~> ls
- drwxrwxr-x 3 0 0 58 Feb 17 07:58 download
- drwxrwxr-x 2 0 0 21 Feb 17 07:49 upload
- lftp normal@192.168.0.109:/> cd download
- lftp normal@192.168.0.109:/download> put ks6.cfg #不可以上传文件
- put: Access failed: 550 Permission denied. (ks6.cfg)
- lftp normal@192.168.0.109:/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 normal@192.168.0.109:/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
- |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
来源: http://www.bubuko.com/infodetail-2958134.html