서버가 서비스를 제공하려면 애플리케이션만 정상이어서는 부족하다. 서버가 네트워크에 제대로 연결되어 있어야 사용자가 서비스에 접근할 수 있다.
그래서 서버 엔지니어도 IP, 서브넷, 게이트웨이, DNS, 라우팅, 포트 상태 같은 기본 네트워크 요소를 이해해야 한다.
이번 장에서는 리눅스와 윈도 서버의 네트워크 설정 방법, 라우팅 테이블 관리, 그리고 장애 확인에 자주 쓰이는 명령어를 정리한다.
서버가 네트워크에 연결되려면 다음 정보가 필요하다.
| 항목 | 설명 |
|---|---|
| IP 주소 | 서버가 네트워크에서 사용하는 주소 |
| 서브넷 마스크 / Prefix | 같은 네트워크 범위를 구분하는 기준 |
| 게이트웨이 | 다른 네트워크로 나갈 때 거치는 장비 |
| DNS 서버 | 도메인을 IP 주소로 변환해주는 서버 |
일반 단말은 DHCP로 자동 설정하는 경우가 많지만, 서버는 서비스 주소가 고정되어야 하므로 고정 IP를 사용하는 경우가 많다.
네트워크 설정 변경은 시스템에 직접 영향을 주므로 윈도에서는 관리자 권한, 리눅스에서는 root 또는 sudo 권한이 필요하다.
리눅스 서버는 보통 GUI보다 CLI와 설정 파일로 네트워크를 관리한다. 배포판마다 설정 파일 위치와 방식이 조금씩 다르다.
CentOS의 네트워크 설정 파일은 보통 아래 경로에 있다.
/etc/sysconfig/network-scripts/etc/sysconfig/network-scripts/ifcfg-eth0CentOS는 인터페이스별로 설정 파일을 따로 둔다.
주요 설정 항목은 다음과 같다.
| 항목 | 설명 |
|---|---|
ONBOOT | 부팅 시 인터페이스 활성화 여부 |
BOOTPROTO | static, dhcp, none 등 IP 설정 방식 |
IPADDR | 서버 IP 주소 |
NETMASK | 서브넷 마스크 |
PREFIX | CIDR 표기 |
GATEWAY | 기본 게이트웨이 |
DNS1, DNS2 | DNS 서버 주소 |
예시:
ONBOOT=yesBOOTPROTO=staticIPADDR=10.1.1.5PREFIX=24GATEWAY=10.1.1.1DNS1=219.250.36.130설정 파일을 수정한 뒤에는 네트워크 서비스를 재시작해야 적용된다.
systemctl restart network.serviceifdown ifcfg-eth0, ifup ifcfg-eth0원격 접속 중인 인터페이스를 내리면 접속이 끊길 수 있으므로 주의해야 한다.
Ubuntu의 전통적인 네트워크 설정 파일은 다음 경로에 있다.
/etc/network/interfacesCentOS와 달리 Ubuntu는 하나의 interfaces 파일 안에 여러 인터페이스 설정을 함께 적는다.
예시 항목:
auto eth0iface eth0 inet staticaddress 10.1.1.6netmask 255.255.255.0gateway 10.10.10.1dns-nameserver 219.250.36.130네트워크 서비스 제어 명령어는 다음과 같다.
/etc/init.d/networking start/etc/init.d/networking stop/etc/init.d/networking restart/etc/init.d/networking reload리눅스에서 네트워크 상태를 확인할 때는 ifconfig와 ip 명령어를 사용한다.
ifconfig로 확인할 수 있는 정보:
다만 CentOS 7 minimal 같은 환경에서는 ifconfig가 기본 설치되어 있지 않을 수 있다. 이 명령어는 net-tools 패키지에 포함되어 있기 때문이다.
요즘은 ip 명령어를 더 많이 사용한다.
ip addressip -s link윈도 서버는 GUI와 CLI 방식 모두 지원한다.
GUI에서는 다음 경로에서 설정할 수 있다.
제어판 > 네트워크 및 인터넷 > 네트워크 연결ncpa.cpl 입력IPv4 속성에서 IP 주소, 서브넷 마스크, 게이트웨이, DNS 서버를 설정한다.
고급 설정에서는 여러 IP나 게이트웨이 메트릭도 조정할 수 있다.
현재 네트워크 정보는 ipconfig로 확인한다.
ipconfigipconfig /allipconfig /all에서는 MAC 주소, DHCP 사용 여부, DNS 서버, 게이트웨이, 임대 시간 등을 확인할 수 있다.
CLI 설정에는 netsh를 사용한다.
netsh interface ipv4 set address name="인터페이스명" static IP주소 서브넷마스크 게이트웨이netsh interface ipv4 set address name="인터페이스명" source=dhcpnetsh interface ipv4 set dns name="인터페이스명" static DNS서버주소netsh interface ipv4 set dns name="인터페이스명" static DNS서버주소 index=2netsh interface ipv4 set dns name="인터페이스명" source=dhcp어댑터를 재시작할 때는 다음 명령을 사용할 수 있다.
netsh interface set interface name="인터페이스명" admin=disablednetsh interface set interface name="인터페이스명" admin=enabled서버도 네트워크 장비처럼 라우팅 테이블을 가진다.
라우팅 테이블은 목적지 IP로 패킷을 보낼 때 어떤 게이트웨이와 인터페이스를 사용할지 결정한다.
라우팅 테이블의 주요 항목은 다음과 같다.
| 항목 | 설명 |
|---|---|
| Destination | 목적지 네트워크 |
| Genmask / Prefix | 목적지 네트워크 범위 |
| Gateway | 다음 홉 주소 |
| Interface | 패킷을 내보낼 인터페이스 |
| Metric | 경로 우선순위 |
네트워크 어댑터가 하나뿐인 서버는 보통 기본 게이트웨이만으로 충분하다.
하지만 프론트엔드망과 백엔드망처럼 NIC가 여러 개인 서버는 라우팅을 직접 조정해야 한다.
두 NIC에 모두 기본 게이트웨이를 설정하면 경로가 꼬일 수 있다. 일반적으로 외부 통신용 NIC에만 기본 게이트웨이를 두고, 내부망은 별도 라우팅을 추가한다.
리눅스 라우팅 확인:
ip routenetstat -rnetstat -rn라우팅 추가 예시:
route add -host 10.10.10.10 gw 10.1.1.1route add -net 10.10.10.0/24 dev eth0route add -net 10.10.10.0/24 gw 10.1.1.6 metric 20라우팅 삭제 예시:
route del -host 10.10.10.10 gw 10.1.1.1route del -net 10.10.10.0/24 dev eth0디폴트 라우팅:
route add default gw 10.1.1.1 dev eth0route del default gw 10.1.1.1 dev eth0명령어로 추가한 라우팅은 재부팅 후 사라질 수 있다. 영구 적용하려면 설정 파일에 저장해야 한다.
CentOS 영구 라우팅 파일:
/etc/sysconfig/network-scripts/route-eth0Ubuntu 영구 라우팅은 /etc/network/interfaces 안에 up route add ... 형식으로 추가할 수 있다.
윈도에서는 route 명령어를 사용한다.
라우팅 확인:
route printroute print 10.10.*라우팅 추가:
route add 192.168.1.0 mask 255.255.255.0 10.0.0.1route add 192.168.1.0 mask 255.255.255.0 10.0.0.1 metric 100영구 라우팅 추가:
route add -p 172.16.0.0 mask 255.255.240.0 10.0.0.1라우팅 삭제:
route delete 192.168.1.0 mask 255.255.255.0 10.0.0.1라우팅 변경:
route change 192.168.1.0 mask 255.255.255.0 10.0.10.1route change 192.168.1.0 mask 255.255.255.0 10.10.10.1 metric 10삭제할 때 목적지 주소만 입력하면 비슷한 라우팅이 함께 삭제될 수 있으므로, 가능하면 마스크와 게이트웨이까지 정확히 입력하는 것이 좋다.
ping은 목적지까지 IP 통신이 가능한지 확인하는 기본 명령어다.
ping 8.8.8.8 -c 2 -s 100ping 8.8.8.8 -n 2응답 여부, 지연 시간, 패킷 손실을 확인할 수 있다.
하지만 ICMP가 차단된 환경에서는 실패할 수 있으므로 ping 실패만으로 서비스 장애를 단정하면 안 된다.
tcping은 특정 TCP 포트가 열려 있는지 확인한다.
tcping naver.com 80ping은 되지만 실제 서비스 포트가 막힌 경우를 확인할 때 유용하다. 단, 기본 명령어가 아니므로 별도 설치가 필요하다.
목적지까지의 네트워크 경로를 확인한다.
traceroute 목적지IPtracert 목적지IP중간 경로 중 어느 구간에서 지연이나 차단이 발생하는지 확인할 수 있다.
다만 보안 장비가 응답을 막으면 *로 표시될 수 있고, 이것이 항상 장애를 의미하지는 않는다.
특정 TCP 포트를 기준으로 경로를 추적한다.
tcptraceroute naver.com 80tcproute -p 80 목적지IPICMP 기반 확인이 어렵거나 특정 포트 차단 여부를 확인할 때 유용하다.
서버의 연결 상태와 포트 상태를 확인한다.
netstat -antnetstat -s -p TCPnetstat -an | grep LISTENnetstat -an | find "LISTENING"LISTEN, ESTABLISHED, TIME_WAIT, CLOSE_WAIT 같은 TCP 상태를 확인할 수 있다.
ss는 netstat를 대체하는 리눅스 명령어다.
ss -lntpLISTEN 중인 TCP 포트, 숫자 포트, 프로세스 정보를 빠르게 확인할 수 있다.
상태 필터로 established, time-wait, close-wait, listen 등을 지정할 수도 있다.
DNS 질의를 확인하는 명령어다.
nslookup google.comnslookup google.com 8.8.8.8nslookup레코드 타입도 바꿀 수 있다.
set type=Aset type=AAAAset type=MXset type=NSset type=PTR도메인이 어떤 IP로 해석되는지, DNS 변경 사항이 반영되었는지 확인할 때 사용한다.
telnet은 원격 접속용 프로토콜이지만, 보안상 서버 관리 용도로는 권장되지 않는다.
다만 특정 포트가 열려 있는지 확인하는 용도로 사용할 수 있다.
telnet naver.com 80접속이 안 된다면 라우팅, 방화벽, 보안 장비, 서버 방화벽, 서비스 프로세스 상태 등을 함께 확인해야 한다.
윈도에서는 Telnet Client 기능이 비활성화되어 있을 수 있으므로 별도 활성화가 필요하다.
윈도 네트워크 설정 확인 명령어다.
ipconfigipconfig /allipconfig /releaseipconfig /renewipconfig /flushdnsipconfig /displaydnsDNS 변경 후 nslookup 결과는 바뀌었는데 실제 접속이 이상하다면 로컬 DNS 캐시 문제일 수 있다. 이때 /flushdns를 사용한다.
DHCP에서 IP를 받지 못하면 윈도는 169.254.0.0/16 대역의 APIPA 주소를 자동 설정할 수 있다. 이 주소가 보이면 DHCP나 네트워크 연결 문제를 의심해야 한다.
tcpdump는 리눅스에서 패킷을 캡처하는 명령어다.
기본 형식:
tcpdump -i 인터페이스 조건예시:
tcpdump -i eth0 tcp port 80tcpdump -i eth0 tcp port 80 and host 172.16.10.10tcpdump -i eth0 not tcp port 22tcpdump -i eth0 -w dumpfile.pcap패킷이 많으면 .pcap 파일로 저장한 뒤 Wireshark에서 분석하는 것이 편하다.
서버 네트워크 문제가 생기면 다음 순서로 확인하면 좋다.
- IP, 서브넷, 게이트웨이, DNS 설정 확인
- 인터페이스 활성 상태 확인
- 라우팅 테이블 확인
- 게이트웨이까지
ping확인- 외부 IP로 통신 확인
- 도메인 문제라면
nslookup확인- 경로 문제라면
traceroute또는tracert확인- 서비스 포트 문제라면
tcping,telnet,tcptraceroute확인- 서버 내부 포트 상태는
netstat또는ss로 확인- 원인이 불분명하면
tcpdump와 Wireshark로 패킷 확인
| 목적 | 리눅스 | 윈도 |
|---|---|---|
| IP 확인 | ip address, ifconfig | ipconfig /all |
| 인터페이스 통계 | ip -s link | netstat -e |
| 라우팅 확인 | ip route, netstat -rn | route print |
| 라우팅 추가/삭제 | route add, route del | route add, route delete |
| 연결 확인 | ping | ping |
| 경로 확인 | traceroute | tracert |
| TCP 포트 확인 | tcping, telnet | tcping, telnet |
| 포트 기반 경로 확인 | tcptraceroute | tcproute |
| 포트/세션 확인 | netstat, ss | netstat |
| DNS 확인 | nslookup | nslookup |
| DNS 캐시 삭제 | - | ipconfig /flushdns |
| 패킷 캡처 | tcpdump | Wireshark |
이번장의 핵심은 서버도 네트워크의 일부라는 점이다.
서버 장애처럼 보여도 원인은 IP 설정, 라우팅, DNS, 방화벽, 포트 상태, 패킷 흐름 중 하나일 수 있다. 반대로 네트워크 문제처럼 보여도 서버에서 서비스가 실행되지 않았거나 LISTEN 상태가 아닐 수도 있다.
따라서 서버 네트워크 문제는 설정값, 라우팅, DNS, 포트, 패킷 흐름을 단계적으로 확인해야 한다. 서버와 네트워크의 접점을 이해하면 장애 원인을 훨씬 빠르게 좁힐 수 있다.