2020年秋招我投了奇安信的运维岗,笔试当天打开试卷,第一反应是:这卷子比我预想的要朴素。没有复杂的代码题,没有刁钻的算法,满屏都是Linux命令、网络状态码、数据库运维里最日常的东西。但正因为朴素,反而把基本功考得很扎实。
现在回头看,那套卷子基本代表了国内主流安全厂商对运维岗的核心预期——不要求你写过什么惊天地泣鬼神的脚本,但要求你对系统、网络、数据库、常用工具链有足够深入的理解,还得有安全运维的意识。这篇就把我当时对这套卷子的复盘整理出来,包括题型结构、核心考点、典型题目分析,以及备考时最容易踩的坑,给准备投网安方向运维岗的同学做个参考。
1. 笔试题型与考察思路总览
1.1 整套卷子的模块分布与分值逻辑
先说总体印象:卷子题量不算大,但涵盖面很广。主要分四个模块——Linux基础与系统管理、网络协议与安全运维、数据库基础、脚本与编程能力。题型以单选、多选、判断、简答和少量实操题为主,没有太多偏题怪题,但你需要对知识点有“即拿即用”的熟练度,而不是死记硬背。
从分值逻辑上看,Linux和网络部分占了绝对大头,大概接近六成。数据库与脚本各占一到两成,剩下的是安全常识类题目。这种结构和我后来面过的几家安全厂商运维岗出奇一致:他们不指望你一来就解决什么天花乱坠的架构问题,但要确保你是一个“靠得住的系统守门人”。
有个容易忽略的细节:多选题的赋分方式很严格,少选、错选都不得分。这意味着你对概念的边界必须非常清楚,而不是“感觉这个选项也有点道理”。我在做后面几道多选时,就明显感觉到平时依赖“模糊记忆”的知识点被精准狙击了。
1.2 奇安信运维方向到底在筛选什么样的人
拆解完整套卷子的考察点之后,你会发现它其实在筛选两类特质。
第一类是“基础宽度”。安全厂商的运维岗,日常可能同时面对Linux服务器、云平台、数据库、网络设备、终端安全软件的部署与维护。一个合格的候选人,不一定要每个方向都钻到专家级,但常见命令、常见故障场景、常见排障流程必须熟练。试卷里很多题目就是这个定位——给你一个报错场景,让你选出最合理的排查顺序。
第二类是“安全意识”。这和其他普通互联网公司的运维笔试有非常明显的区别。试卷里关于权限控制、日志审计、SSH加固、WebShell排查、基线核查的题目占比相当高。普通公司可能只问“怎么查端口占用”,而奇安信会追问“端口异常后你怎么判断是不是被人打了”。这种考察思路贯穿整套卷子,也提示所有准备这个方向的同学:安全知识不是加分项,而是必选项。
从备考角度看,我的建议是务必按“系统 + 网络 + 安全 + 数据库 + 脚本”五条线去复习,任何一条都不要有短板。下面逐块拆解。
2. Linux基础与系统管理核心考点
2.1 进程、内存、磁盘:高频三件套
奇安信这套卷子的Linux基础部分,进程管理、内存查看、磁盘排查是绝对高频考察点。考法不绕,但很看重对命令细节的理解。
比如进程管理,经典题目是给你一段ps aux的输出,让你判断哪个进程CPU占用异常。这里有个容易踩坑的地方:ps aux里默认显示的CPU使用率是进程生命周期内的平均值,如果你要定位瞬时飙高的问题,更适合用top或htop,并按P键按CPU排序。我在笔试时就遇到过这种“概念陷阱”——题目表面上问“哪个进程占用高”,实际考察的是你知不知道ps和top的差异。
另一个高频点是磁盘排查。常见题目会要求你区分df -h和du -sh的适用场景:df看的是文件系统级别的占用,du看的是目录实际大小。如果你发现系统提示磁盘满了,但du统计出来占用不大,大概率是有文件被删除但仍在被进程占用,或者有隐藏的大文件在某个挂载点之外。排查思路应该是先df -h定位哪个分区满了,再du -sh逐级往下找,必要时用lsof | grep deleted找到被删除但仍占用空间的文件。这套逻辑我在实际工作中每年都会用上几次,是基本功中的基本功。
内存部分,试卷爱考free -h的输出解读。很多人以为free里的available才是真正可用内存,其实它已经综合考虑了可回收的缓存,比free列看到的数值更准确。题目如果问“系统内存是否不足”,正确思路是看available,而不是只看free列的数字。另外,遇到内存问题不要一上来就“杀进程”,要先判断是内存泄漏、缓存占比过高,还是突发流量导致的正常波动,顺序反了很容易误伤线上。
2.2 systemd与日志:排查故障的基本功
2020年那会儿,很多老运维还在用service xxx start和/etc/init.d/xxx这一套,但奇安信的卷子已经明显偏向systemd了。它考察了systemctl的常见操作,比如设置开机自启、查看服务状态、重载配置,以及区分restart和reload的区别。
这里有个很多人没在意的细节:systemctl reload只对支持reload的服务有效,它相当于给进程发送一个信号,让进程重新加载配置文件而不是重启进程。但有些服务(比如改了一些依赖端口的配置)必须restart才能生效。刷题时如果只背了命令而没理解业务场景,看到“修改了Nginx配置后如何优雅生效”这类题目就容易犹豫。正确的做法多数情况下是nginx -t先检查语法,再systemctl reload nginx,这样做不会导致连接中断,是生产环境的标准操作。
日志排查也是这套卷子的重点,并且明显带着安全运维的色彩。它不只考你tail -f看日志,还会问你“系统登录失败记录在哪里”“怎么查看某个服务最近启动时的报错”。这些问题的答案分别对应/var/log/secure(或/var/log/auth.log)和journalctl -u 服务名 --since -1h。说明他们希望你具备通过日志定位异常的能力,而不是只会看个滚动输出。
我在复习时补了一个很有用的习惯:把常用的日志文件路径、对应服务、典型报错特征整理成一张表,考前过一遍。这套卷子里至少有两三题是直接命中了这类记忆点,属于送分题,背过就能拿分。
2.3 账号权限与sudo避坑清单
权限管理的考点主要分布在用户管理、文件权限、sudo配置这几块。其中最容易被考倒的是 sudo 的配置语法。
典型题是:要给用户 zhangsan 赋予免密执行/usr/bin/systemctl restart nginx的权限,应该怎么写 sudoers 配置?正确写法是zhangsan ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx。这里有几个坑:第一,命令路径必须写绝对路径,否则sudo会报“command not found”或权限不生效;第二,如果写ALL=(ALL) ALL,代表该用户拥有所有命令的执行权限,安全上属于高危配置;第三,修改sudoers文件一定要用visudo命令打开,它会在保存时做语法检查,避免因为写错导致sudo全部失效。
另外一个高频考点是su和sudo -i的区别,以及为什么生产环境不建议直接使用root账号。安全厂商的运维面试对这一点格外敏感,因为在他们的理念里,最小权限原则是一切操作的基本前提。笔试可能会给你几个操作场景,让你选出“符合安全规范”的做法,答案几乎都指向“使用普通用户 + 按需提权”。
文件权限部分,chmod和chown是必会的,但要注意特殊权限位。比如/tmp目录必须带t(sticky bit),否则普通用户之间就可以互相删除文件,这在多用户服务器上是灾难。题目如果给你一个drwxrwxrwt的输出,你要能马上反应出这个t代表什么含义,以及为什么需要它。
3. 网络协议与安全运维能力考察
3.1 TCP状态机与抓包分析
网络协议是安全厂商运维笔试的重头戏,其中TCP状态机和三次握手几乎是必考题目。奇安信这张卷子也不例外,但它的考法比较灵活,不是让你默写“三次握手是哪三次”,而是给你一个实际场景:服务器上有大量TIME_WAIT连接,可能的原因是什么,怎么处理。
这就非常考察对状态机的理解深度了。TIME_WAIT是主动关闭连接的一方进入的状态,它会持续2MSL(最大报文段生存时间)左右。大量TIME_WAIT通常意味着系统有大量短连接,比如高并发的Web访问、频繁的数据库连接新建。处理手段一般是调整内核参数复用端口,比如net.ipv4.tcp_tw_reuse=1,或者使用连接池减少新建连接。但这里要注意,tcp_tw_reuse只对“客户端发起连接”的场景生效,如果是服务器端频繁关闭连接,这个参数不一定有用,而且tcp_tw_recycle在新版内核里已经不建议开启了,可能引发NAT场景下的连接异常。这个细节让我在复习时学到了一句口头禅:任何优化都要先搞清楚自己是主动关闭方还是被动关闭方。
抓包分析题也出现在了卷子里,考的是tcpdump的基本用法。比如“如何抓取访问80端口的所有HTTP请求”和“如何保存抓包结果到文件供后续分析”。前者是tcpdump -i eth0 port 80,后者要加上-w参数。我自己在做这类题时有个心得:tcpdump抓包时最好加-n不做域名解析,否则大量DNS反查会导致抓包结果非常慢,也会让输出变得杂乱。这个细节不一定在考题里出现,但在实际排障中非常重要。
3.2 HTTP/DNS与常用网络排障
HTTP状态码是网络基础里性价比最高的知识点,几乎每年必考。卷子里给了几个状态码,要求判断含义和影响范围,比如 200、301、403、404、500、502、503、504。这里容易混淆的是 502(网关收到无效响应)和 504(网关超时)。前者通常是后端服务已经响应但内容非法,或者连接被重置;后者是后端在规定时间内没处理完请求。排查思路也不同:502先看后端进程是否存活、负载均衡和后端之间网络是否通;504则要关注后端响应耗时、数据库慢查询、外部接口调用是否超时。
DNS部分考了递归查询与迭代查询的区别,以及nslookup、dig的常见用法。对运维来说,dig比nslookup更适合排查问题,因为它能显示查询耗时、权威服务器、TTL等信息。举一个很实际的场景:用户反馈某个域名偶尔打不开,你在本机测试却正常,这时候需要确认TTL值,如果TTL很长,可能是客户端缓存了旧的解析结果。这类题目不考你背参数,而是考你有没有真正用这些工具解决过问题。
网络排障的实操题里,telnet、nc、ss、ping都被点名了。它们各自的定位要分清楚:ping测ICMP连通性,telnet和nc测TCP端口连通性,ss看端口监听和连接状态。一个经典题目是“服务器80端口能ping通但服务访问不了,怎么排查”,正确思路是先用ss -lntp或netstat -lntp看端口是否有进程监听,再用curl或telnet验证本地访问是否正常,最后检查防火墙规则和云安全组。这个层层递进的排查逻辑,是他们非常看重的“方法论”。
3.3 防火墙与远程运维加固
安全厂商笔试对防火墙的考察,比一般公司要细致不少。奇安信这套卷子涉及了iptables和firewalld的区别、常用规则写法、以及规则持久化方式。
举个典型题:写一条iptables规则,只允许10.0.0.0/8网段访问本机的SSH端口(22),其他来源全部拒绝。正确写法是:
iptables -A INPUT -p tcp --dport 22 -s 10.0.0.0/8 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j DROP这里需要注意规则的顺序:ACCEPT规则必须在DROP规则之前,因为iptables是自上而下匹配的。如果先把DROP放前面,后面的人永远连不进来。而且在生产环境执行这类操作时,我习惯先加一条“允许当前IP访问”的规则作为保底,再添加拒绝规则,不然很容易把正在用的远程连接直接断掉,这在笔试、面试甚至实际运维中都是高发事故。
SSH加固相关题目也用了不少篇幅。怎么禁用root密码登录、怎么修改默认端口、怎么使用密钥认证、怎么限制允许登录的用户。这些内容总结起来就是“远程登录攻击面收敛”八件事:禁用密码登录启用密钥、修改端口、禁止root直接登录、配置Fail2ban防暴力破解、限制来源IP、关闭无用Shell、设置登录超时、定期审计登录日志。卷子里有一道简答题就是“简述SSH服务安全加固的常见手段”,这个题如果能把以上要点写全,基本就能拿满分。
4. 数据库与脚本编程实操题
4.1 MySQL索引与事务
数据库部分主要围绕MySQL展开,考察了索引、事务隔离级别、常见备份恢复方式这些核心知识点。索引相关题目很典型:给你一条SQL,让你判断有没有走索引,以及如何优化。这就牵扯到EXPLAIN命令的解读——type字段(index级别)、key字段(实际使用的索引)、rows字段(扫描行数)都要看得懂。
最容易丢分的是 “联合索引最左匹配原则” 的变体题。比如有一个联合索引(a, b, c),查询条件是where b = 1 and a = 2,问会不会走索引。答案是会,但很多人按“查询顺序从左到右”的惯性来判断,就答错了。MySQL优化器会做等值条件的顺序调整,只要等值条件里包含最左列,就有机会走索引。但如果查询条件是where c = 1或where b = 1,不包含最左列a,就不会走这个联合索引。我把这个知识点整理成一句话:联合索引的最左匹配是指“查询条件中必须存在最左列”,而不是“SQL里写的顺序必须从左到右”。
事务隔离级别考了四种——读未提交、读已提交、可重复读、串行化,它们的区别以及能解决的并发问题。MySQL默认是可重复读(REPEATABLE READ),而Oracle默认是读已提交(READ COMMITTED)。这个差异也曾出现在题目里,考的就是你对不同数据库隔离级别默认值的熟悉度。事务ACID属性和脏读、不可重复读、幻读的定义也属于送分题,但要把这四者对应关系记牢,才能在多选题里不丢分。
4.2 备份与恢复:最容易被考倒的一环
运维方向笔试里,数据库备份与恢复是最能拉开差距的题目,因为它不是单纯考背诵,而是考你在真实灾难场景下有没有完整的处理预案。
奇安信这套卷子里有一道简答题:MySQL实例突然宕机,磁盘未损坏,如何基于已有备份将数据恢复到最近一次状态。这题完整的答题思路分几步:第一步,确认备份策略,是逻辑备份(mysqldump)还是物理备份(xtrabackup);第二步,恢复最近一次全量备份;第三步,将全量备份之后的binlog日志按时间点重放,命令大致是:
mysqlbinlog --start-datetime="2020-09-01 00:00:00" --stop-datetime="2020-09-01 10:23:00" /var/lib/mysql/mysql-bin.000001 | mysql -u root -p这里容易踩坑的点是没有记住--start-datetime和--stop-datetime这个参数,只写了“使用binlog恢复”,没有细节,得分就低了。另外要注意binlog必须和全量备份在时间上衔接上,比如你的全量备份是凌晨2点用xtrabackup做的,那binlog重放就要从凌晨2点开始,而不是从零点开始,否则会把备份之前的数据重复应用,导致主键冲突或数据错乱。这种细节只有真正在测试环境演练过恢复流程的人才能写出来。
关于备份工具选择,我的经验是:数据量小、要求简单,用mysqldump就可以,它能生成逻辑SQL语句,跨版本迁移也方便;数据量大或追求恢复速度,用xtrabackup做物理备份更合适,它直接拷贝数据文件,恢复时间比逻辑备份快一个量级。笔试如果问“生产环境200G数据库选什么备份方式”,正确方向基本是xtrabackup,而不是mysqldump。
4.3 Shell与Python测出来的基本功
脚本编程部分,Shell三剑客(grep、awk、sed)是绝对主角。考法很直接:给你一个日志文件,要求提取某个字段、统计出现次数、找出异常行。比如统计Nginx日志里访问量最高的10个IP,常规解法是:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10这个组合命令在高频笔试题里出现过不止一次,我建议所有备考的人把它背到肌肉记忆的程度。另外一个高频考点是 grep 的扩展正则,grep -E和egrep的关系,以及grep -P(Perl兼容正则)支持更高级的零宽断言。笔试里如果有“查找日志中IP地址”的题目,grep -oP '(\d{1,3}\.){3}\d{1,3}'这种写法会非常加分。
Shell脚本本身考了变量定义、for循环、函数定义、以及脚本执行方式的区别。比如bash script.sh和./script.sh的区别,前者不需要执行权限,后者必须要有执行权限并且文件第一行要有shebang(#!/bin/bash)。还有单引号与双引号的区别——单引号内所有字符都是字面值,双引号内会解析变量和命令替换。这些基础点看起来简单,但很多人会混淆。
Python部分考得不深,更偏向“能不能写明白一段小脚本”的程度。比如给你一个文本文件,要求统计每个单词出现的次数,并输出排序结果。用Python写可以使用defaultdict或Counter,再配合sorted排序,十来行就能解决。关键是要注意处理标点符号和大小写,否则统计结果会偏。我记得自己在模拟练习时就因为没处理大小写,导致统计结果错了一大半,后来总结了一个习惯:任何文本类统计题,先统一小写(.lower()),再剔除标点(re.sub(r'[^a-z\s]', '', text)),最后才分词统计。
5. 高频失分点与复盘心得
5.1 概念混淆的典型题目
复盘这套卷子时,我发现失分最多的地方不是不会的题,而是“以为自己会”的题。概念混淆是最大的失分根源,集中在以下几对容易搞混的知识点上。
第一对是 TCP 和 UDP。题目给几个应用场景,要求判断选TCP还是UDP——文件传输用TCP,视频直播一般用UDP或WebRTC,DNS查询基于UDP但区域传送用TCP,HTTP/HTTPS用TCP,SNMP用UDP。这里最容易被坑的是“DNS默认用什么协议”,答案是UDP,默认端口53,但很多新手会凭“可靠”直觉写成TCP。实际上,DNS规范规定标准查询优先走UDP,只有在响应大于512字节或做区域传送时才使用TCP。
第二对是四层负载均衡与七层负载均衡。四层工作在传输层,转发基于IP和端口,效率高;七层工作在应用层,可以做URL路径、Header、Cookie级别的路由,功能丰富但性能开销大。Nginx的upstream模块默认走七层,而LVS默认走四层。如果笔试问你“Nginx与LVS有什么区别”,中心思想就是四层与七层的区别,而不是什么“一个开源一个闭源”。
第三对是同步与异步、阻塞与非阻塞。这是两组不同维度的概念,不能混为一谈。同步阻塞是最常见的方式,同步非阻塞在等待结果时可以做其他事,异步则是在事件完成后通过回调或通知来获取结果。运维笔试一般不会考得太深,但会以文件读取或网络请求为例,让你判断属于哪种模式。我的经验是先明确每个动作是“谁在等”——调用方是否被挂起、等待期内能不能干别的、结果是通过返回值还是回调拿到。
5.2 命令参数不熟导致的送分题变送命题
我复盘了自己的答题记录,发现一个扎心的事实:有几道丢分题,不是知识点不会,而是命令参数记不准确。
比如tar命令,tar -czvf和tar -xzvf的区别、-z表示gzip压缩、-j表示bzip2压缩,这些在笔试中反复出现。如果题目是“解压backup.tar.gz到指定目录”,正确命令是tar -xzvf backup.tar.gz -C /opt/backup,其中-C指定目标目录。漏掉-C或者把-x写成-c,结果就完全错了。这个问题对老手来说看似低端,但考场上紧张时真的容易手滑,我的建议是考前把这类高频命令做成“肌肉记忆清单”,每天都默写一遍。
再比如find命令和locate命令的区别,以及find按时间查找的两个常用参数-mtime(修改时间)和-ctime(状态变更时间)。卷子里有一道题是“查找三天前被修改过的日志文件并删除”,正确写法是:
find /var/log -name "*.log" -mtime +3 -exec rm {} \;这里有几个易错点:-mtime +3表示超过三天的文件,-exec rm {} \;的结尾分号必须转义,很多人写成;就会报语法错误。更安全的做法是-delete参数,但需要注意-delete不能和-exec一起用,它是find内建的动作。
这类失分让我意识到一个备考原则:背知识点不如背命令场景。你不需要记住所有参数,但至少要能在看到“查找”“压缩”“统计”“定时”等关键词时,立刻反射出对应的命令组合。笔试时间有限,没有时间让你现场查手册。
5.3 针对2020秋招的备考建议
最后分享几个当时验证过很有效的备考方法。
第一,建一套自己的实验环境。不管是本机装虚拟机还是用一台云服务器,随便找几台机器把LAMP或者LNMP环境搭起来,再手动模拟故障——把Nginx停掉、把磁盘打满、把MySQL的慢查询打开、给SSH加上限制规则。这些操作本身就是在覆盖笔试考点,而且比纯刷题的印象深十倍。我当时用一台2核4G的小机器反复折腾,很多知识点到现在都忘不了。
第二,写一份“故障复盘文档”。把笔试考到的、以及日常实验遇到的所有报错和排查过程记录下来,格式固定为“场景 → 现象 → 原因 → 处理 → 预防”。这套卷子的简答题基本都能用这个结构来回答,而且答案会非常有条理。运维岗位本质上就是在不断处理故障,这种文档既是备考资料,也是真实工作的基本功。
第三,不要忽视安全常识题。奇安信这类安全厂商的运维笔试题会夹杂一些看似“无用”的问题,比如“怎么判断一台服务器是否被入侵”“什么是基线核查”“WebShell查杀思路”等。这些问题不需要你有多么深入的安全攻防经验,但至少要有一套完整的排查思路:查进程、查端口、查登录日志、查定时任务、查文件完整性、查Web目录最近被修改的文件。我在复习时专门整理了一套“入侵排查checklist”,笔试中有一道简答题几乎是直接套用这个模板答出来的。
第四点建议留给时间分配。整张卷子难度不大,但题量集中,我建议选择题和判断题控制在40分钟内完成,把充裕的时间留给简答和实操题。简答题的文字量决定印象分,宁可多写两条排除项,也不要只写一行结论。判卷人看的是你的分析过程,这也是运维岗位最真实的工作方式。
从我后来的经验看,2020年那批秋招题型的风格,其实延续到了很多安全厂商的运维笔试中:不追求高深,但覆盖面广,要求你“能干活的深度+不错位的广度”。如果你正在准备类似的岗位,把这篇里提到的知识点挨个过一遍,再用实验环境验证一遍,笔试通过率会高很多。