사전 ifconfig
인터페이스

ifconfig

gabury1고친 사람 github-actions[bot]

ifconfig 는 컴퓨터의 네트워크 인터페이스를 보여 주고 설정을 바꾸는 명령입니다. 인터페이스마다 붙은 주소와 켜짐 상태, 주고받은 패킷 수를 찍어 줍니다. 평소에는 네트워크 문제를 찾을 때 주로 꺼냅니다. 리눅스에서는 이 일을 ip 명령이 넘겨받고 있습니다.

쉽고 빠른 이해

ifconfig 는 컴퓨터가 네트워크에 붙는 통로, 곧 네트워크 인터페이스의 상태를 보여 주는 명령입니다. 인자 없이 치면 「enp2s0f0 에 203.0.113.9 가 붙어 있다. 켜져 있다」 같은 몇 줄이 인터페이스마다 찍힙니다.

인터페이스의 주소와 상태는 커널이 들고 있습니다. 이 명령은 그 값을 사람이 읽는 몇 줄로 찍어 줍니다. 「이 서버 주소가 뭐지」, 「선은 살아 있나」를 그 몇 줄로 가립니다. 부팅할 때 인터페이스를 쓸 수 있게 세우는 것도 이 명령입니다.

  1. 커널에 인터페이스 목록과 설정을 묻습니다
  2. 인터페이스마다 주소, 켜짐 여부, 주고받은 패킷 수를 몇 줄로 찍습니다
  3. 인자를 주면 주소를 붙이거나 인터페이스를 켜고 끕니다

대가도 있습니다. 바꾼 설정은 커널에만 들어가서 재부팅하면 사라집니다. 리눅스에서는 이 명령이 든 net-tools 패키지가 ip 명령에 밀려 낡은 도구로 분류됩니다. 새로 설치한 서버에는 아예 없을 수 있습니다.

상세

ifconfig 는 커널이 들고 있는 네트워크 인터페이스를 설정하는 명령입니다. 부팅할 때 인터페이스를 필요한 만큼 세우는 데 쓰입니다. 인터페이스를 세운다는 것은 주소와 마스크를 붙이고 켜서 통신에 쓸 수 있게 만드는 일입니다. 그 뒤로는 대개 문제를 찾거나 시스템을 조정할 때만 필요합니다.

네트워크 인터페이스는 커널이 네트워크 장치 하나를 다루는 단위입니다. 커널은 인터페이스를 이름이나 번호로 가리킵니다. 리눅스의 첫 이더넷 인터페이스 이름 eth0 이 그 예입니다.

eth0 은 드라이버 이름 뒤에 장치 번호를 붙인 이름입니다. 이 번호는 드라이버가 장치를 찾은 순서대로 매겨집니다. 장치가 여럿이면 어느 부팅의 eth0 이 다음 부팅에서 eth1 이 될 수 있습니다.

그래서 systemd 는 이더넷 · 무선 랜 인터페이스에 바뀌지 않는 이름을 붙입니다. 펌웨어 정보나 장치가 꽂힌 위치를 따서 짓는 이름입니다. enp5s0 같은 이름입니다. systemd 가 이름을 붙이는 리눅스에서는 eth0 대신 이 꼴의 이름이 ifconfig 출력에 나옵니다.

인터페이스에는 주소가 붙습니다. 망 너머에서 이 컴퓨터를 찾는 IP(Internet Protocol) 주소와, 랜 카드에 붙은 하드웨어 주소입니다. 이더넷의 하드웨어 주소를 MAC(Media Access Control) 주소라 부릅니다.

ifconfig 는 ioctl(input/output control) 시스템 콜로 커널에 이 주소와 상태를 묻습니다. 설정을 바꿀 때도 같은 시스템 콜을 씁니다. 인터페이스 목록과 패킷 통계는 커널이 /proc/net/dev 파일로도 내놓습니다.

리눅스에서 ifconfig 는 net-tools 라는 패키지에 들어 있습니다. 같은 패키지에 netstat · route · arp 명령도 들어 있습니다. FreeBSD 와 macOS 에도 같은 이름의 명령이 있습니다. 옵션과 출력이 조금씩 다릅니다.

형태

ifconfig 는 아래 두 줄의 꼴로 부릅니다. 첫 줄은 상태를 보는 호출입니다. 둘째 줄은 인터페이스 하나를 설정하는 호출입니다.

ifconfig [-v] [-a] [-s] [interface]
ifconfig [-v] interface [aftype] options | address ...

어느 인터페이스를 얼마나 찍을지는 인자가 정합니다.

부르는 법 하는 일
ifconfig 지금 켜져 있는 인터페이스의 상태를 찍습니다
ifconfig 이름 그 인터페이스 하나의 상태만 찍습니다
ifconfig -a 내려간 것까지 쓸 수 있는 모든 인터페이스를 찍습니다
ifconfig -s 한 줄짜리 표로 줄여 찍습니다. netstat -i 와 같은 출력입니다
-v 몇몇 오류에서 더 자세히 알립니다
ifconfig 이름 설정… 그 인터페이스를 설정합니다. 아래 「설정 인자」 소절에 있습니다

인터페이스 이름 뒤에는 주소족(address family) 이름을 줄 수 있습니다. 주소족은 뒤따르는 주소를 어느 프로토콜의 주소로 읽고 찍을지 정합니다. 기본은 inet 입니다. IPv6(Internet Protocol version 6) 주소를 다루려면 inet6 을 줍니다.

출력 블록

인자 없이 치면 인터페이스마다 몇 줄짜리 블록이 하나씩 찍힙니다. 블록 안의 줄은 늘 같은 순서로 놓입니다.

flowchart TD
    A["첫 줄 · 인터페이스 이름 · flags · mtu"] --> B["주소 줄 · inet 은 한 줄 · inet6 는 주소마다 한 줄"]
    B --> C["하드웨어 주소 줄 · ether · txqueuelen"]
    C --> D["RX(receive, 받기) 줄 · 받은 패킷과 바이트 · 압축 패킷 수(있을 때만) · 받기 오류"]
    D --> E["TX(transmit, 보내기) 줄 · 보낸 패킷과 바이트 · 압축 패킷 수(있을 때만) · 보내기 오류"]
    E --> F["장치 줄 · interrupt 같은 드라이버 정보 · 있을 때만"]

IPv4(Internet Protocol version 4) 주소는 한 줄로 찍힙니다. IPv6 주소는 주소마다 한 줄씩 붙습니다. 그래서 IPv4 주소가 하나이고 IPv6 주소가 둘이면 주소 줄이 셋입니다.

IPv4 주소는 두 부분으로 갈립니다. 어느 망인지를 가리키는 앞부분과 그 망 안의 컴퓨터를 가리키는 뒷부분입니다. 한 망을 다시 잘게 쪼개 쓰면 그 사이에 서브넷 부분이 들어갑니다. 각 줄이 담는 칸은 이렇습니다.

칸 뜻
flags= 인터페이스의 상태 표시입니다. 꺾쇠 안의 낱말이 지금 켜진 표시입니다. 등호 뒤 숫자는 그 표시들을 비트로 합친 값입니다
mtu MTU(Maximum Transfer Unit, 최대 전송 단위)입니다. 이 인터페이스로 한 번에 보낼 수 있는 크기를 바이트로 적습니다
inet IPv4 주소입니다
netmask 서브넷 마스크입니다. 32비트 주소에서 망과 서브넷을 가리키는 비트에 1, 호스트를 가리키는 비트에 0 을 둔 값입니다
broadcast 브로드캐스트 주소입니다. 호스트 부분의 비트를 모두 1 로 채운 주소입니다. 그 서브넷 전체에 보낼 때 씁니다
inet6 · prefixlen IPv6 주소와 그 접두사 길이입니다. 접두사 길이는 주소 앞쪽 몇 비트가 망을 가리키는지를 적은 수입니다
scopeid IPv6 주소가 통하는 범위입니다. 링크는 라우터를 거치지 않고 바로 닿는 한 구간의 망입니다. link 는 한 링크 안에서만 쓰는 링크 로컬 주소, global 은 인터넷 어디서나 쓰는 전역 주소, host 는 자기 컴퓨터 안에서만 도는 루프백 주소입니다
ether 이더넷 하드웨어 주소, 곧 MAC 주소입니다
txqueuelen 장치의 송신 큐 길이입니다

IPv4 주소와 마스크는 점으로 가른 숫자 넷으로 적습니다. 숫자 하나가 8비트입니다. 255 는 여덟 비트가 모두 1 인 값입니다. 그래서 netmask 255.255.255.0 은 앞의 24비트가 1 이고 뒤의 8비트가 0 인 마스크입니다.

packet-beta
0-23: "망 부분 · 1 이 24개 · 255.255.255"
24-31: "호스트 부분 · 0 이 8개 · 0"

CIDR(Classless Inter-Domain Routing) 표기로는 같은 마스크를 /24 로 적습니다. 1 인 비트의 수를 빗금 뒤에 쓴 표기입니다. IPv6 의 prefixlen 64 도 같은 셈을 128비트 주소에 쓴 것입니다. 앞 64비트가 접두사라는 뜻입니다. 같은 것을 /64 로도 적습니다.

CIDR 앞에는 옛 클래스 A · B · C 체계를 썼습니다. 클래스마다 망 부분의 길이가 미리 정해져 있어서 주소만 보고 마스크를 끌어낼 수 있었습니다. 클래스 B 였던 172.16.0.0 의 마스크는 255.255.0.0 입니다. 클래스 C 였던 192.168.99.0 의 마스크는 255.255.255.0 입니다.

링크 로컬 주소는 fe80 으로 시작하는 IPv6 주소입니다. 라우터는 이 주소를 단 패킷을 다른 링크로 넘기지 않습니다. 그래서 같은 링크 안의 장비끼리만 이 주소로 주고받습니다.

flags 의 표시

꺾쇠 안에 나올 수 있는 표시 가운데 진단에서 자주 보는 것들입니다. -s 의 짧은 표에서는 각 표시를 글자 하나로 줄여 Flg 칸에 찍습니다.

표시 -s 글자 뜻
UP U 관리자가 켜 둔 인터페이스
RUNNING R 동작 중이고 자원이 할당된 인터페이스
BROADCAST B 브로드캐스트 통신을 지원
MULTICAST M 멀티캐스트 통신을 지원
LOOPBACK L 루프백 장치입니다. 127 로 시작하는 주소가 붙습니다. 그 주소는 컴퓨터 밖으로 나가지 않습니다
PROMISC P 무차별 모드입니다. 자기 앞으로 온 것이 아닌 패킷까지 모두 잡습니다. 이 표시가 무차별 모드를 믿을 만하게 보여 주지 않을 수 있습니다
POINTOPOINT p 점대점 링크입니다. 브로드캐스트 대신 맞은편 장비 하나가 있습니다

UP 과 RUNNING

리눅스는 인터페이스의 상태를 둘로 가릅니다. 관리 상태와 운영 상태입니다. UP 은 관리 상태를 보입니다. 관리자가 이 인터페이스로 데이터를 주고받겠다고 켜 두었다는 표시입니다.

켰다고 바로 쓸 수 있는 것은 아닙니다. 이더넷은 스위치에 꽂혀 있어야 합니다. 망의 정책에 따라 인증을 먼저 거쳐야 할 수도 있습니다. 운영 상태는 인터페이스가 이 조건을 넘어 사용자 데이터를 나를 수 있는지를 보입니다.

RUNNING 이 운영 상태를 보이는 표시입니다. 그래서 UP 인데 RUNNING 이 없으면 켜 놓기는 했지만 아직 데이터를 나를 수 없는 인터페이스입니다. 랜 선이 스위치에 안 꽂힌 경우가 그렇습니다.

stateDiagram-v2
    꺼짐: 꺼짐 · flags 에 UP 이 없다
    관리상태만: UP · 관리자가 켜 두었다
    운영상태까지: UP 과 RUNNING · 데이터를 나를 수 있다
    꺼짐 --> 관리상태만: 관리자가 켠다
    관리상태만 --> 운영상태까지: 스위치에 꽂히고 인증을 통과한다

RX 줄과 TX 줄

RX(receive, 받기) 줄은 받은 패킷을 셉니다. TX(transmit, 보내기) 줄은 보낸 패킷을 셉니다. 수는 인터페이스 통계를 마지막으로 초기화한 뒤로 쌓인 값입니다.

표에 나오는 말 넷을 먼저 풉니다. 프레임은 패킷을 랜 선으로 실어 보내는 단위입니다. 어디서 시작하고 끝나는지 표시가 붙어 있습니다. 그 표시가 어긋난 채 받은 것을 프레임 정렬 오류로 셉니다.

반송파는 선이 이어져 있을 때 잡히는 신호입니다. 랜 선이 안 꽂혀 있으면 이 신호가 없습니다. 충돌은 한 선을 함께 쓰는 장비 둘이 같은 때에 보내 신호가 겹치는 것입니다. 프로토콜 스택은 받은 패킷을 IP · TCP(Transmission Control Protocol) 순서로 풀어 올리는 커널의 네트워크 처리 계층입니다.

칸 세는 것
packets · bytes 패킷 수와 그 바이트 합. 괄호 안은 읽기 쉽게 단위를 붙인 값입니다. 1 KiB 는 2의 10제곱 바이트입니다. 소수 첫째 자리 아래는 버립니다
compressed 압축된 패킷 수입니다. 이 줄은 셀 것이 있을 때만 찍힙니다
RX errors 망가진 채 받은 패킷의 합. CRC(Cyclic Redundancy Check) 검사가 틀린 패킷, 프레임 정렬이 어긋난 패킷을 포함합니다
RX dropped 받았지만 프로토콜 스택에 닿기 전에 버린 패킷. 드라이버의 버퍼 부족, 혼잡, 자원 한계가 흔한 원인입니다
RX overruns NIC(Network Interface Card, 랜 카드)나 드라이버의 FIFO(First In First Out) 버퍼가 넘쳐 버린 패킷. 흔한 원인은 하드웨어가 프레임을 시스템에 제때 못 넘긴 것입니다
RX frame 프레임 정렬 오류
TX errors 보내다 생긴 문제의 합. 충돌, 반송파 잃음 같은 실패를 포함합니다
TX dropped 보내기 전에 드라이버가 버린 패킷. 혼잡이나 버퍼 부족이 그런 원인의 예입니다
TX overruns 송신 쪽 FIFO 문제로 잃은 패킷
carrier 보내는 도중 반송파 신호를 잃어 생긴 오류
collisions 보내는 동안 일어난 충돌 횟수

설정 인자

둘째 줄 꼴로 부르면 인터페이스 이름 뒤의 인자가 설정을 바꿉니다. 자주 쓰는 인자는 이렇습니다.

인자 하는 일
up 인터페이스를 켭니다. 주소를 붙이면 따로 안 줘도 켜집니다
down 그 인터페이스를 끕니다. 그 인터페이스를 맡은 드라이버가 내려갑니다. 시스템은 이 인터페이스로 아무것도 보내지 않습니다
주소 인터페이스에 붙일 IPv4 주소입니다
netmask 주소 서브넷 마스크를 정합니다. 안 주면 주소에서 끌어낸 옛 클래스 마스크가 들어갑니다
broadcast 주소 브로드캐스트 주소를 정합니다
mtu N MTU 를 N 바이트로 정합니다
hw 종류 주소 하드웨어 주소를 바꿉니다. 드라이버가 지원할 때만 됩니다. 이더넷이면 종류에 ether 를 줍니다
add 주소/접두사길이 · del 주소/접두사길이 주소를 하나 더하거나 뺍니다
txqueuelen 길이 송신 큐 길이를 정합니다. 모뎀처럼 느리고 지연이 큰 장치에서는 작게 잡는 것이 쓸모 있습니다. 큰 전송이 telnet 같은 대화형 트래픽을 덜 방해하게 됩니다
name 새이름 인터페이스 이름을 바꿉니다. 먼저 내려 둬야 합니다

인터페이스 이름에 콜론과 번호를 붙이면 별칭 인터페이스가 됩니다. eth0:0 은 eth0 의 첫 별칭입니다. 별칭이 아닌 eth0 자신의 주소를 주 주소(primary)라 부릅니다.

커널이 별칭을 지원하면 별칭마다 주소를 붙여 한 장치에 주소를 더 둡니다. 별칭을 지우려면 ifconfig eth0:0 down 을 칩니다.

실패

ifconfig 가 원하는 결과를 못 내는 경우는 둘로 나뉩니다. 오류 문구를 찍고 멈추는 경우가 하나입니다. 명령은 끝났는데 기대와 다른 상태가 남는 경우가 다른 하나입니다.

오류 문구

설정이 실패하면 ifconfig 는 실패한 ioctl 의 이름을 앞에 붙여 찍습니다. 켜기 · 끄기는 SIOCSIFFLAGS, 주소는 SIOCSIFADDR, 마스크는 SIOCSIFNETMASK, MTU 는 SIOCSIFMTU 입니다. 콜론 뒤는 커널이 돌려준 에러 값의 설명입니다.

조건 찍히는 문구 커널이 돌려준 값
없는 이름의 인터페이스를 줌 <이름>: error fetching interface information: Device not found ENODEV. 다른 에러면 Device not found 대신 그 에러의 설명이 붙습니다
권한 없이 인터페이스를 켜거나 끔 SIOCSIFFLAGS: Operation not permitted EPERM. 다른 설정이면 그 설정의 ioctl 이름이 앞에 붙습니다
설정하려고 상태 표시를 읽다가 실패 <이름>: ERROR while getting interface flags: <설명> 그때의 에러
이더넷 드라이버의 인터럽트 문제 SIOCSIIFLAGS: Resource temporarily unavailable EAGAIN. 인터럽트 충돌일 가능성이 가장 큽니다. 이 문구의 철자는 위 SIOCSIFFLAGS 와 글자가 다릅니다

권한. 인터페이스 설정을 바꾸는 ioctl 은 특권 작업입니다. 실효 사용자 ID(effective user ID)가 0 인 root 이거나 CAP_NET_ADMIN 케이퍼빌리티가 있어야 합니다. 둘 다 아니면 커널이 EPERM 을 돌려줍니다. 상태 표시를 읽는 것은 아무 프로세스나 할 수 있습니다.

CAP_NET_ADMIN 은 리눅스가 root 권한을 잘게 나눈 케이퍼빌리티(capability) 가운데 하나입니다. 인터페이스 설정, 방화벽 관리, 라우팅 테이블 수정 같은 네트워크 작업을 허락합니다. 일반 사용자 계정이면 sudo 를 앞에 붙여 root 권한으로 칩니다.

없는 인터페이스. 옛 글의 eth0 을 손대지 않고 따라 치면 이 오류가 날 수 있습니다. systemd 가 이름을 붙이는 리눅스에는 eth0 대신 enp5s0 같은 이름이 있기 때문입니다. ifconfig -a 를 치면 이 서버의 인터페이스 이름이 전부 나옵니다.

명령을 못 찾음. 셸이 ifconfig 를 못 찾는다고 하면 net-tools 패키지가 안 깔렸을 수 있습니다. 데비안 9 부터 net-tools 는 새로 설치할 때 기본으로 들어가지 않습니다. apt install net-tools 로 깝니다.

패키지가 깔려 있어도 못 찾을 수 있습니다. 데비안에서는 이런 저수준 네트워크 도구 일부가 /usr/sbin/ 에 있습니다. 일반 사용자는 /usr/sbin/ifconfig 처럼 전체 경로로 치거나 $PATH 에 /usr/sbin 을 더해야 할 수 있습니다.

끝났는데 기대와 다른 상태

인자 없이 쳤는데 인터페이스가 안 보입니다. 리눅스의 ifconfig 는 인자가 없으면 지금 켜진 인터페이스만 찍습니다. 내려간 인터페이스까지 보려면 -a 를 줍니다.

마스크를 안 줬더니 망이 넓어졌습니다. netmask 를 안 주면 주소에서 끌어낸 옛 클래스 마스크가 들어갑니다. 클래스 B 였던 172.16.0.0 의 마스크는 255.255.0.0 입니다. 그래서 172.16. 으로 시작하는 주소에 마스크를 빠뜨리면 /16 망이 됩니다.

0 으로 시작하는 숫자가 8진수로 읽힙니다. 점으로 가른 IPv4 숫자는 C 언어의 숫자 규칙을 따릅니다. 0x 로 시작하면 16진수, 0 으로 시작하면 8진수, 나머지는 10진수입니다. 그래서 010 은 10 이 아니라 8 입니다. 16진수와 8진수 표기는 RFC(Request for Comments, 인터넷 표준 문서)에 맞지 않아 쓰지 말기를 권합니다.

주 주소를 지우면 같은 망의 별칭이 다 지워집니다. 주소와 마스크로 따져 같은 망에 드는 별칭들은 주 주소를 지울 때 함께 지워집니다. eth0:0 하나만 내리는 것과 다릅니다.

내린 인터페이스로는 아무것도 나가지 않습니다. down 을 받은 인터페이스로는 시스템이 메시지를 보내지 않습니다. 그 인터페이스를 거쳐 SSH(Secure Shell)로 붙어 있던 접속이라면 그 접속으로 보낼 응답도 이 인터페이스로는 나가지 않습니다.

MTU 를 너무 작게 잡으면 커널이 죽을 수 있습니다. MTU 를 바꾸는 것도 특권 작업입니다. 리눅스에서 MTU 를 너무 작은 값으로 잡으면 커널이 죽을 수 있습니다. FreeBSD 에는 MTU 를 못 바꾸는 인터페이스가 있습니다. 받는 값의 범위가 정해진 인터페이스도 있습니다.

재부팅하면 설정이 사라집니다. ifconfig 가 바꾸는 것은 커널 안의 인터페이스입니다. 부팅 때 인터페이스를 다시 세우는 것은 운영체제의 설정 파일입니다. 데비안의 /etc/network/interfaces, FreeBSD 의 /etc/rc.conf 가 그 파일입니다.

flowchart TD
    C["명령줄에서 친 ifconfig"] --> K["커널 안의 인터페이스"]
    K -->|재부팅| X["바꾼 설정이 사라진다"]
    F["설정 파일 · /etc/network/interfaces · /etc/rc.conf"] --> B["부팅"]
    B --> K

FreeBSD 에서 명령줄로 친 ifconfig 설정은 /etc/rc.conf 에도 적어야 재부팅 뒤에 남습니다. 리눅스에서 ifconfig 를 대신하는 ip 명령도 명령줄에서 준 설정은 시스템을 재시작하면 남지 않습니다. 오래 둘 설정은 설정 파일에 적습니다.

예시

리눅스에서 인터페이스 하나 보기

리눅스에서 유선 인터페이스 enp2s0f0 하나를 본 출력입니다.

> ifconfig enp2s0f0
enp2s0f0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 203.0.113.9  netmask 255.255.255.0  broadcast 203.0.113.255
        inet6 fe80::a8bb:ccff:fedd:eeff  prefixlen 64  scopeid 0x20<link>
        inet6 2001:db8::a8bb:ccff:fedd:eeff  prefixlen 64  scopeid 0x0<global>
        ether aa:bb:cc:dd:ee:ff  txqueuelen 1000  (Ethernet)
        RX packets 18668507  bytes 9459465501 (8.8 GiB)
        RX compressed 0
        RX errors 0  dropped 1318  overruns 0  frame 0
        TX packets 26038199  bytes 16983080620 (15.8 GiB)
        TX compressed 0
        TX errors 0  dropped 0  overruns 0  carrier 0  collisions 0
        device interrupt 30

첫 줄에 UP 과 RUNNING 이 둘 다 있습니다. 관리자가 켜 두었고 데이터를 나를 수 있는 상태입니다. 한 번에 보낼 수 있는 크기는 1500 바이트입니다.

IPv4 주소는 203.0.113.9 하나입니다. 마스크 255.255.255.0 은 /24 라서 마지막 8비트가 호스트 부분입니다. 그 8비트를 모두 1 로 채운 203.0.113.255 가 브로드캐스트 주소로 찍혔습니다.

IPv6 주소는 둘입니다. fe80 으로 시작하는 쪽은 scopeid 가 link 인 링크 로컬 주소입니다. 2001:db8 로 시작하는 쪽은 global 인 전역 주소입니다.

받기 쪽 dropped 가 1318 입니다. 받은 패킷 가운데 1318 개를 프로토콜 스택에 닿기 전에 버렸다는 뜻입니다. errors 와 overruns 는 0 이라 망가진 패킷이나 하드웨어 버퍼 넘침은 없었습니다. 받은 바이트는 9459465501 입니다. 읽기 쉬운 값으로는 8.8 GiB 입니다.

같은 인터페이스를 짧은 표로

-s 를 주면 같은 인터페이스가 한 줄로 줄어듭니다.

> ifconfig -s enp2s0f0
Iface     MTU    RX-OK RX-ERR RX-DRP RX-OVR  TX-OK TX-ERR TX-DRP TX-OVR Flg
enp2s0f0 1500 18668761      0   1318 0    26038367      0      0      0 BMRU

RX-DRP 칸의 1318 이 위 블록의 받기 쪽 dropped 와 같은 수입니다. RX-OK 는 잘 받은 패킷 수입니다. 이 값 18668761 은 위 블록의 RX packets 18668507 보다 조금 큽니다. 두 출력을 찍은 때가 달라 그 사이에 더 받은 만큼 늘었습니다. Flg 칸의 BMRU 는 BROADCAST · MULTICAST · RUNNING · UP 의 첫 글자입니다.

FreeBSD 에서 인자 없이 보기

FreeBSD 에서 인자 없이 ifconfig 를 친 출력입니다. 유선 인터페이스 em0 과 루프백 인터페이스 lo0 이 찍혔습니다.

% ifconfig
em0: flags=8863<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP>
        ether 00:1f:16:0f:27:5a
        inet6 fe80::21f:16ff:fe0f:275a%em0 prefixlen 64 scopeid 0x1
        inet 192.168.1.19 netmask 0xffffff00 broadcast 192.168.1.255
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>

em0 에는 UP 이 있습니다. 관리자가 켜 두었다는 뜻입니다. IPv4 주소는 192.168.1.19 입니다. 마스크 0xffffff00 은 255.255.255.0 과 같은 값을 16진수로 적은 것입니다. status: active 는 반송파 신호가 잡힌다는 뜻입니다. 루프백 lo0 에는 127.0.0.1 이 붙어 있습니다.

같은 em0 이 아직 설정되지 않았으면 아래처럼 찍힙니다.

em0: flags=8822<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=481249b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,LRO,WOL_MAGIC,VLAN_HWFILTER,NOMAP>
        ether 00:1f:16:0f:27:5a
        media: Ethernet autoselect
        status: no carrier
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

UP 과 RUNNING 이 둘 다 빠졌습니다. inet 줄도 없습니다. status: no carrier 는 랜 선이 안 꽂혀 있으면 정상으로 나오는 값입니다.

주소를 붙이고 별칭을 더하기

FreeBSD 에서 em0 에 주소를 붙이고 둘째 주소를 더했다가 빼는 세 줄입니다.

# ifconfig em0 inet 192.0.2.10 netmask 255.255.255.0
# ifconfig em0 inet 192.0.2.45/28 alias
# ifconfig em0 inet 192.0.2.45 -alias

첫 줄은 192.0.2.10 을 마스크 255.255.255.0 과 함께 붙입니다. 둘째 줄은 192.0.2.45 를 /28 망으로 하나 더 붙입니다. 셋째 줄은 그 둘째 주소를 뺍니다. macOS 에서는 둘째 줄의 alias 대신 같은 뜻의 add 를 써도 됩니다(ifconfig en0 inet 192.0.2.45/28 add).

이렇게 명령줄에서 붙인 주소는 FreeBSD 에서 재부팅하면 남지 않습니다. 남기려면 /etc/rc.conf 에도 적어야 합니다. 아래 첫 줄은 em0 에 192.168.1.150/24 를 붙입니다. 둘째 줄은 같은 설정을 sysrc 로 /etc/rc.conf 에 적습니다.

# ifconfig em0 inet 192.168.1.150/24
# sysrc ifconfig_em0="inet 192.168.1.150 netmask 255.255.255.0"

이견

ifconfig 라는 이름의 명령은 하나가 아닙니다. 리눅스 net-tools 의 ifconfig(8) 매뉴얼, FreeBSD 의 ifconfig(8) 매뉴얼, macOS 의 ifconfig 매뉴얼(애플 network_cmds 의 ifconfig.8)이 같은 이름의 명령을 각자 정의합니다.

BSD(Berkeley Software Distribution) 쪽 두 매뉴얼은 이 명령이 4.2BSD 에서 처음 나왔다고 적습니다. macOS 매뉴얼의 원본 파일 머리 주석에는 FreeBSD 의 2008년 판 표시가 남아 있습니다. 세 매뉴얼은 아래 항목에서 갈립니다.

견줄 것 리눅스 net-tools FreeBSD macOS
인자 없이 부르면 켜진 인터페이스만 -a 를 준 것과 같음 -a 를 준 것과 같음
-a 내려간 것까지 쓸 수 있는 모든 인터페이스 시스템의 모든 인터페이스 모든 인터페이스. -d 는 내려간 것만, -u 는 켜진 것만
짧게 보기 -s · 한 줄짜리 통계 표 -l · 이름만 나열 -l · 이름만 나열
주소를 더 붙이기 별칭 인터페이스 eth0:0 · add alias · 빼기는 -alias alias 또는 같은 뜻의 add · 빼기는 -alias
출력의 마스크 netmask 255.255.255.0 netmask 0xffffff00 기본이 16진수. -f inet:cidr 로 /24 꼴, dotted 로 점 표기
마스크 입력 netmask 뒤 점 표기 0x 16진수 · 점 표기 · 주소 뒤 /길이 FreeBSD 와 같음
인터페이스 이름 eth0 · enp2s0f0 em0 · 드라이버 이름 + 찾은 순서 번호 en0
블록에 더 있는 줄 RX · TX 패킷 통계 metric · media: · status: 출력 예가 매뉴얼에 없음

맥에서 친 출력이 리눅스를 다룬 글과 안 맞는 것은 이 갈림 때문입니다. 리눅스 글의 netmask 255.255.255.0 이 맥과 FreeBSD 에서는 netmask 0xffffff00 으로 찍힙니다. 두 값은 같은 마스크입니다.

설정 권한의 선도 갈립니다. FreeBSD 와 macOS 매뉴얼은 슈퍼유저만 인터페이스 설정을 바꿀 수 있다고 적습니다. 리눅스는 root 가 아니어도 CAP_NET_ADMIN 케이퍼빌리티가 있으면 됩니다.

대가

이 절은 리눅스의 사정입니다. 리눅스에서 ifconfig 를 고르면 iproute2 패키지의 ip 명령에 견줘 내주는 것이 셋 있습니다. FreeBSD 에서는 ifconfig 가 부팅 때 인터페이스마다 주소를 정하는 바로 그 명령입니다.

한 인터페이스에 붙는 주소 여럿

ifconfig 는 별칭 인터페이스를 만들어 한 장치에 IPv4 주소를 더 둡니다. 별칭은 통계를 따로 갖지 않습니다. 커널 2.2 부터는 같은 장치의 모든 별칭이 주 주소의 통계를 함께 씁니다.

주소마다 통계가 필요하면 iptables 로 그 주소를 세는 규칙을 따로 더해야 합니다. iptables 는 리눅스에서 패킷을 걸러내고 세는 규칙을 다루는 명령입니다.

ip 는 별칭 없이 한 장치에 주소를 여럿 붙입니다. 붙은 주소끼리 위아래를 두지 않아서 「별칭」이라는 말을 쓰지 않습니다. 주소마다 15자까지의 이름표(label)를 달 수 있습니다.

flowchart TD
    subgraph IF["ifconfig 의 방식"]
        E0["eth0 · 주 주소 · 통계를 가짐"]
        E1["eth0:0 · 별칭 · 둘째 주소 · 통계는 주 주소 것을 함께 쓴다"]
        E0 --- E1
    end
    subgraph IP["ip 의 방식"]
        D["enp1s0 · 장치 하나"]
        D --> A1["192.168.2.223/24"]
        D --> A2["192.168.4.223/24"]
    end
    IF ~~~ IP

아래는 레드햇 엔터프라이즈 리눅스 7 에서 ip 로 한 장치에 주소 둘을 붙이고 본 모습입니다.

~]# ip address add 192.168.2.223/24 dev enp1s0
~]# ip address add 192.168.4.223/24 dev enp1s0
~]# ip addr
3: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 52:54:00:fb:77:9e brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.223/24 scope global enp1s0
    inet 192.168.4.223/24 scope global enp1s0

enp1s0 한 장치 아래에 inet 줄이 둘 붙었습니다. 별칭 인터페이스 이름은 나오지 않습니다.

8바이트까지만 읽는 하드웨어 주소

ifconfig 는 ioctl 로 주소 정보를 가져옵니다. 이 방식은 하드웨어 주소를 8바이트로 제한합니다. 인피니밴드는 이더넷이 아닌 다른 종류의 네트워크 하드웨어입니다. 그 하드웨어 주소는 20바이트라 앞 8바이트만 바르게 찍힙니다.

packet-beta
0-63: "앞 8바이트 · ifconfig 가 바르게 찍는 부분"
64-159: "뒤 12바이트 · 바르게 안 찍히는 부분"

이런 하드웨어 주소를 보려면 ip link 를 써야 합니다.

레드햇 엔터프라이즈 리눅스 7 이 ip 로 ifconfig 를 대신하게 한 이유도 이것입니다. net-tools 가 인피니밴드 주소를 지원하지 않습니다.

기본 설치에서 빠진 패키지

데비안 9 는 net-tools 를 iproute2 로 대체하기로 하고 폐기 예고를 냈습니다. 우선순위를 important 에서 optional 로 내려 새 설치에서 뺐습니다. 데비안은 net-tools 를 낡은(obsolete) 도구로 분류합니다.

그래서 새로 설치한 데비안에서는 ifconfig 에 기대는 스크립트가 net-tools 를 따로 깔아야 돌아갑니다. 의존성 때문에만 깔린 net-tools 는 업그레이드할 때 지워질 수도 있습니다. 계속 쓰려면 업그레이드 전에 apt-mark manual net-tools 로 직접 깐 패키지라고 표시해 둡니다.

명령줄에서 준 설정이 재시작 뒤 남지 않는 것은 ip 도 마찬가지입니다. 이 점은 ifconfig 만의 대가가 아닙니다.

두 명령의 대응

같은 일을 두 명령으로 하면 이렇게 갈립니다.

하려는 일 ifconfig ip
주소 보기 ifconfig -a ip addr (줄여서 ip a)
켜기 · 끄기 ifconfig 이름 up · ifconfig 이름 down ip link set 이름 up · ip link set 이름 down
MTU 바꾸기 ifconfig 이름 mtu N ip link set 이름 mtu N
하드웨어 주소 바꾸기 ifconfig 이름 hw ether 주소 ip link set 이름 address 주소
패킷 통계 보기 ifconfig -s ip -s link
주소 하나 더 붙이기 별칭 ifconfig 이름:0 주소 ip address add 주소/길이 dev 이름

관련 항목

ifconfig 가 찍고 바꾸는 인터페이스 설정값

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

ifconfig 의 flags 가 보이는 인터페이스 모드

브로드캐스트 · 멀티캐스트 · 무차별 모드 · 점대점 링크 · 관리 상태와 운영 상태 · 본딩

ifconfig 의 RX·TX 카운터가 세는 오류

패킷 손실 · CRC · FIFO · 프레임 · 반송파 · 충돌 도메인 · 프로토콜 스택

ifconfig 가 인터페이스를 묻고 바꾸는 커널 통로

커널 · 시스템 콜 · ioctl · netlink · procfs · 디바이스 드라이버 · 네트워크 인터페이스 카드 · 이더넷 · 인피니밴드

ifconfig 가 실패할 때 돌려받는 에러 값과 권한

EPERM · ENODEV · EAGAIN · errno · CAP_NET_ADMIN · 리눅스 케이퍼빌리티 · root · sudo

ifconfig 와 한 패키지에 든 net-tools 명령

net-tools · netstat · route (명령) · arp (명령) · nameif

net-tools 명령을 대신하는 iproute2 명령

iproute2 · ip addr · ip link · ip route · ip neigh · ss

ifconfig 밖에서 인터페이스를 다루는 리눅스 도구

ethtool · ifrename · iptables

ifconfig 설정을 부팅 때 다시 세우는 도구

systemd · udev · 예측 가능한 인터페이스 이름 · NetworkManager · ifup · ifdown · sysrc

ifconfig 가 실리는 운영체제와 윈도의 대응 명령

리눅스 · 데비안 · 레드햇 엔터프라이즈 리눅스 · FreeBSD · macOS · 4.2BSD · 유닉스 · 윈도 · ipconfig

ifconfig 로 원격 서버를 만질 때 거치는 접속

SSH · 콘솔 · 원격 접속

다른 이름: interface configuration · ifconfig 명령