DoorDash Systems Administrator (Junior Level) - Interview Preparation Guide
DoorDash's interview process for Systems Administrator positions typically follows a structured format designed to assess technical fundamentals, hands-on infrastructure knowledge, problem-solving abilities, and cultural fit. For a junior-level candidate, the process emphasizes foundational knowledge of operating systems, networking, server management, and the ability to learn and grow in the role. Expect a combination of phone-based technical screening and onsite interviews with multiple team members.
Interview Rounds
Recruiter Screening
What to Expect
This is a brief initial screen with a technical recruiter to assess your background, interest in the role, and basic qualifications. The recruiter will confirm your technical background, understanding of the role, and general fit. This is also an opportunity to ask questions about the team, company culture, and next steps. Typically 20-30 minutes.
Tips & Advice
Be enthusiastic about infrastructure and systems administration. Clearly articulate your understanding of what a Systems Administrator does. Have questions ready about the team size, their infrastructure stack, and growth opportunities. This round is mostly about communication skills and cultural alignment, not technical depth.
Focus Topics
Communication Skills
Clearly explaining technical concepts in understandable terms without jargon
Practice Interview
Study Questions
Background and Experience Summary
Concisely explaining your technical background, any internships, personal projects, or relevant coursework
Practice Interview
Study Questions
Role Understanding and Motivation
Demonstrating clear understanding of what Systems Administrators do and why you're interested in the role
Practice Interview
Study Questions
Technical Phone Screen
What to Expect
A technical interview conducted over phone or video with an engineer from the infrastructure or systems team. This round focuses on foundational knowledge of operating systems, server administration basics, networking fundamentals, and troubleshooting approach. You'll be asked scenario-based questions about how you'd handle common infrastructure tasks and problems. Expect questions about Linux commands, Windows administration, user management, backups, and basic network concepts. The interviewer is assessing your technical foundation and how you approach problem-solving. Approximately 45-60 minutes.
Tips & Advice
Review Linux command-line fundamentals extensively (file permissions, user management, package managers, process management, logs). Be comfortable with Windows Server basics as well. When answering scenario questions, walk through your thought process step-by-step rather than jumping to conclusions. For junior candidates, the interviewer expects solid foundational knowledge but understands you won't know everything—it's okay to say 'I'm not sure, but here's how I'd find out.' Practice explaining your reasoning for troubleshooting decisions. Have real or hypothetical examples ready from your experience or projects.
Focus Topics
Networking Fundamentals
OSI model, TCP/IP, DNS, DHCP, IP addressing, subnetting basics, routing concepts, and firewall basics
Practice Interview
Study Questions
Backup and Disaster Recovery Concepts
Basic backup strategies, retention policies, recovery procedures, and the importance of verification
Practice Interview
Study Questions
Windows Server Administration Basics
Server roles, Active Directory basics, Group Policy, user account management, file sharing, Windows services, and event logs
Practice Interview
Study Questions
Linux Operating System Fundamentals
Command-line usage, file systems, permissions (chmod, chown), user and group management, package management, process management, and log files
Practice Interview
Study Questions
Troubleshooting Methodology
Systematic approach to identifying and solving problems: gathering information, forming hypotheses, testing solutions, and documenting results
Practice Interview
Study Questions
User Account and Access Management
Creating and managing user accounts, setting permissions, sudo/elevation, password policies, and access control principles
Practice Interview
Study Questions
Onsite Round 1 - Infrastructure and System Administration Fundamentals
What to Expect
First onsite interview with a senior Systems Administrator or infrastructure engineer. This round dives deeper into practical system administration skills, including server configuration, operating system knowledge, and hands-on infrastructure tasks. You may be asked to diagram network architectures, explain configuration decisions, or discuss how you'd approach setting up systems. The interviewer evaluates your technical depth, understanding of infrastructure best practices, and ability to ask clarifying questions. Approximately 45-60 minutes.
Tips & Advice
Be prepared to discuss real-world infrastructure scenarios and how you'd approach them. For example, you might be asked 'How would you set up a new user with appropriate access across multiple systems?' or 'Walk me through how you'd diagnose a slow server.' Show your work and explain your reasoning. It's better to ask clarifying questions (e.g., 'What's the current infrastructure like?' or 'What are the security requirements?') than to make assumptions. Draw diagrams if it helps explain your thinking. Relate answers back to the job description responsibilities where possible.
Focus Topics
Storage and File Systems
Understanding different file systems (ext4, NTFS), managing disk partitions, quotas, and storage architecture
Practice Interview
Study Questions
Disaster Recovery Planning
Creating recovery plans, RTO/RPO concepts, failover strategies, and documenting recovery procedures
Practice Interview
Study Questions
Software Installation and Patching
Installing applications, managing software licenses, applying security patches and updates, managing dependencies
Practice Interview
Study Questions
Security Fundamentals for Infrastructure
Access control, encryption basics, firewall configuration, intrusion detection, security patching, and security best practices
Practice Interview
Study Questions
Server Installation and Configuration
Setting up and configuring servers from scratch, including OS installation, hardware configuration, drivers, and initial security setup
Practice Interview
Study Questions
System Monitoring and Performance Management
Tools and techniques for monitoring CPU, memory, disk usage, network utilization; understanding performance baselines and alerts
Practice Interview
Study Questions
Onsite Round 2 - Networking and Infrastructure Troubleshooting
What to Expect
Second onsite interview with a network engineer or infrastructure specialist from the team. This round focuses on networking knowledge, network infrastructure management, and practical troubleshooting scenarios. You may be presented with real-world network problems and asked to diagnose and solve them. Topics include network design concepts, routing, switching, DNS/DHCP, VLANs, and common infrastructure issues. The interviewer assesses your ability to think systematically about network problems and your practical networking knowledge. Approximately 45-60 minutes.
Tips & Advice
Practice troubleshooting network problems methodically. For example, if asked about connectivity issues, walk through checking DNS, DHCP, routing, firewall rules, and physical connectivity in a logical order. Use tools like ping, traceroute, netstat, and ifconfig/ipconfig conceptually. Understand the OSI model and be able to map problems to layers. If you're presented with a network diagram, ask questions before diving in. For a junior role, deep networking expertise isn't expected, but showing a systematic troubleshooting approach is essential. Have examples ready of times you diagnosed networking issues.
Focus Topics
Remote Access and VPN Basics
VPN concepts, remote access technologies, SSH tunneling, and secure remote administration
Practice Interview
Study Questions
Routing and Switching Concepts
Understanding routing protocols, switch configuration, VLANs, spanning tree, and how traffic flows through networks
Practice Interview
Study Questions
Network Architecture and Design Basics
Understanding network topologies, segmentation, VLANs, subnetting, and how to design networks for scalability and security
Practice Interview
Study Questions
Firewall and Security Infrastructure
Firewall rules, access control lists, network security policies, and how security controls are implemented in infrastructure
Practice Interview
Study Questions
DNS and DHCP Configuration
How DNS and DHCP work, configuring these services, troubleshooting DNS resolution and IP assignment issues
Practice Interview
Study Questions
Network Troubleshooting and Diagnostics
Systematic approach to diagnosing connectivity issues, using diagnostic tools, understanding network protocols and common failure modes
Practice Interview
Study Questions
Onsite Round 3 - Behavioral and Culture Fit
What to Expect
Final onsite interview with a team lead, manager, or senior team member focused on behavioral assessment and cultural alignment. This round evaluates how you work in teams, handle challenges, approach learning and growth, and align with company values. You'll be asked behavioral questions about past experiences, how you handle pressure, collaboration, and learning from mistakes. The interviewer also assesses your enthusiasm for the role and fit with the team culture. Approximately 45-60 minutes.
Tips & Advice
Prepare specific examples using the STAR method (Situation, Task, Action, Result) for common behavioral questions like 'Tell me about a time you made a mistake and how you handled it' or 'Describe a challenging technical problem you solved.' For a junior role, emphasize your learning ability, willingness to take on new challenges, collaboration with team members, and how you handle not knowing something. Be genuine about what you don't know and your eagerness to learn. Ask thoughtful questions about the team's projects, culture, and how they approach mentoring junior team members. Show interest in the company's infrastructure and operations.
Focus Topics
Handling Failure and Mistakes
How you respond to making mistakes, learning from errors, and preventing similar issues in the future
Practice Interview
Study Questions
Adaptability and Handling Pressure
How you handle changing priorities, on-call situations, and stressful infrastructure incidents with calm and focus
Practice Interview
Study Questions
Technical Communication
Explaining technical concepts to non-technical stakeholders, documenting procedures, and asking clarifying questions
Practice Interview
Study Questions
Initiative and Ownership
Taking responsibility for tasks, proactively identifying improvements, and not waiting to be told what to do
Practice Interview
Study Questions
Teamwork and Collaboration
Working effectively with team members, communicating technical information, receiving feedback, and contributing to team goals
Practice Interview
Study Questions
Problem-Solving and Learning Approach
How you approach unfamiliar problems, your willingness to learn, resourcefulness in finding answers, and persistence in troubleshooting
Practice Interview
Study Questions
Frequently Asked Systems Administrator Interview Questions
A user reports they cannot authenticate with their SSH public key. The auth log shows: 'sshd[1234]: Authentication refused: bad ownership or modes for directory /home/bob'. Explain the root causes for this message and provide the exact commands you would run to fix the problem and verify SSH key authentication will work. Also mention additional checks (e.g., SELinux) you would perform if permissions look correct.
Sample Answer
Direct answer
That specific message means the SSH daemon's (sshd's) strict permission checks rejected bob's home directory or .ssh directory before it ever evaluated the key itself. By default, sshd refuses to trust a public key if the account's home directory, its .ssh directory, or the key file is writable by anyone other than its owner, because a group- or world-writable path there would let another local user plant their own key and log in as bob. The fix is tightening ownership and permissions on the exact chain of directories sshd checks, then verifying the fix actually took effect.
Structured elaboration
Root causes. Any of these produce the same "bad ownership or modes" message:
/home/bobis not owned bybob(or root), often from files restored by a backup tool or copied in by another administrator's account./home/bobor/home/bob/.sshhas a group- or world-writable bit set (sshd'sStrictModessetting, on by default, rejects this)./home/bob/.ssh/authorized_keysitself is writable by group or other, even if the directories above it are fine.
Commands to fix it, applied in the order that matches how sshd walks the path:
# 1. Home directory must be owned by bob, and not writable by group or other.
sudo chown bob:bob /home/bob
sudo chmod go-w /home/bob
# 2. .ssh directory: owner-only access.
sudo mkdir -p /home/bob/.ssh
sudo chown bob:bob /home/bob/.ssh
sudo chmod 700 /home/bob/.ssh
# 3. authorized_keys file: owner-only read/write, no execute needed.
sudo chown bob:bob /home/bob/.ssh/authorized_keys
sudo chmod 600 /home/bob/.ssh/authorized_keys
Verifying the fix. Confirm the actual mode bits, not just that the commands ran without error:
stat -c "%a %U:%G %n" /home/bob /home/bob/.ssh /home/bob/.ssh/authorized_keys
Expect something like 755 bob:bob /home/bob, 700 bob:bob /home/bob/.ssh, and 600 bob:bob /home/bob/.ssh/authorized_keys. Then attempt the actual login with verbose logging so sshd's own reasoning is visible: ssh -vvv bob@host, and separately watch the server side with sudo tail -f /var/log/auth.log (or /var/log/secure on Red Hat-family distributions) for the corresponding "Accepted publickey" line, rather than assuming success from the client side alone.
If permissions look correct and it still fails, check SELinux (Security-Enhanced Linux, a mandatory access control system available on many Linux distributions). Standard Unix permission bits and SELinux are two independent checks; a directory can have perfectly correct ownership and mode and still be denied if its SELinux file context (label) is wrong, most commonly after files were restored from a backup or copied from another location without preserving context:
ls -Z /home/bob/.ssh /home/bob/.ssh/authorized_keys
.ssh and its contents should carry the ssh_home_t context. If it shows something else (commonly a generic context like user_home_t after a restore), restore the correct label rather than trying to set it by hand:
sudo restorecon -Rv /home/bob/.ssh
If that does not resolve it, check for an actual denial being logged rather than guessing further:
sudo ausearch -m avc -ts recent
An access vector cache (AVC) denial entry naming sshd and the .ssh path confirms SELinux, not a stale permission bit, is the actual blocker.
Worked example
A concrete before-and-after for this exact scenario. Suppose /home/bob/.ssh was left group-writable (mode 775) after a provisioning script ran as root and did not lock it down, a common way this exact error gets introduced:
Before: drwxrwxr-x bob bob /home/bob/.ssh (group-writable, sshd rejects this)
-rw-r--r-- bob bob /home/bob/.ssh/authorized_keys
After applying the fix commands above:
drwx------ bob bob /home/bob/.ssh
-rw------- bob bob /home/bob/.ssh/authorized_keys
Running the fix commands against exactly this before-state (verified directly: chmod go-w on the home directory, chmod 700 on .ssh, chmod 600 on authorized_keys) produces exactly the after-state shown, the group-write bit is gone from .ssh and authorized_keys no longer has any bits set beyond owner read/write. That is the state sshd's strict-mode check requires before it will even look at the key's contents.
Trade-offs and pitfalls
- Fixing only
authorized_keysand skipping the parent directories is a common half-fix. sshd checks the whole path, home directory,.ssh, and the key file itself, so a perfectly permissioned key file inside a group-writable.sshdirectory still fails. - Assuming a fix worked because the commands returned no error is a common mistake. Always verify the actual mode bits with
stat, and confirm the login itself succeeds with verbose logging, rather than trusting thatchmodsilently doing nothing wrong means the state is now correct. - Jumping straight to SELinux before confirming ownership and mode bits wastes time. SELinux denials produce a similar practical symptom (login refused) but a different log signature; check the simpler, more common cause first, and only chase an SELinux label mismatch once the standard permission chain is confirmed correct.
- Manually setting an SELinux context instead of using
restoreconrisks getting the label subtly wrong.restoreconrestores the context the system's own policy defines for that path, which is more reliable than guessing a context string by hand.
Define progressive disclosure and describe two concrete ways you would use it in technical documentation so a reader can go from a high-level decision down to low-level implementation detail without being overloaded.
Sample Answer
Direct answer
Progressive disclosure means showing the minimum someone needs to make their next decision first, then letting them opt into more detail only if they need it, rather than presenting every layer of a decision at once. For technical documentation, that means separating what we decided and why it matters from how it's actually implemented, and only showing the second layer to someone who asks for it.
Structured elaboration
Two concrete ways to build this into documentation:
- A "decision, then detail" page structure. The top of the page states the decision and its business-relevant effect in one or two sentences. Directly below, an expandable or clearly linked section holds the reasoning (why this option over the alternatives, what constraint drove it), and a separate section holds the implementation (exact commands, config, code). A reader making a go/no-go call never has to scroll past architecture detail to find the decision.
- Collapsed detail blocks inside a page that stays otherwise readable. Long code blocks, diagrams, or benchmark tables default to collapsed, with a label that tells the reader what's inside before they open it, not just "details." This keeps the page skimmable top to bottom for someone doing a first pass, while an engineer implementing the change can expand everything in order.
Both work because they let the reader choose their own depth instead of the writer choosing it for them, and because the label on each layer, decision, why, how, tells the reader which layer they're in before they commit to reading it.
Worked example
A raw engineering note might read: "Switched to regional read replicas with async replication and connection pooling via PgBouncer to cut p95 read latency." Applied with progressive disclosure, the page becomes:
Top line (decision layer): "We added copies of the database closer to users in each region so read requests don't have to cross the country, which is what was making some pages feel slow for customers far from our main data center."
Expandable "why" layer: explains the latency problem was concentrated in specific regions and why a cache alone wasn't sufficient, still in plain language.
Expandable "implementation" layer, collapsed by default: regional read replicas (copies of the database kept near each user region), updated by async replication (the copy is written a short delay after the original, not instantly), and connection pooling via PgBouncer (a tool that reuses open database connections instead of opening a new one per request), plus config snippets and the failover procedure.
A reader deciding whether to approve the change never has to parse "PgBouncer" or "async replication" to get the decision; an engineer implementing it clicks straight through to exactly that.
Trade-offs and pitfalls
Progressive disclosure can misfire if the top layer is vague instead of just simple: "we improved performance" tells the reader nothing they can act on, while "reads are faster for users far from our main region" does. It also fails if the label on a collapsed section doesn't say what's inside; readers won't expand something called "details," so label it with what they'll actually get, for example "config and rollback steps." And it isn't free: every layer you maintain is another thing that can drift out of sync with the code, so it's worth it for docs people repeatedly return to, not a one-off internal note nobody will reread.
A kernel module fails to load with an 'invalid module format' error, and another causes an oops soon after loading. What does each symptom tell you about how modules bind to a running kernel, and how do you isolate the cause?
Sample Answer
Background: what a module is. A loadable kernel module is a compiled object file (.ko, an ELF file) that the running kernel links into itself at load time. It runs in kernel mode with full privilege and calls kernel functions directly, with no stable binary interface protecting it (the kernel's internal API and data layouts change between versions and even between build configurations). So loading has two jobs: check that this module was built for this kernel, and resolve its references to kernel symbols. The two symptoms in the question fail at different points in that process.
Symptom 1: 'invalid module format' at load time = the kernel refused the module before running any of its code.
The load fails with ENOEXEC, which insmod prints as 'Invalid module format' (modprobe prints the plain C-library text for the same error, 'Exec format error'). The init_module man page lists the image not being a valid ELF file, or being for a different architecture, as ENOEXEC causes, and adds that the flags described below, which ask the kernel to skip the version checks, also end in ENOEXEC unless the kernel was built with CONFIG_MODULE_FORCE_LOAD. The kernel source (kernel/module/main.c and version.c, checked at v6.12) also returns ENOEXEC when the version magic string does not match and when the check of the module_layout symbol's checksum (a checksum of the layout of the kernel's struct module) fails. A checksum mismatch on any other symbol the module imports fails differently: the kernel logs disagrees about version of symbol <name> and returns EINVAL, which insmod shows as 'Invalid parameters' (modprobe shows 'Invalid argument') rather than 'Invalid module format'.
- Version magic (
vermagic): a string compiled into the module with the kernel version and prominent build features (SMP, preemption model and similar). The kernel compares it with its own and refuses the module on a difference. How much of the string is compared depends onCONFIG_MODVERSIONS: when the module carries symbol checksums (next bullet), the kernel-release word at the start is skipped (same_magic()inkernel/module/version.ccomments that the first part is the kernel version, which is ignored if the module has checksums) and only the feature words (SMP, preempt, mod_unload, modversions, architecture and similar) must match; withoutCONFIG_MODVERSIONSthe release must match as well. So a module built for 6.1.x and loaded on 6.5.x with modversions on usually fails the next check instead. - Symbol versioning (
CONFIG_MODVERSIONS): each exported kernel symbol has a checksum of its prototype (recorded in theModule.symversfile produced by the kernel build). The module records the checksums it was built against; if a function's signature or a struct it uses changed, the checksum differs and the load is refused (withENOEXECformodule_layout,EINVALfor other symbols, as above). This catches an ABI (binary interface) change even when the version string matches, for example the same version with a different config, and it is what normally rejects a module left over from an older kernel release when modversions is on.
The man page also describes flags that ask the kernel to skip each check (MODULE_INIT_IGNORE_VERMAGIC,MODULE_INIT_IGNORE_MODVERSIONS). Forcing a load past a real mismatch is the trap that produces Symptom 2. It is only possible on a kernel built withCONFIG_MODULE_FORCE_LOAD(the kernel then taints itself withF); on other kernels the force flags simply fail withENOEXEC.
Illustrative artifacts (the exact wording varies by kernel version). The shell shows only insmod: ERROR: could not insert module mydrv.ko: Invalid module format. The detail is in the kernel log:
$ dmesg | tail -2
mydrv: version magic '6.1.0-13-amd64 SMP preempt mod_unload modversions ' should be '6.1.0-13-amd64 SMP mod_unload modversions '
Read it as: the module was built for a kernel with the preempt feature and the running kernel (same release) was built without it, so the version-magic check failed and none of the module's code ran. The kernel release is the same in both strings; with modversions in them it would not have been compared anyway. The typical failure after upgrading from 6.1 to 6.5 with an old .ko is the symbol-version one instead, which logs a line like mydrv: disagrees about version of symbol module_layout, meaning the feature words matched but a checksum did not. For module_layout insmod reports 'Invalid module format'; for a different symbol name the same log line appears but insmod reports 'Invalid parameters'.
$ modinfo mydrv.ko | grep -E 'vermagic|license'
vermagic: 6.1.0-13-amd64 SMP preempt mod_unload modversions
license: GPL
vermagic is the version-magic string stored in the file. Compare it with uname -r.
Isolating symptom 1 (ordered checks)
dmesg | tailright after the failed load. The kernel normally logs more detail than the one-line user-space message; read it for which check failed.- Compare the two strings:
uname -rversus the version magic string embedded in the module file (modinfo <file>.koprints the module's attributes; look for thevermagicline, and compare it with the kernel's own version). WithCONFIG_MODVERSIONSthe kernel does not compare the release word, so a matching release does not rule out a checksum failure, and the feature words (SMP, preempt and so on) must match as well. - Confirm the target architecture: a module built on one CPU architecture will not load on another.
- Check that the build used the right tree: the kernel documentation builds an external module against the running kernel with
make -C /lib/modules/$(uname -r)/build M=$PWD, which needs the matching headers and build files installed. A module built against headers of a different version or config is the typical cause. - If
CONFIG_MODVERSIONSis on, the build must have used theModule.symversof the full build of the running kernel; the documentation notes that a bare prepared tree does not produce it.
Remedy for symptom 1: build against the running kernel and keep it matching. After every kernel update the old .ko no longer matches. A framework such as DKMS (Dynamic Kernel Module Support) keeps the module source registered and automates building and installing it for each installed kernel; verify after a kernel update that the new kernel got a freshly built module before rebooting into it. Do not use the ignore-version flags as a production fix.
Symptom 2: the module loaded and an oops (the kernel's report of an illegal operation in kernel mode) appears shortly after = the checks passed, so the kernel ran your code and the code (or its assumptions) is wrong.
Two families of cause:
- The module's own bug: a NULL or dangling pointer, an out-of-bounds write, using a freed object, sleeping in a context where sleeping is not allowed (interrupt context), or bad error-path cleanup in the init function.
- A hidden mismatch the checks missed: the module was force-loaded, or built with a different config than the running kernel, so a struct has different field offsets than the module assumes. Code reading a field at the wrong offset crashes at a seemingly unrelated place.
An illustrative oops, annotated:
BUG: kernel NULL pointer dereference, address: 0000000000000010
#PF: supervisor read access in kernel mode
RIP: 0010:mydrv_read+0x1a/0x90 [mydrv]
CPU: 2 PID: 1234 Comm: cat Tainted: G O 6.1.0-13-amd64 #1
Call Trace:
vfs_read+0x9b/0x1a0
Line 1 says what happened: a read from address 0x10, which is a small offset from a NULL pointer (a field 16 bytes into a structure whose pointer was NULL). The RIP line (the instruction pointer, the address of the instruction that faulted) names the function mydrv_read, byte offset 0x1a into it, inside a function 0x90 bytes long, in module mydrv. The Tainted: G O field says no proprietary module has been loaded (G: every loaded module declares a GPL-compatible licence) and an out-of-tree module is loaded (O); a proprietary module would show P instead of G. A kernel built with CONFIG_MODULE_SIG (as Debian's is) also sets E for an unsigned module, so a real report from such a kernel would normally show E next to the O as well. The call trace shows mydrv_read was called from vfs_read, so a read() on a device file triggered it. A concrete scenario: after a forced load, a structure's field moved, so the module read a stale offset; the oops then points at a plausible-looking line in a function you never changed. If the taint letters include F, suspect that first.
Isolating symptom 2 (ordered checks)
- Read the first lines of the oops in
dmesg: the message type (the kernel documentation's example oops for a NULL pointer showsBUG: unable to handle kernel NULL pointer dereference at (null), and current x86 kernels printBUG: kernel NULL pointer dereference, address: <address>as in the example above; the address shows how far from zero the access was), the instruction pointer (RIPon x86-64) giving function name plus offset, the module name in brackets, and the call trace. - Check taint flags in the report (taint is the kernel's record of anything that makes a report less trustworthy):
P(proprietary module),O(out-of-tree module, built outside the kernel source tree),F(force-loaded),E(unsigned module).Fpoints straight at a forced mismatch. The kernel docs note that reports from tainted kernels are often ignored by kernel developers, so reproduce on a clean kernel where possible. - Translate the crash address into a source line: with a
.kobuilt with debug info,addr2line(turns an address in a binary into a source file and line) orobjdump -dl(disassembles the module and interleaves source lines) against the module, or the kernel'sdecode_stacktrace.shscript (which rewrites an oops so eachfunction+offsetshows its source line, and needsCONFIG_DEBUG_INFO, the build option that keeps debug information). For exampleaddr2line -e mydrv.ko -f mydrv_read+0x1aprints a file and line. Often the line is a dereference of a pointer you can then reason about. - Reduce: does it crash on load, on first open, or under load? Load with the init function's later steps disabled, bisect your own commits, and try the same
.koon a kernel it was built for. - Add instrumentation: a kernel built with KASAN (kernel address sanitiser, a debug mode that tracks which memory is valid and reports bad accesses at once) catches use-after-free and out-of-bounds in module code at the faulting access instead of later.
Putting the two together: symptom 1 says the binding check failed, so the module and kernel disagree on version or interface; symptom 2 says binding succeeded and the problem is in behaviour. If symptom 2 started after you forced a load or after a kernel update with a stale .ko, treat it as symptom 1's root cause in disguise: rebuild against the exact running kernel and retest before debugging the code.
A service seems to be listening but a client can't connect. Using ss (or netstat) on the host, walk through how you'd confirm what's actually listening, on which address and port, and how you'd distinguish a loopback-only bind from one that's reachable externally, a process-ownership problem, and other local blockers (host firewall, SELinux, network namespace) from an actual network-path problem.
Sample Answer
Direct answer
Use ss (or the older netstat) to see exactly what's listening, on which address and port, and confirm whether the bind is scoped to loopback only or to all interfaces, since that single distinction explains a large share of it's-listening-but-nothing-external-can-connect reports. Beyond the bind address and process ownership, a separate class of local blockers, the host firewall, SELinux, and network namespaces, can each independently prevent an otherwise healthy listener from being reached, and each needs its own specific check rather than being lumped in with the network.
Structured elaboration
- List listening sockets with process ownership: ss -ltnp (listening, TCP, numeric, show process) lists every listening TCP socket along with the PID and process name holding it; this immediately answers whether anything is actually listening on this port, and whether it's the process you expect.
- Read the local address field carefully: 0.0.0.0:8080 means the process is listening on all interfaces and is reachable from outside the host (firewall permitting); 127.0.0.1:8080 means it is bound only to loopback and is fundamentally unreachable from any other host, no matter what firewall rules say, because the OS never even considers external interfaces for that socket.
- Check established connections and their state with ss -tn (without the -l) to see active connections; a large number stuck in SYN-RECV suggests the three-way handshake is not completing (possibly a firewall dropping the client's ACK, or a backlog queue issue on the server), while a large number in TIME_WAIT on a busy server is often benign churn rather than a problem, unless it is approaching ephemeral port exhaustion.
- Check the host firewall explicitly, as its own distinct layer from anything upstream: on iptables-based hosts,
iptables -L -n -v(oriptables -S) shows whether a rule is dropping or rejecting the port in question, and on firewalld-based hosts,firewall-cmd --list-allshows the active zone's allowed services and ports; a socket can be correctly listening on 0.0.0.0 and still be unreachable purely because the host's own firewall drops the inbound SYN before it ever reaches that socket. - Check SELinux (on systems that enforce it) as a separate, non-firewall local blocker:
getenforceconfirms whether SELinux is enforcing at all, and if it is, a service listening on a non-standard port that was never labeled for that port's SELinux port-type will be denied at the kernel security-module level even though the bind and firewall are both correct;ausearch -m avc -ts recent(or sealert on systems that have it) surfaces the specific denial, andsemanage port -l | grep <port>shows what port-type is currently associated with that port, withsemanage port -a -t <type> -p tcp <port>as the fix once the correct type is identified. - Check network namespaces on containerized or namespace-isolated hosts: a process can be listening perfectly well, but inside a different network namespace than the one you are inspecting from (for example inside a container's own namespace rather than the host's default namespace), so ss run in the wrong namespace will show nothing at all, not a loopback-only bind or a blocked port.
ip netns listenumerates namespaces on the host, andip netns exec <ns> ss -ltnp(ornsenter --net=<path> ss -ltnp) runs the same check inside the namespace that actually owns the socket; a 0.0.0.0 bind inside a container's namespace is still only reachable from outside according to whatever port-publishing or bridging rule (for example Docker's own iptables-based NAT rules) connects that namespace to the host and the network beyond it. - Distinguish not-listening-at-all from listening-but-blocked-further-out: if ss -ltnp shows nothing on the expected port in the correct namespace, the application itself never started or crashed, a fact entirely independent of firewalls, SELinux, or networking; if it does show a correct, externally-bound listener and external clients still cannot connect, the fault has moved to one of the local blockers above, or to something outside the host entirely.
Worked example
ss -ltnp shows LISTEN 0 128 127.0.0.1:8080 0.0.0.0:* users:(("myapp",pid=4521,fd=6)). The process is confirmed running and listening, but bound specifically to 127.0.0.1, loopback only; changing the bind address to 0.0.0.0 is the first fix, before any firewall or SELinux check is even relevant. Suppose instead ss -ltnp shows the same process correctly bound to 0.0.0.0:8080, and external clients still cannot connect. iptables -L -n -v on the host shows no DROP or REJECT rule referencing port 8080, ruling out the host firewall. getenforce reports Enforcing, and ausearch -m avc -ts recent shows an AVC denial for that process attempting to bind to port 8080, because the application was reconfigured to use a nonstandard port that was never added to SELinux's port-type list for that daemon; semanage port -a -t http_port_t -p tcp 8080 (or the appropriate type for the service) resolves it. In a third case, the process runs inside a container; ss -ltnp on the host shows nothing at all for port 8080, not because the process is not listening but because it is listening inside the container's own network namespace; docker exec <container> ss -ltnp (or ip netns exec <ns> ss -ltnp) confirms the process is listening correctly inside its namespace, and the actual question becomes whether the container's port-publishing rule correctly maps the host port to it.
Trade-offs & pitfalls
It is easy to see the process is listening in ss output and conclude the service is correctly exposed, without reading the bind address carefully enough to notice it is loopback-only, or without checking that you are even looking in the right network namespace. Also do not confuse ss -ltnp's absence of a listener with a firewall or SELinux problem; if nothing is listening in the namespace you are inspecting, no firewall rule or SELinux policy anywhere will make the connection succeed, and time spent checking those first is wasted until is-it-listening-and-where is ruled out. SELinux denials in particular are easy to miss because the application logs may show nothing useful at all (the bind or connection attempt is blocked below the application's own visibility), so always check ausearch or the audit log specifically once a correctly-bound, correctly-firewalled listener still is not reachable.
Which DNS record types would you expect to find in a typical production zone, what is each one for, and which one has bitten you or a colleague with a subtle operational pitfall?
Sample Answer
Direct answer
A production zone is built from a few record types, each with one job: SOA (start of authority) describes the zone and its refresh timers, NS names the servers that are authoritative, A and AAAA map a name to an IPv4 or IPv6 address, CNAME makes one name an alias of another, MX says where mail goes, TXT carries free text such as email-sender policy (SPF, Sender Policy Framework), SRV locates a service by host and port, CAA restricts which certificate authorities may issue certificates, and PTR (in a reverse zone) maps an address back to a name. Most zones are mostly SOA, NS, A/AAAA, CNAME and MX; TXT, SRV, CAA and PTR appear when a service needs them, and the DNSSEC records only in signed zones. The pitfall I would name is the CNAME: a name that owns a CNAME may own no other record type, so an alias placed at the zone apex quietly collides with the SOA, NS and MX records that must live there.
What each type is for
| Type | Purpose | Operational rule that matters |
|---|---|---|
SOA | Zone metadata: primary server, contact, serial, refresh, retry, expire, and the last field (the negative-caching TTL) | Secondaries re-fetch the zone only when the serial increases, so forgetting to bump it leaves them serving old data |
NS | Delegates and names the zone's servers | Keep at least two, on separate networks; the parent zone must carry matching NS records |
A / AAAA | Address of a host | A name can have several; publish AAAA only if the service really answers on IPv6 |
CNAME | Alias to a canonical name | Cannot coexist with other data at the same name (RFC 2181 section 10.1) |
MX | Mail exchangers, lowest preference number tried first | Target must be a name with an address record, not an alias (RFC 2181 section 10.3) |
TXT | Sender policy (SPF), domain-verification tokens | One SPF record per name; SPF allows at most 10 DNS-querying terms (RFC 7208 section 4.6.4) |
SRV | Priority, weight, port and host for a service | Needs the target host to have an address record |
CAA | Which CAs may issue for the name | A CA climbs the name tree to find the nearest CAA set (RFC 8659); no CAA anywhere means no restriction |
PTR | Reverse lookup, lives under in-addr.arpa or ip6.arpa | Owned by whoever controls the address block, often the ISP, not the domain owner |
DNSSEC (the DNS signing extensions) adds DNSKEY, DS, RRSIG and NSEC (or NSEC3) records to a signed zone; signing is a separate step on top of the plain zone shown here.
The SOA fields in plain words
The five numbers in the SOA record are all times in seconds except the serial (RFC 1035 section 3.3.13):
- serial: the version number of the zone. A secondary (a server that copies the zone from the primary) compares it with its own copy.
- refresh (7200 below, 2 hours): how often a secondary asks the primary whether the serial changed.
- retry (900, 15 minutes): how long a secondary waits before trying again after a refresh failed.
- expire (1209600, 14 days): if a secondary cannot reach the primary for this long, it stops answering for the zone.
- negative-caching TTL (300, 5 minutes; the last field, called MINIMUM in the record): how long a resolver may remember that a name or record type does not exist. RFC 2308 takes the smaller of this field and the
SOArecord's own TTL.
The second name in the SOA, hostmaster.example.com., is the responsible person's mailbox with the @ written as a dot (hostmaster@example.com).
A zone excerpt that loads
This zone excerpt was checked with named-checkzone from BIND 9.20 and loads cleanly (zone example.com/IN: loaded serial 2026100601, OK):
$TTL 3600
@ IN SOA ns1.example.com. hostmaster.example.com. (
2026100601 ; serial (YYYYMMDDnn)
7200 ; refresh
900 ; retry
1209600 ; expire
300 ) ; negative-caching TTL (SOA MINIMUM)
IN NS ns1.example.com.
IN NS ns2.example.net.
IN A 192.0.2.10
IN AAAA 2001:db8::10
IN MX 10 mail.example.com.
IN MX 20 mail-backup.example.com.
IN TXT "v=spf1 mx include:_spf.mailer.example.net -all"
IN CAA 0 issue "letsencrypt.org"
ns1 IN A 192.0.2.53
mail IN A 192.0.2.25
mail-backup IN A 192.0.2.26
www IN CNAME @
app 300 IN CNAME app-lb.cloud.example.net.
_sip._tcp IN SRV 10 60 5060 sip.example.com.
sip IN A 192.0.2.60
Reading the syntax:
$TTL 3600sets the default TTL (time-to-live, seconds a cache may reuse a record) for every record that does not state its own.appstates300, which overrides it.@stands for the zone's own name,example.com., called the apex.- A line that starts with spaces has no owner name written, so it reuses the previous owner: the
NS,A,AAAA,MX,TXTandCAAlines all belong to@. INis the record class, Internet, the only class used in practice.- Parentheses let the
SOAspan several lines, and;starts a comment. - A name ending in a dot (
ns1.example.com.) is complete. A name without one gets the zone name appended, sons1on its own meansns1.example.com.. Forgetting a trailing dot is a classic way to createhost.example.com.example.com.. _sip._tcpis the owner name of anSRVrecord: an underscore, the service name, then the protocol (RFC 2782), so the full name is_sip._tcp.example.com..SRV 10 60 5060 sip.example.com.reads: priority 10 (clients try the lowest number first), weight 60 (the share of traffic among targets with equal priority), port 5060, and the host that serves it, which must have an address record and must not be an alias.CAA 0 issue "letsencrypt.org"reads: flags 0 (the issuer-critical bit, 128, is not set), tagissue(this certificate authority may issue certificates for the name), and the authority's identifying domain (RFC 8659).MX 10andMX 20are preferences: the mail server with the lowest number is tried first.
The second NS points at a server in another zone (example.net), which needs no glue and keeps the zone reachable if example.com's own network is down. The www alias uses @, the zone apex, as its target, which is legal because the alias sits on www, not on the apex.
The pitfall in action: an alias at the apex
A common story: the team moves the site to a hosted platform that says "point your domain at lb.cloud.example.net", and someone replaces the apex A record with a CNAME. The apex also holds the SOA, NS and MX records, so the zone breaks. Here is that zone as bad.zone:
$TTL 3600
@ IN SOA ns1.example.com. hostmaster.example.com. 1 7200 900 1209600 300
IN NS ns1.example.com.
IN CNAME lb.cloud.example.net.
IN MX 10 mail.example.com.
ns1 IN A 192.0.2.53
mail IN A 192.0.2.25
$ named-checkzone example.com bad.zone
dns_master_load: bad.zone:5: example.com: CNAME and other data
dns_master_load: bad.zone:5: example.com: CNAME and other data
dns_master_load: bad.zone:5: example.com: CNAME and other data
zone example.com/IN: loading from master file bad.zone failed: CNAME and other data
zone example.com/IN: not loaded due to errors.
exit=1
BIND refuses the zone, which is the safe outcome. The same message appears several times because the alias collides with several records at once. Do not rely on a provider console to catch the same mistake: run a zone check (named-checkzone or the provider's validator) before publishing. Fixes: use the platform's address records, or the provider's flattening feature (often called ALIAS or ANAME, a non-standard provider feature that answers with plain A records), or put the site on www and redirect the apex.
A nearby trap is bad2.zone: no apex alias, but the mail host is an alias.
$TTL 3600
@ IN SOA ns1.example.com. hostmaster.example.com. 1 7200 900 1209600 300
IN NS ns1.example.com.
IN A 192.0.2.10
IN MX 10 mail.example.com.
ns1 IN A 192.0.2.53
mail IN CNAME mx1.example.com.
mx1 IN A 192.0.2.25
$ named-checkzone example.com bad2.zone
zone example.com/IN: example.com/MX 'mail.example.com' is a CNAME (illegal)
zone example.com/IN: loaded serial 1
OK
exit=0
$ named-checkzone -M fail example.com bad2.zone
zone example.com/IN: example.com/MX 'mail.example.com' is a CNAME (illegal)
zone example.com/IN: not loaded due to errors.
exit=1
Both runs print the word "illegal", and the difference is only what the checker is told to do about it: by default an MX that points at an alias is a warning, so the zone loads and the exit code is 0; with -M fail (BIND's check-mx-cname setting, which named.conf also accepts) the same finding stops the load. The record is invalid either way under RFC 2181 section 10.3, so a clean exit code from the default check does not mean the zone is correct. Delivery behaviour depends on the sending server. And a CNAME pointing at a third-party name that is later deprovisioned is a dangling alias that an attacker may be able to claim.
Pitfalls beyond the one
- TTL before a migration. Lower the TTL (time-to-live, how long caches may reuse a record) a full old-TTL ahead of a change; otherwise caches keep the old address.
- SPF 10-lookup limit. Each
include,a,mx,ptr,existsorredirectcounts toward 10; exceeding it yieldspermerrorand mail can be rejected. A TXT value over 255 characters must be split into several quoted strings, which readers concatenate (RFC 7208 section 3.3). - Serial not bumped. The zone file is correct on the primary and wrong everywhere else until the serial rises.
What's the difference between redundancy and replication when it comes to service reliability? Walk through an example for a stateless service and a stateful service, and name a failure mode that redundancy alone doesn't protect against for the stateful one.
Sample Answer
Direct answer: Redundancy is having extra, interchangeable components standing by so one can take over if another fails; replication is actively keeping copies of state (data) synchronized across multiple nodes so the state itself survives a failure, not just the compute that serves it. They're often used together, but they solve different problems: redundancy alone is enough for a stateless service, because any interchangeable instance can serve any request; a stateful service needs replication too, because a fresh redundant instance with no data isn't actually a working replacement.
Structured elaboration
| Aspect | Redundancy (stateless) | Replication (stateful) |
|---|---|---|
| What's duplicated | Compute/serving capacity | Data/state itself |
| Failover requirement | Route traffic to a healthy instance; done | Promote a replica that has the data, and ensure it's sufficiently up to date |
| Consistency concern | None, any instance is interchangeable | Central concern: how in-sync are the replicas at failover time |
| Typical mechanism | Load balancer + auto-healing instance group | Leader-follower or multi-leader data replication |
Stateless example: a set of identical app server instances behind a load balancer, handling API requests with no local state. If one instance dies, the load balancer routes around it and an autoscaler replaces it; the new instance needs no data transfer because there was never any instance-local state to lose. This is pure redundancy: extra interchangeable copies of the same stateless computation.
Stateful example: a primary-replica database. The primary accepts writes; replicas continuously receive a copy of the write stream (replication). If the primary fails, a replica is promoted to take over. Unlike the stateless case, simply having an extra database instance running (redundancy alone, no replication) would give you an empty database, not a working replacement, because there's no mechanism copying the actual data into it.
A failure mode redundancy alone doesn't protect against, for the stateful case: data loss or corruption on the primary itself. If the primary's disk corrupts a row, or a bad write silently corrupts application-level data, having a redundant (but not yet caught-up, or synchronously replicating that same bad write) standby doesn't help, because either the standby doesn't have the data yet (async lag) or it faithfully replicated the corruption along with everything else (synchronous replication of a logically bad write). Redundancy protects against a node dying; it does not protect against the data itself being wrong, that requires backups (a separate, point-in-time copy decoupled from live replication) and, for silent corruption specifically, checksums or application-level validation.
How this generalizes: a useful mental checklist for fault tolerance covers five distinct techniques, and redundancy and replication are only two of them: retries (recover from a transient failure by trying again), bulkheads (isolate one failure from spreading to unrelated resources), failover (the mechanism that switches traffic to a healthy replacement), redundancy (having that replacement exist at all), and replication (making sure the replacement actually has the state it needs). A strong answer names which of these a given design decision is actually addressing, since "redundancy" gets used loosely to mean all five in casual conversation.
Trade-offs & pitfalls
- Replication has a cost redundancy alone doesn't: network bandwidth, storage for extra copies, and a consistency model to reason about (synchronous replication costs write latency; asynchronous replication risks data loss on failover, the classic RPO trade-off).
- A common wrong turn: assuming "we have 3 replicas" automatically means "we're protected," without checking replication lag. A replica that's minutes behind at failover time silently loses however much data arrived in that window, unless the promotion logic explicitly accounts for lag and refuses to promote a too-far-behind replica.
- Redundancy for stateless services is comparatively cheap and low-risk to over-provision; replication for stateful services is not, since more replicas means more write-path coordination overhead (for synchronous replication) or more divergence risk (for asynchronous/multi-leader), so it isn't a "just add more" lever in the same way.
Explain the concept of 'hub-and-spoke' network topology in enterprise cloud networking. What are two security benefits and one potential single point of failure you must mitigate?
Sample Answer
Direct answer
Hub-and-spoke is a network topology where a central "hub" virtual network hosts shared services (a transit gateway or equivalent, centralized firewall/inspection, logging, VPN or Direct Connect termination) and every workload "spoke" network connects only to the hub, never directly to another spoke; the two clearest security benefits are centralized enforcement and reduced east-west exposure between workloads, and the one significant single point of failure to mitigate is the hub itself, since every spoke's connectivity, and every spoke's security enforcement, now depends on it.
Structured elaboration
Security benefit 1: centralized policy enforcement and inspection. Because every spoke's traffic to another spoke, or to the internet, or to an on-premises network passes through the hub, a single centralized firewall or inspection appliance in the hub can enforce one consistent policy for every workload, rather than each spoke team independently configuring and maintaining its own egress and inter-spoke rules, which in practice drift out of consistency over time.
Security benefit 2: default isolation between spokes. Spokes do not connect directly to each other by default in a hub-and-spoke design; two spokes can only reach each other by explicit route through the hub, which is itself a chokepoint the hub's own policy can restrict or deny. This means a compromise in one spoke does not automatically have a network path to another spoke, unless the hub's routing and policy explicitly permit it, a meaningfully smaller default blast radius than a flat, fully-meshed network where every workload can reach every other workload unless specifically blocked.
The single point of failure: the hub itself. Every spoke's connectivity to every other spoke, to the internet, and to on-premises infrastructure routes through the hub; an outage or a misconfiguration in the hub's transit gateway, its centralized firewall, or its own network path affects every spoke simultaneously, which is a materially larger blast radius for an availability failure than a flat topology would have (even though the security posture is generally better). The hub is also a concentrated target: a compromise of the hub's own centralized firewall or transit component potentially exposes the routing decisions for every spoke it serves.
Mitigating the hub's single-point-of-failure risk. Redundant hub infrastructure (a highly-available transit gateway configuration, redundant firewall appliances across multiple Availability Zones rather than a single instance) is the direct availability mitigation. For the security-concentration risk specifically, the hub's own administrative access needs tighter controls than any individual spoke (since compromising hub administration is a strictly worse outcome than compromising one spoke), and the hub's own configuration changes should go through a more deliberate change-control process than a typical spoke, given the blast radius of a mistake made there.
Worked example
An enterprise with 12 application spokes routes all inter-spoke and internet-bound traffic through a hub containing a redundant, multi-Availability-Zone firewall cluster and a highly-available transit gateway. A compromised workload in Spoke 3 attempts to reach a database in Spoke 7; because spokes do not connect directly, this traffic must route through the hub, where the centralized firewall's policy (permitting only the specific inter-spoke flows that have been explicitly approved) denies the connection, since Spoke 3 and Spoke 7 were never granted a route to each other. Separately, when one of the hub's two firewall appliances fails during a maintenance window, the redundant second appliance continues serving all 12 spokes without an availability interruption, which is the concrete payoff of the redundancy investment described above; without it, that same failure would have been a total outage for every spoke simultaneously, not just the one undergoing maintenance.
Trade-offs and pitfalls
- The security benefit and the availability risk come from the exact same architectural property, and treating them as separate concerns misses that they trade off against each other. The same centralization that makes policy enforcement consistent and blast radius small during a compromise is what makes an outage or a misconfiguration in the hub itself catastrophic across every spoke at once; a hub-and-spoke design is only a net improvement if the redundancy investment in the hub is genuinely made, not merely intended.
- A common wrong turn is under-investing in hub redundancy specifically because the hub "isn't a workload," so it does not get the same operational rigor (monitoring, on-call ownership, change review) that individual application spokes receive. The hub is infrastructure every spoke depends on, and it deserves at least the operational rigor of the most critical spoke it serves, not less.
- A hub-and-spoke design still allows a spoke-to-spoke path if the hub's policy explicitly permits it, and over time, as more legitimate integration needs accumulate, the hub's policy can gradually grow permissive enough to erode the default-isolation benefit. Periodic review of the hub's actual permitted spoke-to-spoke flows against what is still genuinely needed keeps this benefit real rather than nominal.
- A concentrated administrative-access risk at the hub is easy to overlook because the hub is infrastructure, not a customer-facing workload, and infrastructure access reviews sometimes receive less scrutiny than application access reviews. Given the hub's blast radius, its administrative access should receive at least as much scrutiny as the most sensitive spoke it serves, arguably more.
Your logging ingestion costs have tripled due to extensive debug logging. Propose practical strategies to reduce volume and cost while retaining debugability. Discuss trade-offs and an implementation plan including monitoring to detect lost visibility.
Sample Answer
Tripled logging cost usually means volume grew faster than the value extracted from it; the fix is to cut volume selectively, not uniformly, so the signal that actually gets used survives.
A practical plan
- Set log-level policy by environment and default: debug logging is fine to leave on in staging but must default to info/warn in production, with a way to raise it temporarily and narrowly (one instance, one request ID, a short TTL) rather than fleet-wide and indefinitely.
- Sample high-volume, low-value lines (e.g. successful health checks, routine polling) instead of dropping them entirely, so you can still detect a rate change without paying to store every instance.
- Aggregate/rollup where the individual line rarely matters: turn "1000 identical retry log lines" into one line with a count, and rely on metrics (which are cheap) for anything that's fundamentally a counter, saving log storage for things that need the specific detail (a stack trace, a specific failing payload).
- Redact and shorten before storage, not after: strip large payloads or PII at the point of logging rather than logging everything and cleaning it up downstream, since the ingestion cost is already paid by the time cleanup happens.
- Set retention tiers: keep full-fidelity logs for a short, cheap window (days) and only aggregated/rolled-up summaries for the longer compliance window, instead of one flat retention policy for everything.
Monitoring the change itself
Track "log volume per request" and "percentage of debug-triage sessions where the needed line was missing" as the two competing metrics, so cost cuts can be validated against not silently destroying the ability to debug, rather than declared successful purely because the bill went down.
Trade-offs and pitfalls
The main risk is over-trimming: cutting a log line that turns out to be the one thing needed during the next incident. The mitigation is a staged rollout of each cut (reduce, watch for a sprint, then commit) plus keeping an emergency dial to re-enable full verbosity narrowly and fast when an active incident needs it.
Give me an example of a time you received tough feedback or criticism right after something went wrong operationally, like after an outage. How did you manage your reaction in the moment, and what did you do afterward to rebuild trust?
Sample Answer
Direct answer
In the moment, my first job is to actually listen to the criticism rather than start explaining or defending myself before I've fully heard it, even when the instinct to justify is strong. Afterward, rebuilding trust isn't about the conversation where I received the feedback, it's about visibly acting differently going forward in the specific way the feedback pointed at.
Structured elaboration
- Managing the reaction in the moment: the instinct right after an outage, already stressed, is to explain the context and mitigating factors as soon as criticism starts. I've learned to let the person finish first, genuinely hear the specific complaint, and only then respond, since jumping in early to explain often lands as defensiveness even when that isn't the intent.
- Separating the valid signal from the delivery: tough feedback right after an outage often arrives with real frustration attached. The useful move is extracting the actual substance, what specifically should have gone differently, rather than reacting to the tone it arrived in.
- Not over-apologizing either: there's a version of managing the reaction that overcorrects into excessive self-criticism, which doesn't address the substance any better than defensiveness does; the goal is a level, accurate acknowledgment, not performing contrition.
- Rebuilding trust afterward: the actual trust repair happens in what changes afterward, doing the specific thing the feedback pointed at differently next time, not in how gracefully the original conversation went.
Worked example
Right after an outage I'd contributed to, my manager gave me direct, pointed feedback in a one-on-one: that I'd been slow to escalate once it became clear I was stuck, and that the delay had made the outage longer than it needed to be. My first instinct was to explain the reasoning that had made sense to me in the moment, that I'd thought I was close to a fix. I held off on that and let them finish first, and once I actually listened past my own defensiveness, the specific point was fair: I had, in fact, kept trying alone for longer than made sense given how the situation was unfolding.
I acknowledged the specific point directly rather than the vaguer "I hear you, I'll do better," and said what I'd concretely do differently: escalate earlier next time I'm stuck past a set point, rather than continuing to push alone. The actual trust rebuilding happened over the incidents that followed, not in that conversation. In the very next incident where I got stuck, I escalated well before I would have previously, and I made a point of telling my manager afterward that I'd deliberately applied the earlier feedback, which is what actually closed the loop for them, seeing the specific behavior change rather than just hearing that I'd taken the feedback well.
Trade-offs and pitfalls
The common failure mode is treating receiving feedback well as the whole task, being gracious and non-defensive in that one conversation and considering it handled. Without a visible change in behavior afterward, gracious listening reads as agreeable in the moment and forgotten a week later, which damages trust more than a defensive reaction followed by real change would. The other trap is swinging to excessive self-criticism, which can feel like taking it seriously but doesn't actually engage with the specific, actionable substance of the feedback any better than dismissing it does.
After a TCP connection closes, the socket that initiated the close sits in TIME_WAIT for a period before the port is reusable. Explain why TIME_WAIT exists, what a half-open connection is, and how you would detect an unusually large number of sockets stuck in TIME_WAIT on a busy server. What are the trade-offs of the common mitigations for socket exhaustion caused by this?
Sample Answer
Direct answer
TIME_WAIT is the state the side that sent the FINAL ACK of a connection close sits in for a fixed period (commonly twice the maximum expected segment lifetime, often around 60 seconds on Linux) before the connection's resources are fully released. It exists so a delayed, duplicate packet from an old connection can't be mistaken for part of a brand-new connection reusing the same address/port pair. A half-open connection is one where only one side still believes the connection is alive; the other side has already reset, crashed, or otherwise abandoned it without a clean FIN exchange.
Structured elaboration
TIME_WAIT exists to protect two things: (1) it guarantees the final ACK the closing side sent actually gets through, by giving time to retransmit it if the peer's FIN gets retransmitted (meaning the ACK was lost); (2) it prevents a stray, delayed packet from a previous incarnation of a connection (same 4-tuple: source IP, source port, destination IP, destination port) from being delivered into a brand new connection that happens to reuse the same 4-tuple before the old segments have had time to disappear from the network.
To detect a large number of sockets stuck in TIME_WAIT on Linux, ss -tan state time-wait | wc -l (or the older netstat -ant | grep TIME_WAIT | wc -l) gives a live count; watching this metric over time distinguishes a normal, self-draining backlog from a genuine problem.
Worked example
A server that closes millions of short-lived outbound connections per hour (for instance, a service making one HTTP call per request to an upstream) can exhaust its available ephemeral source ports if TIME_WAIT sockets accumulate faster than they expire, because each TIME_WAIT socket still holds its port reserved. The two standard mitigations are: raise the number of available client-side (ephemeral) ports and/or reuse connections via keepalive/connection pooling so fewer connections churn through TIME_WAIT in the first place; and, on the SERVER side specifically, enabling SO_REUSEADDR and, where safe, tcp_tw_reuse lets a new outgoing connection reuse a TIME_WAIT 4-tuple once TCP timestamps confirm it's safe to do so, rather than waiting out the full timer.
Trade-offs & pitfalls
Disabling or drastically shortening TIME_WAIT globally (rather than tuning port ranges or reuse settings) is the wrong fix: it reintroduces the exact correctness problem TIME_WAIT was designed to prevent, stray old packets landing in a new connection and corrupting it. The safe levers are reducing HOW MANY connections churn through the state (pooling, keepalive) and widening the ephemeral port range, not shrinking the safety window itself.
Want to create your own tailored preparation guide using our deep research?
Get Started for FreeInterview-Ready Courses
Visual-first, interactive, structured learning paths
Browse Systems Administrator jobs
AI-enriched listings across hundreds of company career pages
Explore Jobs