네트워크 인터페이스 상태 진단은(는) 무엇을 하나요?
네트워크 증상이 물리적 링크, 스위치 포트, 케이블, 트랜시버, 듀플렉스 설정 또는 인터페이스 혼잡으로 인해 발생할 수 있을 때 이 스킬을 사용하세요.
사용 시기
- 호스트 또는 VLAN에서 패킷 손실, 지연 스파이크 또는 간헐적 연결 가능성 문제가 발생합니다.
- 스위치 또는 라우터 인터페이스에 CRC, 런트, 자이언트, 드롭, 리셋 또는 플랩이 표시됩니다.
- 하드웨어를 교체하기 전에 링크의 양쪽 끝을 비교해야 합니다.
- 변경 작업 전후로 인터페이스 카운터 증거가 필요합니다.
- 모니터링에서
ifInErrors,ifOutErrors또는ifOutDiscards증가를 보고합니다.
작동 방식
인터페이스 카운터는 증거이지만, 절대 숫자보다 추세가 더 중요합니다. 기준선을 캡처하고, 측정 간격을 기다린 후 다시 캡처하여 증분을 비교합니다.
show interfaces <인터페이스>
show interfaces <인터페이스> status
show logging | include <인터페이스>|changed state|line protocol
Linux 호스트:
ip -s link show <인터페이스>
ethtool <인터페이스>
ethtool -S <인터페이스>
카운터 참조
| 카운터 | 의미 | 일반적인 원인 |
|---|---|---|
| CRC | 수신 프레임 체크섬 실패 | 케이블 불량, 광섬유 오염, 광트랜시버 불량, 듀플렉스 불일치 |
| input errors | 수신 측 오류 집계 | 결론 전에 하위 카운터 확인 |
| runts | 최소 이더넷 크기 미만 프레임 | 듀플렉스 불일치, 충돌 도메인, NIC 결함 |
| giants | 예상 MTU보다 큰 프레임 | MTU 불일치 또는 점보 프레임 경계 |
| input drops | 장치가 인바운드 패킷을 수락할 수 없음 | 버스트, 과도 구독, CPU 경로, 큐 압력 |
| output drops | 송신 큐에서 패킷 폐기 | 혼잡, QoS 정책, 용량 부족 업링크 |
| resets | 인터페이스 하드웨어 리셋 | 플래핑, keepalive, 드라이버, 광트랜시버, 전원 |
| collisions | 이더넷 충돌 카운터 | 반이중 또는 협상 불일치 |
진단 흐름
CRC 또는 입력 오류
- 카운터가 증가 중인지 확인합니다(단순히 과거 기록이 아님).
- 링크의 양쪽 끝을 모두 확인합니다. 수신 측 오류는 일반적으로 오류를 보고하는 포트 자체가 아니라 해당 측에 도착하는 신호의 문제를 가리킵니다.
- 패치 케이블을 교체하거나 광섬유와 광트랜시버를 청소/교체합니다.
- 양쪽의 속도/듀플렉스 설정이 일치하는지 확인합니다.
- 동일한 타임스탬프 주변의 플랩 이벤트에 대한 로그를 확인합니다.
드롭
- 입력 드롭과 출력 드롭을 분리합니다.
- 인터페이스 속도를 용량과 비교합니다.
- QoS 정책, 큐 카운터 및 링크가 과도 구독된 업링크인지 확인합니다.
- 큐 튜닝을 부차적인 것으로 간주합니다. 먼저 링크가 혼잡한지 입증합니다.
듀플렉스 및 속도
양쪽에서 지원하는 최신 이더넷 링크에서는 자동 협상을 선호합니다. 한쪽을 고정해야 하는 경우 양쪽을 명시적으로 구성하고 그 이유를 문서화하십시오. 한쪽에 고정 속도/듀플렉스를 설정하고 다른 쪽에 자동 협상을 혼합하지 마십시오.
show interfaces <인터페이스> | include duplex|speed
안전한 파서 예제
각 인터페이스 블록을 한 헤더에서 다음 헤더까지 슬라이스합니다. 임의의 문자 창을 사용하지 마십시오. 큰 인터페이스 블록은 카운터가 누락되거나 잘못된 포트에 할당될 수 있습니다.
import re
from typing import Any
HEADER_RE = re.compile(
r"^(?P<name>\S+) is (?P<status>(?:administratively )?down|up), "
r"line protocol is (?P<protocol>up|down)",
re.I | re.M,
)
ERROR_RE = re.compile(r"(?P<input>\d+) input errors, (?P<crc>\d+) CRC", re.I)
DROP_RE = re.compile(r"(?P<output>\d+) output errors", re.I)
DUPLEX_RE = re.compile(r"(?P<duplex>Full|Half|Auto)-duplex,\s+(?P<speed>[^,]+)", re.I)
def parse_show_interfaces(raw: str) -> list[dict[str, Any]]:
headers = list(HEADER_RE.finditer(raw))
interfaces = []
for index, header in enumerate(headers):
end = headers[index + 1].start() if index + 1 < len(headers) else len(raw)
block = raw[header.start():end]
errors = ERROR_RE.search(block)
drops = DROP_RE.search(block)
duplex = DUPLEX_RE.search(block)
interfaces.append({
"name": header.group("name"),
"status": header.group("status"),
"protocol": header.group("protocol"),
"duplex": duplex.group("duplex") if duplex else "unknown",
"speed": duplex.group("speed").strip() if duplex else "unknown",
"input_errors": int(errors.group("input")) if errors else 0,
"crc_errors": int(errors.group("crc")) if errors else 0,
"output_errors": int(drops.group("output")) if drops else 0,
})
return interfaces
예제
스위치 포트 하나의 CRC
- 로컬 포트의 카운터를 캡처합니다.
- 연결된 원격 포트의 카운터를 캡처합니다.
- 라우팅 또는 방화벽 규칙을 변경하기 전에 케이블 또는 광트랜시버를 교체합니다.
- 기준선을 기록한 후에만 카운터를 지웁니다.
- 고정된 간격 후에 다시 확인합니다.
인터넷은 느리지만 LAN은 정상
- WAN 인터페이스 드롭/오류를 확인합니다.
- LAN 업링크 사용률 및 출력 드롭을 확인합니다.
- WAN 링크가 깨끗하지만 처리량이 여전히 낮은 경우 게이트웨이 CPU를 확인합니다.
- 업스트림 서비스를 비난하기 전에 유선 및 무선 테스트를 비교합니다.
안티 패턴
- 기준선을 저장하기 전에 카운터를 지웁니다.
- 링크의 한쪽만 확인합니다.
- 시간 창 없이 모든 과거 CRC가 활성 문제라고 가정합니다.
- 한쪽에 자동 협상을, 다른 쪽에 고정 속도/듀플렉스를 혼합합니다.
- 혼잡을 확인하기 전에 출력 드롭을 케이블 문제로 처리합니다.
참조
- 에이전트:
network-troubleshooter - 스킬:
network-config-validation - 스킬:
homelab-network-setup