리눅스 네트워크 문제 해결 및 디버깅


80

때때로 Linux 및 Unix 사용자는 다양한 네트워크 문제에 직면했습니다. 이러한 문제 중 상당수는 여기 및 기타 문제 해결 포럼에 나와 있지만 매우 구체적이며 많은 추가 기술 정보가 포함되어 있으며 때로는 버그가있는 시스템 동작의 주요 원인과 실제 이유를 이해하기가 어렵습니다.

이 질문을함으로써 네트워크 문제 해결 및 디버깅 경험을 일반화 할 수 있는 커뮤니티 위키 페이지 를 시작하려고 합니다. 리눅스와 유닉스 사용자가이 페이지를 사용하여 네트워크 문제를 쉽게 인식하고 해결할 수 있기를 바랍니다.

이 페이지의 부모는 문제를 진단하는 모범 사례가 되어야합니다 . 그러나 여기서 우리는 문제 해결에 초점을 맞추어야 네트워크 문제 에서 사용자 및 커널 공간.

당신이 생각한다면 :

  1. 구체적인 사용 예 및 네트워크 버그의 예와 함께 유용한 네트워크 진단 도구 사용에 대한 정보를 공유하십시오.
  2. 이 주제와 관련된 훌륭한 네트워크 튜토리얼 링크를 공유하십시오
  3. 일부 클래스의 네트워크 문제를 해결할 수있는 일반적인 방법이나 레시피에 대해 설명하십시오.
  4. 네트워크 디버깅 및 문제 해결을위한 도구 세트에 대한 정보 공유

이 주제에 완벽하게 맞습니다.


다양한 진단 도구12 년 된 간단한 자습서 링크를 공유하는 것부터 시작하겠습니다 . 또한 아치 리눅스 튜토리얼 은 우리 주제에 대한 실제 정보를 가지고있는 것 같습니다. 리눅스 네트워킹에 뛰어 들기 위해서는 Linux Networking-HOWTO 를 방문해야한다 .


이 Q & A는 동일한 IP 주소로 구성된 네트워크에서이 컴퓨터 고려해야 할 한 가지가 unix.stackexchange.com/questions/85887/...을 .
slm

또 다른 유용한 네트워크 문제 해결 가이드 : cisco.com/en/US/docs/internetworking/troubleshooting/guide/...
Ryne 에버렛

답변:


118

네트워크 문제 해결의 일반적인 원칙은 다음과 같습니다.

  1. 어떤 수준의 TCP / IP 스택 (또는 다른 스택)에서 문제가 발생 하는지 확인 하십시오.
  2. 올바른 시스템 동작 및 정상적인 시스템 상태와의 편차 이해
  3. 한 문장이나 여러 단어로 문제를 표현해보십시오
  4. 버기 시스템에서 얻은 정보, 다른 사람 (Google, 다양한 포럼 등)에 대한 자신의 경험과 경험을 사용하여 성공 (또는 실패)까지 문제를 해결하십시오.
  5. 실패하면 다른 사람들에게 도움이나 조언을 요청하십시오.

나는 보통 필요한 모든 도구를 사용하여 필요한 모든 정보를 얻고이 정보를 내 경험과 일치 시키려고 노력한다. 버그가 포함 된 네트워크 스택 수준을 결정하면 변형 가능성을 줄일 수 있습니다. 다른 사람들의 경험을 사용하면 문제를 신속하게 해결하는 데 도움이되지만 상황을 이해하지 못하면 문제를 이해하지 않고 해결할 수 있으며이 문제가 다시 발생하면 인터넷없이 문제를 다시 해결할 수 없습니다.

그리고 일반적으로 네트워크 문제를 해결하는 방법을 모르겠습니다. 내 두뇌에는 마법의 기능이 SolveNetworkProblem(information_about_system_state, my_experience, people_experience)있는데, 때로는 정답을 정확하게 반환하고 때로는 실패 할 수도 있습니다 ( Linux 랩톱 에서 TCP가 죽는 것처럼 ).

나는 보통 네트워크 디버깅을 위해이 세트의 utils를 사용합니다 :

  • ifconfig(또는 ip link, ip addr) - 네트워크 인터페이스에 관한 정보를 취득
  • ping-내 컴퓨터에서 대상 호스트에 액세스 할 수 있는지 확인합니다. ping기본 DNS 진단에도 사용할 수 있습니다. IP 주소 또는 호스트 이름으로 호스트를 핑한 다음 DNS가 작동하는지 여부를 결정할 수 있습니다. 그리고 traceroute또는 tracepath또는 mtr거기에가는 일을보고 있습니다.
  • dig -모든 DNS 진단
  • dmesg | lessdmesg | taildmesg | grep -i error- 리눅스 커널은 몇 가지 문제에 대해 어떻게 생각하는지 이해.
  • netstat -antp+ | grep smth-가장 많이 사용되는 netstat 명령 사용법은 TCP 연결에 대한 정보를 보여줍니다. grep을 사용하여 필터링을 수행하는 경우가 종종 있습니다. 또한 새로운 참조 ss(에서 명령에 iproute2새로운 표준 리눅스 네트워킹 도구의 스위트)와 lsof같이 lsof -ai tcp -c some-cmd.
  • telnet <host> <port> -다양한 TCP 서비스 (예 : SMTP, HTTP 프로토콜)와 통신하는 데 매우 유용하며 일부 TCP 포트에 연결할 수있는 일반적인 기회를 확인할 수도 있습니다.
  • iptables-save(Linux에서)- 전체 iptables 테이블 을 덤프
  • ethtool -모든 네트워크 인터페이스 카드 매개 변수 가져 오기 (링크 상태, 속도, 오프로드 매개 변수 ...)
  • socat-모든 네트워크 프로토콜 (UDP, 멀티 캐스트, SCTP ...)을 테스트하는 스위스 군용 도구. 몇 가지 -d옵션으로 특히 유용합니다 (텔넷보다 더 유용함) .
  • iperf -대역폭 가용성을 테스트
  • openssl( s_client, ocsp, x509...) 모든 SSL / TLS가 / PKI 문제를 디버깅하는 방법.
  • wireshark -네트워크 트래픽을 캡처하고 분석하는 강력한 도구로 많은 네트워크 버그를 분석하고 포착 할 수 있습니다.
  • iftop -네트워크 / 라우터에서 큰 사용자를 표시합니다.
  • iptstate (Linux의 경우)-방화벽의 연결 추적에 대한 현재보기
  • arp(또는 new (Linux) ip neigh)-ARP 테이블 상태를 표시합니다.
  • route또는 최신 버전 (Linux) ip route-라우팅 테이블 상태를 표시합니다.
  • strace(또는 truss, dtrace또는 tusc시스템에 따라하기) - 시스템 호출이 실패하면 시스템 호출이 문제의 과정을 무엇을 보여주고있는 유용한 도구입니다, 그것은 또한 (errno를) 에러 코드를 보여줍니다. 이 정보는 종종 시스템 동작을 이해하고 문제를 해결하기에 충분하다고 말합니다. 또는 일부 네트워킹 함수에서 중단 점을 사용 gdb하면 언제 만들어졌으며 어떤 인수를 사용하는지 알 수 있습니다.
  • Linux의 방화벽 문제 조사 : iptables -nvL각 규칙과 일치하는 패킷 수를 표시합니다 ( iptables -Z카운터를 0으로 설정). LOG방화벽 체인에 삽입 된 대상은 패킷이 그들을 도달하고 그들이 어떻게 거기에 도착 때 이미 변형 된 확인할 때 유용합니다. 더 얻으려면 NFLOG(와 연결됨 ulogd) 전체 패킷을 기록합니다.

이봐, 철저히 말해봐!
mVChr

7
추가 nmap합니다. 시스템의 열린 포트 프로파일은 예를 들어 Linux 또는 Windows 서버를보고 있는지에 대한 힌트를 빠르게 제공 할 수 있습니다.
Adam Monsen

7
추가 tcpdump합니다. TCP의 표준 패킷 ​​분석기로 사용됩니다.
jhvaras

14

놀라운 "네트워크 문제"는 일종의 DNS 문제로 귀결됩니다. 초기 문제 해결은 ping -n w.x.y.z호스트 이름의 DNS 확인을 생략하고 IP 연결을 확인하기 위해 사용해야 합니다. 그런 다음, route -nDNS 확인없이 기본 IP 경로를 확인하는 데 사용 하십시오.

IP 연결 및 라우팅을 확인한 후 nslookup, hostdig정보를 얻을 수 있습니다. "잠금"은 DNS 시간 초과가 발생했음을 나타낼 수 있습니다.

의 존재와 내용을 확인하는 것을 잊지 마십시오 /etc/resolv.conf. DHCP 클라이언트는 임대 할 때마다 해당 파일을 변경하며 때때로 파일이 잘못되거나 디스크 공간이 부족하면 업데이트가 수행되지 않을 수 있습니다.


8

케이블 문제가 존재할 수 있습니다. 하드웨어에 접근 할 수 있으면 케이블이 모두 연결되어 있고 기계적으로 연결되어 있는지 확인하십시오. 라우터 또는 이더넷 인터페이스가 보이면 링크 표시등이 켜져 있는지 확인하십시오.

원격으로 ethtool및 에 의존해야합니다 mii-tool.

[root@flask ~]# ethtool eth0
Settings for eth0:
        Supported ports: [ TP MII ]
        Supported link modes:   10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
        Supported pause frame use: No
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full 
                                100baseT/Half 100baseT/Full 
        Advertised pause frame use: Symmetric
        Advertised auto-negotiation: Yes
        Speed: 10Mb/s
        Duplex: Half
        Port: MII
        PHYAD: 24
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: g
        Wake-on: d
        Current message level: 0x00000001 (1)
                               drv
        Link detected: yes

"링크 감지 : 예"는 좋지만 해당 컴퓨터의 NIC가 더 잘 수행 할 수 있으므로 10Mb / s 및 반이중은 좋지 않습니다. NIC가 끊어 졌는지 또는 케이블이 맞는지 알아 내야합니다. 동일한 라우터에 연결된 다른 컴퓨터에 100Mb / s, 전이중이라고 표시되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.