|
개인 DNS 서버 구성하기: Bind 사용하기¶
전제 조건 및 가정¶
· Rocky Linux를 실행하는 서버
· 인터넷을 통하지 않고 로컬에서만 액세스해야 하는 여러 내부 서버
· 동일한 네트워크에 존재하는 동일한 서버에 액세스해야 하는 여러 워크스테이션
· 명령 줄에서 명령 입력에 익숙한 수준
· 명령 줄 편집기에 익숙함(이 예에서는 _vi_를 사용함)
· 방화벽 규칙을 생성하기 위해 firewalld 또는 iptables_를 사용할 수 있음. _iptables 방화벽 설정에 대한 옵션과 firewalld 방화벽 설정에 대한 옵션을 모두 제공합니다. _iptables_를 사용할 계획인 경우 Iptables 방화벽 활성화 절차를 사용하세요.
소개¶
외부 또는 공개 DNS 서버는 인터넷에서 호스트 이름을 IP 주소로 매핑하고 PTR("pointer" 또는 "reverse") 레코드의 경우 IP를 호스트 이름으로 매핑하는 데 사용됩니다. 이것은 인터넷의 필수적인 부분입니다. 이렇게 하면 메일 서버, 웹 서버, FTP 서버 또는 기타 많은 서버와 서비스가 어디에 있든 기대대로 작동합니다.
개인 네트워크, 특히 여러 시스템을 개발하는 데 사용되는 네트워크의 경우 Rocky Linux 워크스테이션의 /etc/hosts 파일을 사용하여 이름을 IP 주소에 매핑할 수 있습니다.
이것은 워크스테이션에서는 작동하지만 네트워크의 다른 기계에서는 작동하지 않습니다. 모든 기계에 적용하려면 시간을 들여 로컬, 개인 DNS 서버를 만들어 모든 기기에 대해 이를 처리하는 것이 가장 좋은 방법입니다.
공용 DNS 서버 및 리졸버를 생성하는 경우 이 저자는 Production 수준의 보다 견고한 PowerDNS 인증 및 재귀 DNS를 권장합니다. PowerDNS는 Rocky Linux 서버에 쉽게 설치할 수 있습니다. 그러나 이는 외부 세계에 DNS 서버를 노출하지 않을 로컬 네트워크에 대해서는 오버킬입니다. 이것이 우리가 이 예제에서 _bind_를 선택한 이유입니다.
DNS 서버 구성 요소 설명¶
앞서 언급한대로 DNS는 권한 서버와 재귀 서버로 서비스를 분리합니다. 이 서비스는 이제 서로 다른 하드웨어나 컨테이너에서 동작하는 것이 권장됩니다.
권한 서버는 모든 IP 주소와 호스트 이름의 저장 영역이며 재귀 서버는 주소와 호스트 이름을 조회하는 데 사용됩니다. 개인 DNS 서버의 경우 권한 및 재귀 서버 서비스가 함께 실행됩니다.
바인드 설치 및 활성화¶
첫 번째 단계는 패키지를 설치하는 것입니다. _bind_의 경우 다음 명령을 실행해야 합니다.
dnf install bind bind-utils
_bind_에 대한 서비스 데몬은 _named_이며, 이를 부팅 시 자동으로 시작하도록 활성화해야 합니다.
systemctl enable named
그런 다음 시작해야 합니다.
systemctl start named
구성¶
구성 파일을 변경하기 전에, 원래 설치된 작동 파일의 백업 복사본을 만드는 것이 좋습니다. 이 경우 _named.conf_입니다.
cp /etc/named.conf /etc/named.conf.orig
그렇게 하면 구성 파일에 오류가 도입되면 나중에 도움이 됩니다. 변경하기 전에 백업 복사본을 만드는 것은 항상 좋은 생각입니다.
이러한 변경 사항은 named.conf 파일을 편집해야 합니다. 여기서는 _vi_를 사용하지만, 사용자의 즐겨찾는 명령 줄 편집기로 대체할 수 있습니다(_vi_보다 사용하기 쉬운 nano 편집기도 Rocky Linux에 설치되어 있습니다).
vi /etc/named.conf
먼저 "options" 섹션에 있는 이 두 줄을 "#" 기호로 주석 처리하여 localhost에서의 listening을 비활성화하고 외부로의 연결을 효과적으로 차단합니다. 이것이 하는 일은 외부 세계와의 연결을 효과적으로 차단하는 것입니다.
특히 워크스테이션에 이 DNS를 추가할 때 도움이 됩니다. DNS 서버는 요청하는 IP 주소가 로컬일 때만 응답하고 조회하는 서비스가 인터넷에 있는 서비스인 경우 아예 응답하지 않기를 원합니다.
이렇게 하면 다른 구성된 DNS 서버가 거의 즉시 인터넷 기반 서비스를 조회하게 됩니다.
options {
# listen-on port 53 { 127.0.0.1; };
# listen-on-v6 port 53 { ::1; };
마지막으로 named.conf 파일의 맨 아래로 이동하여 네트워크에 대한 섹션을 추가합니다. 우리의 예제에서는 ourdomain을 사용하므로 LAN 호스트에 원하는 이름을 대입하세요.
# 기본 순방향 및 역방향 영역
//forward zone
zone "ourdomain.lan" IN {
type master;
file "ourdomain.lan.db";
allow-update { none; };
allow-query {any; };
};
//reverse zone
zone "1.168.192.in-addr.arpa" IN {
type master;
file "ourdomain.lan.rev";
allow-update { none; };
allow-query { any; };
};
이제 변경 사항을 저장합니다(_vi_의 경우 SHIFT:wq!).
정방향 및 역방향 레코드¶
다음으로 /var/named에 두 개의 파일을 생성해야 합니다. 이 파일은 DNS에 포함하고 싶은 네트워크의 기계를 추가할 경우 편집할 파일입니다.
첫 번째 파일은 IP 주소를 호스트 이름에 매핑하는 전방 파일입니다. 여기서 다시 "ourdomain"을 예제로 사용합니다. 이 예제에서 로컬 DNS의 IP는 192.168.1.136입니다. 호스트는 이 파일의 끝에 추가됩니다.
vi /var/named/ourdomain.lan.db
이 파일을 편집한 후 다음과 같이 보일 것입니다.
$TTL 86400
@ IN SOA dns-primary.ourdomain.lan. admin.ourdomain.lan. (
2019061800 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
;Name Server Information
@ IN NS dns-primary.ourdomain.lan.
;IP for Name Server
dns-primary IN A 192.168.1.136
;A Record for IP address to Hostname
wiki IN A 192.168.1.13
www IN A 192.168.1.14
devel IN A 192.168.1.15
원하는 만큼 호스트와 그들의 IP 주소를 파일 맨 아래에 추가한 다음 변경 사항을 저장하세요.
그다음, 호스트 이름을 IP 주소에 매핑하는 후방 파일이 필요합니다. 이 경우, IP의 마지막 옥텟만 필요합니다(IPv4 주소에서는 점으로 구분된 각 숫자는 옥텟입니다) 그리고 PTR과 호스트 이름을 추가해야 합니다.
vi /var/named/ourdomain.lan.rev
완료되면 파일은 다음과 같아야 합니다.:
$TTL 86400
@ IN SOA dns-primary.ourdomain.lan. admin.ourdomain.lan. (
2019061800 ;Serial
3600 ;Refresh
1800 ;Retry
604800 ;Expire
86400 ;Minimum TTL
)
;Name Server Information
@ IN NS dns-primary.ourdomain.lan.
;Reverse lookup for Name Server
136 IN PTR dns-primary.ourdomain.lan.
;PTR Record IP address to HostName
13 IN PTR wiki.ourdomain.lan.
14 IN PTR www.ourdomain.lan.
15 IN PTR devel.ourdomain.lan.
전방 파일에 나타나는 모든 호스트 이름을 추가하고 변경 사항을 저장하세요.
이 모든 것이 의미하는 것¶
이 모든 내용이 추가되었고 bind DNS 서버를 재시작하기 전에, 이 두 파일에서 사용하는 몇 가지 용어에 대해 알아보겠습니다.
각 용어의 의미를 모르면 단순히 기능만 작동하는 것으로는 충분치 않습니다, 그렇지 않나요?
· TTL은 두 파일 모두에 나타나며 "Time To Live"를 나타냅니다. TTL은 DNS 서버가 캐시를 유지하는 시간으로, 새로운 복사본을 요청하기 전에 이 캐시를 유지할 시간을 DNS 서버에 알려줍니다. 이 경우 TTL은 특정 레코드 TTL이 설정되지 않으면 모든 레코드의 기본 설정입니다. 여기서는 86400초 또는 24시간입니다.
· IN은 "Internet"의 약어입니다. 이 경우 실제로 인터넷을 사용하지 않고, 이를 인트라넷으로 간주하세요.
· SOA는 "Start Of Authority(권한시작)"로서 도메인의 기본 DNS 서버를 나타냅니다.
· NS는 "name server"의 약어입니다.
· Serial은 DNS 서버가 영역 파일의 내용이 최신인지 확인하는 데 사용되는 값입니다.
· Refresh는 슬레이브 DNS 서버가 마스터로부터 영역 전송을 얼마나 자주 해야 하는지를 지정합니다.
· Retry는 영역 전송이 실패한 후 다시 시도하기까지의 시간을 지정합니다.
· Expire는 마스터에 연결할 수 없을 때 슬레이브 서버가 쿼리에 응답해야 하는 대기 시간을 지정합니다.
· A는 호스트 주소 또는 전방 레코드를 나타내며 전방 파일에만 사용됩니다(위에 표시됨).
· PTR은 "포인터" 또는 "역"으로 더 잘 알려져 있으며 후방 파일에만 사용됩니다(위에 표시됨).
구성 테스트¶
모든 파일을 추가한 후 bind 서비스를 다시 시작하기 전에 구성 파일과 영역이 잘 작동하는지 확인해야 합니다.
주요 구성을 확인하세요:
named-checkconf
모두 정상이라면 빈 결과를 반환해야 합니다.
그런 다음 정방향 영역을 확인합니다.
named-checkzone ourdomain.lan /var/named/ourdomain.lan.db
모두 정상이면 다음과 같이 반환됩니다.
zone ourdomain.lan/IN: loaded serial 2019061800
OK
그리고 마지막으로 역방향 영역을 확인합니다.
named-checkzone 192.168.1.136 /var/named/ourdomain.lan.rev
모두 정상이면 다음과 같은 결과를 반환해야 합니다.
zone 192.168.1.136/IN: loaded serial 2019061800
OK
모든 것이 정상으로 보인다면 _bind_를 다시 시작합니다.
systemctl restart named
9 LAN에서 IPv4 사용¶
LAN에서 오직 IPv4만 사용하려면 /etc/sysconfig/named에서 하나의 변경사항을 해야 합니다.
vi /etc/sysconfig/named
그런 다음 파일 맨 아래에 다음을 추가하십시오.
OPTIONS="-4"
이제 변경 사항을 저장합니다(_vi_의 경우 SHIFT:wq!).
9 컴퓨터 테스트¶
로컬 DNS에 추가한 서버에 액세스하려는 각 시스템에 DNS 서버(예: 192.168.1.136)를 추가해야 합니다. Rocky Linux 워크스테이션에서 이 작업을 수행하는 방법에 대한 예를 보여줄 뿐이지만 Windows 및 Mac 시스템뿐만 아니라 다른 Linux 배포판에도 유사한 방법이 있습니다.
현재 할당된 DNS 서버를 대체하는 대신 DNS 서버를 목록에 추가하면 됩니다. 인터넷 접속을 위해 현재 할당된 DNS 서버가 필요하기 때문입니다. 이러한 DNS 서버는 DHCP(Dynamic Host Configuration Protocol)에 의해 할당되거나 정적으로 할당될 수 있습니다.
nmcli를 사용하여 로컬 DNS를 추가한 다음 연결을 재시작하세요.
??? "바보같은 프로필 이름" 경고
NetworkManager에서 연결은 장치 이름이 아닌 프로필 이름으로 수정됩니다. 이것은 "유선 연결 1" 또는 "무선 연결 1"과 같은 것일 수 있습니다. 매개변수 없이 `nmcli`를 실행하여 프로파일을 볼 수 있습니다.
```
nmcli
```
그러면 다음과 같은 출력이 표시됩니다.
```bash
enp0s3: connected to Wired Connection 1
"Intel 82540EM"
ethernet (e1000), 08:00:27:E4:2D:3D, hw, mtu 1500
ip4 default
inet4 192.168.1.140/24
route4 192.168.1.0/24 metric 100
route4 default via 192.168.1.1 metric 100
inet6 fe80::f511:a91b:90b:d9b9/64
route6 fe80::/64 metric 1024
lo: unmanaged
"lo"
loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
DNS configuration:
servers: 192.168.1.1
domains: localdomain
interface: enp0s3
Use "nmcli device show" to get complete information about known devices and
"nmcli connection show" to get an overview on active connection profiles.
```
연결 수정을 시작하기 전에 인터페이스 이름과 같이 적절한 이름을 지정해야 합니다(**참고사항** 아래의 "\"는 이름의 공백을 이스케이프 처리함).
```
nmcli connection modify Wired\ connection\ 1 con-name enp0s3
```
이 작업을 완료한 후 `nmcli`를 다시 실행하면 다음과 같은 내용이 표시됩니다.
```bash
enp0s3: connected to enp0s3
"Intel 82540EM"
ethernet (e1000), 08:00:27:E4:2D:3D, hw, mtu 1500
ip4 default
inet4 192.168.1.140/24
route4 192.168.1.0/24 metric 100
route4 default via 192.168.1.1 metric 100
...
```
이렇게 하면 DNS의 나머지 구성이 훨씬 쉬워집니다!
연결 프로파일 이름이 "enp0s3"인 것으로 가정하고, 이미 구성된 DNS를 유지하면서 로컬 DNS 서버를 추가합니다:
nmcli con mod enp0s3 ipv4.dns '192.168.1.138,192.168.1.1'
여러 개의 DNS 서버를 가질 수 있으며, 공용 DNS 서버로 구성된 기기의 경우 구글의 공개 DNS와 같이 다음과 같이 할 수 있습니다:
nmcli con mod enp0s3 ipv4.dns '192.168.1.138,8.8.8.8,8.8.4.4'
원하는 DNS 서버를 연결에 추가한 후, 로컬 DNS 서버의 호스트를 ourdomain.lan으로 해결할 수 있으며 인터넷 호스트도 해결할 수 있습니다.
9 방화벽 규칙 - firewalld¶
기본적으로 firewalld
Rocky Linux 9.0 이상에서는 `iptables`` 규칙 사용이 중지되었습니다. 대신 firewalld를 사용해야 합니다.
네트워크나 서비스에 대해 어떤 가정도 하지 않습니다. 단지 LAN 네트워크에 대한 SSH 액세스와 DNS 액세스를 활성화하려 합니다. 이를 위해 기본 제공되는 `firewalld`` zone인 "trusted"를 사용합니다. 또한 "public" zone에서 SSH 액세스를 LAN에 한정하기 위해 일부 서비스 변경이 필요합니다.
첫 번째 단계는 LAN 네트워크를 "신뢰할 수 있는" 영역에 추가하는 것입니다.
firewall-cmd --zone=trusted --add-source=192.168.1.0/24 --permanent
다음으로, 두 가지 서비스를 "trusted" zone에 추가해야 합니다.
firewall-cmd --zone=trusted --add-service=ssh --permanent
firewall-cmd --zone=trusted --add-service=dns --permanent
마지막으로, 기본적으로 활성화된 "public" zone에서 SSH 서비스를 제거해야 합니다.
firewall-cmd --zone=public --remove-service=ssh --permanent
다음으로 방화벽을 다시 로드하고 변경한 zone을 나열합니다.
firewall-cmd --reload
firewall-cmd --zone=trusted --list-all
위와 같이 서비스와 소스 네트워크를 올바르게 추가했다면 다음과 같이 나와야 합니다.
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces:
sources: 192.168.1.0/24
services: dns ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
"public" zone을 나열하면 SSH 액세스가 허용되지 않은 것을 확인할 수 있습니다.
firewall-cmd --zone=public --list-all
다음과 같이 표시됩니다:
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
이러한 규칙은 192.168.1.0/24 네트워크의 호스트로부터 로컬 DNS 서버의 DNS 해결을 가능하게 합니다. 또한 이러한 호스트에서 로컬 DNS 서버로 SSH를 할 수 있습니다.
결론¶
개별 워크스테이션에서 /etc/hosts를 사용하면 내부 네트워크의 시스템에 액세스할 수 있지만 해당 시스템에서만 사용할 수 있습니다. _bind_를 사용하여 개인 DNS 서버를 추가함으로써 DNS에 호스트를 추가하고, 워크스테이션이 이 개인 DNS 서버에 액세스할 수 있다면 이러한 로컬 서버에 액세스할 수 있습니다.
인터넷에서 기계를 해결해야 하는 필요가 없지만 여러 기기에서 로컬 서버로 로컬 액세스가 필요한 경우, 개인 DNS 서버를 사용하는 것을 고려해 보세요.
|