A模块
·注意事项:
1、无论题目是否有要求,都要安装一些常用测试工具、还有题目中定义的所有服务的客户端,例如:vim man bash-completion ssh curl wget dnsutils mailutils ftp lftp nmap traceroute tcptraceroute smbclient
2、建议不要放行ssh root用户,复制文件就复制到普通用户家目录即可
3、如果机器或者服务同时拥有IPv6和IPv4,那么它们会优先通过IPv6来通信,所以这个时候就要同时考虑IPv4和IPv6的通信问题(特别是防火墙),要记得放行IPv6;并且也不要忘记IPv4的放行。
4、Linux 一些密码文件权限需要是 600,例如 ansible .vault_pass
5、如果 目录权限是 644,而不是 755,缺少 x 权限,就会导致很多问题,例如 ftp登陆后无法查看目录内容,无法列出目录文件。
6、如果密码中带有 * ,就不能直接在控制台输入,要加上双引号 或单引号;如果密码中带有 $ 就必须加单引号或 转义符。还有很多符号都会导致这个问题,所以建议只要有符号的密码,就在外层加上单引号
7、配置 反向代理时,要配置把真实的Web Host传给后端:
apache2代理要添加:ProxyPreserveHost on
nginx代理要添加 proxy_set_header $http_host;haproxy默认就能够把 Host 传给后端。
8、在 debian 13.3 中 roundcube,不要改它的web目录,就用 /usr/share/roundcube 作为web根目录,因为它有的软连接是 ../../.. 这样指到 /usr/share/中的,改了路径会导致访问不到。
9、Ikev2 VPN,防火墙要放行 udp 500/4500 端口,和 esp protocol。两种场景:
没有NAT,放行 udp 500、esp protocol
经过NAT,放行 udp 500、4500
·初始化:
apt install -y vim man dbus bash-completion ssh python3 curl wget dnsutils mailutils ftp lftp nfs-common nmap traceroute tcptraceroute
systemctl start dbus
timedatectl set-timezone Asia/Shanghai
echo "set nu" >> /etc/vim/vimrc
echo -e 'WSC2026!shanghai\nWSC2026!shanghai' | adduser mailuser1
echo -e 'WSC2026!shanghai\nWSC2026!shanghai' | adduser mailuser2
hostnamectl set-hostname
sed -i "s/^127.0.1.1.*/127.0.1.1 $(hostname).hq.int $(hostname)/" /etc/hosts
一、DNS(TCP/UDP 53):
1、bind9:
# 第一个是2,剩下四个都写成 600000 即可

·TSIG 主从DNS:
tsig-keygen shanghai.org >> /etc/bind/named.conf


·ddns:
配置后在客户端重新获取一遍地址,如果还是不行,就重启服务器(isc-dhcp-server有时需要等待几分钟)
dhcp 必须下发域名,才能够成功ddns


·RPZ 非法域名:
# 如果要配置 RPZ + View 区域分离,那么 view 的两个区域要同时配置 RPZ非法域名的 zone,否则重启会报错
或者单独在 view 中指定 RPZ
# 出现timeout的原因(debian 13后新增):本地存在的域名就不会这样。当解析本地区域不存在的RPZ域名时,dns服务器默认会先进行递归,因为我们是测试环境,因此这个递归大概率找不到,因此就会提示timeout,配置了这个 qname-wait-recurse no; 之后,对于rpz域名就不会进行递归了,而是直接返回RPZ的 NXDOMAIN。


记得要加上 response-policy
·allow-query/blackhole:
allow-query 是白名单
blackhole 是黑名单
# 只允许指定网段解析指定域名:

# blackhole 禁止指定IP查询
![]()
·隐藏版本号:
# 只有两种写法:
1、none //不显示任何信息
2、“” //自定义信息,(“”内可以自定义内容)也可以“”,什么内容都不输入,就会显示为 “”

·dns 查询日志:
这里直接写相对路径 file "queries.log" ,不写绝对路径,日志默认就会存储到 /var/cache/bind 下

自定义路径需要修改 apparmor,并给那个目录 bind用户读写权限
·IPv6 DNS 反向解析记录:
# 可以先用 nslookup 获取IPv6地址段

db 文件中地址的顺序也是反过来的:
# 例如:::10 需要表示为:0.1.0.0

·SRV记录:
_服务._协议.域名,例如:ldap 服务记录为 auth
_ldap._tcp.auth.wsc2026.net.


·解决 view + 主从 组合的问题:
# 假如同一个zone:wsc48.test,主服务器定义了不同网段访问获得不同的解析结果,但是从服务器在向主服务器同步时,不知道哪个文件才是对的,因此从服务器上就会同步过来两个文件名不同,但是内容一样的区域文件,导致客户端解析时无法解析到正确的view定义的地址
这样就需要配置 tsig key,让每个 view都用一个不同的tsig密钥,让从服务器根据这个不同的tsig密钥来进行同步
·主服务器:
# 生成两个tsig密钥,每个view使用不同的tsig key:
tsig-keygen -a hmac-sha256 >> named.conf
tsig-keygen -a hmac-sha256 >> named.conf
vim named.conf
要用 ! 拒绝其他不允许的 tsig key



·从服务器:
vim named.conf



·根提示:
/usr/share/dns/root.hints

·转发器:

·条件转发器:
only //只转发给这个服务器
first //当这个服务器返回失败时,尝试进行本地递归

·dnssec:
# 用于递归服务器校验权威服务器:
## 权威服务器:

重启后就会在 /var/cache/bind目录生成公钥私钥
![]()
然后复制这个 key:

在从服务器开启 dnssec 校验,并信任 key:
trustj-anchors { "域名.com." static-key <key>; };


2、dnsmasq:
# 设置接受指定接口传入的dns请求:
vim /etc/dnsmasq.conf
## 如果有多个接口,可以用 ,分割

systemctl restart dnsmasq
·A记录:
![]()
![]()
![]()
·反向解析:

·CNAME记录:

不能这样写:(这样写只会把cname变成A记录)

·mx记录:

·ipv6正向解析:


·ipv6反向解析:
vim /etc/dnsmasq.conf
## 结尾与 ipv4反解不同,是 ip6.arpa

分为 8段,每段4个字节,不能省略0
例如这里的,2001:db8 = 2001:0db8
·配置转发器:

二、DHCP(UDP 67、546):
1、isc-dhcp-server:
·isc-dhcp-relay 监听接口要同时监听dhcp服务器和客户端接口,与Windows不一样,Windows只需要监听客户端接口即可。
# 注意要同时指定一个本地网段的地址池,否则启动会报错
2、kea-dhcp-server:
·分配IPv4地址:
注释原本 192.0.2.0/24 网段的默认内容,否则启动会报错:
这里只显示了部分,要全部注释掉

分配固定地址:

·ddns:
vim /etc/kea/kea-dhcp4.conf

vim /etc/kea/kea-dhcp-ddns.conf

加上 tsig:

·DHCPv6:


注释掉 subnet 内部的 option,它会覆盖掉前面定义的全局dns,或者在这里修改 option:

最后把一些地址保留注释掉:

# 然后需要安装配置 radvd,下发 ra:
apt install -y radvd

·如果有防火墙,并且要求 output 策略为drop,那么DHCPv6 必须要在output放行 udp 546端口,否则客户端获取不到IPv6地址
3、dnsmasq:

网关:

·DHCPv6:
dnsmasq自己就能发 ra,不需要安装 radvd


![]()
·仅 SLAAC:


4、中继:
·IPv6 中继:
# 只能用命令配置:
dhcrelay -6 -d -l ens192 -u fdab:cdef:1234:10::10%ens256
配置持久化:

5、radvd 配置 SLAAC:
apt install -y radvd

三、CA:
·有时生成出来的证书(在子CA环境遇到的问题),私钥是被密码加密的
我们可以通过 openssl rsa -in client.key -out client.key 来解密,因为加密的私钥服务是无法直接读取的(特别是排错时)要确定私钥是否是加密的,除了看服务日志的报错,还可以直接vim 打开私钥文件查看开头,如果这里是 ENCRYPTED 就表示该私钥是被加密的

1、命令 申请证书:
## 创建证书申请前要设置:
vim /etc/ssl/openssl.cnf
# 取消注释,这样openssl就会自动调用 extension

openssl req -out newreq.pem -newkey rsa:2048 -nodes -keyout newkey.pem -subj "/CN=mail.shenzhen.cn/C=CN" -addext "subjectAltName=DNS:mail.shenzhen.cn, DNS:smtp.shenzhen.cn" //这里如果要写多个DNS,必须要 逗号 + 空格
# 签发:
/usr/lib/ssl/misc/CA.pl -sign
## 注意这里的DNS,必须是 subjectAltName,这里是严格区分大小写的
2、CDP、AIA:

# 手动生成crl:
openssl ca -gencrl -out ISP-CA.crl
# 将crl的pem格式转换为der(否则web网站和命令无法识别):
openssl crl -in ISP-CA.crl -inform PEM -outform DER -out ca.crl
# 吊销证书:
openssl ca -revoke web.crt
# 吊销后要手动重新生成crl,并且转格式为DER(如果要放到web中):
openssl ca -gencrl -out capem.crl
3、pkcs12:
## 合成pkcs12:
# 只合并证书和私钥:
openssl pkcs12 -export -inkey server.key -in server.crt -out server.p12
# 合并证书+私钥+CA根证书:
openssl pkcs12 -export -inkey server.key -in server.crt -certfile ca.crt -out server.p12
## 拆分pkcs12:
# 导出证书:
openssl pkcs12 -in server.p12 -clcerts -nokeys -out server.crt
# 导出私钥:
openssl pkcs12 -in server.p12 -nocerts -out server.key
# 导出CA(如果有):
openssl pkcs12 -in server.p12 -cacerts -nokeys -out ca.crt
4、子CA:
注意子CA的字段需要是: CA:TRUE
并且颁发完子CA后记得改回:CA:FALSE
·如果有子CA,一些服务的需求的ca根证书(例如openvpn),那个文件中必须同时包含 根CA证书和 subCA证书
# 解决方法:将根CA根证书和子CA根证书放在同一张文件ca.crt中(需要注意根CA需要在前面)(服务和客户端都需要使用这张根证书来建立openvpn)
cat Root-CA.crt Sub-CA.crt > ca.crt
四、nftables
直接放行:iifname lo accept、meta l4proto { icmp, icmpv6 } accept
一些点对点的,例如:S2S、dns主从 等,可以同时写上 iifname、oifname、ip saddr、ip daddr
如果一些影响比较大的,例如web,可能从其他服务端测试的,就可以不配置 iifname、ip saddr 来限定源地址
防火墙不要对dhcp端口设置 ip saddr 的限制,因为dhcp客户端默认源地址为:0.0.0.0,目标为:255.255.255.255,如果配置了ip saddr,就会导致客户端无法获取dhcp地址
·防火墙放行 53端口时,建议同时放行 udp和tcp 53,因为有时解析可能会用到 tcp 53
·要写注释、自定义链、拒绝日志:

·拒绝之后记录日志:
## 记录拒绝日志,日志前缀为:WSC48-SZ-DROP:
# 需要创建一个自定义链,专门用来记录日志,然后将拒绝条目重定向到这个链
vim /etc/nftables.conf

末尾加一条 jump 将所有没有匹配到的条目跳过去
查看:
journalctl -k -f | grep --line-buffered 'WSC48-SZ-DROP:'

·同时放行 ICMPv4、ICMPv6:
![]()
或:
![]()
·防火墙速率限制:

·如果防火墙要求 output 策略为 drop,那么一定要配置放行 oifname lo accept,否则会导致一些服务无法访问。
五、LDAP(TCP 389、636):
1、设置 ssl、禁止匿名用户登陆:

ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif

当设置错误了 可以这样修改:


关闭匿名访问:


2、导入 用户表:
注意用户的CN 等于 givenname + sn,然后用户的 givenname 和 sn 正常填写就行
vim usertemp


·连接 ldap用户之后记得允许用户登陆的时自动创建家目录:
pam-auth-update
六、S2S VPN(UDP 500、4500;esp protocol):
1、wireguard:
apt install -y wireguard ncat
# 生成私钥公钥:
wg genkey > key1
cat key1 | wg pubkey > pub1
vim wg0
# 注意:预共享密钥是 presharedkey

2、openvpn:
证书要有serverAuth 和 clientAuth字段
开启ccd配置,在后续能够配置ccd
在服务端本地推送客户端路由,让服务端有路由能够访问客户端内网

还有ccd目录下的配置

# iroute //它告诉 OpenVPN 服务器:“如果你想访问客户端 172.16.1.0/24这个网段,请把数据包发送给当前这个客户端(client)
给客户端push路由,让它有路由能够访问服务端的内网:
![]()
3、strongswan:
# 证书字段:
证书1:vpn1.crt:CN=fw01.shanghai.cn,SAN DNS=fw01.shanghai.cn
证书2:vpn2.crt:CN=fw02.shenzhen.cn,SAN DNS=fw02.shenzhen.cn
apt install -y strongswan libstrongswan-extra-plugins
# 将证书、私钥复制到对应路径:
cp ca.crt /etc/swanctl/x509ca
cp vpn1.crt vpn2.crt /etc/swanctl/x509
cp vpn1.key vpn2.key /etc/swanctl/private
# 配置 strongswan:
vim /etc/swanctl/swanctl.conf
注意 local 和 remote 需要分别指定不同的证书


![]()

![]()


指定私钥文件名
![]()

swanctl --load-all
·配置自动发起连接:
vim /etc/swanctl/swanctl.conf
# 主要是 start_action 这一条就是
![]()

七、Web(TCP 80、443):
1、Apache2:
·301重定向保留URI:
vim /etc/apache2/sites-enabled/000-default.conf
# 要在最后加 /

·虚拟目录(别名):
直接访问 /whoami 就能访问到 /opt/wwwroot/whoami.html 文件
末尾不会有斜杠

当客户端访问 [uri]/whoami 时,就会返回这个 whoami.html 文件

·指定默认页面文件:

·对指定文件类型强制下载:

·仅支持IPv6/IPv4:
仅IPv6:

仅IPv4:

·开启 目录浏览(默认开启):

·身份认证:
·Basic:
htpasswd -cB /etc/apache2/.htpasswd user01
htpasswd -B /etc/apache2/.htpasswd user02
-c //创建新文件
-B //(可选)密码加密算法

·PAM 本地认证:
apt install -y libapache2-mod-authnz-pam
# 或者用 Directory 直接指定网页根目录

·LDAP:
a2enmod authnz_ldap
a2enmod ldap

·仅允许某个网段认证:
使用 require:
## 要求192.168.1.0/24网段进行身份认证:
Require ip 192.168.1.0/24
## 要求192.168.1.0/24、172.16.1.0/24网段、123.1.1.1机器进行身份认证:
# 并列写多个即可
Require ip 192.168.1.0/24
Require ip 172.16.1.0/24
Require ip 123.1.1.1
## 排除某个网段、IP:
Require not ip 192.168.1.0/24
·WebDAV:
# 注意要开放 WebDAV 根目录读写权限
mkdir /var/www/html/webdav
chmod 777 /var/www/html/webdav
a2enmod dav
a2enmod dav_fs
htpasswd -c .htpasswd admin

·拒绝使用 IP地址访问:

·添加 Header:
a2enmod headers

# 请求头:
## 作为代理服务器传给后端Web时需要配置
requestheader set X-Test "abc"

·自定义错误页面:
vim /etc/apache2/apache2.conf
# 这个路径是Web根路径,404文件放到web根目录即可

·(mTLS)客户端证书身份认证:

在 /usr/share/doc/apache2/下有配置摘抄:
grep -r SSLVerify /usr/share/doc/apache2/examples/*

# 合成证书为 pkcs12 给客户端:
openssl pkcs12 -export -out client.p12 -in skill39.crt -inkey skill39.key -certfile ca.crt
·mTLS 在子目录下:
禁用TLS 1.3:

模板在:/etc/apache2/mods-available/ssl.conf 中:


2、Nginx:
·301重定向保留URI:

·虚拟目录(别名):
·末尾带斜杠 / :

这个会在末尾自动加斜杠

·末尾不带斜杠:
直接指定文件(文件名不必须是 index)
需要加上 default_type text/html;否则会直接下载

这个不会在末尾加斜杠,但是访问加斜杠的路径会报错

·指定默认页面文件:
在这里指定

·对指定文件类型强制下载:

·仅支持IPv6/IPv4:
仅IPv4:

仅IPv6:


·开启 目录浏览:

·身份认证:
·Basic:
htpasswd -c /etc/nginx/.htpasswd user1
htpasswd /etc/nginx/.htpasswd user2

·PAM:
apt install -y libnginx-mod-http-auth-pam

·LDAP(PAM):
就是用上面 PAM的方式,然后本地连接 nslcd即可
·拒绝使用IP地址访问:
单独定义Virtual,然后其他域名、IP都放到 default_server 然后拒绝即可
## 444 是直接断开连接(nginx专有)

·添加 Header:

·添加 request header:
# 用于反向代理:
proxy_set_header X-Test "WSC2026";
·自定义错误页面:
# 这个路径是Web根路径,404文件放到web根目录即可

·(mTLS)客户端证书身份认证:

# 合成证书为 pkcs12 给客户端:
openssl pkcs12 -export -out client.p12 -in skill39.crt -inkey skill39.key -certfile ca.crt
·mTLS 放在子目录下:

八、Proxy(TCP 80、443、3128):
1、Haproxy:
·ACL:
use_backend www1 if { hdr_beg(host) -i web1 } //以web1开头的域名
use_backend www1 if { hdr(host) -i web1.wsc2026.org } //匹配 web1.wsc2026.org域名
use_backend api if { path_beg /api } //匹配指定的URI(不论是否有斜杠)
·调度算法:
balance roundrobin //(默认算法)权重轮询,将请求按顺序分配给后端服务器,可以手动调整权重,默认所有后端服务器权重一样,可以在运行中通过 Runtime API/stats socket 调整权重,roundrobin 可以动态生效
balance static-rr //也是权重轮询,但是是静态算法,手动指定好之后,就不能在运行时更改了
balance leastconn //最少连接,将新连接分配给当前连接数最少的后端服务器
balance first //优先使用第一台服务器,优先把连接发给编号最小、排在最前面的服务器,只有这台服务器达到maxconn(最大连接数,可以自定义)后,才使用下一台
balance source //源IP哈希模式,根据客户端源 IP 做 hash,让同一个客户端 IP 尽量固定到同一台后端服务器
balance uri //根据 HTTP URI 做 hash,
·TCP 代理:
·代理ftp、ftp被动端口:
将 mode 设置为 mode tcp 即可

·添加头部信息:


·mTLS:

# 合成证书为 pkcs12 给客户端:
openssl pkcs12 -export -out client.p12 -in skill39.crt -inkey skill39.key -certfile ca.crt
2、Squid(能透明代理):
·过滤配置,生成配置文件:
cp squid.conf squid.conf.bak
egrep -v "^#|^$" squid.conf.bak > squid.conf
·反向代理:


·正向代理:

浏览器设置:


·透明代理:
必须要有一个普通端口才能启动
intercept可以使用和它一样的端口,也可以自定义一个端口

或:

在本机配置防火墙,将 web流量重定向到这个端口:

·透明代理 https:
# 不能和 80 的透明代理一个端口
apt install -y squid-openssl

nft add rule ip nat prerouting iif ens37 tcp dport 443 redirect to 3129
·添加头部信息:
reply_header_replace
reply_header_add
request_header_replace
request_header_add

·允许身份认证头部:
# 带有身份认证的网页,通过squid代理后,客户端访问就不会弹出身份认证框,会直接 401报错。
需要加上这个参数
vim /etc/squid/squid.conf

3、Nginx 代理:
·代理一台:

·负载均衡代理:
Location这里直接用默认的就行了,不要加 ~

4、Apache2 代理:
这里就必须加 ProxyPreserveHost,这样就不会传IP给后端服务器,如果证书字段中没有IP,不配置这个,就会导致 proxy 和 后端服务器这个链路的web不信任
·代理一台:
http:

https:

·代理多个服务器:
# 可以调度方式:
## 必须要 a2enmod lbmethod_... 启用,例如:a2enmod lbmethod_byrequests
byrequests //默认算法,按权重分配。默认权重都是 1,所以就是轮询
bytraffic //尽量让 后端web1 和 web2 处理的总字节量一样。如果更改权重,例如 web1 = 2,web2 = 1,那么 web1 就会承担两倍于 web2的流量(字节量)
bybusyness //给最空闲的后端web(目前处理请求最少的web)

·如果要配置重定向:
直接在 80重定向即可

九、Mail(TCP 143、25、465、993、587):
·postfix/dovecot 如果使用了 lmtp来投递文件,就必须使用 Maildir格式来存储邮件,否则无法接收的邮件
·可以使用 postconf 查看配置属性

·postfix 写本地域名时,假设邮件域名是 mail.dmz.skills.cn,不仅要写 mail.dmz.skills.cn,同时还要写 dmz.skills.cn

·连接 ldap:
apt install -y dovecot-ldap
vim /etc/dovecot/conf.d/10-auth.conf
vim /etc/dovecot/conf.d/10-auth.conf

vim /etc/dovecot/conf.d/auth-ldap.conf.ext
## 将uri改为 ldaps 就能连接ldaps了

·注意要给 /home 权限,否则用户无法创建邮件目录:
chmod -R 777 /home
·starttls:
submission 就是 starttls(TCP 587)

·sasl:
postfix:
master.conf

main.cf

dovecot:

·邮件分离:
postfix:
main.cf

dovecot:

·邮件群发:

·邮件自动回复:
需要配置 lmtp 来投递
apt install -y dovecot-sieve dovecot-lmtpd
这个方式还需要配置 使用 lmtp进行投递
vim /etc/dovecot/conf.d/20-lmtp.conf
# 取消注释

vim /etc/dovecot/conf.d/90-sieve.conf
# 取消注释

这个 .dovecot.sieve 就是脚本文件名
# 编写脚本:
## 去到用户家目录(ldap用户定义的是哪个就是哪个,没有就创建):
vim /home/bob/.dovecot.sieve

systemctl restart dovecot 此时就能够自动进进行回复了
但是这个在一天内只会回复一次,要让它每次都回复,需要配置一个脚本,删除目录下的 .dovecot.lda-dupes* 两个文件
·写脚本骗过 sieve 脚本:
因为 sieve 脚本是通过检测.dovecot.lda-dupes 文件中定义的重复用户来判断的,因此直接删掉它就行了

客户端测试:

可以看到已经接受了 自动回复邮件:

·Mailbox、Maildir:
·Maildir:
maildir 需要使用 lmtp 来投递
main.cf

dovecot:
10-master.conf

10-mail.conf

·Maildir自定义路径:
dovecot:
10-mail.conf

其他全部注释
# 需要给目录权限,否则无法创建用户目录
chmod 777 /var/vmail/wsc48.test
postfix:

·Mailbox:
自定义mbox路径:

改 mail_inbox_path 路径即可
·postfix 配置 mTLS:
main.cf 指定根证书:

vim /etc/postfix/master.cf
# 配置只在 587 和 465端口启用:
添加一行 smtpd_tls_req_ccert=yes,并将 smtpd_tls_security_level 复制到下面

# 合成证书为 pkcs12 给客户端:
openssl pkcs12 -export -out client.p12 -in skill39.crt -inkey skill39.key -certfile ca.crt
·Webmail:
roundcube中,如果postfix 开启了 SASL认证,这里就必须有 %u 和 %p,如果没有开启,那么就建议将它们清空

十、Samba(TCP 445):
·基础参数:
browseable //是否能在网络浏览中看到
available //共享是否可用
valid users = //允许哪些用户访问
invalid users = //禁止哪些用户访问
write list //可读写用户/组 列表
read list //可读用户/组 列表
·samba 连接ldap:
man smb.conf

有时需要加上: idmap backend=ldap:"ldap://ldap.devops.com"

apt install -y smbldap-tools
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f /usr/share/doc/samba/examples/LDAP/samba.ldif
smbpasswd -W //root密码
net getlocalsid >> smbldap.conf
vim smbldap.conf
![]()



vim smbldap_bind.conf

smbldap-populate
·smbldap 工具:
smbldap-useradd //创建用户
-a //同时创建 samba用户(不加-a只创建ldap用户)
-m //创建home目录
-P //同时指定密码
-g //指定主要组
-G //指定附加组
-u //指定UID
smbldap-usermod //修改已经存在的用户
-a //将LDAP用户转换为Samba用户(添加Samba属性)
smbldap-passwd //不加参数时同时修改 LDAP/Samba 用户密码(在修改samba用户密码时,它必须有samba属性)
-s //只修改samba用户密码(必须有samba属性)
-u //只修改LDAP用户密码
·如果要使用 @group 这样匹配 LDAP用户组:
# 最简单的方式就是安装 nslcd:
apt install -y nslcd
## getent group shenzhen 能够列出用户即成功(一般连接成功就行了)

·用户映射:
smb.conf

adduser smbuser
adduser user1
smbpasswd -a smbuser
smbpasswd -a user1
vim /etc/samba/map

valid users 中要写左边的真实用户
·DFS:
# host msdfs=yes 表示这台Samba提供DFS
# msdfs root=yes 表示这个共享是DFS命名空间的根

# 假如本机是 srv02.wsc2026.sh
## 这里可以写 主机名,也可以写FQDN(但是必须要能够访问到,主机名还要写hosts,所以直接写fqdn):
ln -s 'msdfs:srv02.wsc2026.sh\resources' /dfsroot/resources

其他机器的也是这样添加,只要能够访问到
·定义多个target:
ln -s 'msdfs:fw01.wsc2026.sh\resources,srv02.wsc2026.sh\resources' /dfsroot/resources
此时两个文件夹的数据不会自动同步,这里可以使用 rsync 进行数据同步:
# 两边同时安装 rsync:
apt install -y rsync
ssh-keygen
ssh-copy-id root@fw01.wsc2026.sh
rsync -aHAX --delete /resources/ root@fw01.wsc2026.sh:/resources/
# -a 保留文件属性、权限
# -H 保留硬链接(不加也行)
# -A 保留 ACL(不加也行)
# -X 保留扩展属性(不加也行)
# --delete 表示本地删除的文件,远端也删除

十一、Docker(TCP 9090、9100、3000):
1、docker 常用命令:
(1)查看容器、镜像:
# 查看正在运行的容器:
docker ps
# 查看所有容器,包括未运行的容器
docker ps -a
# 查看所有镜像:
docker images
(2)删除容器、镜像:
# 删除容器:
docker rm [容器名] //只能删除未在运行的容器
要强制删除正在运行的容器,需要加上参数: -f
docker rm -f [容器名]
删除所有容器:
docker rm `docker ps -aq`
# 删除镜像:
docker rmi [镜像名] //只能删除未被容器使用的镜像
docker rmi -f [镜像名] //伪强制删除,只是删除了名称和TAG,镜像还存在(需要先删除容器,才能删除镜像)

(3)进入容器:
# 进入容器:
docker exec -u root -it [容器名] /bin/bash
# -i: 交互式操作。
# -t: 终端。
# /bin/bash 自选 shell,一般为 /bin/bash
exit退出容器
(4)在容器和本地机器之间传输文件:
# 复制本地文件到 docker中:
docker cp server.crt nginx:/
# 复制 docker 文件到本地:
docker cp nginx:/etc/nginx/nginx.conf .
(5)启动、停止容器:
# 停止容器:
docker stop nginx
强制停止容器:
docker kill nginx
# 启动容器:
docker start nginx
# 启动所有容器:
docker start `docker ps -aq`
(6)设置容器为开机自启动:
docker update --restart=always nginx
## 如果是 --restart always 将无法生效
docker update --restart always `docker ps -aq`
(7)关闭容器开机自启动:
docker update --restart no nginx
docker update --restart no `docker ps -aq`
(8)重新加载配置:
docker restart prometheus

·重命名镜像(对镜像打 tag):
docker tag grafana/grafana:latest grafana-v1:latest
# 然后删掉旧镜像即可:
docker rmi oldname:latest

2、创建 prometheus docker(TCP 9090):
prometheus-node-exporter(TCP 9100)
apt install -y prometheus
systemctl disable prometheus --now
/etc/prometheus/prometheus.yml

或者这样写:

# 创建容器网络:
docker network create mo
docker network ls
# 创建docker volume:
docker volume create prometheus-data
docker volume ls
# 创建 prometheus dockers:
docker run -d --name prometheus --network mo --restart always -p 9090:9090 -v /etc/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro -v prometheus-data:/prometheus prom/prometheus:v3.10.0 --config.file=/etc/prometheus/prometheus.yml --storage.tsdb.path=/prometheus
3、创建 grafana docker(TCP 3000):
docker volume create grafana-data
docker run -d --name grafana --network mo --restart always -p 3000:3000 -v grafana-data:/var/lib/grafana grafana/grafana-oss:12.4.2
4、监控值:
(1)UP/DOWN状态:
Stat 图表
up{instance=~".*:9100"}
(2)去掉端口:
label_replace(up{instance=~".*:9100"}, "host","$1","instance","(.*):.*")
(3)CPU:
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
(4)内存:
100 * (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
(5)服务状态:
# 使用 node_systemd_unit_state 参数

node_system.. 可以在 Builder中补全
name=~ 可以定义多个服务,能够同时查看多个服务是否up/down
然后可以使用 value map将 1 映射为 UP,将 0 映射为 DOWN

十二、Ansible、Git:
1、Ansible:
(1)读取文件:
·万能读取法:
这个方法不论文件中写了什么,都能读取到
## 这个name是变量名称,可以随便定义
- set_fact:
name: "{{ lookup('file', '/data/ansible/users.json') }}"

用这个方法所有格式的文件都能直接读取,然后在后面用 | [方法] 来处理不同格式的文件
1)json 文件:
# 使用 | from_json

2)yaml、yml文件:
# 使用 | from_yaml

·如果一个 yaml 文件中包含多个 yaml:
## 用 --- 来表示不同的 yaml
# 例如:
---
name: user1
age: 20
---
name: user2
age: 21

3)csv文件:
这个方法与直接使用 read_csv模块是一样的
# 使用 | community.general.from_csv
## 必须写 community.general.

直接使用 read_csv 文件:

2、Git:
2.1、Git 在本地:
mkdir /data
cd /data
git init
git config --global user.name "root"
git config --global user.email "root@shanghai.org"
# 然后就能 提交git了:
touch test
git add .
git commit -m "test file"
2.2、搭建 git仓库(git仓库在服务端上,使用客户端连接git仓库):
配置 服务端:
apt install -y git
# 搭建 git仓库:
mkdir /git
cd /git
git init --bare git.git
# git init --bare [仓库名称] //会自动在当前目录下创建仓库
adduser git //不是必要的,主要是看题目想要你使用哪个用户来 push 和 clone(如果没有指定,直接使用root也可以)(要用哪个用户,就将哪个用户设置为属主和属组)
chown -R git:git git.git/ //这个必须设置,git的用户必须对git服务器文件夹拥有属主和属组的权限
配置 客户端 push:
apt install -y git
git clone git@192.168.1.2:/git/git.git /ansible //把前面的‘git clone’替换成 scp,就能够理解这行代码了,一样的作用
git config --global user.email "git@a.com"
git config --global user.name "gitte"
cd /ansible
# 随意上传一些 文件、目录:(git也能够 push 和 拉取 目录[前提是目录中有内容])
echo 1 > 1.txt
mkdir test
echo 2 > test/2.txt
# push到 git仓库:
git add . //将更改添加
git commit -m "Add" //每次push都必须些commit,否则无法push
git push //完成push(这样才算push成功)
# push会提示需要输入密码
从 git 仓库拉取代码:
其实和 push 是一样的,甚至操作更加简单
apt install -y git
git clone git@192.168.1.2:/git/git.git /test
# 拉取成功,这样就可以看到上面push的代码

十三、Bash Script:
1、自动备份文件和mysql数据库,并删除超过7天的文件:
apt install -y mariadb-server
mkdir mysql_backup

如果要只保留3个最新文件:
ls -t /bash_scripts/backup_dir/*.sql | tail -n +4 | xargs rm -f
十四、NTP(UDP 123):
1、NTPSec:

2、Chrony:

十五、Keepalived:
·配置keepalived抢占时,优先级不能是 255,否则不会被抢占
·记得看题目,判断keepalived ip是否需要写掩码
·配置 IPv6 虚拟地址:

如果记不住,配置两个vrrp instance也可以
十六、磁盘:
1、为磁盘创建分区:
fdisk /dev/sdb //指定要创建分区的磁盘
n //创建分区
p
默认为1 //指定分区的数量
默认
默认
w /完成
2、raid:
apt install -y mdadm
# RAID会按照最小磁盘的大小来计算,例如三块盘:10G、20G、30G,会按照10G为标准来计算RAID磁盘大小
注意:RAID 冗余盘和热备盘不是一个东西,热备盘是手动使用 -x 指定的,可以不指定,冗余盘是根据不同的格式固定的
下面都是只计算冗余盘,不计算热备盘,因为热备盘不参与计算,要添加热备盘直接额外加 -x 添加即可
配置raid 1:
# 最少需要 2块磁盘,RAID磁盘大小等于单块磁盘大小:
不论添加多少块磁盘,容量大小都不变,都等于单块磁盘大小,因为只有一块磁盘用来存储数据,剩下的磁盘全部用来做备份
mdadm -C /dev/md1 -l 1 -n 2 /dev/sd[bc]
配置raid 5:
# 最少需要 3块磁盘,固定一块冗余磁盘,剩余两块存储数据
假如最终RAID大小要为20G:
3块磁盘(1块冗余),每块10G
5块磁盘(1块冗余),每块5G
mdadm -C /dev/md5 -l 5 -n 3 /dev/sd[bcd]
配置raid 6:
# 最少需要4块磁盘,固定需要2块磁盘冗余,最终RAID磁盘大小为减去两块磁盘后 剩余磁盘大小的总和
假如最终RAID大小要20G:
4块磁盘(2块冗余),每块10G
6块磁盘(2块冗余),每块5G
mdadm -C /dev/md6 -l 6 -n 4 /dev/sd[bcde]
配置raid 10:
# 最少需要4块磁盘,磁盘数量必须是偶数,一半的磁盘会被用作冗余磁盘,磁盘大小等于磁盘数量 除于2之后的总和
假如最终RAID大小要20G:
4块磁盘(2块冗余),每块10G
8块磁盘(4块冗余),每块5G
mdadm -C /dev/md10 -l 10 -n 4 /dev/sd[bcde]
配置raid 50:
RAID 50 = 多个 RAID 5,再做 RAID 0
# 最少磁盘数量 6块,假如有两组raid 5阵列(每组固定一块冗余磁盘),就可以对它们做raid 0
假如RAID磁盘大小需要为 20G:
6块磁盘(分成两组,每组一块冗余盘),每块5G
# 创建两个RAID5:
mdadm -C /dev/md51 -l 5 -n 3 /dev/sd[bcd]
mdadm -C /dev/md52 -l 5 -n 3 /dev/sd[efg]
# 做成RAID50:
mdadm -C /dev/md50 -l 0 -n 2 /dev/md51 /dev/md52
配置raid 60:
与raid 50一样,但是每组固定要2块冗余磁盘
# 最少磁盘数量 8块,假如有两组raid 6阵列(每组固定两块冗余磁盘),就可以对它们做raid 0
假如RAID磁盘大小需要为 20G:
8块磁盘(分成两组,每组两块冗余盘),每块5G
# 创建两个RAID6:
mdadm -C /dev/md61 -l 6 -n 4 /dev/sd[bcde]
mdadm -C /dev/md62 -l 6 -n 4 /dev/sd[fghi]
# 做成RAID60:
mdadm -C /dev/md60 -l 0 -n 2 /dev/md61 /dev/md62
3、lvm:
pvcreate /dev/sdb
vgcreate vg01 /dev/sdb
lvcreate -L 1G -n lv01 vg01
apt install -y xfsdump
mkfs.xfs /dev/vg01/lv01
或用 mkfs.ext4 ...
4、NFS(TCP 2049):
·将所有用户的请求映射为 匿名用户:
(1)配置 服务端:
apt install -y nfs-kernel-server
mkdir /test
chown nobody:nogroup /test //只有配置了这条才能生效
vim /etc/exports
## 共享目录的所属者、所属组和 exports文件中定义的uid要一样
将 all_squash 改为 root_squash 即可

exportfs -av
(2)配置 客户端:
apt install -y nfs-client
mkdir /test
vim /etc/fstab


·映射为其它普通用户:
# 如果要映射为其它普通用户,就在服务器上将属组改为普通用户,exportfs文件中的uid也要改为它,同时客户端和服务器都需要同时创建该用户(uid最好要一样)
假如要映射为skills用户:
server:
![]()

client:

十七、FTP(TCP 20、21;990):
1、vsftpd:
·定义根目录:
![]()
![]()
·允许匿名用户 上传、删除文件:

·显式ftp:

·隐式ftp:

·chroot:
![]()
·被动模式:
需要指定一个地址,这个地址就是 防火墙的地址

2、proftpd:
·允许匿名用户登陆:

匿名可写:

·隐式ssl:
apt install -y proftpd proftpd-mod-crypto
# 注意要安装 crypto 这个软件包,否则 ssl 无法起来
vim /etc/proftpd/proftpd.conf

vim /etc/proftpd/modules.conf
# 取消注释

vim /etc/proftpd/tls.conf
# UseImplicitSSL 需要背,没得抄


·显式ssl:
与上面隐式加密配置一样,甚至配置更少,只要不将端口改为990,保持默认的21,也不添加 UseImplicitSSL 配置即是显示加密
·chroot:
指定目录后自动配置:

·被动模式:
vim /etc/proftpd/proftpd.conf

十八、数据库:
1、mysql(TCP 3306):
# 创建数据库、用户:
create database wordpress;
grant all privileges on wordpress.* to 'admin'@'172.16.1.101' identified by 'Skills39';
flush privileges;
十九、fail2ban:
二十、cron:
* * * * * //每分钟
*/2 * * * * //每2分钟
*/3 * * * * //每3分钟
0 * * * * //每小时
0 0 * * * //每天
0 1 * * * //每天01:00
0 2 * * 1 //每周一02:00
二十一:system timer:

1、编写脚本:
vim /usr/local/sbin/wsc48-backup.sh

chmod +x wsc48-backup.sh
2、配置为 systemd:
cd /etc/systemd/system/
cp sshd.service wsc48-backup.service
vim wsc48-backup.service

systemctl daemon-reload
systemctl restart wsc48-backup
3、配置 systemd timer:
cd /etc/systemd/system/
cp /usr/lib/systemd/system/man-db.timer wsc48-backup.timer
vim wsc48-backup.timer //timer需要有一个同名的 .service
# 配置为每10分钟运行一次

但是这个配置是在 每小时的第 0、10、20 分钟进行执行,但是如果是每隔7分钟,就是从每小时的 0、7、14 ... 56,但是这里差4分钟就到下一个小时了,因此不是严格的每7分钟运行一次,要配置严格每7分钟运行一次需要配置:

# 启动计时器:
systemctl enable wsc48-backup.timer --now
查看计时器下一次执行时间
![]()
二十二:日志(TCP/UDP 514):
1、根据主机名来定义 日志文件存储文件名:
vim /etc/rsyslog.conf
