앞 장에서는 포트의 state를 확인하는 법을 배웠다.

 

이번에는 iptables를 이용하여 리눅스방화벽 ufw를 조작하는 법을 말해보겠다.


리눅스에서 아래 명령어를 쳤을 때 No command가 나오면 iptables를 설치해줘야한다.

 

$ iptables -nL

$ apt-get install iptables-persistent  //리눅스 방화벽 ufw를 disable시킨 상태에서 iptables를 설치한다.

$ cp /usr/share/netfilter-persistent/plugins.d/15-ip4tables /etc/init.d/iptables → 해당 파일 init.d에 복사한다.

$ sudo /etc/init.d/iptables start  //iptables를 시작한다.

$ /etc/init.d/iptables flush → iptables를 종료한다. (이것은 왠만하면 실행않는다.)

 

 

제대로 설치되었다면 아래 명령어를 치면 ip들이 쭈루룩 뜰것이다.

$ sudo iptables -nL

 

특정 포트를 외부에서 접속할 수 있게 방화벽을 해제하기

- TCP PORT일 경우

$ iptables -I INPUT -p tcp --dport 5006 -j ACCEPT   //5006 포트를 외부에서 연결할수 있도록 OPEN

- UDP PORT일 경우

$ iptables -I INPUT -p udp --dport 5006 -j ACCEPT   //5006 포트를 외부에서 연결할수 있도록 OPEN

 

 

-I: 새로운 규칙을 추가한다. (알파벳 엘이 아니고 아이다.)

-p: 패킷의 프로토콜을 명시한다.

-j: 규칙에 해당되는 패킷을 어떻게 처리할지를 정한다. 

 

$ iptables -L -v  | grep 5006 // 방금 추가한 설정을 조회

-L: 규칙을 출력

-v: 자세히 

 

$ service iptables save //변경 사항 저장

$ /etc/init.d/iptables restart  //재시작

추가한 규칙을 삭제하고 싶을 때

 

a) 규칙번호로 삭제

$ iptables -D INPUT 1 // 1번규칙 삭제

 

b) 추가한 규칙 그대로 삭제. (-D는 delete)

$ iptables -D INPUT -p tcp --dport 5006 -j ACCEPT

$ iptables -D INPUT -p udp --dport 5006 -j ACCEPT

방화벽 활성화 & 비활성화

1. 켜기

$ /etc/init.d/iptables start

 

2. 끄기

$ /etc/init.d/iptables flush

 

 

우분투의 경우는 ufw 명령어도 사용할 수 있다.

 

$ sudo ufw enable  //ufw 켜기

$ sudo ufw disable  //ufw 끄기

 

$ sudo ufw allow 5006/tcp  //tcp 5006 port 허용

$ sudo ufw allow 5006/udp  //udp 5006 port 허용

 

$ sudo ufw deny 5006/tcp  //tcp 5006 port 거부

$ sudo ufw deny 5006/udp  //udp 5006 port 거부

 

ufw 상태보기

$ sudo ufw status

$ sudo ufw status verbose


--------------------------

 

참고로 TCP는 송신자와 수신자가 상호작용을 하며 응용계층으로부터 데이터를 받아 TCP 헤더를 추가한 후에 이를 IP로 보낸다.

하지만 UDP는 수신자가 데이터를 받는지 마는지 관심이없다. 즉, UDP는 신뢰성을 보장해주지 않지만 간단하고 속도가 빠르다.

 

 

TCP(Transfer Control Protocol)                                           UDP(User Datagram Protocol)

연결이 성공해야 통신 가능(연결형 프로토콜) 비연결형 프로토콜(연결 없이 통신이 가능)
데이터의 경계를 구분하지 않음(Byte-Stream Service) 데이터의 경계를 구분함(Datagram Service)
신뢰성 있는 데이터 전송(데이터의 재전송 존재) 비신뢰성 있는 데이터 전송(데이터의 재전송 없음)
일 대 일(Unicast) 통신 일 대 일, 일 대 다(Broadcast), 다 대 다(Multicast) 통신

 

 

 

리눅스는 대표적으로 우분투, CentOS, KaliLinux 등이 있지만 Ubuntu 기준으로 기술한다.

 

1. 리눅스에서 실행되고 있는 프로세스 확인하기

 

ps 명령어를 사용한다.

 

옵션 설명
-e 모든 프로세스를 출력해 준다.
-f 풀 포맷으로 보여준다. (UIP, PID)
-l 긴 포맷으로 보여준다.
-p 특정 PID의 프로세스를 보여준다.
-u 특정 사용자의 프로세스를 보여준다.

여기서 PID는 프로세스를 구별하는 유일한 요소이며, UID는 프로그램을 실행한 사람의 정보를 나타내는 요소이다.

그리고 PPID는 프로세스를 만든 부모 프로세스의 PID를 나타내는 값이다.

 

옵션으로는 aux, -e 등 많지만 -ef나 -el을 grep과 함께 많이 사용한다.

 

 

$ ps -el | grep "찾을 문자열"
예) $ ps -el | grep ripple

 

2. 파일 찾기

리눅스는 CLI 기반이라서 파일이 어디있는지 찾기 힘든 경우가 많다.

 

단순히 아래 명령어를 치면 폴더가 검색되어 나온다.

$ find | grep "찾을 문자열"

 

아래만 명심하면 된다.

 

* r로 시작하는 폴더만 찾기

$ find -name "r*" -type d

 

* r로 시작하는 파일만 찾기

$ find -name "r*" -type f

 

3. 프로세스 죽이기

sudo kill -9 "PID번호"

ps -el | grep "찾는 문자열"   << 이 명령어로 PID 확인 가능

 

 

4. 로그 파일 열기

tail -f "로그파일명"

-f는 로그파일을 계속 감시한다는 것을 뜻한다.

이때 해당 폴더 안에 있거나 정확한 디렉토리명을 입력해줘야한다.

 

 

 

 

 

+ Recent posts