사전 ifconfig
인터페이스

ifconfig

gabury1고친 사람 github-actions[bot]

ifconfig 는 컴퓨터의 네트워크 인터페이스를 보여 주고 설정을 바꾸는 명령입니다. 인터페이스마다 붙은 주소와 지금 켜져 있는지를 몇 줄씩 묶어 찍어 줍니다. 서버의 주소를 알아내거나 네트워크가 안 될 때 먼저 쳐 보는 명령입니다. 리눅스에서는 같은 일을 하는 새 명령 ip 로 옮겨 가는 중입니다.

쉽고 빠른 이해

ifconfig 는 이 컴퓨터가 네트워크에 드나드는 문(네트워크 인터페이스)을 하나씩 보여 주는 명령입니다. 인자 없이 치면 「eth0 에는 10.0.0.5 가 붙어 있고 켜져 있다」 같은 몇 줄이 문마다 찍힙니다.

문과 주소는 운영체제 안에 있어서 눈에 안 보입니다. 이 명령이 없으면 「이 서버 주소가 뭐지」, 「선은 꽂혀 있나」를 짐작으로 풀어야 합니다.

  1. 운영체제가 들고 있는 문 목록과 설정을 읽어 옵니다
  2. 문마다 주소, 켜짐 여부, 주고받은 양을 몇 줄로 묶어 찍습니다
  3. 인자를 주면 주소를 바꾸거나 문을 켜고 끕니다

대가가 있습니다. 이 명령으로 바꾼 설정은 재부팅하면 사라집니다. 리눅스에서는 한 문에 붙은 주소를 다 못 보여 줄 때가 있어서 ip 명령으로 옮겨 가는 중입니다.

상세

ifconfig 는 interface configuration(인터페이스 설정)을 줄인 이름입니다. 운영체제가 관리하는 네트워크 인터페이스의 목록과 설정을 사람이 읽을 모양으로 찍습니다. 인자를 주면 그 설정을 바꿉니다.

리눅스와 맥을 비롯한 유닉스 계열 운영체제가 이 명령을 갖고 있습니다. 윈도에는 이름이 닮은 ipconfig 가 따로 있습니다. 보여 주는 내용은 비슷합니다. 그래도 다른 명령이라 옵션이 다릅니다.

백엔드 개발자가 이 명령을 꺼내는 때는 대개 셋입니다. 새로 받은 서버의 주소를 알아낼 때입니다. 서버가 네트워크에 아예 안 닿을 때입니다. 패킷이 자꾸 버려진다는 의심이 들 때입니다.

네트워크 인터페이스

컴퓨터가 네트워크에 드나드는 문 하나를 네트워크 인터페이스라 부릅니다. 유선 랜 카드 하나, 와이파이 하나가 각각 인터페이스 하나입니다. 운영체제는 인터페이스마다 eth0 · wlan0 같은 이름을 붙여 따로 관리합니다.

인터페이스를 따로 세는 이유는 한 컴퓨터가 여러 네트워크에 동시에 붙을 수 있기 때문입니다. 데이터를 보낼 때 어느 인터페이스로 내보낼지 골라야 합니다. 남이 찾아올 주소도 인터페이스마다 따로 달아야 합니다.

요즘 리눅스에서는 이름이 enp0s3 · ens33 꼴인 경우도 흔합니다. 장치가 꽂힌 위치를 따서 짓는 이름입니다. 옛 문서의 명령을 손대지 않고 따라 치면 eth0 이 없다는 에러가 나는 것은 이 때문입니다.

IP 주소와 MAC 주소

인터페이스에는 주소가 두 종류 붙습니다. 첫째는 IP 주소(Internet Protocol address, 인터넷 프로토콜 주소)입니다. 네트워크 너머에서 이 컴퓨터를 찾아올 때 쓰는 주소입니다.

지금 가장 흔한 IPv4(Internet Protocol version 4, 인터넷 프로토콜 4판) 주소는 10.0.0.5 처럼 점으로 가른 네 숫자입니다. 관리자가 손으로 정하거나 네트워크에서 자동으로 받아 옵니다.

네 숫자는 각각 8비트, 곧 1바이트입니다. 그래서 숫자 하나에는 0부터 255 까지 들어갑니다. 255 는 여덟 비트가 모두 1 인 값입니다. 네 숫자를 이으면 주소 하나가 32비트입니다.

둘째는 MAC 주소(Media Access Control address, 매체 접근 제어 주소)입니다. 랜 카드에 붙은 하드웨어 주소입니다. 같은 망 안의 장비끼리 데이터를 건넬 때 씁니다.

MAC 주소는 08:00:27:4e:66:a1 처럼 콜론으로 가른 여섯 바이트입니다. 대개 카드를 만들 때 정해집니다. ifconfig 는 이 두 주소를 인터페이스 블록 하나 안에 함께 찍습니다.

아래 그림은 유선과 무선에 함께 붙은 컴퓨터 한 대입니다. 인터페이스마다 제 주소를 따로 달고 서로 다른 망에 닿습니다.

flowchart TD
    subgraph 컴퓨터
        E["eth0 · 유선 랜 카드 · IP 10.0.0.5 · MAC 08:00:27:4e:66:a1"]
        W["wlan0 · 와이파이 · IP 192.168.0.20 · MAC 다른 값"]
        L["lo · 루프백 · IP 127.0.0.1"]
    end
    E --> N1["사무실 유선망"]
    W --> N2["무선망"]
    L --> S["같은 컴퓨터 안"]

루프백 인터페이스

그림의 lo 는 루프백 인터페이스입니다. 컴퓨터가 자기 자신에게 데이터를 보낼 때 쓰는 가상의 인터페이스입니다. 랜 카드 같은 장치 없이 운영체제 안에서만 돕니다.

루프백에는 대개 127.0.0.1 이 붙습니다. 같은 컴퓨터에 띄운 데이터베이스에 localhost 로 붙으면 그 데이터가 이 인터페이스를 지납니다. 장치가 없으니 선을 뽑아도 lo 는 켜진 채 남습니다.

출력 블록 하나를 읽는 법

리눅스에서 인자 없이 ifconfig 를 치면 켜진 인터페이스마다 몇 줄씩 묶어 찍습니다. 이 묶음 하나를 블록이라 합니다. 아래는 유선 인터페이스 하나와 루프백을 가진 서버의 예입니다. 주소와 수는 예로 지어낸 것입니다.

터미널
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.5  netmask 255.255.255.0  broadcast 10.0.0.255
        inet6 fe80::a00:27ff:fe4e:66a1  prefixlen 64  scopeid 0x20<link>
        ether 08:00:27:4e:66:a1  txqueuelen 1000  (Ethernet)
        RX packets 120345  bytes 104857600 (100.0 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 80321  bytes 52428800 (50.0 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)

블록의 첫 줄은 인터페이스 이름, 상태 표시, 한 번에 보낼 수 있는 크기입니다. 그 아래 줄들이 주소와 통계입니다. 진단에 쓰는 칸은 아래 표의 아홉입니다.

칸 뜻
flags 인터페이스의 상태 표시. 꺾쇠 안의 낱말이 지금 켜진 표시다
mtu 한 번에 내보낼 수 있는 패킷의 최대 크기. 단위는 바이트
inet IPv4 주소
netmask 주소 가운데 망을 가리키는 부분
broadcast 같은 망 전체에 한꺼번에 보낼 때 쓰는 주소
inet6 IPv6(Internet Protocol version 6, 인터넷 프로토콜 6판) 주소
ether MAC 주소
RX packets · TX packets 받은 패킷 · 보낸 패킷의 수와 바이트 수
errors · dropped 오류가 난 패킷 수 · 버린 패킷 수

UP 과 RUNNING

flags 의 꺾쇠 안에서 먼저 볼 것은 UP 과 RUNNING 입니다. 둘은 비슷해 보이지만 가리키는 것이 다릅니다. 등호 뒤의 숫자는 이 표시들을 비트로 합친 값이라 꺾쇠 안 낱말만 읽으면 됩니다.

UP 은 관리자가 이 인터페이스를 켜 두었다는 표시입니다. 운영체제가 이 인터페이스로 데이터를 주고받을 준비를 마쳤다는 뜻입니다.

인터페이스를 끄면 UP 이 사라집니다. 이렇게 꺼진 인터페이스는 인자 없는 ifconfig 에 아예 안 나옵니다. 꺼진 것까지 보려면 ifconfig -a 를 칩니다.

RUNNING 은 장치 쪽에서 신호가 잡힌다는 표시입니다. 유선이면 랜 선이 꽂혀 있고 건너편 장비가 살아 있다는 뜻입니다. UP 인데 RUNNING 이 없으면 켜 놓기는 했지만 선이 빠졌거나 건너편이 응답하지 않는 것입니다.

나머지 표시는 진단에서 볼 일이 드뭅니다. BROADCAST 는 망 전체에 보내기를, MULTICAST 는 여러 대에 한꺼번에 보내기를 이 인터페이스가 할 수 있다는 표시입니다. LOOPBACK 은 루프백 인터페이스라는 표시입니다.

서브넷 마스크

IP 주소는 앞부분과 뒷부분으로 나뉩니다. 앞부분은 어느 망인지를, 뒷부분은 그 망 안의 어느 컴퓨터인지를 가리킵니다. 앞부분이 같은 주소의 묶음이 망 하나입니다. 이 망을 서브넷이라고도 부릅니다.

netmask 칸의 값이 서브넷 마스크입니다. 주소의 어디까지가 망을 가리키는 앞부분인지 정합니다. 255.255.255.0 이면 앞의 세 숫자가 망이고 마지막 숫자가 컴퓨터입니다.

이 값으로 10.0.0.5 와 10.0.0.9 는 같은 망이고 10.0.1.9 는 다른 망이 됩니다. 같은 망의 상대에게는 데이터를 바로 건넵니다. 다른 망의 상대에게는 망 사이를 이어 주는 게이트웨이를 거쳐 보냅니다.

서브넷 마스크가 틀리면 운영체제가 같은 망과 다른 망을 잘못 가립니다. 바로 건넬 상대를 게이트웨이로 보내거나, 게이트웨이로 보낼 상대에게 바로 건네려다 실패합니다.

서브넷 마스크를 비트로 펴면 앞쪽에는 1 이 이어지고 뒤쪽에는 0 이 이어집니다. 1 인 비트까지가 망을 가리키는 앞부분입니다. 255.255.255.0 은 255 가 셋이라 1 이 8개씩 세 번, 모두 24개입니다.

그래서 이 마스크를 /24 로도 적습니다. 1 인 비트의 수를 빗금 뒤에 쓴 표기입니다. ip 명령은 주소를 10.0.0.5/24 처럼 이 표기를 붙여 찍습니다.

브로드캐스트 주소와 IPv6 주소

broadcast 칸은 브로드캐스트 주소입니다. 이 망 안의 모든 컴퓨터에게 한꺼번에 보낼 때 쓰는 주소입니다. 컴퓨터를 가리키는 뒷부분의 비트를 전부 1 로 채운 값입니다. 위 예에서는 마지막 숫자의 여덟 비트가 모두 1 이 되어 10.0.0.255 입니다.

inet6 칸은 IPv6 주소입니다. IPv6 는 주소를 16바이트로 늘린 새 판입니다. 주소는 콜론으로 가른 16진수로 적습니다.

fe80 으로 시작하는 IPv6 주소는 링크 로컬 주소입니다. 같은 망 안에서만 쓰는 주소라 인터페이스가 켜지면 저절로 붙습니다. 이 주소가 보인다고 해서 IPv6 로 인터넷에 나갈 수 있다는 뜻은 아닙니다.

MTU

mtu 칸은 MTU(Maximum Transmission Unit, 최대 전송 단위)입니다. 이 인터페이스로 한 번에 내보낼 수 있는 패킷의 최대 크기를 바이트로 적은 값입니다. 이더넷 인터페이스에서는 흔히 1500 입니다.

이보다 큰 데이터는 여러 패킷으로 쪼개 보냅니다. 문제는 경로 중간의 장비가 받는 최대 크기가 내 인터페이스의 MTU 보다 작을 때 생깁니다.

중간 장비는 「쪼개지 말라」는 표시가 붙은 패킷을 쪼개지 못하고 버립니다. 그러면 보낸 쪽이 크기를 줄여 다시 보내야 합니다. 경로 위의 가장 작은 크기를 알아내 패킷을 그에 맞추는 절차를 경로 MTU 탐색이라 합니다. 이 절차가 어딘가에서 막히면 큰 패킷만 계속 사라지고 작은 패킷은 지나갑니다.

그래서 「연결은 맺어지고 작은 요청은 되는데 큰 응답만 멈춘다」는 증상이 나옵니다. 이 증상을 보면 양쪽 인터페이스의 MTU 부터 견줘 봅니다.

받은 양과 보낸 양

RX(Receive, 받기) 줄은 인터페이스가 켜진 뒤로 받은 패킷을 셉니다. TX(Transmit, 보내기) 줄은 보낸 패킷을 셉니다. packets 는 패킷 수입니다. bytes 는 그 패킷들의 바이트 합입니다.

errors 는 망가진 채 도착했거나 내보내다 실패한 패킷 수입니다. dropped 는 운영체제가 받아 놓고 처리하지 못해 버린 패킷 수입니다. 둘 다 평소에는 0 이거나 거의 늘지 않습니다.

errors 가 계속 늘면 선, 랜 카드, 장치를 움직이는 디바이스 드라이버 쪽을 의심합니다. dropped 가 계속 늘면 들어오는 양을 운영체제가 처리하는 속도가 못 따라가는지 봅니다. 어느 쪽이든 결과는 패킷 손실이라 응답이 늦어지고 재전송이 늘어납니다.

이 수들은 켜진 뒤로 센 누적 값입니다. 한 번 보고는 지금 늘고 있는지 모릅니다. 시간을 두고 두 번 찍어 차이를 봅니다.

설정을 바꾸는 명령

ifconfig 는 인자로 인터페이스 이름과 바꿀 값을 받습니다. 설정을 바꾸려면 관리자인 root 권한이 있어야 합니다. 그래서 명령 하나를 관리자 권한으로 실행해 주는 sudo 를 앞에 붙여 칩니다.

아래는 흔히 치는 설정 명령입니다. 줄마다 앞에 sudo 를 붙인다고 보면 됩니다.

ifconfig eth0 down       # 끈다
ifconfig eth0 up         # 켠다
ifconfig eth0 mtu 1400   # MTU 를 바꾼다
ifconfig -a              # 꺼진 것도 본다

주소를 바꾸는 줄은 길어서 따로 적습니다. 인터페이스 이름 뒤에 새 IPv4 주소를 적습니다. netmask 뒤에는 서브넷 마스크를 적습니다. 원래 붙어 있던 주소는 새 값으로 바뀝니다.

ifconfig eth0 10.0.0.6 netmask 255.255.255.0

이렇게 바꾼 설정은 운영체제가 켜져 있는 동안만 남습니다. 재부팅하면 배포판의 네트워크 설정 파일에 적힌 값으로 돌아갑니다. 오래 둘 설정은 그 설정 파일이나 배포판의 네트워크 관리 도구로 바꿉니다.

원격 서버에서는 끄는 명령을 조심합니다. SSH(Secure Shell, 보안 셸)로 붙어 있는 인터페이스를 끄면 그 연결도 함께 끊깁니다. 다시 켜 줄 방법이 없어서 서버 앞에 가거나 콘솔을 따로 열어야 합니다.

자주 만나는 에러

ifconfig 에서 자주 보는 에러는 셋입니다. 에러 문장만 보고는 까닭이 바로 안 떠오릅니다.

에러 까닭 할 일
ifconfig: command not found 이 명령이 든 도구 묶음이 안 깔렸다 묶음을 깔거나 ip 명령을 쓴다
SIOCSIFFLAGS: Operation not permitted root 권한 없이 설정을 바꾸려 했다 sudo 를 붙인다
eth0: error fetching interface information: Device not found 그 이름의 인터페이스가 없다 ifconfig -a 로 실제 이름을 본다

둘째 줄의 콜론 앞 낱말은 ifconfig 가 운영체제에 보낸 요청의 이름입니다. 무엇을 바꾸려 했는지에 따라 이 낱말이 달라집니다. 뒤의 Operation not permitted 가 「허락되지 않았다」는 본뜻입니다.

셋째 줄은 앞의 「네트워크 인터페이스」 소절에서 본 이름 차이로 자주 납니다. 옛 문서가 eth0 이라 적었어도 이 서버에서는 ens33 일 수 있습니다.

진단 순서

서버가 네트워크에 아예 안 닿을 때 ifconfig 로 볼 것은 셋입니다. 인터페이스가 있는지, 켜져 있고 신호가 잡히는지, 주소가 붙었는지입니다.

셋 다 멀쩡하면 문제는 인터페이스 밖에 있습니다. 그때는 목적지마다 어느 인터페이스로 내보낼지 적은 경로표를 봅니다. 드나드는 패킷을 걸러 내는 방화벽 규칙도 봅니다. 아래 그림이 이 순서입니다.

flowchart TD
    B{"ifconfig -a 에 인터페이스가 있나"}
    B -->|"없다"| X["장치나 드라이버를 본다"]
    B -->|"있다"| C{"UP 과 RUNNING 이 둘 다 있나"}
    C -->|"아니다"| Y["UP 이 없으면 켜고 · RUNNING 이 없으면 선을 본다"]
    C -->|"있다"| D{"inet 에 주소가 있나"}
    D -->|"없다"| Z["주소를 못 받았다 · 주소 설정을 본다"]
    D -->|"있다"| F["인터페이스는 멀쩡하다 · 경로표나 방화벽을 본다"]

주소가 없는 경우는 대개 자동으로 받아야 할 주소를 못 받은 것입니다. 네트워크 안에서 주소를 나눠 주는 서버와 그 규칙을 DHCP(Dynamic Host Configuration Protocol, 동적 호스트 설정 프로토콜)라 합니다. 그 서버에 닿지 못했거나 서버가 응답하지 않은 것입니다.

ip 명령과 나눠 맡는 일

리눅스에서 ifconfig 는 net-tools 라는 도구 묶음에 들어 있습니다. 같은 묶음에 netstat 도 들어 있습니다. 지금 리눅스에서는 iproute2 묶음의 ip 명령이 이 일을 이어받았습니다.

요즘 리눅스 배포판 가운데는 net-tools 를 기본으로 깔지 않는 것이 많습니다. 앞의 에러 표에서 본 command not found 가 그래서 납니다.

옮겨 가는 이유 하나가 주소 수입니다. 리눅스는 한 인터페이스에 IPv4 주소를 여럿 붙일 수 있습니다. 그런데 ifconfig 는 인터페이스 하나에 주소를 하나만 보여 줍니다.

둘째 주소부터 ifconfig 에 보이게 하려면 별칭을 씁니다. 별칭은 eth0:1 처럼 인터페이스 이름 뒤에 콜론과 번호를 단 이름입니다. 주소마다 별칭을 따로 만들어 붙이면 ifconfig 도 그 주소를 블록 하나로 따로 보여 줍니다.

그래서 ip 명령으로 별칭 없이 둘째 주소를 붙인 서버에서 ifconfig 만 보면 그 주소가 없는 줄 알게 됩니다. ip 명령은 한 인터페이스에 붙은 주소를 전부 찍습니다.

같은 일을 두 명령으로 치면 아래와 같습니다.

하려는 일 ifconfig ip
인터페이스와 주소 보기 ifconfig -a ip addr
켜기 · 끄기 ifconfig eth0 up ip link set eth0 up
주소 붙이기 ifconfig eth0 10.0.0.6 netmask 255.255.255.0 ip addr add 10.0.0.6/24 dev eth0
패킷 수 보기 ifconfig eth0 ip -s link show eth0
MTU 바꾸기 ifconfig eth0 mtu 1400 ip link set eth0 mtu 1400

주소 붙이기 줄은 동작이 다릅니다. ifconfig 는 원래 주소를 새 값으로 바꿉니다. ip addr add 는 원래 주소를 둔 채 하나를 더 붙입니다.

맥에서는 사정이 다릅니다. 맥에서는 ifconfig 가 지금도 주된 명령입니다. ip 명령은 기본으로 없습니다. 유선과 무선 인터페이스 이름은 en0 · en1 꼴입니다. 출력 모양도 리눅스와 조금 다릅니다.

관련 항목

ifconfig 가 보여 주고 바꾸는 인터페이스 설정

네트워크 인터페이스 · IP 주소 · IPv4 · IPv6 · MAC 주소 · 서브넷 · 서브넷 마스크 · 브로드캐스트 주소 · 링크 로컬 주소 · MTU · 루프백

ifconfig 출력의 수로 짚어 내는 네트워크 문제

패킷 손실 · 재전송 · 경로 MTU 탐색 · IP 단편화 · 링크 다운

ifconfig 아래에서 인터페이스를 움직이는 부품

커널 · 디바이스 드라이버 · 네트워크 인터페이스 카드 · 이더넷 · 와이파이

ifconfig 를 대신하거나 함께 쓰는 명령과 도구 묶음

ip addr · ip link · ip route · iproute2 · net-tools · netstat · ss · ethtool · ipconfig · ping · tcpdump

ifconfig 뒤에서 주소와 경로를 정하는 설정

DHCP · 고정 IP · 게이트웨이 · 기본 게이트웨이 · 경로표 · ARP · 방화벽

ifconfig 로 설정을 바꿀 때 거치는 권한과 접속

sudo · root · SSH · 콘솔

다른 이름: interface configuration · ifconfig 명령