13년차의 서버실

서버, 인프라, 홈랩 기술 블로그

[태그:] DNS 트러블슈팅

  • [Linux] 리눅스 서버 네트워크 연결 장애: IP 설정부터 방화벽까지 디버깅 5단계

    [Linux] 리눅스 서버 네트워크 연결 장애: IP 설정부터 방화벽까지 디버깅 5단계

    [리눅스] 리눅스 서버 네트워크 연결 장애: IP 설정부터 방화벽까지 디버깅 5단계

    리눅스 네트워크 장애는 평소엔 조용하다가 꼭 바쁠 때 터지더라고요. SSH는 안 붙고, 서비스 Health Check(헬스 체크, 상태 확인)는 빨갛게 뜨고, 팀 메신저에는 왜 서버가 안 되냐는 메시지가 쌓입니다. 저도 홈랩이랑 운영 서버를 만지면서 비슷한 상황을 정말 많이 겪었는데, 처음엔 케이블 문제인가 싶었는데, 실제로는 리눅스 IP 설정 하나가 꼬였던 적도 있었고, 반대로 IP는 멀쩡한데 iptables(아이피테이블스, 리눅스 패킷 필터) 규칙 때문에 통신이 막힌 적도 많았어요.

    그래서 오늘은 제가 실제로 쓰는 기준으로 리눅스 네트워크 장애를 좁혀 가는 5단계 디버깅 흐름을 정리해보겠습니다. 무작정 재부팅부터 하는 게 아니라, 아래에서 위로 차근차근 확인하는 방식이죠. 특히 Ubuntu 계열에서 자주 쓰는 netplan(넷플랜, 네트워크 설정 추상화 도구), systemd-networkd(시스템디 네트워크 관리 데몬), 그리고 방화벽 쪽의 nftables(엔에프테이블스, 최신 패킷 필터 프레임워크)까지 같이 보겠습니다.

    리눅스 네트워크 장애 점검 순서를 보여주는 전체 흐름도

    리눅스 서버에서 링크 상태, IP 설정, 라우팅, DNS, 방화벽 순서로 점검하는 전체 디버깅 흐름을 보여주는 개요 이미지입니다.

    리눅스 네트워크를 층으로 나눠 봐야 하는 이유

    쉽게 말해 네트워크 장애는 한 덩어리가 아니라 여러 층으로 나뉘어 있거든요. 물리 링크가 살아 있는지, 인터페이스가 Up(업, 활성화) 상태인지, IP가 붙었는지, 기본 게이트웨이(Default Gateway, 기본 경로)가 맞는지, 이름 해석 DNS가 되는지, 마지막으로 방화벽이 막고 있지는 않은지요. 여기서 중요한 포인트는 위 증상만 보고 아래 원인을 단정하면 삽질이 길어진다는 점입니다.

    제가 직접 해보니 제일 효율적인 방법은 이렇더라고요. 1단계에서 링크와 인터페이스를 확인하고, 2단계에서 리눅스 IP 설정을 보고, 3단계에서 라우팅과 DNS를 확인한 뒤, 4단계에서 netplan과 systemd-networkd를 보고, 마지막 5단계에서 iptables 또는 nftables를 점검하는 겁니다. 이 순서대로 보면 원인 범위가 빠르게 줄어들어요.

    리눅스 네트워크 장애 디버깅 5단계

    1단계. 링크 상태와 인터페이스 확인 (제일 많이 놓치는 부분)

    제일 먼저 보는 건 케이블, 가상 NIC, 스위치 포트, 인터페이스 상태입니다. 이 단계에서 해결되는 경우가 생각보다 많더라고요. 특히 VM(가상머신)에서는 가상 스위치 설정이, 베어메탈에서는 포트 비활성화가 원인일 때가 꽤 있거든요.

    ip link show
    ip -br link
    ethtool eth0
    

    여기서 보는 포인트는 간단해요.

    1. 인터페이스 상태가 UP인지 확인하세요.
    2. LOWER_UP 표시가 있는지 봐야 합니다. 이게 없으면 링크 자체가 안 잡힌 경우가 많거든요.
    3. ethtool로 Speed(속도), Duplex(이중화 모드), Link detected 여부를 봅니다.

    예를 들어 인터페이스가 내려가 있으면 이렇게 올릴 수 있어요.

    sudo ip link set eth0 up
    

    별거 아닌 것 같지만, 저도 예전에 테스트하다가 인터페이스를 내려놓고 그대로 잊어버려서 한참 헤맨 적이 있습니다. 진짜 허무했어요 ㅎㅎ

    2단계. 리눅스 IP 설정 확인

    다음은 IP 주소, 서브넷 마스크(Subnet Mask, 네트워크 범위 정보), DHCP(디에이치씨피, 자동 IP 할당) 여부를 확인하는 거예요. 여기서 리눅스 IP 설정이 의도와 다르게 잡혀 있으면 외부 통신이 바로 꼬입니다.

    ip addr show
    ip -br addr
    hostname -I
    

    출력에서 확인할 것은 아래입니다.

    • 예상한 인터페이스에 IP가 붙었는지
    • 대역이 맞는지 예: 192.168.10.0/24
    • 중복 IP 가능성은 없는지
    • DHCP로 받아야 하는 서버인데 주소가 비어 있지는 않은지

    Ubuntu 서버에서 netplan을 쓴다면 설정 파일은 보통 이렇게 생겨요.

    network:
      version: 2
      renderer: networkd
      ethernets:
        eth0:
          dhcp4: false
          addresses:
            - 192.168.10.20/24
          routes:
            - to: default
              via: 192.168.10.1
          nameservers:
            addresses:
              - 1.1.1.1
              - 8.8.8.8
    

    설정 반영은 아래처럼 하면 됩니다.

    sudo netplan generate
    sudo netplan apply
    

    처음엔 이게 뭔가 싶었는데, YAML(야믈, 들여쓰기 기반 설정 형식) 들여쓰기 하나만 틀려도 적용이 안 되더라고요. 그래서 저는 반영 전에 꼭 눈으로 한 번 더 봅니다.

    리눅스 IP 설정과 netplan 점검 장면

    netplan YAML 설정과 ip 명령 결과를 나란히 확인하는 실전 점검 장면을 담은 이미지입니다.

    3단계. 라우팅과 DNS 확인

    IP가 붙어 있어도 목적지로 가는 길이 없으면 통신이 안 되거든요. 그래서 라우팅 테이블(Route Table, 경로 정보)과 DNS를 따로 봐야 합니다. 이 구간에서 많이들 헷갈리세요. 핑은 IP로 되는데 도메인은 안 된다면 DNS 쪽일 가능성이 높고, 같은 대역은 되는데 외부가 안 된다면 기본 게이트웨이 문제일 가능성이 커요.

    ip route show
    ip route get 8.8.8.8
    ping -c 4 192.168.10.1
    ping -c 4 8.8.8.8
    getent hosts example.com
    resolvectl status
    

    제가 주로 이렇게 해석하더라고요.

    증상 가능성 높은 원인 우선 확인할 것
    게이트웨이 핑 실패 L2 링크, VLAN, 잘못된 IP 케이블, 스위치, 인터페이스 상태
    외부 IP 핑 실패 기본 라우트 누락, 업스트림 차단 ip route, 게이트웨이
    도메인만 실패 DNS 설정 오류 nameserver, resolvectl
    특정 포트만 실패 방화벽 또는 서비스 미기동 ss, iptables, nftables

    여기서 중요한 포인트! DNS 문제를 네트워크 전체 장애로 오해하는 경우가 정말 많아요. 실제로 써보니까 IP 통신과 이름 해석을 분리해서 보는 습관이 장애 시간을 많이 줄여줍니다.

    4단계. netplan, systemd-networkd 로그 확인

    설정 파일이 맞아 보여도 실제 적용 과정에서 실패할 수 있거든요. 특히 cloud-init(클라우드이닛, 초기 인스턴스 설정 도구)와 netplan이 같이 엮인 환경에서는 예상과 다르게 덮어써지는 경우도 있어요.

    networkctl status eth0
    systemctl status systemd-networkd
    journalctl -u systemd-networkd --no-pager
    sudo netplan try
    

    netplan try는 꽤 유용하더라고요. 원격 서버에서 네트워크 설정 바꿀 때 잘못 적용하면 SSH가 끊길 수 있거든요. 이 명령은 일정 시간 안에 확인하지 않으면 롤백되는 방식이라 조금 더 안전합니다.

    저도 홈랩에서 라우트를 바꾸다가 접속이 끊겨서 콘솔로 다시 들어간 적이 몇 번 있어요. 그 뒤로는 원격 작업에서는 무조건 보수적으로 갑니다. 가능하면 콘솔 접근 경로를 하나 확보하고 작업하시길 권장합니다.

    리눅스 네트워크 장애 원인을 systemd-networkd 로그로 분석하는 모습

    systemd-networkd 상태 출력과 journal 로그를 보며 적용 실패 원인을 찾는 디버깅 장면입니다.

    5단계. iptables, nftables, 서비스 포트 확인

    마지막 단계는 방화벽과 리스닝 포트(Listening Port, 대기 중인 서비스 포트)예요. 여기까지 왔는데도 통신이 안 되면, 사실 방화벽일 때가 꽤 많습니다. 특히 오래된 서버는 iptables를, 최근 배포판은 nftables를 쓰는 경우가 많아서 둘 다 확인해야 헷갈리지 않아요.

    sudo iptables -L -n -v
    sudo iptables -S
    sudo nft list ruleset
    ss -tulpn
    

    체크 포인트는 이렇습니다.

    • INPUT 체인 기본 정책이 DROP인지
    • SSH, HTTP, HTTPS 등 필요한 포트 허용 규칙이 있는지
    • 서비스가 실제로 해당 포트에서 listen 중인지
    • iptables와 nftables가 혼재되어 정책을 헷갈리게 만들고 있지는 않은지

    예를 들어 SSH 22/tcp가 막혀 있으면 서버는 살아 있어도 접속이 안 돼요. 반대로 방화벽은 열려 있는데 서비스가 안 떠 있으면 역시 안 되죠. 그래서 저는 항상 패킷 필터와 서비스 포트를 같이 봅니다.

    ⚠️ 실제로 자주 겪는 트러블슈팅 포인트

    여기서는 제가 삽질 좀 했던 사례를 중심으로 적어보겠습니다. 혹시 이런 경험 있으신가요? 겉으로는 리눅스 네트워크 장애처럼 보이는데, 실제 원인은 아주 사소한 설정 하나인 경우 말입니다.

    1. YAML 들여쓰기 오류
      netplan은 형식이 엄격해요. 공백 수가 틀리면 적용이 실패하거나 의도와 다르게 해석됩니다.
    2. 인터페이스 이름 혼동
      예전엔 eth0로 익숙했는데, 환경에 따라 ens18, enp1s0처럼 다르게 보여요. 설정 파일과 실제 NIC 이름이 다르면 당연히 안 붙습니다.
    3. 기본 라우트 누락
      같은 대역 통신만 되고 외부가 안 되는 전형적인 증상이죠.
    4. DNS 서버 미설정
      핑은 되는데 apt 업데이트나 도메인 접근이 안 됩니다.
    5. 방화벽 정책 잔존
      이전 작업에서 넣어둔 DROP 규칙이 그대로 남아 있는 경우가 있더라고요.

    이런 문제를 줄이려면 변경 전후 비교가 중요합니다. 저는 보통 현재 상태를 먼저 저장해 둬요.

    ip addr show
    ip route show
    resolvectl status
    sudo iptables -S
    sudo nft list ruleset
    

    그리고 변경 후에는 꼭 다시 비교합니다. 이 습관이 쌓이면 리눅스 네트워크 디버깅 속도가 확실히 빨라집니다.

    검증 방법: 어디까지 확인해야 정말 해결된 걸까요?

    설정만 반영됐다고 끝이 아닙니다. 리눅스 네트워크 장애는 재현이 사라진 것처럼 보여도 실제 서비스 경로가 여전히 막혀 있을 수 있거든요. 그래서 저는 최소한 아래 검증은 꼭 합니다.

    1. 게이트웨이 핑 확인
    2. 외부 IP 핑 확인
    3. 도메인 이름 해석 확인
    4. 필요 포트 접속 확인
    5. 서비스 로그와 클라이언트 관점 확인
    ping -c 2 192.168.10.1
    ping -c 2 8.8.8.8
    getent hosts example.com
    curl -I http://example.com
    nc -zv 127.0.0.1 22
    

    여기까지 다 통과하면 거의 끝입니다. 드디어 됐다! 싶은 순간이 오죠. 다만 운영 환경이라면 여기서 한 번 더, 다른 서버나 사용자 위치에서 역방향 확인도 해보시는 걸 권장합니다. 서버 안에서만 되는 경우가 있거든요.

    리눅스 네트워크 장애 복구 후 검증 화면

    ping, curl, 포트 체크 결과가 정상으로 돌아온 모습을 한눈에 보여주는 검증 이미지입니다.

    정리 표: 단계별 점검 포인트 한 번에 보기

    단계 확인 명령 핵심 질문
    1. 링크 ip link, ethtool 인터페이스와 물리 링크가 살아 있나?
    2. IP ip addr 리눅스 IP 설정이 맞게 붙었나?
    3. 라우팅/DNS ip route, getent, resolvectl 길이 있나? 이름 해석이 되나?
    4. 설정 적용 netplan, networkctl, journalctl 설정이 실제로 반영됐나?
    5. 방화벽/포트 iptables, nft, ss 패킷과 서비스 포트가 열려 있나?

    이 표만 머릿속에 넣어두셔도 현장에서 꽤 도움이 됩니다. 특히 초반에 당황해서 이것저것 동시에 건드리기 시작하면 원인 추적이 더 어려워져요. 순서대로, 하나씩, 확인한 사실만 쌓아가는 게 제일 빠릅니다.

    리눅스 네트워크 장애 5단계 디버깅 요약 인포그래픽

    링크, IP, 라우팅, 설정 적용, 방화벽 점검 순서를 한 장으로 요약한 체크리스트 이미지입니다.

    마무리: 리눅스 네트워크 장애는 감으로 풀기보다 순서로 푸는 게 낫습니다

    오늘 정리한 흐름의 핵심은 단순합니다. 리눅스 네트워크 장애가 생기면 링크, IP, 라우팅, DNS, 설정 적용, 방화벽 순서로 보자는 거예요. 저도 처음엔 여기저기 막 건드렸는데, 실제로 써보니까 장애 대응에서 제일 중요한 건 화려한 명령어보다 점검 순서였습니다.

    특히 netplan과 systemd-networkd를 쓰는 환경에서는 설정 파일과 적용 로그를 같이 봐야 하고, 구형 환경이나 혼재된 환경에서는 iptables와 nftables를 둘 다 체크해야 합니다. 이 부분만 익숙해져도 리눅스 네트워크 디버깅이 훨씬 덜 막막해집니다.

    다음 글에서는 tcpdump(티씨피덤프, 패킷 캡처 도구)로 패킷 흐름을 직접 보면서 원인을 좁히는 방법도 다뤄보겠습니다. 이전 글에서 다뤘던 홈랩 VLAN 구성 글이 있다면 같이 보셔도 흐름 이해에 도움이 됩니다. 현장에서 바로 써먹을 수 있는 기준으로 계속 정리해보겠습니다.

    자주 묻는 질문

    Q1. ping은 되는데 웹 접속만 안 되면 어디부터 봐야 하나요?

    A. 보통은 서비스 포트와 방화벽을 먼저 봅니다. ss -tulpn으로 리스닝 여부를 확인하고, 그다음 iptables 또는 nftables 규칙을 점검해보세요.

    Q2. netplan apply 전에 더 안전한 방법이 있나요?

    A. 원격 서버라면 netplan try를 먼저 권장합니다. 잘못 적용돼도 자동 롤백되는 흐름이라 실수 비용이 줄어듭니다.

    Q3. DNS 문제와 라우팅 문제는 어떻게 구분하나요?

    A. IP로는 되는데 도메인만 안 되면 DNS 문제일 가능성이 커요. 반대로 외부 IP 자체가 안 되면 라우팅이나 게이트웨이를 먼저 보시면 됩니다.

  • [네트워크 보안 트러블슈팅] OPNsense/pfSense 장애 진단 가이드

    [네트워크 보안 트러블슈팅] OPNsense/pfSense 장애 진단 가이드

    [네트워크 보안 트러블슈팅] OPNsense/pfSense 장애 진단 가이드

    홈랩이나 소규모 사무실에서 OPNsense/pfSense를 메인 방화벽으로 올려두면, 평소에는 정말 든든합니다. 근데 한 번 꼬이기 시작하면 이야기가 달라지죠. 인터넷은 살아 있는 것 같은데 특정 서비스만 안 되고, VPN은 붙었다 끊겼다 하고, 내부 DNS는 멀쩡한데 외부 접속만 실패하고요. 이런 상황에서 제일 무서운 건 설정을 이것저것 바꾸다가 문제를 더 키우는 겁니다. 그래서 오늘은 네트워크 보안 트러블슈팅 관점에서 OPNsense 문제 해결, pfSense 오류 확인, 방화벽 디버깅 순서를 어떻게 잡아야 하는지 제가 실제로 쓰는 방식대로 정리해보겠습니다.

    저도 처음엔 장애가 나면 로그부터 무작정 뒤졌었는데요. 실제로 써보니까 순서가 더 중요하더라고요. 물리 계층 → IP 계층 → 라우팅 → 방화벽 룰 → NAT → DNS → 애플리케이션 순서로 좁혀가면 생각보다 빨리 답이 나옵니다. 삽질 좀 했습니다 ㅎㅎ 그래서 이 글은 이론보다도, 막혔을 때 어디부터 봐야 하는지에 집중해보겠습니다.

    네트워크 보안 트러블슈팅을 위한 OPNsense/pfSense 홈랩 네트워크 아키텍처 이미지

    홈랩 네트워크에서 OPNsense/pfSense가 WAN, LAN, VLAN, VPN 사이에서 어떤 위치를 차지하는지 한눈에 보여주는 개요 이미지입니다.

    1. OPNsense/pfSense 장애가 유독 헷갈리는 이유

    방화벽 장비의 문제는 겉으로 보이는 증상과 실제 원인이 다른 경우가 많습니다. 예를 들어 사용자는 “인터넷이 안 된다”고 말하지만, 실제로는 DNS Resolver(디엔에스 리졸버, 이름 해석기)만 죽어 있는 경우가 있거든요. 반대로 ping은 되는데 웹만 안 열리면 TLS, MTU, 정책 기반 라우팅(Policy-based Routing) 문제일 수도 있습니다.

    • 증상은 단순한데 원인은 여러 계층에 걸쳐 있을 수 있습니다.
    • 룰(Rule), NAT, 게이트웨이(Gateway), DNS가 함께 얽히면 체감 난도가 확 올라갑니다.
    • 특히 홈랩 네트워크에서는 VLAN, WireGuard/OpenVPN, Reverse Proxy까지 얹히면서 더 복잡해집니다.

    혹시 이런 경험 있으신가요? 어제까지 잘 되던 포트 포워딩(Port Forwarding, 포트 전달)이 오늘 갑자기 안 됩니다. 근데 내부에서는 접속이 되고, 외부에서는 안 되고, 로그에는 딱히 에러도 안 보입니다. 이런 게 전형적인 방화벽 디버깅 케이스입니다.

    2. 계층별 문제 진단: 어디서 막히는지 먼저 파악하세요

    쉽게 말해 네트워크 보안 트러블슈팅은 “패킷(Packet, 네트워크 데이터 조각)이 어디까지 갔는지”를 찾는 과정입니다. 이걸 감으로 하면 오래 걸리고, 체크리스트로 하면 빨라집니다.

    구간 확인 질문 대표 도구 자주 나오는 원인
    물리/링크 인터페이스가 살아 있나? Interfaces, ifconfig 케이블, NIC 협상, VLAN 태그 오류
    IP/라우팅 목적지까지 경로가 있나? ping, traceroute, route 게이트웨이 오설정, 정적 라우트 누락
    방화벽 룰에서 막히나? Live View, pfctl, filter log 인터페이스 방향 착각, 룰 순서 문제
    NAT 주소 변환이 기대대로 되나? NAT rules, packet capture Outbound NAT 누락, Port Forward 불일치
    DNS 이름 해석만 안 되나? nslookup, drill, dig Resolver/Forwarder 설정 문제
    애플리케이션 포트/프로토콜만 안 되나? curl, nc, telnet 서비스 미기동, TLS, 리스닝 포트 오류

    여기서 중요한 포인트! 네트워크 보안 트러블슈팅은 “인터넷 됨/안 됨”으로 판단하면 안 됩니다. 반드시 출발지, 목적지, 포트, 프로토콜, 인터페이스, 시간대를 같이 적어두세요. 예를 들면 “VLAN 30의 192.168.30.10에서 TCP 443으로 외부 접속 실패, 오전 9시부터 시작” 이런 식입니다. 이 한 줄이 디버깅 속도를 정말 많이 올려줍니다.

    3. 실제로 하는 1차 점검 루틴 (방화벽 디버깅 기초)

    장애가 나면 저는 설정 화면부터 안 들어갑니다. 먼저 증상을 최소 단위로 쪼갭니다. 아래 순서가 기본입니다.

    1. 문제를 재현합니다. 어떤 클라이언트에서, 어떤 목적지로, 어떤 포트가 실패하는지 확인합니다.
    2. 게이트웨이 상태를 봅니다. WAN이 죽었는지, 특정 경로만 죽었는지 먼저 가릅니다.
    3. 클라이언트에서 기본 테스트를 합니다. IP ping, DNS 조회, TCP 포트 접속을 나눠봅니다.
    4. 방화벽 로그와 패킷 캡처를 같이 봅니다. 로그만 믿으면 놓치는 케이스가 꽤 있습니다.
    5. 최근 변경사항을 떠올립니다. 룰 추가, VLAN 수정, DHCP 변경, DNS 설정 변경이 있었는지요.

    실제로 써보니까 장애 원인의 절반 이상은 “최근 내가 바꾼 것”에서 나오더라고요. 저도 처음엔 인정하기 싫었는데, 결국 제 설정이 원인인 경우가 많았습니다.

    3-1. 클라이언트에서 먼저 보는 명령어

    ping -c 4 192.168.1.1
    ping -c 4 1.1.1.1
    nslookup example.com
    traceroute 1.1.1.1
    nc -vz example.com 443

    이 다섯 줄만 해도 꽤 많은 정보가 나옵니다. 첫 번째 ping이 실패하면 로컬 게이트웨이까지 못 가는 거고, 두 번째만 실패하면 WAN 또는 라우팅 문제일 가능성이 큽니다. nslookup이 실패하면 DNS 쪽을 보면 되고요. nc(netcat, 네트워크 디버깅 도구)로 443 포트 테스트까지 해보면 L3/L4를 빠르게 나눌 수 있습니다.

    3-2. 방화벽 자체에서 확인하는 명령어

    ifconfig
    netstat -rn
    pfctl -sr
    pfctl -ss
    tcpdump -ni em0 host 1.1.1.1
    tcpdump -ni em1 host 192.168.1.10

    인터페이스 이름은 환경마다 다르니 em0, em1은 실제 NIC 이름으로 바꿔서 보시면 됩니다. pfctl -sr은 로드된 필터 룰, pfctl -ss는 현재 상태 테이블(State Table, 연결 상태 추적 정보)을 보여줍니다. 상태 테이블에 세션이 생기지 않으면 룰 또는 경로 문제를 의심해볼 수 있습니다.

    네트워크 보안 트러블슈팅 중 OPNsense/pfSense 설정 화면과 게이트웨이 상태를 보여주는 이미지

    게이트웨이 상태, 인터페이스 상태, 실시간 로그, 패킷 캡처 흐름을 한 화면에서 정리한 설정 화면 예시 이미지입니다.

    4. [방화벽 디버깅] 규칙은 맞는데 트래픽이 안 지나갈 때

    이건 정말 자주 봅니다. 특히 OPNsense 문제 해결이나 pfSense 오류 문의에서 많이 나오는 패턴이 “Allow 룰을 넣었는데 왜 안 되죠?”입니다. 근데 자세히 보면 인터페이스 방향을 반대로 이해한 경우가 많아요.

    pf 기반 방화벽은 기본적으로 들어오는 방향(Inbound) 기준으로 룰을 평가합니다. 예를 들어 VLAN 20에서 인터넷으로 나가는 트래픽을 허용하려면, WAN이 아니라 VLAN 20 인터페이스에 룰이 있어야 하는 경우가 대부분입니다. 저도 예전에 WAN 쪽에만 룰을 만지다가 한참 헤맸습니다.

    • 룰은 어느 인터페이스로 들어오는가 기준으로 생각합니다.
    • 상단 룰이 먼저 매칭되므로 룰 순서를 꼭 확인합니다.
    • Floating Rule(플로팅 룰, 여러 인터페이스 공통 적용 룰)을 쓰는 경우 quick 옵션 해석도 주의가 필요합니다.

    점검 포인트

    1. 문제가 발생한 클라이언트가 어느 인터페이스에 속하는지 확인합니다.
    2. 그 인터페이스의 규칙에서 목적지/포트/프로토콜을 다시 봅니다.
    3. 상단에 더 넓은 차단 룰이 먼저 있는지 확인합니다.
    4. Live View에서 실제 차단 로그가 찍히는지 봅니다.
    5. 상태 테이블을 초기화해야 하는 상황인지 검토합니다.
    pfctl -k 192.168.20.10
    pfctl -Fs

    첫 줄은 특정 호스트 관련 상태를 끊고, 두 번째는 상태 테이블 전체를 비우는 명령입니다. 다만 운영 중인 환경에서는 전체 상태 초기화가 영향이 크니 조심하셔야 합니다. 저는 홈랩에서 테스트하다가 가족들 인터넷까지 잠깐 끊겨서 혼난 적도 있습니다 ㅎㅎ

    5. [pfSense 오류 해결] NAT와 포트 포워딩이 미묘하게 꼬일 때

    포트 포워딩(Port Forwarding, 외부 포트를 내부 서버로 전달) 장애도 단골입니다. 외부에서 내부 서비스로 들어오게 만들었는데 접속이 안 되면, 단순히 포워드 규칙만 볼 게 아니라 연관된 방화벽 규칙, 대상 IP, 내부 서버의 리스닝 상태, 헤어핀 NAT(Hairpin NAT, 내부에서 공인 주소로 다시 접근하는 구조)까지 같이 확인해야 합니다.

    제가 직접 해보니 여기서 제일 많이 헷갈리는 건 두 가지였습니다. 첫째, 내부 서버 서비스가 실제로 해당 포트에서 리스닝(listening, 접속 대기) 중인지 확인하지 않고 방화벽만 보는 경우. 둘째, 내부에서 공인 IP로 테스트하고 “안 된다”고 판단하는 경우입니다. 이건 NAT Reflection(내트 리플렉션, 내부에서 외부 주소로 우회 접속) 정책이 없으면 정상입니다.

    sockstat -4 -l
    nc -vz 192.168.10.20 443
    tcpdump -ni wan port 443
    tcpdump -ni lan host 192.168.10.20 and port 443

    이렇게 WAN과 LAN 양쪽에서 같은 포트를 잡아보면, 패킷이 들어오기만 하고 내부로 못 나가는지, 아예 바깥에서 안 들어오는지 분리할 수 있습니다. 방화벽 디버깅에서 패킷 캡처는 정말 강력합니다. 로그에는 안 보여도 캡처에는 보이는 경우가 꽤 있거든요.

    자주 실수하는 NAT 체크리스트

    • 포트 포워딩 대상 IP가 DHCP로 바뀌지 않았는지 확인
    • 자동 생성된 연동 룰이 실제로 활성 상태인지 확인
    • Outbound NAT(아웃바운드 NAT)가 수동 모드일 때 필요한 규칙이 빠지지 않았는지 확인
    • Split DNS 또는 NAT Reflection 정책이 환경에 맞는지 확인

    WAN에서는 패킷이 보이는데 LAN에서는 사라지는 상황, 또는 양쪽 모두 보이는 상황을 비교하는 패킷 캡처 예시 이미지입니다.

    6. [홈랩 네트워크 보안] DNS 문제를 방화벽 장애로 착각할 때

    이건 생각보다 더 많습니다. 사용자는 “인터넷이 안 된다”고 느끼는데, 실제로는 1.1.1.1 같은 IP ping은 잘 되고 도메인만 안 풀리는 경우죠. 그럼 방화벽 디버깅보다 DNS부터 봐야 합니다.

    OPNsense/pfSense에서는 보통 DNS Resolver나 DNS Forwarder 역할을 방화벽이 맡습니다. 그래서 이 서비스가 꼬이면 전체 장애처럼 체감됩니다. 특히 홈랩 네트워크에서 내부 도메인, 광고 차단 DNS, 로컬 호스트 오버라이드(Host Override)까지 쓰고 있으면 더 복잡해집니다.

    drill example.com
    drill @127.0.0.1 example.com
    drill @1.1.1.1 example.com

    같은 질의를 로컬 리졸버와 외부 공개 DNS에 각각 던져보면 차이를 바로 볼 수 있습니다. 로컬만 실패하면 방화벽 내 DNS 서비스 문제일 가능성이 높고, 둘 다 실패하면 WAN 또는 업스트림 문제일 수 있습니다.

    네트워크 보안 트러블슈팅에서 DNS는 별도 축으로 다뤄야 합니다. 왜냐하면 이름 해석이 안 되면 사용자는 모든 서비스가 죽은 것처럼 느끼기 때문입니다. 저도 예전에 Unbound 계열 설정을 건드린 뒤 내부 서비스가 전부 죽은 줄 알고 한참 헤맸는데, 결국 DNS 오버라이드 한 줄이 문제였던 적이 있습니다.

    7. 로그와 패킷 캡처는 같이 봐야 정확합니다

    로그(Log, 기록)는 왜 차단됐는지 알려주고, 패킷 캡처(Packet Capture)는 어디까지 갔는지 보여줍니다. 둘 중 하나만 보면 반쪽짜리 진단이 되기 쉽습니다. 특히 pfSense 오류를 좁혀갈 때는 상태 테이블과 캡처를 같이 보는 습관이 중요합니다.

    제가 자주 보는 항목

    • Live firewall log에서 차단 인터페이스와 규칙 정보
    • Gateway 모니터링 상태와 지연/손실 변화
    • DHCP Lease 변동 여부
    • ARP 테이블 이상 여부
    • 상태 테이블에 세션이 생성되는지 여부
    arp -an
    netstat -rn
    pfctl -ss | grep 192.168.30.10

    특정 클라이언트 기준으로 세션이 생성되는지 보는 것만으로도, 룰 매칭 이후까지는 갔는지 판단할 수 있습니다. 상태가 생기는데 응답이 없으면 반대 방향 경로, 업스트림 필터링, 서버 응답 문제 쪽으로 시선을 돌려야 합니다.

    여기서 팁 하나. 장애가 반복되면 체크리스트를 템플릿으로 만들어두세요.

    incident_note:
      source_ip: 192.168.30.10
      source_vlan: vlan30
      destination: example.com:443
      protocol: tcp
      first_seen: "09:10 UTC"
      last_change:
        - "Added VLAN rule"
        - "Modified DNS override"
      symptoms:
        - "Ping gateway success"
        - "Ping public IP failed"
        - "DNS lookup timeout"

    이런 식으로 적어두면 다음 삽질을 줄일 수 있습니다. 드디어 됐다! 하는 순간에 원인을 안 적어두면, 다음 달에 똑같이 다시 헤매게 되더라고요.

    네트워크 보안 트러블슈팅 결과로 정상 복구된 OPNsense/pfSense 상태 검증 이미지

    장애 해결 후 ping, DNS 조회, 상태 테이블, 서비스 접속이 모두 정상으로 돌아온 결과를 보여주는 검증 이미지입니다.

    8. 검증은 반드시 단계별로 해야 합니다

    설정을 고친 뒤 바로 “이제 됩니다”라고 끝내면 안 됩니다. 최소한 아래 항목은 다시 확인해야 합니다.

    1. 클라이언트에서 게이트웨이 ping 성공
    2. 공인 IP ping 또는 traceroute 정상
    3. DNS 조회 정상
    4. 문제였던 포트 접속 정상
    5. 방화벽 로그에 더 이상 의도치 않은 차단 없음
    6. 다른 VLAN 또는 다른 클라이언트에 부작용 없음

    특히 마지막이 중요합니다. OPNsense 문제 해결을 하다가 특정 대역만 살리고 다른 대역을 죽여버리는 경우가 의외로 많거든요. 그래서 저는 항상 “원래 안 되던 것”뿐 아니라 “원래 되던 것”도 같이 확인합니다. 이게 진짜 실무적인 검증입니다.

    간단한 결과 확인 예시

    ping -c 2 192.168.1.1
    ping -c 2 1.1.1.1
    nslookup example.com
    curl -I https://example.com

    curl까지 성공하면 적어도 웹 계층에서의 기본 통신은 확인한 셈입니다. 물론 실제 서비스가 API, 게임, VPN, VoIP라면 그 프로토콜 특성에 맞는 추가 검증이 필요합니다.

    9. 정리: 네트워크 보안 트러블슈팅의 핵심은 순서입니다

    오늘 내용의 핵심은 단순합니다. 네트워크 보안 트러블슈팅은 센스보다 순서가 중요합니다. 물리, IP, 라우팅, 룰, NAT, DNS, 애플리케이션 순서로 좁혀가면 됩니다. OPNsense/pfSense는 강력한 만큼, 설정 요소가 많아서 겉증상에 속기 쉽습니다. 그래서 더더욱 “패킷이 어디까지 갔는가”를 기준으로 봐야 하죠.

    제가 실제로 오래 써보니, 가장 시간을 아껴주는 건 세 가지였습니다. 첫째, 증상을 문장으로 정확히 적기. 둘째, 로그와 캡처를 같이 보기. 셋째, 최근 변경사항부터 의심하기. 이 세 가지만 지켜도 홈랩 네트워크 장애 대응 속도가 꽤 달라집니다.

    이전 글에서 VLAN 분리와 기본 방화벽 정책을 다뤘다면, 이번 글은 그 위에서 장애를 푸는 방법에 가까웠습니다. 다음 글에서는 WireGuard VPN과 정책 기반 라우팅이 섞일 때 생기는 디버깅 포인트도 따로 다뤄볼 예정입니다. 그쪽은 진짜 한 번 꼬이면 오래 갑니다.

    네트워크 보안 트러블슈팅 요약과 OPNsense 문제 해결 포인트를 정리한 인포그래픽 이미지

    장애 진단 순서, 자주 나오는 원인, 추천 도구를 한 장으로 요약한 인포그래픽 이미지입니다.

    자주 묻는 질문

    Q1. ping은 되는데 웹만 안 열리면 방화벽 문제인가요?

    반드시 그렇진 않습니다. TCP 80/443 차단, DNS 문제, MTU 문제, 서버 리스닝 문제, TLS 이슈까지 모두 가능성이 있습니다. ping 성공만으로 방화벽 정상이라고 보시면 안 됩니다.

    Q2. 포트 포워딩이 외부에서는 안 되고 내부에서는 되면요?

    내부 테스트가 사설 IP 기준인지, 공인 IP 기준인지 먼저 구분하셔야 합니다. NAT Reflection이나 Split DNS 구성이 없으면 내부에서 공인 주소 테스트는 실패할 수 있습니다.

    Q3. 로그에 아무것도 안 찍히면 어떻게 하나요?

    그럴 때일수록 패킷 캡처가 중요합니다. 아예 방화벽까지 패킷이 도달하지 않는지, 도달은 하는데 다른 인터페이스로 안 나가는지부터 확인해보세요.