생활코딩 리눅스 요약 : 24 - 그룹 ~ 29 - 도메인 (domain)

Jeongtae Kim·2022년 7월 29일
0

서버

목록 보기
5/6
post-thumbnail

📒 생활코딩 리눅스 수업 소개

생활코딩의 운영자 이고잉 님이 2016년부터 2017년까지 만드신 리눅스 초보 수업으로 리눅스 뿐만 아니라 네트워크와 인터넷 등도 수업에 포함되어 있습니다. 이 글의 요약을 보는 것보다 동영상 수업을 듣는 것을 강력 추천합니다! 또한, 이고잉님이 작성하신 글들에 동영상의 추가 정보들을 더 적어 놓았습니다.
생활코딩 리눅스

📌 24 - 그룹

그룹 수업
소유자를 제외하고 특정 사람들을 묶어 권한을 부여하고 싶을 수 있습니다. 그럴 때, 그룹을 만들면 됩니다.

준비

cd /var
sudo mkdir developer
cd developer

실습

제 컴퓨터에는 유저 3명이 있습니다. kjt와 dave는 개발자이고, why는 디자이너입니다. 그래서 kjt와 dave만 developer 폴더에 파일을 만들 수 있고, why는 못 만들게 하고 싶습니다. 그럼 일단 developer 라는 그룹을 만들어 kjt와 dave를 넣겠습니다. 인터넷 검색을 통해 그룹을 만드는 방법을 찾아보겠습니다.
참고 사이트

sudo groupadd developer

사이트를 참고하니 다음과 같이 적으면 developer 라는 그룹이 만들어지는 것 같네요. 그룹이 만들어진 것을 확인하려면 '/etc/group' 을 확인하면 됩니다. nano로 확인해보겠습니다.

developer라는 그룹이 새로 만들어진 것을 확인했습니다. 이제 그룹에 kjt와 dave를 추가해 주겠습니다. 위의 참고 사이트에서 유저를 추가하는 방법도 나오니 그것을 활용하면 이렇게 칠 수 있습니다.

sudo usermod -a -G developer kjt
sudo usermod -a -G developer dave

저번 포스트에서 말했듯이 -a -G는 group append, 즉 그룹에 추가한다는 뜻입니다. 이제 그룹에 사용자들을 추가했으니 테스트를 해보기... 전에 컴퓨터를 재부팅한 후 진행하겠습니다. 그룹 진행상황을 반영하기 위해서 재부팅이 필요합니다.

이제 '/var/developer' 로 들어와서 두 가지 과정이 필요합니다.

  1. 디렉토리인 developer의 소유 그룹을 변경합니다.
  2. 그룹 권한에 쓰기 권한을 부여합니다.

쓰기 권한 부여는 저번에 배웠지만, 소유 그룹을 변경하는 것은 아직 모릅니다. 이번에도 검색을 통해 찾아보겠습니다. 저는 리눅스 답변사이트에서 chown이라는 명령어가 파일이나 디렉토리의 소유자와 소유 그룹을 바꾼다는 사실을 알아냈습니다. 사이트를 참고하여 다음과 같이 칠 수 있습니다.
참고 사이트

sudo chown root:developer .

'.' 은 현재 디렉토리를 나타내고 'root:developer' 는 root를 소유자, developer를 소유 그룹으로 정하겠다는 뜻입니다. developer가 현재 디렉토리여야 developer 디렉토리에 적용될 것입니다.

그럼 이렇게 소유 그룹이 root에서 developer로 바뀌게 됩니다.

이제 그룹 권한에 쓰기 권한을 부여하면 됩니다.

sudo chmod g+w .

현재 디렉토리의 그룹 권한에 쓰기 권한을 부여해 주었습니다. 그럼 이제 파일이 만들어지는지 테스트를 해보겠습니다.


그룹에 속해 있는 kjt와 dave는 각자 이름의 파일을 디렉토리에 만드는 데 에러가 없습니다. Other에 속한 why는 어떨까요?

developer 그룹이 아닌 why는 쓰기 권한이 없어 에러가 납니다.

📌 25 - 인터넷, 네트워크 그리고 서버

인터넷, 네트워크 그리고 서버 수업
그룹까지 해서 리눅스의 다중 사용자 시스템을 모두 살펴보았습니다. 이번 수업부터 리눅스를 서버로 다루기 위해 알아야 할 것들을 다뤄보겠습니다.

이미지 출처

우리가 인터넷에서 검색을 하기 위해 구글로 가고 싶습니다. 그럼 웹 브라우저에서 https://google.com/ 이라고 쳐야합니다.

이때, 사용자의 컴퓨터는 구글의 컴퓨터에 접속되면서 구글 검색을 하기 위해 필요한 것을 요구하게 됩니다. 이것을 요청(Request)이라고 합니다. 그럼 구글의 컴퓨터는 사용자의 컴퓨터에 요청한 것을 보내게 됩니다. 이것을 응답(Response)이라고 합니다. 또한, 요청을 보낸 사용자의 컴퓨터는 클라이언트(Client), 응답을 보낸 회사의 컴퓨터는 서버(Server)라고 합니다.

사용자의 컴퓨터가 구글의 컴퓨터에 접속하기 위해서는 IP주소 혹은 도메인 네임(Domain Name)을 알아야 합니다. 도메인 네임은 복잡한 IP주소를 사용자가 사용하기 불편하여 만든 주소로 IP주소를 대신할 수 있습니다. 도메인 네임을 주소창에 입력한다면 DNS 서버(Domain Name System Server)에 연결되어 도메인 네임이 IP주소로 대체되어 서버에 접속할 수 있는 것입니다.
'google.com' 역시 도메인 네임인데 ping 명령어를 통해 IP 주소를 알아낼 수 있습니다.

그럼 리눅스로 저의 IP주소를 알아보겠습니다. 저는 두 가지 방법을 알아왔는데요. 두 가지 방법 모두 사용해 보겠습니다.

curl ipinfo.io/ip

첫 번째로, https://ipinfo.io/ip 에 접속하면 아무 디자인 없이 IP 주소만을 응답으로 보내주게 됩니다. curl 명령을 사용하면 그 응답을 쉘로 받을 수 있습니다. 저는 '118'로 시작하는 IP 주소를 받았습니다.

ip addr

두 번째로, 'ip addr' 명령어를 사용하여 IP 주소를 받을 수 있습니다. 첫 번째 문단의 inet, inet6를 지나 두 번째 문단 inet의 옆의 숫자들이 IP주소입니다. 저는 '192'로 시작합니다. 엥?

첫 번째 아이피와 두 번째 IP주소가 다른 것을 알아낼 수 있습니다. (특정 사용자들은 같습니다.) 그 이유는 첫 번째 아이피는 공인 IP(Public Address), 두 번째 아이피는 사설 IP(Private Address)이기 때문입니다.

이미지 출처

우리가 인터넷을 사용하기 위해서는 통신사의 회선에 장치를 연결해야 합니다. 통신사는 그 회선에 대해 IP주소를 주게 됩니다. 그러나 장치가 많아질수록 여러 회선을 통신사와 계약해야하기 때문에 비용이 올라가게 됩니다. 그래서 공유기(Router)가 등장하게 됩니다.

통신사가 회선으로 제공한 IP주소는 라우터가 갖고, 라우터에 여러 장치를 연결하여 각각의 장치를 식별하기 위한 IP주소를 부여하게 됩니다. 이때 라우터가 부여받는 IP주소가 공인 IP, 사용자의 장치가 부여받는 IP주소가 사설IP가 됩니다. 공인 IP와 사설 IP가 같다면 라우터없이 회선에 직접 연결한 것입니다.

📌 26 - 웹서버 (아파치)

웹서버 (아파치) 수업
클라이언트는 웹 브라우저(Firefox, Edge, Chrome 등)를 사용하여 서버에 요청(Request)를 보내게 됩니다. 웹서버(Apache, Nginx, IIS 등)는 항상 켜져있다가 요청이 들어오면 그것을 분석하여 하드디스크(HDD), SSD 등 저장장치에 있는 것들을 가져와 응답(Response) 해 주면 됩니다. 이번 시간에는 대표적인 웹서버 중 하나인 Apache를 설치하고 이용해보겠습니다.

설치

Apache2를 설치하는데 데몬 수업에서 설치하신 분들은 설치를 안 하셔도 됩니다.

sudo apt-get update
sudo apt-get install apache2

실습

웹서버를 시작하고 종료하는 명령어입니다.

sudo service apache2 start	# 시작
sudo service apache2 stop 	# 종료

웹서버를 시작하고 htop을 이용해 프로세스를 보겠습니다. F4를 누르고 'apache'를 검색하면 이렇게 많은 Apache2 프로세스들이 등장합니다.

웹서버는 굉장히 많은 접속이 들어올 수 있어 접속을 분산시켜 처리하기 위해 여러 프로세스들을 실행시키게 됩니다. 이제 쉘에서 웹 브라우징을 할 수 있는 프로그램인 elinks를 이용해 웹서버에 들어가겠습니다.

sudo apt-get update 	# 컴퓨터 켜고 한 번만
sudo apt-get install elinks

이렇게 설치한 후 ip addr로 사설 IP를 알아내어 명령어를 치면 웹서버에 들어갈 수 있습니다.

elinks http://(사설 IP)/


아파치의 기본 페이지가 나오네요. 종료는 q를 눌러 하시면 됩니다.
사실 사설 IP로만 들어갈 수 있는 것은 아닙니다. 사설 IP가 ip addr의 두 번째 문단의 inet 옆의 값이라고 배웠었습니다. 근데 첫 번째 문단의 inet 옆의 값은 무엇을 나타냈을까요? 바로 자기 자신의 IP주소를 나타내는 값입니다.

127.0.0.1은 컴퓨터마다 자신의 IP주소를 나타내기로 약속되었습니다. 또한, 자신의 IP주소를 나타내는 도메인도 있는데요. 그것은 localhost라는 것입니다.

elinks http://127.0.0.1
elinks http://localhost

따라서 이 명령어들로도 자신의 웹서버에 접속이 됩니다.

아파치의 기본 페이지는 저장공간 어딘가에 저장되었을 것입니다. 그 기본 페이지를 삭제하고 저희의 html 파일로 대체해보고 그 밖의 다른 파일들도 살펴봅시다.

'/etc/apache2'로 가면 아파치의 설정 파일이 저장되었습니다. 그 중 '/etc/apache2/sites-enabled/000-default.conf'에는 웹문서가 있는 디렉토리 위치와 에러 로그의 위치 등이 다음과 같이 기록되어 있습니다.

그 중 'DocumentRoot' 값이 웹서버가 문서를 가져오는 위치이고, 'ErrorLog' 값이 아파치 서버에 에러가 났을 때 에러를 기록하는 에러 로그의 위치입니다. 'CustomLog' 값은 웹서버에 접속한 사람의 정보가 추가되는 액세스 로그의 위치이고, ${APACHE_LOG_DIR}은 '/var/log/apache2/'라고 합니다. 먼저 웹서버가 문저를 가져오는 곳부터 가서 문서를 바꿔보겠습니다.

cd /var/www/html # DocumentRoot 값
sudo mv index.html apache.html
sudo nano index.html

아파치 웹서버는 'index.html'을 기본적으로 웹페이지에 띄우는데요. 기존에 있던 파일은 'apache.html'로 이름을 바꾸고 새로운 'index.html'을 나노로 열었습니다.

이렇게 간단한 html 파일을 만들고 웹서버에 접속해보겠습니다.

elinks http://localhost/


이렇게 "Hello, Web Server!"만 있는 웹페이지를 띄우게 됩니다!

이번엔 에러 로그와 액세스 로그가 있는 '/var/log/apache2'로 가겠습니다.

ls를 해보니 확실히 에러 로그와 액세스 로그가 있습니다.

cat을 통해 에러 로그를 출력해보니 에러가 있었던 적이 있음을 알 수 있습니다. 이번엔 tail을 통해 실시간으로 액세스 로그를 보겠습니다.

tmux로 화면을 분할하여 한 쪽은 액세스 로그를 보고 한 쪽은 웹서버에 접속했습니다. 웹서버에 접속하자마자 액세스 로그가 업데이트하는 것을 볼 수 있습니다.

📌 27 - 원격제어 (ssh)

원격제어 (ssh) 수업
클라이언트가 인터넷을 통해 서버를 원격 제어를 할 때 ssh를 사용합니다. AWS 같은 곳에서도 많이 쓰이는 ssh를 간단하게 다뤄보겠습니다.

ssh Client가 깔려 있는 클라이언트 컴퓨터는 ssh Server가 깔려 있는 서버 컴퓨터를 제어하게 됩니다. 클라이언트 컴퓨터에서 rm, ls, pwd같은 명령어들을 치면 서버 컴퓨터는 그 명령들을 수행하고 수행한 결과를 클라이언트 컴퓨터에 전달하여 보여주게 됩니다. 이것은 웹 브라우저와 웹서버의 관계와 유사하다고 볼 수 있습니다.

먼저, ssh가 깔려있는 모르니 다운로드가 되었는지 확인해보겠습니다.

apt --installed | grep openssh

다운로드 된 패키지들 중 'openssh'가 포함된 패키지를 검색했습니다.

저는 설치가 다 되어 있습니다. 설치가 안 되어 있다면 클라이언트, 서버 중 안 되어 있는 것 모두 설치해봅시다.

sudo apt-get install openssh-server openssh-client

서버의 입장이 되어서 ssh 서버를 시작하려면 데몬에서 배웠던 것처럼 시작하면 됩니다.

sudo service ssh start	# 시작
sudo service ssh stop	# 중지

클라이언트의 입장이 되어서 ssh 서버에 접속하려면 서버의 IP주소를 알아내어야 합니다.

ssh (username)@(IP주소) # 서버 컴퓨터 접속

이제 비밀번호를 누르면 서버 컴퓨터에 접속할 수 있습니다.

📌 28 - 포트 (port)

포트 (port) 수업

포트란 무엇인가?

포트(Port)는 애플리케이션 구분을 위해서 사용하는 번호로 같은 프로토콜의 데이터끼리 통하는 통로입니다. 말이 어려운데 예시를 보겠습니다.

이미지 출처

이 사진은 URL 구조입니다. 저기에 80이라고 되있는 것은 포트라고 적혀있네요. 한번 테스트 해보겠습니다.
예를 들어 https://naver.com:80 이라 쳐보겠습니다. 이때는 네이버로 잘 도착합니다. 그러나 https://naver.com:8080 이라 쳐보면 네이버로 향하지 못합니다. 웹은 포트 80번을 사용하는 것입니다.

그럼 이번에는 ssh로 테스트 해보겠습니다.

ssh -p 22 (아이디)@(서버주소)

이렇게 치면 서버에 접속이 되지만 'ssh -p 2222 아이디@서버주소' 라고 하면 서버에 접속이 안 됩니다. ssh는 포트 22번을 사용하는 것입니다.

서버는 특정 포트에서 대기하기로 약속하고 클라이언트는 특정 포트로 접속하기로 약속되었습니다. 앞에서 보신 것 처럼, 웹서버를 설치했을 때 80번 포트로 대기하기로 약속되었고 웹 브라우저는 80번 포트로 접속하기로 약속된 것입니다. ssh 서버는 22번 포트로 대기하기로 약속되었고 ssh 클라이언트는 22번 포트로 접속하기로 약속된 것입니다.

컴퓨터에 포트는 0부터 65535까지 있습니다. 이중에서 0부터 1023번 포트까지는 잘 알려진 포트(well-known)라고 부릅니다. 다음 이미지는 0부터 25번 포트가 어디에 사용되는 지를 설명하고 있습니다. ssh가 22번에 있는 것을 볼 수 있습니다.

이미지 출처

물론 포트또한 바꿀 수 있습니다. ssh 서버가 대기하고 있는 포트를 바꾸어 보겠습니다.

sudo nano /etc/ssh/sshd_config


nano로 문서를 보다보면 사진과 같은 부분이 나옵니다. 여기서 주석을 풀고 'Port' 다음 숫자를 바꾸면 해당 숫자가 서버가 대기하고 있는 포트 번호가 됩니다. 이제 ssh를 restart하면 해당 포트로 서버에 접속할 수 있게 됩니다.

sudo service ssh restart
ssh -p (포트번호) (아이디)@(서버주소)

포트 포워딩이란?

사설 IP는 외부에 공개되지 않고 똑같은 IP를 가지고 있는 경우도 많기 때문에 외부 사용자가
기본적으로 접근이 어렵습니다. 그러나 특정 포트로 라우터에 접근했을 때 특정 사설 IP로 접근이 허용되게 할 수 있습니다. 이것을 포트포워딩(Port Forwarding)이라고 합니다. 그래서 다른 네트워크와 연결하기 위해서 라우터가 관문과 같은 역할을 한다고 하여 라우터의 주소를 기본 게이트웨이(default gateway) 라고 부릅니다. 기본 게이트웨이는 내부에서만 통용되는 주소입니다. 기본 게이트웨이를 알아낼 수도 있습니다.

ip route

'default via' 옆의 주소가 기본 게이트웨이입니다.
iptime을 기준으로 포트포워딩 하는 과정을 알고 싶다면 수업 영상을 참고해주세요!

📌 29 - 도메인 (domain)

도메인 (domain) 수업
블로그 작성자 기준으로 최종 보스지만 재밌는 도메인에 대해 알아봅시다!
먼저, 도메인을 한번 더 이해하기 위해 host 명령어를 써서 네이버의 IP 주소를 가지고 오겠습니다.

네이버는 'naver.com' 이라는 도메인 네임을 가졌고 DNS 서버를 거쳐 4개의 서버 중 하나의 서버 IP 주소로 변환되는 것입니다.

서브 도메인

제가 뉴스 서비스, 지도 서비스 등 많은 서비스를 운영해서 서비스마다 도메인을 구매하면 돈이 많이 들 것입니다. 그래서 도메인을 재사용하는 방안으로 서브 도메인이 등장했습니다.

이미지 출처

다음 사진에서는 'support'가 서브 도메인입니다. 도메인 앞에 서브 도메인을 붙여 서로 다른 IP를 가르켜 하나의 도메인으로 여러 사이트를 운영하는 효과를 얻을 수 있습니다.

Hosts File

도메인 네임을 IP주소로 바꾸어주는 DNS 서버가 나오기 전에는 컴퓨터마다 hosts file에 적혀 있는 도메인 네임의 IP를 보고 그 아이피를 가지고 접속을 했었습니다. 그러나 클라이언트인 호스트들이 어마어마하게 많아지면서 복잡하지만 본질적인 해결책인 DNS 서버가 등장하게 된 것입니다. 현재는 hosts file을 검사해서 해당 도메인 네임이 없다면 DNS 서버에서 도메인 네임을 검사하는 방식을 취하고 있습니다.

리눅스에서 hosts file은 '/etc/hosts' 입니다. hosts file을 nano로 열어보겠습니다.

sudo nano /etc/hosts


제가 한번 다음 줄에 '127.0.0.1 google.com'을 추가해보겠습니다.

저장한 후에 elinks로 'google.com'에 들어가보겠습니다.

와! 구글이 아니라 제 웹서버로 접속했습니다. 이러한 것도 가능하기 때문에 hosts file은 빈번하게 악의적인 변조 대상이 됩니다. 그래서 hosts file을 잘 관리해야 합니다. 백신또한 hosts file을 보호합니다.

DNS 서버

DNS 서버의 원리를 살펴보기 전 DNS 서버 주소를 살펴보겠습니다. DNS 서버 주소는 '/etc/resolv.conf'에 있습니다. cat으로 보겠습니다.

저의 DNS 서버는 127.0.0.53입니다. 이 DNS 서버 주소로 도메인 네임을 IP주소로 바꾸어 달라는 요청을 보내는 것입니다.

인터넷을 설계한 사람들은 도메인을 사용하지 못하는 재앙을 막기 위해 도메인을 계층적으로 여러 컴퓨터로 분산하는 방식을 채택했습니다. 다음은 'egoing.ga'가 DNS서버를 통해 IP주소를 알아내는 과정입니다.

  1. 클라이언트에 연결된 우리의 DNS서버는 루트 DNS 서버 주소를 알고 있습니다. 루트 DNS서버는 하나가 사라졌을 때의 DNS가 마비되는 상황을 막기위해 많은 서버들이 전세계에 골고루 흩어져 있습니다. 그 중 하나의 루트 DNS 서버를 선택합니다.
  2. 우리의 DNS서버는 루트 DNS 서버에 '.ga' 도메인을 담당하는 DNS 서버 목록을 리턴해달라고 요청하며 루트 DNS 서버는 해당 목록을 리턴하게 됩니다.
  3. 그 서버들 중에서 하나를 선택하여 'egoing.ga'를 담당하는 DNS 서버 목록을 리턴해달라고 요청합니다. '.ga' DNS 서버는 해당 목록을 리턴하게 됩니다.
  4. 최종적으로 그 서버들 중 하나를 선택하여 'egoing.ga' 의 IP주소를 리턴해달라고 요청합니다. 그것을 받으면 클라이언트로 전달하여 그 IP주소로 서버에 접속하게 됩니다.

정리하면 '.' -> '.ga.' > 'egoing.ga.' 순서로 URL을 완성할 때까지 DNS 서버를 찾아가는 것입니다. 참고로 URL 끝에는 루트 도메인인 '.'이 생략되어 있습니다. 원래는 'google.com'이 아니라 'google.com.'인 것입니다.

도메인 편은 도메인 구입 과정을 생략해서 순서를 다르게 했습니다. 도메인 구입 과정은 수업 영상을 참고해주세요!

다음 시간에 계속...

profile
유용할지도 모른다.

0개의 댓글