防火墙
硬件防火墙: 主要是防御DDOS攻击, 流量攻击. 兼顾数据包过滤.
软件防火墙: 主要处理数据包的过滤.
- iptables
- firewalld
包过滤防火墙
应用层防火墙
iptables
CentOS 6 默认防火墙, 主要是包过滤防火墙, 对 ip, 端口, tcp, udp, icmp 协议控制.
配置清晰, 很复杂.属于包过滤防火墙
iptables [选项]
选项
-n --numeric # 数字输出。IP地址和端口会以数字的形式打印。默认情况下,程序试显 示主机名、网络名或者服务(只要可用)
-v --verbose # 让 -L 显示更详细的
-L -list <规则链> # 显示所选链的所有规则。如果没有选择链,所有链将被显示。也可以和z选项一起 使用,这时链会被自动列出和归零。精确输出受其它所给参数影响。
-t <规则表=filter> # 要操作的匹配包的表(默认是操作 filter)
规则"表"
filter 过滤
ip, 端口, tcp,udp,icmp协议
- nat 网络地址转换
- mangle
- raw
常用, 需重点学习的: filter 和 nat不同的表有自己的默认规则, eg.
Chain INPUT (policy ACCEPT)
表示若未匹配任意规则则默认接受
规则"链"
- INPUT (C->S 方向)规则链
- OUTPUT (S->C 方向)规则链
- FORWARD 转发规则链
- PREROUTING 路由前转换(改变目标地址)规则链
- POSTROUTING 路由后转换(控制源地址)规则链
filter 表操作
默认操作的是 filter 表, 因此一般书写时可以省略.
filter [-t filter] <命令> <规则链> <规则>
命令
-L -list # 查看状态
-I -insert # 添加规则(插入到最前面), 注意规则的顺序是有优先级的(排在前面的优先级高)
-A -append # 添加规则(追加到最后面), 注意规则的顺序是有优先级的(排在前面的优先级高)
-D -delete <规则序号或详细规则> # 删除某一条规则
-F -flush # 清空所有规则(默认的Policy规则不会改变)
-P -policy # 设置默认规则
自定义规则链
-N -new-chain # 创建自定义规则链
-X -delete-chain
-E -rename-chain
规则链
INPUT
OUTPUT
规则
-s -source [!] address[/mask] # 指定源地址 ip
# eg. 10.0.0.0
# eg. 10.0.0.0/24
-d --destination [!] address[/mask] # 指定目标地址 ip, 用于 INPUT 没意义
-i -in-interface [!] [name] # 进入的网络接口(网卡)
-o --out-interface [!][name] # 出去的网络接口(网卡)
-p -protocal [!]protocol # 协议: tcp, udp, icmp
-j --jump <target> # 指定规则的目标(动作)
tcp协议相关选项
--sport, --source-port [!] [port[:port]] # 来源端口或端口范围
--dport, --destionation-port [!] [port:[port]] # 目标端口或端口范围
udp协议相关选项
--sport, --source-port [!] [port[:port]] # 来源端口或端口范围
--dport, --destionation-port [!] [port:[port]] # 目标端口或端口范围
icmp协议相关选项
动作(target) -j
ACCEPT # 允许
DROP # 禁止
QUEUE
RETURN
示例
iptables -vnL # 查看filter表详细状态, 可方便查看当前的所有规则
iptables -t filter -A INPUT -s 10.0.0.1 -j ACCEPT # 允许来自 10.0.0.1 的包进入
iptables -t filter -A INPUT -s 10.0.0.2 -j DROP # 允许来自 10.0.0.1 的包进入
iptables -D INPUT -s 10.0.0.2 -j DROP # 删除匹配的规则
iptables -t filter -D INPUT 3 # 删除第3条规则(第1条的序号是1)
iptables -P INPUT DROP # 修改INPUT规则链的默认规则为 DROP
iptables -t filter -A INPUT -i eth0 -s 10.0.0.2 -p tcp --dport 80 -j ACCEPT # 允许从 eth0 网卡进入, 来自10.0.0.2的包访问本地的80端口.
常用策略
默认ACCEPT, 配置特定规则 DROP
常用于测试
默认 DROP, 配置特定规则 ACCEPT
常见于生产环境
输出字段解释
当前的默认策略是ACCEPT
👇
Chain INPUT (policy ACCEPT 501 packets, 33820 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 10.0.0.1 0.0.0.0/0
👆 👆 👆 👆 👆 👆
策略 协议 进入网卡 出去网卡 来源地址 目的地址
(tcp,udp,icmp)
nat 表操作
NAT表 - 网络地址转换表
filter -t nat <命令> <规则链> <规则>
规则链
PREROUTING # 路由前转换 - 目的地址转换
POSTROUTING # 路由后转换 - 控制源地址
动作(target) -j
DNAT
规则
--to-destination <ip>[/<mask>] # 修改目的地址
--to-source <ip>[/<mask>] # 修改源地址
示例
iptables -t nat -vnL # 查看nat表详细状态
# 假设 iptables 所在主机ip为 114.115.116.117, 此处配置外网访问该地址(eth0网卡)时将访问tcp协议且是80端口的数据包目的地址转换内网主机
iptables -t nat -A PREROUTING -i eth0 -d 114.115.116.117 -p tcp --dport 80 -j DNAT --to-destination 10.0.0.1
# 另内网访问该地址(eth1网卡)时将数据包源地址转换成iptables所在主机ip 114.115.116.117
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j SNAT --to-source 114.115.116.117
可用于: 端口转发
配置文件
iptables 配置文件 /etc/sysconfig/iptables
在 CentOS 6 中, 管理 iptables:
service iptables save|start|stop|restart
命令
save # 将当前内存中的配置保存为配置文件 /etc/sysconfig/iptables
# 实际执行了 iptables-save > /etc/sysconfig/iptables
# 下次启动时 iptables-restore < /etc/sysconfig/iptables
在CentOS 7 中, 需要安装该服务 yum install iptables-services
才可以使用该命令
注意:
- iptables 的命令是写在内存中, 重启后失效.
firewalld
CentOS 7 在 iptables 上又封装了一层, 也就是 firewalld , 使用更简洁(底层使用 netfilter).
属于包过滤防火墙
firewalld 的特点
支持区域 "zone" 概念
即 iptables 的自建规则链
- firewall-cmd 控制防火墙
firewalld 服务管理
systemctl start|stop|enable|disable firewalld.serivce
注意: firewalld 与 iptables 服务是冲突的.
firewall-cmd
firewall-cmd [选项]
选项
状态选项
--state # 查看firewalld当前状态
--reload # 重新加载配置
--zone=public # 指定区域, 不指定时默认就是 public
Zone选项
--get-zones # 查看所有的区(除了public外还有一些iptables默认规则链一样)
--get-default-zone # 查看默认的区
--get-active-zone # 查看激活的zone
永久性选项
--permanent # 设置选项写入配置, 需要 reload 才能生效
修改和查询zone的选项
--list-all # 查看详细状态(包含以下内容)
--list-interfaces # 查看某一项状态 - 网卡接口
--list-ports # 查看某一项状态 - 端口
--list-services # 查看某一项状态 - 服务端口
--add-service <服务> # 添加service端口
--add-port <端口/协议> # 添加指定协议指定端口, eg. 81/tcp
--add-source <源ip[/网段]> # 添加源地址
--add-interface <网卡接口>
--remove-service <服务>
--remove-port <端口/协议>
--remove-source <源ip[/网段]>
--remove-interface <网卡接口>
待整理的示例
# 只允许某个IP段访问3306 firewall-cmd --permanent --zone=public --add-rich-rule 'rule family=“ipv4” source address=“192.168.0.4/24” port port protocal=“tcp” port=“3306” accept'
firewall-cmd --list-all
输出字段解释
#public区域 激活状态
# 👇 👇
public (active)
target: default # 👈
icmp-block-inversion: no
interfaces: eth0 # 👈 public区域绑定了 eth0 网卡
sources: # 允许访问的源ip
services: ssh dhcpv6-client # 允许访问的服务端口
ports: # 允许访问的端口
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
telnet 服务
telnet 是明文传输, 危险, 因此不能应用于远程管理.
安装服务
## telnet 是客户端工具
## telnet-server 是服务端服务
## xinetd 是因为 telnet-server 无法自启动, 因此需要使用它来管理 telnet-server 的启动
yum install telnet telnet-server xinetd -y
启动服务
systemctl start xinetd
systemctl start telnet.socket
telnet 不负责端口的监听, 只负责处理传过来的数据.端口监听工作交由 xinetd 负责, xinetd 负责端口监听并将请求转发给 telnet
root 用户无法用于telnet 远程登录
SSH 服务
客户端配置文件 /etc/ssh/ssh_config
服务配置文件 /etc/ssh/sshd_config
Port 22 # 服务端口号(默认是22)
PermitRootLogin yes # 是否允许root登录
AuthorizedKeysFile .ssh/authorized_keys # 密钥验证的公钥存储文件. 默认是放在 ~/.ssh/authorized_keys
使配置生效
systemctl restart sshd.service
ssh 命令
ssh 选项 [<user>@]<host>
选项
常用
-p <port> # 指定连接端口
-4 # 强制 ssh 只使用 IPv4 地址
-f # 要求 ssh 在执行命令前退至后台.
端口转发
-N # 不执行远程命令. 用于转发端口.
-L port:host:hostport # local, 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
# 工作原理是这样的, 本地机器上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转发出去, 同时远程主机和 host 的 hostport 端口建立连接. 可以在配置文件中指定端口的转发.
# 只有 root 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
-R port:host:hostport # remote, 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
# 工作原理是这样的, 远程主机上分配了一个 socket 侦听 port 端口, 一旦这个端口上有了连接, 该连接就经过安全通道转向出去, 同时本地主机和 host 的 hostport 端口建立连接.
# 可以在配置文件中指定端口的转发. 只有用 root 登录远程主机 才能转发特权端口. IPv6 地址用另一种格式说明: port/host/hostport
示例
ssh -fNL 27117:127.0.0.1:27017 <远程主机地址> # 建立local隧道, 将来自27117的连接经过<远程主机>转发至127.0.0.1(其实还是<远程主机>)的27017端口
# 通常适用于<远程主机>未对外开放27017端口
ssh -fNR 2222:127.0.0.1:22 <远程主机地址> # 建立remote隧道(也叫反向隧道), 将来自<远程主机>2222端口的连接经过本机转发给127.0.0.1(实际上还是本机)
# 通常适用于外网访问内网服务
示例: 配置访问特定主机时使用特定的私钥文件
- 当前主机存在多个私钥文件
- 访问特定主机时需使用特定私钥文件(非默认)
# 假设私钥文件路径: ~/.ssh/xxx_id_rsa
cat > ~/.ssh/config <<'EOF'
Host 192.168.0.143
PubkeyAuthentication yes
IdentityFile ~/.ssh/xxx_id_rsa
EOF
# 注意 config 文件和私钥文件的权限都必须是 600
chmod 600 ~/.ssh/config
公钥认证
ssh-keygen 命令
生成密钥对
ssh-keygen [选项]
选项
-t <密钥类型=rsa> # 指定密钥类型: dsa|ecdsa|ed25519|rsa|rsa1
-C <comment=$USER@$HOSTNAME> # 注释(追加在公钥文件最后)
注意:
- 生成密钥对一定是在客户端上做, 然后再将公钥传给服务端.
默认生成的文件
~/.ssh/id_rsa
~/.ssh/id_rsa.pub
ssh-copy-id 命令
将公钥(通过ssh)拷贝到目标主机
ssh-copy-id 选项 [user@]hostname
选项
-n # dry-run, 不真正执行命令
-i <identity_file=~/.ssh/id_rsa.pub> # 手动指定公钥文件
-p port
-o ssh_option
注意:
- 目标主机的公钥存储文件
~/.ssh/authorized_keys
, 600 权限
scp 命令
远程文件复制
scp [选项] <src> <dest>
选项
-C 允许压缩
-r 递归复制整个目录
-P port
src 和 dest 可以是以下任意的
[<user>@]<host>:/remote/path # 指定远程文件或目录
/local/path # 指定本地文件或目录
示例
scp a.txt 192.168.0.16:/tmp/ # 拷贝本地的 a.txt 到远程的 /tmp/ 目录下
传递大文件更推荐用 rsync(断点续传, 压缩)
rsync 命令
快速、通用的远程和本地文件传输工具
语法
# 本地复制
rsync [选项] <src> <dest>
# 通过 ssh 远程复制
Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
# 通过 rsync 服务
Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST]
rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST
rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST
选项
# 常用
-P # 断点续传(保留那些因故没有完全传输的文件,以便加快随后的再次传输), 等同于 --partial --progress
-z, --compress # 对备份的文件在传输时进行压缩处理, 加快传输
-e, --rsh=<COMMAND> # 以ssh方式进行数据传输, -e "ssh -p2222" 指定连接2222端口, 如果是ssh方式默认使用22端口
--bwlimit # 限速, 字节/秒
-r,--recursive # 对子目录以递归模式处理
--progress # 显示传输进度
--partial # 断点续传
-c, --checksum # 打开校验开关,强制对文件传输进行校验。(而不是基于文件的修改时间及大小)
--delete # 删除那些 DEST 中 SRC 没有的文件。
--delete-before # rsync 首先读取 src 和 dest 的文件列表, 并删除那些 DEST 中 SRC 没有的文件, 之后再执行同步操作。
# 由于分两步骤执行, 因此需要更多的内存消耗以及时间消耗. 因此仅在 dest 的可用空间较小时用这种方式.
--delete-excluded # 除了删除 DEST 中 SRC 没有的文件外, 还会一并移除 dest 中 --exclude 或 --exclude-from 指定的文件/目录.
-u, --update # 如果 DEST 中的文件比 SRC 新(指修改时间), 就不会对该文件进行同步.
--exclude=PATTERN # 指定排除不需要传输的文件, 比如 --exclude="logs" 会过滤掉文件名包含 "logs" 的文件或目录, 不对齐同步.
--include=PATTERN # 指定不排除而需要传输的文件模式。
-v, --verbose # 详细模式输出。
-q, --quiet # 精简输出模式。
-a, --archive # 归档模式,表示以递归方式传输文件,并保持所有文件属性,等于-rlptgoD
-t, --list # list the contents of an archive
-l, --links # 保留软链
-L, --copy-links # 同步软链时, 以实际的文件来替代
-p, --perms # 保持文件的权限属性
-o, --owner # 保留文件的属主(super-user only)
-g, --group # 保留文件的属组
-D # 保持设备文件信息, 等同于 "--devices --specials"
-t, --times # 保持文件的时间属性
示例
rsync -P -z -r root@xx.xx.xx.xx:/data/transfer/archive.zip /data/archive.zip
rsync -P -e "ssh -p2222" --bwlimit=200 root@xx.xx.xx.xx:/data/transfer/archive.zip /data/archive.zip
当带宽足够大时, 使用 -z
反而会拖慢速度.
FTP 服务
ftp 协议
ftp 协议: 文件传输协议
- 需要同时建立命令链路(21端口, 先建立, 传输命令)和数据链路(传输文件名称, 目录名称, 文件数据)
数据链路
主动模式
命令链路建立后, 服务端(使用20端口)主动向客户端发起建立数据链路请求(实际可能会被客户端防火墙之类的挡住, 导致无响应)
被动模式(实际常用)
命令链路建立后, 服务端会开放大于1024的端口被动等客户端连接.
vsftpd 服务
# 安装必要软件
## vsftpd 是服务端
## ftp 是客户端
yum install vsftpd ftp
# 启动 vsftpd 服务
systemctl start vsftpd.service && systemctl enable vsftpd.service
通过
man 5 vsftpd.conf
可以查看配置文件详解.注意
- 默认提供匿名账号:
ftp
- 默认当前系统的账号
vsftpd 配置文件
/etc/vsftpd/vsftpd.conf
主配置文件/etc/vsftpd/ftpusers
用户相关/etc/vsftpd/user_list
用户黑白名单, 比如禁止 root 登录
vsftpd.conf
配置
anonymous_enable=YES # 是否允许匿名用户(ftp)
local_enable=YES # 是否允许系统本地用户账号登录. 同时会受到 SELinux(ftp_home_dir 项)的影响
write_enable=YES # 本地用户是否可写
connect_from_port_20=YES # 是否允许开启主动模式(不会影响被动模式)
userlist_enable=YES # 是否启用用户黑白名单
userlist_deny=YES # 控制用户列表是黑名单还是白名单, YES 表示黑名单.
# 仅在 userlist_enable=YES 时生效
# 虚拟用户配置相关
guest_enable=YES # 允许虚拟用户进行验证
guest_username=<系统用户名> # 指定登录身份为某个系统用户
user_config_dir=/etc/vsftpd/<系统用户名>config # 指定虚拟用户权限控制文件所在目录
allow_writeable_chroot=YES # 虚拟用户是否可写
pam_service_name=vsftpd.vuser # 虚拟用户的"可插拔验证模块(pam)"对应文件名称
YES
和NO
必须是大写的.可以使用
man 5 vsftpd.conf
来查看该配置文件的帮助
强制访问控制对 ftpd 的影响
# 查看 SELinux 中和 ftpd 相关的布尔配置项 getsebool -a | grep ftpd # 修改 ## -P 同时写入配置文件 ## 0 表示 off, 关闭 ## 1 表示 on, 打开 setsebool -P <配置项名> 1|0
默认匿名账号
- 账号:
ftp
- 密码: 空
- 默认目录:
/var/ftp/
普通账号
- 账号: 系统账号
- 密码: 系统账号的密码
- 默认目录:
~
- 能访问普通账号的 home 目录
ftpusers 配置
vsftp 虚拟用户
示例: 新增3个虚拟用户
# 1. 建立一个真实系统账号
## 指定 /data/ftp 为该用户的home目录
## 指定该用户不可登录到系统
useradd -d /data/ftp -s /sbin/nologin vuser
# 2. 编写存储虚拟用户账号和密码的临时文件
## 该文件格式是: 一行虚拟用户名, 一行对应密码
cat <<'EOF' > /etc/vsftpd/vuser.tmp
u1
123456
u2
123456
u3
123456
EOF
# 3. 将上述临时文件转成数据库专用格式
db_load -T -t hash -f /etc/vsftpd/vuser.temp /etc/vsftpd/vuser.db
# 4. 创建可插拔验证模块配置
cat <<'EOF' > /etc/pam.d/vsftpd.vuser
auth sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
account sufficient /lib64/security/pam_userdb.so db=/etc/vsftpd/vuser
EOF
# 5. 修改 /etc/vsftpd/vsftp.conf 确保其中相关配置如下
guest_enable=YES
guest_username=vuser
user_config_dir=/etc/vsftpd/vuserconfig
allow_writeable_chroot=YES
pam_service_name=vsftpd.vuser
# 注释掉以下语句后, 就不再支持匿名和本地用户登录了
#pam_service_name=vsftpd
# 6. 创建虚拟用户配置所在目录
mkdir /etc/vsftpd/vuserconfig
# 7. 在虚拟用户配置目录中创建和所要创建虚拟用户名同名的配置文件
## 此处创建 u1, u2, u3 的配置文件
## 省略 u2 的...
## 省略 u3 的...
cat <<'EOF' > /etc/vsftpd/vuserconfig/u1
local_root=/data/ftp # 用户登录后进入的目录
write_enable=YES # 可写
anon_umask=022
anon_world_readable_only=NO # 可写?
anon_upload_enable=YES # 可上传
anon_mkdir_write_enable=YES # 可创建目录?
anon_other_write_enable=YES # 可写?
download_enable=YES # 可下载
EOF
# 8. 重启 vsftpd 服务
systemctl restart vsftpd.service
ftp 命令
ftp客户端
ftp <地址>
选项
如果提示"没有到主机的路由", 一般是由于被防火墙挡住.
相关命令
ls # 在远程执行 ls
!ls # 在本地执行 ls
pwd # 在远程执行 pwd
!pwd # 在本地执行 pwd
cd # 切换远程目录
lcd # 切换本地目录
put <file> # 上传文件, 若提示无权限则应检查 "write_enable" 配置项
get <file> # 下载文件
samba 服务
samba 服务
- 使用 smb 协议
- 使用 cifs 文件系统
/etc/samba/smb.conf
配置文件
smb 协议是微软持有的版权, 用于windows之间的共享.而samba则是模拟这种协议, 主要用于共享给windows.
若是 Linux 之间的共享则建议使用 nfs
# 安装
yum install samba
# 服务
systecmtl start|stop|restart|reload smb.service
配置文件
配置文件 /etc/samba/smb.conf
部分格式说明
[global] # 全局设置
workgroup = SAMBA
security = user
passdb backend = tdbsam
printing = cups
printcap name = cups
load printers = yes
cups options = raw
[share] # 共享名
comment = my share
path = /data/share # 共享路径
read only = No # 是否只读, No 表示可写
man 5 smb.conf
可查看该配置文件的帮助文档
smbpasswd 命令
samba 用户的创建和删除
smbpasswd [选项]
选项
-a # 添加用户(系统中必须有一个同名的用户, samba 用户访问权限是参考系统同名用户的)
-x # 删除用户
-s # silent, 从标准输入上读取原口令和新口令, 常用于脚本处理smb
新创建的用户默认会直接共享出自己的home目录, 也就是 /home/用户名
这个目录.
pdbedit 命令
samba 用户查看
pdbedit [选项]
选项
-L # 查看用户
示例
# 1. 创建系统用户, 此处以 user1 为例
useradd user1
# 2. 创建同名samba用户
echo -e "123456\n123456" | smbpasswd -a user1
# 3. 启动samba服务
systemctl start smb.service
# 4. 使用
## windows 客户端可以通过映射网络驱动器或windows共享来使用
## Linux 客户端可以通过磁盘挂载使用(将 127.0.0.1 上的 /home/user1 挂载到了当前的 /mnt 目录)
### -t cifs 可省略, 由 mount 自行判断
### 输入密码后就挂载成功了
### 挂载完毕后可通过 df -hT 或 mount | tail -1 查看挂载信息
mount -t cifs -o username=user1 //127.0.0.1/user1 /mnt # 挂载前面在 /etc/samba/smb.conf 里配置的 [share] 共享所指定的目录
mount -t cifs -o username=user1 //127.0.0.1/share /mnt2 # 此处举例, 挂载在 /mnt2 文件夹上
# 不需要后就卸载掉
umount /mnt
umount /mnt2
nfs 服务
主要用于 Linux 之间的共享服务.
默认已安装
管理
systemctl start|stop|reload nfs.service
/etc/exports 主配置文件
man 5 exports
可查看帮助
配置格式
<共享目录> <允许来源主机>(权限)...
👆 这里不得有空格
可指定多个
共享目录
必须是已存在的目录.
允许来源主机
* # 任意主机
具体ip # 指定该ip可访问
权限(用逗号分隔)
rw # 读写权限
ro # 只读权限
sync # (内存)数据同步写入磁盘, 避免丢失数据
all_squash # 使用 nfsnobody 系统用户
示例
/data/share *(rw,sync,all_squash)
若权限设置了
all_squash
, 则会使用 nfsnobody 这个用户来做实际操作, 因此需要将该共享目录的属主和属组设为 nfsnobodychown -R nfsnobody:nfsnobody /data/share/
showmount 命令
显示关于 NFS 服务器文件系统挂载的信息
showmount [选项] <host>
选项
-e, --exports # 查看所有共享的目录
挂载
mount 主机:/path/dir /local/path/to/mount
示例
mount localhost:/data/share /mnt # 将localhost上共享的 /data/share 目录挂载到本地的 /mnt 目录
Nginx/OpenResty
- Nginx(engine X) 是一个高性能的 Web 和反向代理服务器.
Nginx 支持 HTTP, HTTPS 和电子邮件代理协议
Nginx 模块由于是用c/c++编写的, 要添加新模块还需要重新编译.
- OpenResty 是基于 Nginx 和 Lua 实现的 Web 应用网关,集成了大量的第三方模块.
安装
# 添加 yum 源
yum-config-manager --add-repo https://openresty.org/package/centos/openresty.repo
# 安装 openresty
yum install -y openresty
管理
systemctl start|reload|stop openresty
配置文件
/usr/local/openresty/nginx/conf/nginx.conf
Nginx 配置
/usr/local/openresty/nginx/conf/nginx.conf
worker_processes 1; # 配置多少个worker进程, 最大值建议不大于CPU核心数
error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
pid logs/nginx.pid;
events {
# use epoll;
worker_connections 1024; # 每个worker允许的并发连接, 超过会返回 503 Service Unavailable 错误
}
http {
# 此处的配置会对下面所有 server 生效
# 访问日志格式定义
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
# 访问日志记录文件及采用的格式配置
access_log logs/access.log main;
# sendfile 和 tcp_nopush 是在内核层面上优化传输链路
sendfile on; # 传输文件时的优化: 直接在内核中将文件数据拷贝给socket.
tcp_nopush on; # 仅sendfile启用时生效, 将http头和实体一同返回, 减少报文段数量
keepalive_timeout 65; # HTTP 协议的 keepalive, 建立长连接, 重用TCP连接
gzip on; # 传输时启用 gzip 压缩, 节省带宽, 造成CPU额外消耗.
server {
listen 80; # 监听端口
server_name localhost; # 域名(虚拟主机)
location / {
root html;
index index.html index.htm;
}
}
}
上述配置中的相对路径是基于编译nginx时指定的特定路径, 一般是nginx所在目录, 对应此处是 `/usr/local/openresty/nginx/
LNMP
MySQL
- mariadb 是 MySQL 的社区版
# 安装
# mariadb 是客户端
#
yum install mariadb mariadb-server
修改配置文件 /etc/my.cnf
[mysqld]
character_set_server=utf8
init_connect='SET NAMES utf8'
或者是采用 utf8mb4 编码, 兼容4字节的unicode, 需要存emoji表情的话应使用 utf8mb4
PHP
yum install php-fpm php-mysql
systemctl start php-fpm.service
默认源的版本是 5.4, 需要更高的可以用 webtatic 源此处仅作示范
Nginx
server {
location ~ \.php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
通过 fastcgi 协议将请求转发给 php-fpm
DNS 服务
DNS 服务介绍
- DNS(Domain Name System) 域名系统
- FQDN(Full Qualified Domain Name) 完全限定域名
- 域分类: 根域、顶级域(TLD)
- 查询方式: 递归、迭代
- 解析方式: 正向解析(主机 -> ip)、反向解析(ip -> 主机)
- DNS 服务器的类型: 缓存域名服务器、主域名服务器(master)、从域名服务器(salve)
www.baidu.com.
👆 👆 👆
主机名 域名 根域
.com 顶级域
. 根域
BIND 软件
提供 DNS 服务
# 安装
## bind 提供服务的软件包
## bind-utils DNS服务的相关工具
yum install bind bind-utils
# 服务管理
systemctl start named.service
主配置文件: /etc/named.conf
options {
listen-on port 53 { any; }; // 监听端口及对应网卡
...
allow-query { any; }; // any 允许任何人查询
}
// 根域
zone "." IN {
type hint;
file "named.ca"; // /var/named/named.ca
};
named-checkconf
确认配置文件是否正确
named-checkconf
...........DNS 本节课后续略过, 看不下去
NAS
NAS(Network attached storage)网络附属存储
支持的协议:
- nfs
- cifs
- ftp
一般是通过创建磁盘阵列RAID后, 再通过上述协议共享.
创建步骤
假设此处提供了2个新硬盘
- /dev/sde
- /dev/sdf
1. 创建共享空间
# 磁盘分区
fdisk /dev/sde
fdisk /dev/sdf
# 创建 RAID
## 此处创建 RAID1 级别的磁盘阵列
mdadm -C /dev/md0 -a yes -l 1 -n 2 /dev/sd{e,f}1
# 持久化 RAID 配置信息
mdadm --detail --scan --verbose > /etc/mdadm.conf
# 通过逻辑卷的方式以方便后续扩容
## 初始化物理卷
pvcreate /dev/md0
## 创建卷组
vgcreate vg1 /dev/md0
## 创建逻辑卷
### 此处示例, 因此只创建个 200M 的逻辑卷
lvcreate -L 200M -n nas vg1
# 分区格式化
mkfs.xfs /dev/vg1/nas
# 分区挂载
mkdir /share
mount /dev/vg1/nas /share
2. 通过协议共享
# 创建公用用户 shareuser
useradd shareuser -d /share/shareuser
echo 123456 | passwd --stdin shareuser
# 1. 配置ftp共享 - 通过 shareuser 用户登录ftp并访问home目录 (也可以用虚拟用户)
确认 /etc/vsftpd/vsftpd.conf 配置
pam_service_name=vsftpd
local_enable=YES
write_enable=YES
systemctl restart vsftpd.service
# 2. 配置samba服务
echo -e "123456\n123456" | smbpasswd -a shareuser
systemctl restart smb.service
# 3. 配置nfs服务
## 配置为 ro (nfs由于没有用户级别的限制, 因此这种情况下不推荐设置为 rw)
echo '/share/shareuser *(ro)' >> /etc/exports
systemctl restart nfs.service
## 配置为 rw (配合 facl 权限访问控制列表)
echo '/share/shareuser *(rw,sync,all_squash)' >> /etc/exports
setfacl -d -m u:nfsnobody:rwx /share/shareuser
setfacl -m u:nfsnobody:rwx /share/shareuser
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。