docker는 하이브리드 클라우드의 모든 애플리케이션을 처리할 수 있는 유일한 컨테이너 플랫폼 제공 프로그램이다.

 

즉, 컨테이너 기반의 오픈소스 가상화 플랫폼이다.

 

docker에서 말하는 컨테이너란 택배나 화물선 위에 수출용품을 싣는 컨테이너를 대신하여 프로그램(소프트웨어)을 담는 격리된 공간을 의미한다.

각각의 격리된 여러개의 소프트웨어 컨테이너에는 ubuntu, centos 등의 운영 체제 그리고 java, python, mysql, 아파치 같은 프로그램까지도 담기게된다.

 

그리고 각 컨테이너는 격리된 공간이기 때문에 한 컨테이너가 해킹을 당하던 한 컨테이너에 문제가 생기더라도 컨테이너간에 영향을 끼치지 않는다.

 

 

1) 우선 작업 관리자에서 가상화를 사용함으로 설정했는지 확인 한다. (안되어 있는 경우 BIOS 에서 사용함으로 설정해야 한다.)

 

2) 1. 도커를 사용하기 위해서 가상화 기술인 Hyper-V(하이퍼 바이저)를 활성화시켜야한다.

 

 

3) 다음 사이트 접속 > Get Docker 클릭 하여 다운로드
 - https://hub.docker.com/editions/community/docker-ce-desktop-windows/

 

 

4) ok를 계속 누르면 아래처럼 설치가 진행된다.

재시작 후 구동시킨다. 아이디가 없으면 회원가입을 해야한다.

 

5) 설치가 정상적으로 되었으면 파워쉘에서 docker -v를 치면 아래처럼 나온다.

 

 

리눅스 파티션 설정 resize, resizepart

 

리눅스VM에서는 특정 폴더의 용량을 잡아 놓기 때문에 디스크용량을 늘리는 것이 필요하다.

 

아래 명령어를 쳐서 디스크용량을 확인해보자

$ df -h

541G로 용량이 꽉차서 Avail 용량이 0이다.

 

VG1-LV1이란 것은 볼륨그룹1의 논리볼륨1이라는 뜻이다.

LV를 새로 만들어도 되지만 여기서는 /dev/mapper/VG1-LV1이라는 폴더의 용량을 200G 늘려보겠다.

 

 

VM상에서 용량을 200G 늘려준뒤에 gparted라는 프로그램을 다운 받는다.

$ apt-get install gparted

 

VM에서 용량늘려주는 방법은 VMware 업체마다 다르므로 패스.

 

실행하면 아래와 같이 UI가 뜨는데 마우스 드래그로 unused 디스크를 활용하여 파티션을 풀용량으로 잡아준다.

 

그뒤에 아래 명령어를 쳐서 541G에서 700G 의 용량으로 늘려준다.

$ lvextend -L 700G /dev/mapper/VG1-LV1

 

 

그 뒤 용량이 늘어났는지 확인해본다.
$ lvdisplay /dev/mapper/VG1-LV1

 

LV size가 700G로 잘 늘어났다.

그 뒤 df -h를 쳐서 확인해본다.

하지만 시스템에 반영이 안된 것을 알 수 있다.

 

그러면 아래 명령어를 쳐서 sync를 맞춰준다. 

$ resize2fs /dev/mapper/VG1-LV1

 

그뒤 df -h를 쳐보면 용량이 잘 늘어난 것을 확인할 수 있다.

 

이외에도 pated 명령어도 많이 쓰이지만 사용법이 어렵고 잘안들어서 lvextend를 추천한다.

반대로 용량을 줄이고 싶으면 lvreduce -L 명령어를 사용하면 된다.

앞 장에서는 포트의 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) 통신

 

 

 

리눅스 자체 방화벽에서 포트를 열고 닫는데 이때 다른 컴퓨터나 VM에서 접속하려고 하면 안되는 경우가 있다.

 

포트가 닫혀있는지 확인하는 법은

 

cmd에서는 ping이나 tcping을 사용하면 된다.

 

아래처럼 나오면 연결이 안된다는 뜻

아래처럼 나오면 연결이 잘 동작한다는 뜻이다.

 

하지만 특정 포트에 알아보고 싶으면 tcping을 쓰면 된다.

 

설치방법은 C:\Windows\System32 경로에 아래 파일을 복사하면된다.

tcping.exe
0.25MB

 

그리고 cmd창에 tcping이라고 입력하면 쭈루룩 무언가가 뜨는데, 이러면 설치 성공이다.

 

5009포트에 대해서 tcping 테스트를 해보면 아래와 같이나온다.

 

No response라고 뜨는데, 이는 5009 포트가 닫혀있다는 것을 의미한다.

 

5006 포트는 열려있기에 아래와 같이 정상적으로 작동한다.

 

 

만약 내가 리눅스OS에서 5006 포트를 열었는데 타PC에서 접속할때 No response가 뜬다면 리눅스 방화벽이 원인이고 이는 여러 방법으로 해결할 수 있다.

 

netstat을 이용한 port 스캔

 

$ netstat -tnlp       // 현재 가동 중인 포트 들을 보여준다.

이와 더불어 netstat -nap도 열려있는 모든 포트를 보여준다. grep을 사용하여 포트번호를 검색할 수 도 있다.

 

$ netstat 

namp을 이용한 포트 확인

 

nmap을 이용한 port 스캔

리눅스 상에 아래 명령어를 치면 Usage: Nmap으로 나오면 nmap이 이미 설치되어 있는 것.

$ nmap

 

Command 'nmap' not found가 나온다면 설치를 해줘야 한다.

아래 명령어로 namp을 설치 한다.

 

$ sudo apt install nmap

 

그리고 아래 명령어를 실행 해본다.

 

$ nmap -sT 172.26.12.120      // 172.26.12.120에서 열린 port들을 보여준다.

$ nmap -sT 172.26.12.120 -p 5006     // 172.26.12.120의 5006포트가 열렸는지 닫혔는지 보여준다.

$ nmap -Pn 172.26.12.120 -p 5006     // 172.26.12.120의 5006포트가 열렸는지 닫혔는지 보여준다.

 

-sT 또는 -Pn을 주로 쓴다.

-sT 일반적인 TCP 포트스캐닝.
-sS 이른바 'half-open' 스캔으로 추적이 어렵다.
-sP ping 을 이용한 일반적인 스캔.
-sU UDP 포트 스캐닝.
-PO 대상 호스트에 대한 ping 응답을 요청하지 않음 .
log 기록과 filtering 을 피할 수 있다.
-PT 일반적이 ICMP ping이 아닌 ACK 패킷으로 ping 을 보내고
RST 패킷으로 응답을 받는다.
-PI 일반적인 ICMP ping 으로 방화벽이나 필터링에 의해 걸러진다.
-PB ping 을 할 때 ICMP ping 과 TCP ping을 동시에 이용한다.
-PS ping 을 할 때 ACK 패킷대신 SYN 패킷을 보내 스캔.
-O 대상 호스트의 OS 판별.
-p 대상 호스트의 특정 포트를 스캔하거나, 스캔할 포트의 범위를 지정.
ex) -p 1-1024
-D Decoy 기능으로 대상 호스트에게 스캔을 실행한 호스트의 주소를 속인다.
-F /etc/services 파일 내에 기술된 포트만 스캔.
-I TCP 프로세서의 identd 정보를 가져온다.
-n IP 주소를 DNS 호스트명으로 바꾸지 않는다. 속도가 빠르다.
-R IP 주소를 DNS 호스트명으로 바꿔서 스캔. 속도가 느리다.
-o 스캔 결과를 택스트 파일로 저장.
-i 스캔 대상 호스트의 정보를 지정한 파일에서 읽어서 스캔.
-h 도움말 보기

 

PORT의 state가 open이면 열렸다는 것, closed면 닫혔거나 존재하지 않는다는 것, filtered면 열렸지만 방화벽으로 가로막혔다는 것을 뜻한다.

 

filtered면 방화벽을 해제함으로써 다른 pc에서 통신할수 있게끔 할수 있다. 다음장에 계속

 

 

 

 

 

리눅스는 대표적으로 우분투, 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