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 정보를 연결하여 사용하고자 할 때 사용한다.
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라는 통신 방법을 사용하면 동일 주소에 대하여 물리 서버를 다르게 구성하고 가까운 거리에 있는 사람들은 자신과 가까운 서버로 접속하게 된다.
(IPv6에서는 broadcast라는 개념이 사라졌다. 이를 해결하기 위한 용도로 anycast를 활용하기도 한다.)
ipv4 anycast
https://tech.kakao.com/2014/05/29/anycast/
Dynamic Host Configuration Protocol
iana port number registry에서 포트 넘버 검색할 수 있음
https://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
bootps -> server -> 67
bootpc -> client -> 68
default-lease-time(1일) -> 해당 시간이 되면 pc가 동작 중인지 여부를 확인한다. pc로부터 응답이 돌아오면 임대 기간을 갱신하여 계속 사용할 수 있도록 해준다.
max-lease-time(1일 1시간)
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주소를 할당받았음
www.google.com 접속
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.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
vi .bashrc
alias vi='vim'
systemctl stop firewalld
setenforce 0
cat /etc/selinux/config | grep SELINUX
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
echo "1" > /proc/sys/net/ipv4/ip_forward
yum update -y
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 있는 행) 주석제거
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
환경 변수 확인