[Linux] nameserver, DHCP, forwarding

gununoo·2022년 7월 25일
3

Linux

목록 보기
6/10
post-thumbnail
post-custom-banner

Server

  • web (apache ? nginx > IIS .. )
  • FTP(File Transfer Protocol)
  • email(POP3, SMTP)
  • NFS, iSCSI(EBS)->SCSI
  • Samba -> linux(xfs, ext4)와 windows(NTFS, Fat32) 간의 공유 폴더 구축

DNS server

  • Domain Name System
  • 도메인에 대한 ip 정보 전달
  • 기능
      1. 캐시 네임 서버
      1. 도메인을 관리 -> 마스터 네임 서버, Slave 네임 서버
        도메인 -> Public/Private
        Private 도메인 -> .com, .co.kr 등을 쓰면 다른 도메인과 겹칠 수 있으므로 주소 .pri를 씀

캐시 네임 서버 구성

vi /etc/named.conf 
listen-on port 53 { any; };

53번 포트 listen -> 서비스 대기 상태

allow-query     { any; };

DNS 요청 -> 누구든지 자신에게 물어본다면 응답을 주겠음

마스터 네임 서버 구성

vi /etc/named.conf 
zone "gunwoo.com" IN {
  type master;
  file "gunwoo.com.db";
  allow-update { none; };
};

zone은 여러 개 구성 가능

vi /var/named/gunwoo.com.db 
$TTL            3H
@       SOA     @       root. ( 2 1D 1H 1W 1H )
        IN      NS      @
        IN      A       192.168.1.116

www     IN      A       192.168.1.116

shop    IN      A       192.168.1.199 
hr      IN      A       192.168.1.101

TTL 3H -> ip 주소를 캐시에 3시간 저장함
root -> 자기가 최상위 서버임
2(serial 번호) -> 내가 만약 slave라면 master의 serial 번호와 비교하여 더 높은 번호를 가지고 있다면 master에게 업데이트된 정보를 요청해야한다. 시리얼 번호는 일반적으로 날짜, 시간 등을 이용하여 작성하는 경우가 많다. ex) 2022072510
1D(refresh) -> 2차 네임서버가(slave) 1차 네임서버에 접속하는 시간. 하루에 한 번 slave가 master에 접속해서 serial 번호를 비교한다.
1H(retry) -> 접속 실패 시 재접속 시간. 1D로 한 번 접속했는데 연결이 안 될 경우 1시간 이후 재접속해 보겠다.
1W(expire) -> 1차 네임서버에 데이터가 없다면 1주일 후에 삭제. 1주일 이내에는 master가 서비스를 하지 않더라도 slave에서 지속적으로 서비스를 제공한다.
1H(minimum) -> 만약 master로부터 정보를 query한 뒤 받았다면 1H 동안 보관해라. 단, 위에 TTL 3H가 있다면 3H가 우선한다. 따라서 캐시에 저장하는 시간은 3H가 된다.
IN -> 클래스 이름으로, internet을 의미한다.
NS -> Name server
IN NS @ -> 내가 gunwoo.com의 네임서버이다.
A -> 도메인에 대한 IP 정보
IN A 192.168.1.116 -> gunwoo.com의 네임서버 주소는 1.116이다.
www IN A 192.168.1.116 -> www.gunwoo.com의 IP 주소는 1.116이다.
shop IN A 192.168.1.199 -> shop.gunwoo.com의 ip 주소는 1.199이다.
CNAME -> 도메인에 대한 별칭. 주로 하나의 도메인에 여러 IP 정보를 연결하여 사용하고자 할 때 사용한다.

cname(canocical name)

vi /etc/named.conf 
www IN CNAME websrv.gunwoo.com. 
websrv 100 IN A 1.1.1.1 
       200 IN A 1.1.1.3 
       300 IN A 1.1.1.4 

세 서버(로드밸런서)에 라운드로빈 방식으로 처리하게끔 설정할 수 있다.

dig www.naver.com 

Anycast

특히 anycast라는 통신 방법을 사용하면 동일 주소에 대하여 물리 서버를 다르게 구성하고 가까운 거리에 있는 사람들은 자신과 가까운 서버로 접속하게 된다.
(IPv6에서는 broadcast라는 개념이 사라졌다. 이를 해결하기 위한 용도로 anycast를 활용하기도 한다.)

ipv4 anycast
https://tech.kakao.com/2014/05/29/anycast/

DHCP

Dynamic Host Configuration Protocol

  • UDP/67(s),68(c)

iana port number registry에서 포트 넘버 검색할 수 있음
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
bootps -> server -> 67
bootpc -> client -> 68

  1. 전원 켜기 -> 자신의 IP 구성 방식 확인(만약 정적 구성이라면 해당 주소를 자신의 NIC에 할당하고, 동일 ip를 확인하기 위해 gratuitous ARP를 발생시킨다)
  2. ip 주소 요청(DISCOVER: 목적지 -> 255.255.255.255)
  3. DHCP는 자신의 dhcp binding table(어떤 mac이 어떤 ip 주소를 언제까지 사용할 수 있는지가 기록되어있음)에 할당되지 않은 주소를 dhcp pool에서 꺼내어 pc에게 전달(OFFER)한다.
  4. OFFER를 받은 pc는 해당 오퍼에 대하여 REQUEST를 전달한다. -> 해당 주소를 다른 pc가 사용하고 있는지 여부를 확인(gratuitous ARP)한다.
  5. 서버는 최종적으로 해당 주소에 대한 binding table을 작성(ACK).
  6. 전원을 끄면 ip주소를 반납하고 pool에 들어간다.

default-lease-time(1일) -> 해당 시간이 되면 pc가 동작 중인지 여부를 확인한다. pc로부터 응답이 돌아오면 임대 기간을 갱신하여 계속 사용할 수 있도록 해준다.
max-lease-time(1일 1시간)

DNS/웹서버/DHCP 실습

centos8: DNS, 웹서버 -> VMnet10(VMWS에서 변경) -> 211.183.3.88
centos7: 일반 PC -> VMnet10 -> DHCP를 이용하여 211.183.3.201~239 사이에서 할당 받음

centos8 -> DNS서버(캐시네임서버, 마스터네임서버)
관리하는 도메인 주소: test.pri
웹서버: www.test.pri
DHCP 서버로 동작
1. 211.183.3.201 ~ 201.183.3.239 할당
2. DNS: 211.183.3.8

실습을 위해 VMWS에서 제공하는 DHCP 기능 끄기
virtual network editor 열기
user local dhcp service 체크 해제하기

[centos8]

systemctl set-default multi-user.target
reboot

-> boot level cli로 변경

[작업순서]
step 1. cli를 이용하여 server(centos8)의 ip 주소를 211.183.3.88로 입력한다.
기본 게이트웨이는 211.183.3.2가 되어야 한다.
DNS 정보는 향후 이 서버가 test.pri에 대한 master 네임 서버로 동작할 계획임을 감안하여 등록한다.
[centos8]

vi /etc/sysconfig/network-scripts/ifcfg-ens160
IPADDR=211.183.3.88
GATEWAY=211.183.3.2
DNS1=127.0.0.1  
DNS2=8.8.8.8

DNS1 -> www.test.pri는 본인(127.0.0.1)이 처리함
DNS2 -> 나머지는 8.8.8.8이 처리함

reboot

step 2. 웹서버, DNS, DHCP 서비스를 위하여 방화벽과 SELinux는 편의상 비활성화 시켜둔다.

systemctl diable firewalld 
getenforce 

step 3. 웹서비스를 활성화시킨다.

systemctl restart httpd 

step 4. 캐시네임서버와 마스터네임서버(test.pri)를 구성하되, 내부에 www 정보를 zone 파일에 등록한다. 단, 웹서버는 자기 자신이다.
[캐시네임서버 구성]

yum -y install bind bind-chroot
vi /etc/named.conf
listen-on port 53 { any; };
listen-on-v6 port 53 { none; };
allow-query     { any; };
dnssec-validation no;

위와 같이 변경

systemctl restart named
systemctl enable named
systemctl status named 
nslookup server 

-> 211.183.3.88

[마스터네임서버 구성]

vi /etc/named.conf 
zone "test.pri" IN {
  type master;
  file "test.pri.db";
  allow-update { none; };
};

위 코드 추가

named-checkconf

cd /var/named/
touch test.pri.db 
vi test.pri.db 
$TTL            3H
@       SOA     @       root. ( 2 1D 1H 1W 1H )
        IN      NS      @
        IN      A       211.183.3.88

www     IN      A       211.183.3.88
systemctl restart named 

step 5. pc들을 위한 DHCP 서비스를 구성하고 활성화시킨다.
[centos8]

dnf -y install dhcp-server 
vi /etc/dhcp/dhcpd.conf 
ddns-update-style interim;
subnet 211.183.3.0 netmask 255.255.255.0 {
        option routers 211.183.3.2;
        option subnet-mask 255.255.255.0;
        range dynamic-bootp 211.183.3.201 211.183.3.239;
        option domain-name-servers 211.183.3.88;
        default-lease-time 10000;
        max-lease-time 50000;
}
systemctl restart dhcpd 

[centos7]

ifconfig eth0

-> 아직 ip주소가 없음

su -c 'systemctl restart NetworkManager'

step 6. pc는 ip주소 입력에 대하여 dhcp로 전환하고 211.183.3.201~239 사이의 주소를 할당받아야 한다. 또한 firefox를 실행한 뒤 주소창에 www.test.pri를 입력했을 경우 server의 웹페이지 내용이 보여야 한다. 또한 www.google.com을 입력했을 경우에도 정상적으로 페이지가 보여야 한다.
[centos7]

ifconfig eth0

-> 211.183.3.202
-> DHCP 서버로부터 ip주소를 할당받았음

http://www.test.pri 접속

www.google.com 접속

firewall

OS에서 포워딩 기능 활성화

cat /proc/sys/net//ipv4/ip_forward

1 -> ipforward를 해서 밖으로 빠져나감

만약 1이 아니라 0이라면

echo "1" > /proc/sys/net/ipv4/ip_forward

-> 1로 덮어씌우기

재부팅시 활성화 시키기

vi /etc/sysctl.conf 
net.ipv4.ip_forward = 1

systemctl start firewalld
systemctl status firewalld 

firewall-cmd --list-all 

-> 기본적으로 ssh 연결은 열려있음

firewall-cmd --get-default-zone 

public은 default zone임

firewall-cmd --zone=work --add-interface=eth1

인터페이스 eth1을 work zone에 추가

firewall-cmd --zone=work --add-service=ssh

-> ssh는 이미 work zone에 있음

firewall-cmd --zone=work --add-service=http 

http 서비스 추가

firewall-cmd --zone=work --add-port=8888/tcp

특정 포트를 지정할 수도 있음

firewall-cmd --zone=work --list-all

firewall-cmd --zone=work --remove-service=http
firewall-cmd --zone=work --list-all

http 서비스가 list에서 사라짐

firewall-cmd --permanent --add-port=80/tcp
firewall-cmd --permanent --add-port=3306/tcp

zone을 따로 지정하지 않고 default인 public에 저장됨 -> 재부팅 시에도 적용됨

firewall-cmd --reload 

방화벽 설정 적용

vi /etc/firewalld/zones/public.xml

위에서 허용했던 서비스(ssh, 80, 3306)이 있음

cd /etc/firewalld/zones 
cat public.xml > dbzone.xml
vi dbzone.xml 

-> dbzone이라는 zone 생성

<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Database</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm 
your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <port protocol="tcp" port="3306"/>
  <port protocol="tcp" port="33060"/>
</zone>

-> dbzone 설정 -> ssh, 3306번 포트, 33060번 포트를 열어놓음
-> 포트 번호를 입력하는 대신, ssh처럼 서비스 이름을 사용하고 싶음
-> xml파일을 만들어서 서비스 이름을 사용할 수 있음

firewall-cmd --reload
firewall-cmd --get-zones 

-> block dbzone dmz drop external home internal public trusted work

cd /etc/firewalld/services
cp /usr/lib/firewalld/services/ssh.xml ./mariadb.xml 

/user/lib/firewalld/services에는 ssh 등 다양한 서비스가 있음
ssh.xml을 가져와서 mariadb.xml 서비스를 만들 것임
업로드중..

vi mariadb.xml 
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>MARIADB</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed 
for this option to be useful.</description>
  <port protocol="tcp" port="3306"/>
</service>

위와 같이 이름(MARIADB), port번호(3306) 수정

firewall-cmd --reload 

방화벽 설정 적용

firewall-cmd --permanent --add-service=mariadb 

이제 mariadb라고 만든 서비스 이름을 사용할 수 있음

firewall-cmd --permanent --add-port=80/tcp

http://211.183.3.202:80 접속이 된다

[자주 사용하는 방화벽 설정 명령어]

firewall-cmd --permanent --add-port=3306/tcp 
firewall-cmd --reload 

centos7 VM 생성

centos7.iso 이미지 선택
name: CentOS_Bash
max disk size: 80 GB
power on this vm 체크 해제

ram: 8192
cpu: 1(processor), 4(cores), VT-x/EPT만 체크
cd/dvd -> remove
network -> VMnet0 (bridge)
usbcontroller, soundcard, printer -> remove

install centos7

installation destination
-> i will configure partitioning 선택
-> swap(10 GB), /boot(1 GB), /(10 GB), /cloud

network & hostname
hostname: gunwoo
configure
-> general -> automatically 체크
-> IPv4 settings -> manual
-> add -> ip: 192.168.1.116, netmask: 24, gw: 192.168.1.1, dns: 8.8.8.8

create user
-> user1
-> make this user administrator 체크

[실습 환경 구성하기]
1. wget, git, curl, vim을 설치한다

yum -y install wget curl git vim 
  1. 처음 시작 시 vi를 입력하면 자동으로 vim이 실행되도록 설정
vi .bashrc 
alias vi='vim'
  1. 방화벽과 selinux 종료
systemctl stop firewalld 

setenforce 0 
cat /etc/selinux/config | grep SELINUX
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  1. 내부 자원들, 가상 머신들이 서버를 통해 외부와 통신이 가능하도록 ip_forward 기능 활성화
echo "1" > /proc/sys/net/ipv4/ip_forward
  1. 업데이트(yum update)
yum update -y
  1. user1 사용자는 sudo를 통해 root의 명령어를 실행할 수 있다. 단, sudo 입력 시 패스워드 요구하지 말아야 한다.
vi /etc/sudoers 
## Allows people in group wheel to run all commands
# %wheel        ALL=(ALL)       ALL

## Same thing without a password
%wheel  ALL=(ALL)       NOPASSWD: ALL

wheel 검색하여 107 행 주석처리
110행(NOPASSWD 있는 행) 주석제거

  1. 재부팅
reboot

쉘 스크립트

touch test1.sh 
chmod +x test1.sh 

#!/bin/bash 

echo -n "What is your name?: "
echo $USER
echo 

echo "What is your name?: "
echo $USER 

-n: 바로 옆에 이어서 출력

./test1.sh 

#!/bin/bash 

echo -n "What is your name?: "

read name 

echo $name 

read name -> 사용자로부터 입력을 받기 위해 프롬프트 대기
-> 사용자가 입력한 값은 name 변수에 담긴다

./test1.sh 

일반 변수를 환경변수로 사용하고 싶다면 export 환경변수=값
환경변수는 모든 시스템 내에서 동이랗게 사용할 수 있다.
일반적으로 환경변수는 대문자를 사용하고 사용자 변수는 소문자를 사용한다.

printenv 

환경 변수 확인

profile
take a look
post-custom-banner

0개의 댓글