docs/blog/2023-02-11-linux-04.md
2026-08-29 22:09:51 +09:00

298 lines
16 KiB
Markdown

---
title: "리눅스 사용 part 2 (작성 중)"
description: ""
image: "/assets/blog/04-linux-04/NetworkTopologies.svg"
authors: [bitdori]
---
## [World Wide Web][World Wide Web]
_192.168.56.101_ 로 접속을 시도해 보면 들어갈 수 없을 것이다.
![conn-refused](/assets/blog/04-linux-04/conn-refused.png)
해당 주소는 `ip addr` 실행 후 _enp0s8_ 인터페이스에 할당 받은 주소이다.
![xubuntu-ip](/assets/blog/03-linux-03/xubuntu-ip.png)
- `sudo apt install nginx` 로 [nginx][nginx] 설치
![nginx](/assets/blog/04-linux-04/nginx.png)
- `systemctl status nginx`_Active_ 상태 확인
- `q` 를 눌러 종료한다.
- 다시 _192.168.56.101_ 로 접속을 시도
- nginx 환영 페이지 확인
![nginx-welcome](/assets/blog/04-linux-04/nginx-welcome.png)
웹브라우저에서 `example.tld` 라는 주소로 접속을 시도하면 들어갈 수 없을 것이다.
![example-not-resolved](/assets/blog/04-linux-04/example-not-resolved.png)
- Windows 탐색기에서 `%windir%\system32\drivers\etc` 로 이동
- _hosts_ 를 복사해서 백업본을 만들고 관리자 권한으로 원본 [hosts][hosts]를 연다
- `192.168.56.101 example.tld` 를 추가한 뒤 저장
![hosts](/assets/blog/04-linux-04/hosts.png)
- 웹브라우저에서 다시 `example.tld` 탐색
_192.168.56.101_ 로 접속 했을 때 나오던 nginx 환영페이지를 볼 수 있다.
같은 주소로 접속 했다는 것을 확인하기 위해 `tail -f /var/log/nginx/access.log`
로 파일 내용을 감시해 놓으면 페이지 새로고침을 할 때 마다 새로운 내용이
기록되는 것을 확인할 수 있다.
![nginx-welcome-hosts](/assets/blog/04-linux-04/nginx-welcome-hosts.png)
### [Domain Name System][Domain Name System]
예를 들어 `173.239.79.196` 이라는 주소로 웹브라우저에서 접속을 시도하면
https://www.eff.org/ 라는 주소로 변환돼서 들어간다.
![eff](/assets/blog/04-linux-04/eff.png)
어떤 [클라이언트][클라이언트]에서 웹사이트 접속을 시도하면 맨 처음에는
1. 웹브라우저의 cache를 탐색해 보고 이전 방문 기록이 없는 경우
2. 해당 시스템의 _hosts_ 파일에서 어느 [도메인][도메인]이 어느 IP 주소로 연결되어 있는지
확인
3. _hosts_ 파일에도 해당 내용이 없으면 현재 가입 중인 [ISP][ISP]에게 질의를 보낸다
4. ISP의 cache에도 해당 도메인에 대한 정보가 없으면 [TLD][TLD] 종류에 따라서 ccTLD인 경우
[ICANN][ICANN] 산하 기관이 지정한 국가 DNS 서버로 (한국은 [KRNIC][KRNIC]),
gTLD인 경우 [루트 네임 서버][루트 네임 서버]로 질의를 보낸다
5. 루트 네임 서버에 질의가 들어오면 TLD 네임 서버로 질의를 돌린다
6. TLD 네임 서버는 [Domain name registrar][Domain name registrar] 등 다시금
접속하고자 하는 도메인의 네임 서버로 질의를 돌린다
7. 이곳 [zone 파일][zone 파일]에 목적지 IP 주소가 저장되어 있다면 결과를 보여주고
해당 목적지에서 개별적으로 DNS 서버를 운영하고 있다면 다시 한 번 더 질의를 그쪽으로
보내서 zone 파일을 탐색한 뒤 [A 레코드][A 레코드]에 지정된 주소의 결과를 보여준다.
8. 성공적으로 접속을 하면 다음 번 질의를 할 때 트래픽 낭비 없이 더 빨리 응답하기 위해
클라이언트의 브라우저와 ISP에는 해당 도메인-IP 짝을 저장해 놓는다.
![Example_of_an_iterative_DNS_resolver](/assets/blog/04-linux-04/Example_of_an_iterative_DNS_resolver.svg)
![DNS_Architecture](/assets/blog/04-linux-04/DNS_Architecture.svg)
이처럼 각 웹사이트는 원래 숫자로 이루어진 IP 주소로 서비스가 이루어지고 있지만
사람이 더 쉽게 식별할 수 있도록 숫자가 아닌 문자열을 입력하면 그 주소에 할당된
IP 주소로 매칭시키도록 _Domain Name System_ 이라는 체계로 구현하고 있다.
- 참고로 [IPv6][IPv6]는 [옥텟][옥텟] 내에 _abcd_ 와 같은 문자열이 끼어 있는 것처럼
보일 수도 있는데 이는 [16진수][16진수] 숫자이다.
위에서 `%windir%\system32\drivers\etc\hosts` 에 직접 _example.tld_ 라는
도메인으로 원하는 주소를 넣었고 해당 DNS query는 이 단계에서 끝이 난다.
하지만 hosts 파일은 관리자 권한으로 다뤄지는 파일인데 왜냐하면 이 파일이 사이트를 잘못
가리키면 잘못된 결과가 나오기 때문이다.
_192.168.56.101_ 대신 `173.239.79.196` 으로 변경하고 `example.tld` 로 접속해 보면
아까 확인했던 nginx 환영 페이지가 아니라 https://www.eff.org/ 로 연결이 된다.
![hosts-forgery](/assets/blog/04-linux-04/hosts-forgery.png)
- `%windir%\system32\drivers\etc\hosts` 에 지금까지 변경한 내용을 지우고
이전 상태로 되돌린다.
이러한 주의사항으로 인해 각종 보안 프로그램에서 hosts 변조를 감지하는 기능을
내장하고 있다.
### DNS 서버 구축 (작성 중)
DNS 서버를 자체적으로 구축하면 _hosts_ 를 그대로 둔 채 도메인과 IP 짝을
원하는대로 묶을 수 있다.
- https://mirror.kakao.com/ubuntu-releases/jammy/ 또는 https://releases.ubuntu.com/jammy/
에서 _live-server-amd64.iso.torrent_ 를 다운로드
![ubuntu-server-torrent](/assets/blog/04-linux-04/ubuntu-server-torrent.png)
![ubuntu-server-torrent-downloading](/assets/blog/04-linux-04/ubuntu-server-torrent-downloading.png)
---
_다운로드 하는 동안 볼 내용_
- [BIND][BIND]를 설치해서 DNS query에 응답만 해 주도록 단순하게 구성할 것이기
때문에 X가 없는 서버 버전을 설치한다.
- 우분투 서버 버전은 X를 제외시킨 경량 버전이기 때문에 마우스 포인터를 사용하지
않는다. 나중에라도 [데스크탑 환경][데스크탑 환경]을 설치하면 마우스 포인터를
인식할 수 있다.
- 우분투처럼 유명한 리눅스 배포본은 torrent를 이용하든 말든 본인에게 가장 손쉬운
방법으로 프로그램을 획득하면 되지만 [AlmaLinux][AlmaLinux]처럼 배포본 개발을
시작한지 오래되지 않은 프로젝트에 대해서는 torrent로 트래픽을 절감해주면
프로젝트 자원봉사자의 운영 부담을 덜어줄 수 있다.
- 리눅스는 서로 다른 개발주체의 소프트웨어를 결합한 것이기 때문에 필요한
프로그램을 찾아서 설치하고 관리하는 비용이 MS 운영체제 대비 낮다고 할 수 없으나
그만큼 운영체제 내에서 각 프로그램 간 결합도가 느슨한 편이어서 [커널][커널]
업데이트를 하지 않는 이상 [유저 랜드][유저 랜드] 소프트웨어에 몇몇 사소한 변경사항이
생긴 것만으로는 시스템 재시작을 하지 않아도 된다.
필수 재부팅 상황이 더 적기 때문에 구동 중인 프로그램의 규모가 작을수록
[고가용성][고가용성] 운용을 할 수 있다.
---
live-server iso 다운로드가 끝나면 VirtualBox에 설치한다.
![vbox-ubt-serv-inst-01](/assets/blog/04-linux-04/vbox-ubt-serv-inst-01.png)
![vbox-ubt-serv-inst-02](/assets/blog/04-linux-04/vbox-ubt-serv-inst-02.png)
![vbox-ubt-serv-inst-03](/assets/blog/04-linux-04/vbox-ubt-serv-inst-03.png)
![vbox-ubt-serv-inst-04](/assets/blog/04-linux-04/vbox-ubt-serv-inst-04.png)
![vbox-ubt-serv-inst-05](/assets/blog/04-linux-04/vbox-ubt-serv-inst-05.png)
![vbox-ubt-serv-inst-06](/assets/blog/04-linux-04/vbox-ubt-serv-inst-06.png)
![vbox-ubt-serv-inst-07](/assets/blog/04-linux-04/vbox-ubt-serv-inst-07.png)
![vbox-ubt-serv-inst-08](/assets/blog/04-linux-04/vbox-ubt-serv-inst-08.png)
![vbox-ubt-serv-inst-09](/assets/blog/04-linux-04/vbox-ubt-serv-inst-09.png)
`Update to the new installer` 가 나오지 않으면 필수사항이 아니기 때문에 그대로 진행하면
된다.
![vbox-ubt-serv-inst-10](/assets/blog/04-linux-04/vbox-ubt-serv-inst-10.png)
![vbox-ubt-serv-inst-11](/assets/blog/04-linux-04/vbox-ubt-serv-inst-11.png)
![vbox-ubt-serv-inst-12](/assets/blog/04-linux-04/vbox-ubt-serv-inst-12.png)
_Search for third-party drivers_ 도 필수사항은 아니다.
![vbox-ubt-serv-inst-13](/assets/blog/04-linux-04/vbox-ubt-serv-inst-13.png)
_enp0s8_ 인터페이스에 할당된 IP 주소를 사용하게 될 것이다.
![vbox-ubt-serv-inst-14](/assets/blog/04-linux-04/vbox-ubt-serv-inst-14.png)
![vbox-ubt-serv-inst-15](/assets/blog/04-linux-04/vbox-ubt-serv-inst-15.png)
![vbox-ubt-serv-inst-16](/assets/blog/04-linux-04/vbox-ubt-serv-inst-16.png)
[LVM][LVM] 구성에 대한 안내를 보여준다.
![vbox-ubt-serv-inst-17](/assets/blog/04-linux-04/vbox-ubt-serv-inst-17.png)
![vbox-ubt-serv-inst-18](/assets/blog/04-linux-04/vbox-ubt-serv-inst-18.png)
[디스크 파티션][디스크 파티션] 레이아웃을 확정한 뒤에는 되돌릴 수 없다는 경고가 나온다.
가상머신 내에서는 실수를 하더라도 [호스트][호스트]에 영향을 주지 않는다는 점이
편리하다고 할 수 있다.
_Continue_ 하여 계속 진행한다.
![vbox-ubt-serv-inst-19](/assets/blog/04-linux-04/vbox-ubt-serv-inst-19.png)
![vbox-ubt-serv-inst-20](/assets/blog/04-linux-04/vbox-ubt-serv-inst-20.png)
원격접속을 받기 위해서 _Install OpenSSH server_ 체크
이 단계에서 실수로 sshd 설치를 하지 않고 넘겨버렸어도 운영체제 설치가 끝난 뒤에
`sudo apt install openssh-server` 를 설치하면 된다.
![vbox-ubt-serv-inst-21](/assets/blog/04-linux-04/vbox-ubt-serv-inst-21.png)
![vbox-ubt-serv-inst-22](/assets/blog/04-linux-04/vbox-ubt-serv-inst-22.png)
[오케스트레이션][오케스트레이션], [RDBMS][RDBMS] 툴 등을 사전 설치할 것인지
보여주고 있는데 아무 것도 선택하지 않아도 된다.
![vbox-ubt-serv-inst-23](/assets/blog/04-linux-04/vbox-ubt-serv-inst-23.png)
![vbox-ubt-serv-inst-24](/assets/blog/04-linux-04/vbox-ubt-serv-inst-24.png)
모든 작업이 끝난 뒤 `Reboot Now` 메세지에 엔터를 쳐서 재부팅을 한다.
![vbox-ubt-serv-inst-25](/assets/blog/04-linux-04/vbox-ubt-serv-inst-25.png)
만약 재부팅이 안 되고 `Please remove the installation medium, then press ENTER:`
라고 표시가 된다면 상단 `Machine` 메뉴에서 `Reset` 을 누르면 된다.
![vbox-ubt-serv-inst-26](/assets/blog/04-linux-04/vbox-ubt-serv-inst-26.png)
![vbox-ubt-serv-inst-27](/assets/blog/04-linux-04/vbox-ubt-serv-inst-27.png)
재부팅이 끝나면 화면에 나온 메세지를 밀어내기 위해서 엔터를 누른 뒤 로그인을 한다.
![vbox-ubt-serv-1](/assets/blog/04-linux-04/vbox-ubt-serv-1.png)
`ip addr` 를 실행하면 설치할 때 _enp0s8_ [NIC][NIC]로 할당됐던 IP 주소가 나온다.
xubuntu에 이어서 두 번째 Host-only Adapter를 사용했기 때문에 `192.168.56.102`
들어가 있을 것이다.
![vbox-ubt-serv-2](/assets/blog/04-linux-04/vbox-ubt-serv-2.png)
모든 작업을 [리눅스 프레임버퍼][리눅스 프레임버퍼] 내에서 처리할 수 있지만
마우스 포인터로 복사/붙여넣기를 하고 싶다면 Cygwin에서 ssh로 원격접속을 하면 된다.
- `systemctl status sshd` 로 ssh 서버 구동상태 확인
- Cygwin에서 `ssh ubuntu-server@192.168.56.102` 로 접속
![vbox-ubt-serv-3](/assets/blog/04-linux-04/vbox-ubt-serv-3.png)
![vbox-ubt-serv-4](/assets/blog/04-linux-04/vbox-ubt-serv-4.png)
- `sudo shutdown -h now` 로 우분투 서버 종료
![shutdown](/assets/blog/04-linux-04/shutdown.png)
X가 없는 [로그인 매니저][로그인 매니저]에서는 마우스 포인터로 시스템을 끌 수 없고
[shutdown][shutdown] 커맨드로 끄면 된다.
---
- 다시 가상머신 시작
- `sudo apt install bind9`
- `systemctl status named` 로 서비스 상태 확인
- `cd /etc/bind`
- `ls -l`
![bind9-inst](/assets/blog/04-linux-04/bind9-inst.png)
![bind9-status](/assets/blog/04-linux-04/bind9-status.png)
![bind9-path](/assets/blog/04-linux-04/bind9-path.png)
- `cd /var/lib/bind`
- `sudo cp /etc/bind/db.local default-zone-data`
- `sudo vi default-zone-data`
- 다음과 같이 작성한다
```
$TTL 1h
@ IN SOA ns.example.tld. root.example.tld. (
2023021401 ; Serial
1h ; Refresh
1h ; Retry
1w ; Expire
1h ) ; Negative Cache TTL
;
NS ns.example.tld.
ns A 192.168.56.102
@ IN AAAA ::1
```
![bind-zone-default](/assets/blog/04-linux-04/bind-zone-default.png)
- `sudo vi /var/lib/bind/zone-example.tld`
```
$INCLUDE /var/lib/bind/default-zone-data
example.tld. IN A 192.168.56.101
```
![bind-zone-example](/assets/blog/04-linux-04/bind-zone-example.png)
- $[TTL][TTL]과 Refresh 값을 줄인다
`vi /etc/bind/named.conf` 에서 `named.conf.options`, `named.conf.local`,
`named.conf.default-zones` 를 포함하고 있다.
![bind-named-conf](/assets/blog/04-linux-04/bind-named-conf.png)
{/* ![bind-named-conf-options](/assets/blog/04-linux-04/bind-named-conf-options.png)
![bind-named-conf-local](/assets/blog/04-linux-04/bind-named-conf-local.png) */}
![dns-browser](/assets/blog/04-linux-04/dns-browser.png)
![mdns](/assets/blog/04-linux-04/mdns.png)
https://answers.microsoft.com/en-us/windows/forum/all/how-to-force-windows-10-to-use-dns/5b80e376-fa6a-4c6e-b59d-5eb5ec65c26d
![dns-preferred](/assets/blog/04-linux-04/dns-preferred.png)
![dns-flush](/assets/blog/04-linux-04/dns-flush.png)
![vbox-start-dns-and-web](/assets/blog/04-linux-04/vbox-start-dns-and-web.png)
[World Wide Web]: https://en.wikipedia.org/wiki/World_Wide_Web "www"
[nginx]: https://nginx.org/en/linux_packages.html#Ubuntu
[hosts]: https://en.wikipedia.org/wiki/Hosts_(file)
[Domain Name System]: https://en.wikipedia.org/wiki/Domain_Name_System "DNS"
[클라이언트]: https://en.wikipedia.org/wiki/Client_(computing) "Client"
[도메인]: https://en.wikipedia.org/wiki/Domain_name "Domain Name"
[ISP]: https://en.wikipedia.org/wiki/Internet_service_provider "Internet Service Provider"
[TLD]: https://en.wikipedia.org/wiki/Top-level_domain "Top-level Domain"
[ICANN]: https://en.wikipedia.org/wiki/ICANN
[KRNIC]: https://www.krnic.or.kr/jsp/resources/dns/dnsInfo.jsp
[루트 네임 서버]: https://en.wikipedia.org/wiki/Root_name_server "Root Name Server"
[Domain name registrar]: https://en.wikipedia.org/wiki/Domain_name_registrar
[zone 파일]: https://en.wikipedia.org/wiki/Zone_file "Zone File"
[A 레코드]: https://en.wikipedia.org/wiki/List_of_DNS_record_types "DNS 레코드 타입 목록"
[IPv6]: https://en.wikipedia.org/wiki/IPv6
[옥텟]: https://en.wikipedia.org/wiki/Octet_(computing) "Octet"
[16진수]: https://en.wikipedia.org/wiki/Hexadecimal "Hexadecimal"
[BIND]: https://en.wikipedia.org/wiki/BIND "Berkeley Internet Name Domain"
[데스크탑 환경]: https://en.wikipedia.org/wiki/Desktop_environment "Desktop Environment"
[AlmaLinux]: https://en.wikipedia.org/wiki/AlmaLinux
[커널]: https://en.wikipedia.org/wiki/Kernel_(operating_system) "Kernel"
[유저 랜드]: https://en.wikipedia.org/wiki/User_space_and_kernel_space "User space and kernel space"
[고가용성]: https://en.wikipedia.org/wiki/High_availability "High availability"
[LVM]: https://en.wikipedia.org/wiki/Logical_Volume_Manager_(Linux) "Logical volume manager"
[디스크 파티션]: https://en.wikipedia.org/wiki/Disk_partitioning "Disk partitioning"
[호스트]: https://en.wikipedia.org/wiki/Host_(network) "Host"
[오케스트레이션]: https://en.wikipedia.org/wiki/Orchestration_(computing) "Orchestration"
[RDBMS]: https://en.wikipedia.org/wiki/Relational_database#RDBMS
[NIC]: https://en.wikipedia.org/wiki/Network_interface_controller "Network interface controller"
[리눅스 프레임버퍼]: https://en.wikipedia.org/wiki/Linux_framebuffer "Linux framebuffer"
[로그인 매니저]: https://en.wikipedia.org/wiki/Login_manager "Login manager"
[shutdown]: https://www.freedesktop.org/software/systemd/man/shutdown.html# "shutdown(8)"
[TTL]: https://en.wikipedia.org/wiki/Time_to_live "Time to live"