vi editor 명령어는 Unix / Linux 시스템 관리자가 반드시 숙지해야 하는 기본 텍스트 편집기 조작법입니다. vi는 모든 Linux/Unix 배포판에 기본 포함되어 있어 GUI가 없는 서버 환경에서도 파일 편집이 가능하며, Command Mode / Insert Mode / Last Line Mode 세 가지 모드로 동작합니다. 각 모드의 전환 방법과 커서 이동, 삭제, 복사, 검색·치환 명령어를 정리합니다.
What is vi?
Unix 계열에서 사용되는 text 편집기
최근의 Redhat 계열 Linux에서는 vim을 vi로 alias 처리(vim 패키지 미설치시 미적용)
UNIX와 Linux의 Terminal CLI 환경에서는 가장 기본적인 편집기이기 때문에 기본적인 사용키 정도는 익혀두는 것이 좋습니다.
3 modes of vi
Command Mode(명령) : esc 입력 상태, 기본값
Insert Mode(입력) : 편집 상태
Last Line Mode(명령) : Command Mode상 : “shift + ;” 입력 상태, 파일 또는 vi 상태 제어
tcpdump는 네트워크 인터페이스에서 패킷을 캡처하고 분석하는 CLI 도구입니다. 특정 IP, 포트, 프로토콜 필터를 조합해 원하는 트래픽만 추출할 수 있으며, .pcap 파일로 저장 후 Wireshark에서 분석하는 것도 가능합니다. 네트워크 문제 진단 및 보안 감사에 자주 활용됩니다.
NIC를 통해 주고 받는 패킷을 캡쳐하는 기능을 가진 명령어 입니다.
평문으로 구성된 패킷의 분석이 가능하며 네트워크 종단간의 정상 통신 여부를 검증할 때도 사용이 가능합니다.
-n : 주소를 십진수로 표시
-i : 어느 인터페이스를 경유하는 패킷을 캡쳐할지 결정
-t : 캡쳐 시간을 출력하지 않음
-c : 캡쳐할 패킷 수 지정
-a : 도메인 이름형식으로 주소 출력
-f : 로컬호스트는 도메인 이름, 원격호스트는 숫자로 표시
-e : 링크레벨 헤더를 출력
-N : 호스트 이름을 출력할 때 도메인 출력하지 않음
-P : 인터페이스를 promiscuous 모드로 하지 않음
-q(v) : 프로토콜정보를 간단히(자세히) 출력
-w(r) : 캡쳐한 패킷을 파일에 저장(로드)
-s : snap length를 변경 (기본 68바이트) -s0 무제한
-S : TCP순서번호를 상대적인 번호가 아닌 절대적 값으로 출력
-v : 더 많은 정보들을 출력
-vv : -v 보다 더 많은 정보들을 출력
-x : 패킷을 헥사코드로 출력
// eth0를 통해 인입되는 패킷 모니터링
# tcpdump -i eth0
// eth0를 통해 인입되는 패킷 모니터링 결과를 packet_log.txt에 저장
# tcpdump -i eth0 -w packet_log.txt
// 지정한 수 만큼만 저장
# tcpdump -i eth0 kj-c 50
// eth0을 통해 들어오는 패킷 중 지정된 포트와 IP로 들어오는 패킷에 대해서만 모니터링하여 packet_log에 저장
# tcpdump -i eth0 -w packet_log.txt -1 1500 tcp port 23 and host 218.38.71.24
// 저장된 파일을 확인
# tcpdump -r packet_log.txt
// 예시
# tcpdump -nns0 host 172.30.1.80 -i bond0 -w pcap_20150911_002.cap
BPF 필터 문법
tcpdump는 Berkeley Packet Filter(BPF) 문법을 사용해 캡처할 패킷을 정밀하게 필터링합니다. 필터 표현식은 host, net, port, proto 등의 기본 단위와 and, or, not 논리 연산자로 조합합니다. 필터를 올바르게 사용하면 불필요한 트래픽을 제거하고 원하는 흐름만 정확히 추출할 수 있어 분석 효율이 크게 향상됩니다.
# 특정 IP에서 발생하는 트래픽만 캡처
tcpdump -i eth0 host x.x.x.x
# 출발지 IP 또는 목적지 IP 방향 필터
tcpdump -i eth0 src x.x.x.x # 출발지
tcpdump -i eth0 dst x.x.x.x # 목적지
# 특정 포트 트래픽 캡처 (HTTP, SSH 등)
tcpdump -i eth0 tcp port 80
tcpdump -i eth0 tcp port 22
# 복합 조건 (IP + 포트 조합)
tcpdump -i eth0 host x.x.x.x and tcp port 443
# 특정 서브넷 트래픽
tcpdump -i eth0 net 10.0.0.0/8
실전 활용 사례
tcpdump는 네트워크 장애 진단, 보안 감사, 애플리케이션 통신 검증 등 다양한 상황에서 활용됩니다. 원격 서버에서 실시간으로 캡처하고 로컬 Wireshark에서 분석하는 워크플로가 일반적입니다. 아래는 현장에서 자주 사용하는 패턴입니다.
# DNS 쿼리 확인 (UDP 53)
tcpdump -i eth0 -nn udp port 53
# HTTP 요청 URL 추출 (평문 HTTP)
tcpdump -i eth0 -A -s0 tcp port 80 | grep -E "GET|POST|Host:"
# 특정 두 호스트 간 트래픽만 캡처
tcpdump -i eth0 host x.x.x.x and host x.x.x.x
# 고용량 캡처: 100MB 단위 파일 롤링 (-C 100MB, 최대 5개 보관)
tcpdump -i eth0 -w /tmp/capture.pcap -C 100 -W 5
# 원격 서버에서 캡처 → 로컬 Wireshark 파이프라인
ssh root@x.x.x.x "tcpdump -i eth0 -s0 -w - port 443" | wireshark -k -i -
캡처 시 -s0 옵션을 사용해 스냅샷 길이를 무제한으로 설정하면 페이로드 전체를 확인할 수 있습니다. 보안 민감한 환경에서는 캡처 파일을 분석 후 즉시 삭제하고, 평문 패킷에서 자격증명이 노출되지 않도록 주의합니다.
캡처 파일 크기 관리와 Wireshark 연동
운영 서버에서 장시간 트래픽을 캡처할 때는 디스크 용량 관리가 중요합니다. -C 옵션으로 파일 크기 제한을, -W 옵션으로 보관할 최대 파일 수를 설정하면 자동으로 파일을 롤링하여 디스크가 꽉 차는 상황을 방지할 수 있습니다. 캡처가 종료된 후에는 .pcap 파일을 로컬로 가져와 Wireshark의 GUI에서 심층 분석합니다.
Wireshark에서는 tcpdump의 BPF 필터보다 표현력이 풍부한 Display Filter 문법을 사용합니다. http.request.method == "GET", tcp.flags.syn == 1, dns.qry.name contains "example"처럼 프로토콜 필드 수준의 정밀한 필터링이 가능합니다. 서버에서 tcpdump로 캡처하고 Wireshark로 분석하는 조합이 현장에서 가장 널리 쓰이는 네트워크 진단 워크플로입니다.
보안 감사 관점에서 tcpdump는 평문 프로토콜(HTTP, FTP, Telnet)에서 자격증명 노출 여부를 검증하거나, 비정상적인 포트 스캔 패턴을 탐지하는 데 활용됩니다. 단, 다른 사용자의 트래픽 캡처는 법적·정책적 허가가 필요하므로 반드시 사전 승인을 받고 수행해야 합니다.
Network Bonding(또는 Link Aggregation)은 두 개 이상의 물리 네트워크 인터페이스를 하나의 논리 인터페이스로 묶어 대역폭을 늘리거나 이중화(failover)를 구현하는 기술입니다. 리눅스에서는 bonding 커널 모듈과 /etc/sysconfig/network-scripts/ 설정 파일로 구성하며, mode 0(balance-rr)부터 mode 6(ALB)까지 다양한 Bonding 모드를 지원합니다.
Network Bonding 활용 사례
Network Bonding(Link Aggregation)이 실무에서 사용되는 주요 사례는 크게 두 가지입니다. 첫째, 서버의 트래픽이 단일 NIC 대역폭(보통 1Gbps)을 초과할 때 여러 NIC를 묶어 대역폭을 확장합니다(mode 0, 2, 4). 둘째, 한 NIC나 케이블에 장애가 발생해도 서비스가 중단되지 않도록 이중화(failover)를 구성합니다(mode 1). 데이터센터 서버, 스토리지 서버, 가상화 호스트에서 흔히 사용합니다.
실제 환경에서는 스위치 지원 여부에 따라 mode 선택이 달라집니다. 스위치 없이 바로 사용하려면 mode 1(active-backup)이 가장 안정적입니다. 스위치에서 LACP(802.3ad)를 지원하면 mode 4로 대역폭 확장과 failover를 동시에 구현할 수 있습니다. mode 0(balance-rr)은 스위치 설정 없이도 동작하지만, 일부 네트워크 장비와 호환성 문제가 발생할 수 있습니다.
What is bonding?
2개 이상의 물리적인 NIC(Network Interface Card)를 논리적인 NIC 1개로 묶어서 대역폭을 확장하거나 Active/Standby 구조로 구성하여 특정 NIC의 고장 또는 케이블의 단절로 인한 Disconnect를 예방하여 고가용성(High Availability) 또는 내결함성(Fault Tolerance)를 보장해줍니다.
Configuration
RHEL(CentOS) 7 & 6
// Bonding Interface 정의
# vi /etc/modprobe.d/bonding.conf
alias bond0 bonding
# vi /etc/sysconfig/network-script/ifcfg-bond0
DEVICE=bond0
IPADDR=192.168.12.117
NETMASK=255.255.255.0
GATEWAY=192.168.12.1
USERCTL=no
BOOTPROTO=none
ONBOOT=yes
BONDING_OPTS="mode=1 miimon=100"
※BONDING_OPTS에 primary=eth0 추가 하여 인터페이스 우선 순위 설정
// Bonding으로 묶을 NIC들의 설정 변경
# vi/etc/sysconfig/network-script/ifcfg-eth0
TYPE=Ethernet
NAME=eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
# vi/etc/sysconfig/network-script/ifcfg-eth1
TYPE=Ethernet
NAME=eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no
// CentOS 7 서비스 재시작
# systemctl restart network
// CentOS 6 서비스 재시작
# service network restart
Common Configuration(BONDING_OPTS=mode)
0 balance-rr : (Round Robin) Load Balancing, 송신할 패킷마다 사용하는 물리적 NIC를 순차 변경
1 active-backup: Fault-Tolerance, bond내에서 한개의 Slave만 사용, 해당 NIC에 문제가 발생할 경우 다른 Slave가 Enable
2 balance-xor : Load Balancing, 소스와 목적지의 MAC을 XOR 연산을 통해 사용할 NIC를 결정하여 분배
3 Broadcast : Fault-Tolerance, 모든 Slave로 데이터전송(failover), 일반적으로는 잘 사용안함.
4 802.3ad : Dynamic Link Aggregation, IEEE 802.3ad 프로토콜을 이용하여 동적 Aggregation 작성 대역폭 상승, 부하 분산, Failover 지원(Switch LACP 구성 필요)
5 balance-tlb(TLB) : 적응형 송신 부하 분산, 송신패킷 로드밸런싱, 송신시 부하가 낮은 NIC이용 수신은 특정 NIC이용
6 balance-alb(ALB) : 적응형 부하 분산, 송수신패킷 로드밸런싱, 송수신시 부하가 낮은 NIC를 사용
miimon=100 : NIC가 활성화되어 있는지 확인하는 단위 시간 0.1초
RHEL(CentOS) 5
// Bonding Interface 정의
# vi /etc/modprobe.conf
alias bond0 bonding
alias bond1 bonding
// NIC 설정 방식 동일
// 서비스 재시작
# service network restart
Network Manager 서비스가 기동중일 경우 설정중인 파일이 서비스 재기동과 관계 없이 반영될 수 있으므로 Network Manager 서비스를 종료 후 작업을 추천 드립니다.
// CentOS 7 서비스 재시작
# systemctl stop NetworkManager
// CentOS 6 서비스 재시작
# service NetworkManager stop
bonding 상태 확인
# cat /proc/net/bonding/bond0
# ethtool bond0
Bonding Mode와 Slave NIC의 상태를 확인 가능
RHEL 8/9 및 Ubuntu에서의 Bonding
위 설정 방식은 CentOS 6/7(/etc/sysconfig/network-scripts/) 기반입니다. RHEL 8/9 및 Rocky Linux 9부터는 이 방식이 deprecated되었으며, NetworkManager와 nmcli 명령으로 bonding을 구성합니다. nmcli con add type bond로 bond 인터페이스를 생성하고 각 slave NIC를 추가하는 방식입니다. Ubuntu에서는 Netplan(/etc/netplan/*.yaml)에서 bonds: 블록으로 설정합니다. 운영 중인 OS 버전에 맞는 방식을 사용해야 설정이 영구 반영됩니다.
설정 완료 후 /proc/net/bonding/bond0 파일에서 현재 active slave, bonding mode, MII 상태를 실시간으로 확인할 수 있습니다. Kernel bonding 드라이버는 miimon 값(밀리초) 주기로 각 slave NIC의 링크 상태를 폴링하여 장애 감지와 failover를 자동 처리합니다.