이 글에서는 서버를 운영할 때 알아두면 좋은 단편적인 네트워크 개념들과 CentOS에서 사용하는 명령어 대해 알아보도록 하겠습니다.



1. 소켓 ( Socket )

Well-known port링크 )는 원격 컴퓨터가 특정 네트워크 서비스를 위해 어떤 포트로 접속해야 하는지 알 수 있도록 해주는 표준화된 포트 번호입니다.

하지만 송신자와 수신자 사이의 특정 프로세스가 여러 개 존재할 경우,

포트 번호만으로는 어떤 애플리케이션으로 데이터를 전송해야 하는지 지정되어 있지 않기 때문에 데이터 송수신이 불가능합니다.


예를 들어, 어떤 유저가 브라우저 2개를 실행하여 a.com에 접속하는 상황을 생각해봅시다.

이 때 두 브라우저에서 a.com에 데이터를 80번 포트로 송신하지만,

a.com의 웹 서버 입장에서는 웹 서버 프로세스 중 어떤 프로스세스가 유저의 어떤 브라우저와 통신해야 하는지 모르는 상태입니다.


이 때 필요한 것이 소켓입니다.

소켓은 특정 IP 주소와 포트 번호의 조합으로서 클라이언트와 서버단의 소켓을 연결하는 Socket-pair를 통해,

같은 IP의 동일한 시스템이 동시에 특정 클라이언트의 복수 개의 애플리케이션에 정확하게 통신할 수 있게 해주는 기반을 제공합니다.


즉, 클라이언트와 웹 서버의 프로세스에서 두 소켓이 연결되면 데이터를 주고 받을 수 있게 됩니다.

따라서 소켓을 통해 웹 서버의 각 프로세스는 유저의 어떤 브라우저와 통신하고 있는지 알게 되기 떄문에, 브라우저마다 다른 동작을 할 수 있게 됩니다.





2. 네트워크와 호스트, 서브넷팅 계산

IP주소는 네트워크 식별자와 호스트 식별자로 나뉩니다.


네트워크 식별자는 라우터에 의하여 구성된 인터넷의 각 네트워크를 지정하는 주소를 말하고,

호스트 식별자는 해당 네트워크 내에서 특정 호스트 컴퓨터를 구분하는 주소를 뜻합니다.


IP주소를 네트워크 주소와 호스트 주소로 구분하기 위해서는 서브넷 마스크( Subnet Mask )가 필요합니다.

서브넷 마스크는 네트워크 부분을 1, 호스트 부분을 0으로 표기하여 이루어지며, 크기는 IP주소와 같이 32bit입니다.

흔히 IP 주소 뒤에 /24 같은 것을 본적이 있으실텐데요, 이는 1bit의 수가 왼쪽부터 24개 있다는 의미입니다.

즉, 서브넷 마스크 255.255.255.0( 11111111.11111111.11111111.00000000 )을 의미합니다.


예를 들어, 194.136.10.123/24는 IP주소가 194.136.10.123이며, 서브넷 마스크는 255.255.255.0를 의미합니다.

네트워크 ID는 파란색 부분이고, 호스트 ID는 빨간색 부분입니다.



IP주소와 서브넷 마스크를 갖고 AND 연산을 하면 네트워크 주소가 나오게 되는데, 이를 넷 마스크( Net Mask )라 합니다.

이렇게 넷 마스크를 이용해서 네트워크를 나누는 것을 서브넷팅( Subnetting )이라 합니다.


서브넷팅에 대해 더 알아보겠습니다.

위의 194.136.10.123/24 IP 주소에서 4번 째 옥텟에 2bit를 확보하면 194.136.10.123/26이 될겁니다.

이 때 서브넷 마스크는 255.255.255.192( 11111111.11111111.11111111.11000000 )가 됩니다.


이렇게 되면 네트워크 ID가 확장되어서 더 많은 네트워크로 분리가 가능해집니다.

특정 몇 군데의 호스트에서 너무 많은 트래픽이 발생하여 속도가 저하되는 문제에서 이를 해결할 때 용이합니다.

이는 서브넷팅을 통하여 네트워크가 분리되기 때문에 브로드캐스트 도메인의 크기가 줄어들게 되므로 가능해집니다.


194.136.10.123/26 IP 주소를 더 살펴보겠습니다.
서브넷 마스크는 255.255.255.192이므로,
호스트에 할당 가능한 IP의 범위는 [0~63], [64~127], [128~191], [192~255]로 가능하며,
네트워크는 [194.139.10.0], [194.139.10.64], [194.139.10.128], [194.139.10.192] 총 4개로 나누어지게 됩니다.
따라서 194.139.10.123이 속한 네트워크는 194.168.10.64/26에 속하게 되며, 서브넷팅 된 3개의 다른 네트워크와는 라우터를 통하여서만 통신할 수 있습니다.






3. DNS

전세계 인터넷은 특정한 주소체계로 구성되어 있으며, 이러한 주소는 컴퓨터가 인식하기 쉬운 숫자로 되어있습니다.

하지만 사람은 문자가 더 익숙하기 때문에, 실제 주소 숫자를 기억하기 쉬운 문자로 변환해주는 시스템이 존재하는데,

이를 DNS( Domain Name System )라 합니다.



한국 인터넷 진흥원에서 다음과 같이 도메인 체계를 설명하고 있습니다.


루트는 인터넷 도메인의 시작점을 말합니다.

1단계 최상위 도메인은 국가명을 나타내는 국가최상위도메인(한국kr, 일본jp, 미국us 등..)이 있고,

일반적으로 사용되는 일반최상위도메인( com, net, org 등... )이 있는 것을 확인할 수 있습니다.


좀 더 자세한 내용은 생활코딩 강의를 참고하면 좋을 것 같습니다. ( 링크 )





4. 네트워크 관련 명령어
1) ip link
네트워크 연결 상태를 확인하는 명령어이며, 네트워크에 연결되어 있으면 state up으로 나타납니다.




2) ip route

기본 게이트웨이 정보와 라우팅 테이블을 확인하는 명령어




3) ifconfig

네트워크 인터페이스의 네트워크 정보를 설정, 변경, 확인하는 명령어


(1) 모든 네트워크 인터페이스의 네트워크 설정 확인



(2) 네트워크 환경 설정

# ifconfig {인터페이스 장치명} {IP주소} netmask {넷마스크주소} broadcast {브로드캐스트주소} up

ex) ifconfig ens34 192.168.92.130 netmask 255.255.255.0 broadcast 192.168.92.255 up





4) netstat

# netstat -a

소켓에 대한 정보가 출력됩니다.

state의 각 항목은 다음과 같은 의미를 갖으며, TCP 프로토콜의 3-way-handshake의 상태와 유사합니다.


 상태

 의미

 ESTABLISHED

 소켓이 연결된 상태

 SYN_SENT

 소켓이 동작중이고 연결 시도 중인 상태

 SYN_RECV

 네트워크로부터 연결 요청을 받은 상태

 FIN_WAIT1

 소켓의 연결이 끊어지고, 연결이 중단되고 있는 상태

 FIN_WAIT2

 연결이 끊어지고, 소켓이 원격의 연결중단을 기다리고 있는 상태

 TIME_WAIT

 소켓이 네트워크상에 있는 패키를 처리하기 위해 대기중인 상태

 CLOSED

 소켓이 사용중이 아닌 상태

 CLOSE_WAIT

 원격지에서 연결을 중단했고, 소켓이 끝나기를 기다리고 있는 상태

 LAST_ACK

 원격지의 연결이 중단되고, 소켓은 끝났으며 ACK 응답을 기다리고 있는 상태

 LISTEN

소켓이 연결을 기다리고 있는 상태 

 CLOSING

양쪽에서 연결은 끊겼찌만 아직 보내지 않은 데이터가 있는 상태

 UNKNOWN

소켓의 상태가 파악되지 않은 상태




5) nslookup

DNS에 사용자가 직접 도메인 이름을 질의할 수 있도록 해주는 명령어이며,

DNS 서버는 /etc/resolv.conf 파일에 정의되어 있는 네임서버를 기본 네임서버로 사용합니다.




6) arp

동일한 네트워크에 존재하는 호스트들의 IP주소와 MAC주소를 확인하는 명령어



7) ping

원격 호스트 응답 테스트





5. 방화벽 - firewalld 명령어

CentOS6까지는 방화벽 설정 파일을 변경하거나 iptables 서비스를 재시작하여 방화벽 규칙을 설정했지만,

CentOS7부터는 방화벽 규칙을 관리하는 데몬( firewalld )이 작동되고, 이 방화벽 데몬이 제공하는 DBUS API를 통해 방화벽을 제어합니다.


firewalld 명령어로 방화벽을 설정할 때, 네트워크 연결 신뢰도에 따라 영역을 구분하여 사용할 수 있습니다.

각 영역의 의미와 firewalld에 대해서 링크를 참고하면 자세히 살펴볼 수 있으며,

아래 사진은 구글 번역기로 돌린 영역과 관련된 문서 일부입니다.


번역되기 전 영역명은 다음과 같습니다.

  • drop
  • block
  • public
  • external
  • internal
  • dmz
  • work
  • home
  • trusted

기본 값은 public입니다.




firewalld의 서비스는 /usr/lib/firewalld/services/*.xml 파일에 명시되어 있습니다. ( /etc/services 가 아님에 유의 )

각 서비스별 정의된 프로토콜, 포트, 모듈, 목적지에 대해 정의된 서비스를 말하며,

서비스의 xml 파일을 보면 port와 module 등이 정의되어 있습니다.




이제 firewalld-cmd 명령어를 통해 방화벽을 설정하는 방법에 대해 알아보겠습니다.

1) 포트 허용
예를 들어, 웹 서버를 운영하기 위해 http, https 포트를 허용하는 명령어는 다음과 같습니다.
# firewall-cmd --permanent --add-service=http --add-service=https
# firewall-cmd --reload
# firewall-cmd --list-all
  • --permanent   : 영구적인 설정을 의미하며, 명시하지 않으면 runtime이 적용되기 때문에, 시스템 재부팅 시 설정이 사라진다.
  • --add-service  : 오픈고자 하는 서비스를 지정
  • --reload         : 영구적으로 설정된 롤을 런 타임 환경에 적용
  • --list-all           : 설정된 룰 목록 조회


2) 방화벽 오픈 확인
방화벽이 제대로 오픈 됐는지 확인하기 위해서는 다른 서버에서 해당 서버( A )로 nmap 명령어를 실행합니다.
# nmap A서버IP -p 포트1,포트2
nmap 명령어를 통해 방화벽 설정 내역을 확인할 수 있으며, 각 상태의 의미는 다음과 같습니다.
  • filtered : 방화벽에 의해 차단됨
  • closed : 방화벽은 열려 있으나, 서비스 데몬인 실행되지 않았거나 정상적이지 않은 상태
  • open : 방화벽이 열려 있고, 서버 데몬이 포트를 리스닝하고 있는 상태


3) 여러 옵션
(1) 영역 변경
--set-default = 영역명
ex) firewall-cmd --set-default-zone=block

(2) 포트 오픈
--add-port=포트/프로토콜
특정 포트를 오픈하기 위해 사용합니다.
ex) firewall-cmd --permanent --add-port=5900-5910/tcp


(3) 포트 삭제
--remove-port=포트/프로토콜
특정 포트를 제거하기 위해 사용합니다.

ex) firewall-cmd --permanent --remove-port=5900-5910/tcp

포트 변경은 적용을 한 후에 꼭 firewall-cmd --reload를 해줘야 반영이 됩니다.


(4) 포트 포워딩
--add-forward-port=port=포트번호:proto=프로토콜:toport=적용포트번호
ex) firewall-cmd --permanent --add-forward-port=port=80:proto-tcp:toport=8080
예를 들어, 톰캣은 일반 사용자 계정으로 실행할 것을 권장합니다.
그러나 톰캣에서 HTTP 기본 포트인 80을 사용할 경우, root 권한이 아니면 80포트를 바인딩할 수 없습니다.
이러한 경우 포트 포워딩을 사용하여 80포트로 접속되는 패킷을 로컬의 8080포트로 포워딩시킴으로써 root 권한 없이 80포트를 사용하여 웹 서비스를 할 수 있도록 할 수 있습니다.


(5) ping 응답하지 않기
ping은 네트워크 확인에 유용하지만, 악의적으로 과다한 트래픽을 유발할 수 있으므로 이러한 공격을 차단할 목적으로 ping 응답을 거부할 수 있습니다.
# firewall-cmd --permanent --add-icmp-block=echo-request





6. 방화벽 - iptables 명령어

방화벽의 기본은 출발지IP, 프로토콜, 포트도착지IP, 프로토콜, 포트를 기본으로 방화벽 규칙을 만듭니다.

그런데 firewalld 명령어는 출발지 IP와 목적지 IP에 대한 정의가 명확하지 않기 때문에,

리눅스에 익숙하다면 firewalld 서비스를 제거하고 iptables 서비스를 사용하길 권장합니다.

( Centos7부터는 firewalld가 기본 서비스로 등록되어 있음. )

# yum install -y iptables-services
# systemctl disable firewalld
# systemctl stop firewalld
# systemctl enable iptables
# systemctl start iptables



간단한 iptables 명령어에 대해 살펴보겠습니다.

( 자세한 사용법은 여기 블로그에 잘 나와 있으므로 참고하시면 좋을 것 같습니다. )

1) iptables 규칙 확인

# iptables -nL


2) 특정 IP에 대한 접근 제어

특정 IP에 대해 접근을 허용하거나, 차단할 수 있습니다.

ex) # iptables -A INPUT -s 출발지IP -j ACCEPT
  • -A  : INPUT 체인에 규칙을 추가 ( 체인의 마지막에 규칙 추가 )
  • -s   : 출발지(source)가 출발지IP인 모든 패킷에 대하여
  • -j   : 타켓(trager)에 행위를 한다. ( ACCEPT : 허용, DROP : 폐기, REJECT : 거부 )

즉, 위의 예에서는 출발지IP로 오는 모든 패킷은 접근을 허용한다는 의미가 됩니다.



3) 특정 포트 및 프로토콜 접근 제어

ex) iptables -I INPUT -p tcp --dport 80 -j ACCEPT
ex) iptables -I INPUT -p tcp --dport 443 -j ACCEPT
  • -I           : INPUT 체인에 규칙을 삽입 ( 체인의 앞쪽에 규칙 삽입 )
  • -p          : 프로토콜 명시
  • --dport   : 목적지 포트
  • -j           : 타켓에 대한 설정

즉, 위의 예는 tcp 프로토콜 중 80, 433 포트에 대하여 접속을 허용한다는 의미입니다.






이상으로 서버를 다룰 때 필요한 네트워크 이론 개념 및 네트워크 명령어, 방화벽에 대해 알아보았습니다.