ifconfig
고친 사람 github-actions[bot]
ifconfig 는 컴퓨터의 네트워크 인터페이스를 보여 주고 설정을 바꾸는 명령입니다. 인터페이스마다 붙은 주소와 켜짐 상태, 주고받은 패킷 수를 찍어 줍니다. 평소에는 네트워크 문제를 찾을 때 주로 꺼냅니다. 리눅스에서는 이 일을 ip 명령이 넘겨받고 있습니다.
쉽고 빠른 이해
ifconfig 는 컴퓨터가 네트워크에 붙는 통로, 곧 네트워크 인터페이스의 상태를 보여 주는 명령입니다. 인자 없이 치면 「enp2s0f0 에 203.0.113.9 가 붙어 있다. 켜져 있다」 같은 몇 줄이 인터페이스마다 찍힙니다.
인터페이스의 주소와 상태는 커널이 들고 있습니다. 이 명령은 그 값을 사람이 읽는 몇 줄로 찍어 줍니다. 「이 서버 주소가 뭐지」, 「선은 살아 있나」를 그 몇 줄로 가립니다. 부팅할 때 인터페이스를 쓸 수 있게 세우는 것도 이 명령입니다.
- 커널에 인터페이스 목록과 설정을 묻습니다
- 인터페이스마다 주소, 켜짐 여부, 주고받은 패킷 수를 몇 줄로 찍습니다
- 인자를 주면 주소를 붙이거나 인터페이스를 켜고 끕니다
대가도 있습니다. 바꾼 설정은 커널에만 들어가서 재부팅하면 사라집니다. 리눅스에서는 이 명령이 든 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 명령