linux service 2

김수민김수민
9 min read

Table of contents

vagrant 가상머신 배포 자동화 vagrantfile 안 구성내용을 자동배포 vagrant up vagrant halt 종료 vagrant destroy 제거 vagrant snapshot save vagrant snapshot restore vagrant ssh VMNAME 접속 vagrant status vagrant box add generic/rocky9 이미지 다운 vagrant plugin install vagrant-disksize vagrant-hostmanager 디스크 작업 코드로 할때, 호스트네임 설정

vagrant 설치 재부팅 폴더생성 vagrant init 초기 생성된 Vagrantfile 수정 해당폴더이동 vagrant up vagrant ssh VMNAME

vol2 ls -Z 파일 컨텍스트 ps -Z 프로세스 selinux 보안 컨텍스트 위주 + boolean 스위치 set/getenforce 주로씀, 설정은 root만 가능 enforcing과 permissive 는 메모리에 올라온 상태 semanage fcontext 파일 port 포트 boolean 스위치(부득이한 경우) 기본값 설정 -l 리스트, -a 추가, -d 제거 chcon 임시변경 restorecon 원래값 되돌리기 semanage fcontext 패키지설치필요 dnf provides semanage 명령어 검색 dnf search SELinux 키워드검색

dns 자연어주소와 ip주소를 변환해주는 서버 /etc/hosts, /etc/resolve.conf recursive query - 클라이언트가 요청한 dns에서만 응답받는것 iterative query - 요청을 수신한 dns가 tlds부터 단계적으로 질의하는 과정 mail.google.com 에서 mail은 zone A ipv4 주소 레코드 AAAA ipv6 주소 레코드 CNAME 별칭 PTR 포인터, 역방향 조회시 필요 google.com ->219.222.212.22 정방향 조회 219.222.212.22 -> google.com 역방향 조회 조회 nslookup, host, dig 어느걸 쓰든 상관없음

서비스구성 0. 네트워크 구성

  1. 패키지 설치 - 실행파일이나 명령어도구

  2. 서비스 실행 - 설정가능한 경우

  3. 서비스 설정 - 설정파일, 사용자, 권한, selinux...

  4. 서비스 재시작 - 설정변경시

  5. 자체 검증

  6. 방화벽 설정

node1 sudo dnf list/info bind sudo dnf install bind sudo vi /etc/named.conf listen-on port 53 any; 192.168.56.102; 내가 가지고 있는 인터페이스중 어디에서 받을것인가 - no prefix allow-query 192.168.0.56/24 or any 이 주소대역대의 요청을 받겠다 directory 기본값 주소

dns 역할을 할때 어떤 도메인 주소를 알려줄 수 있느냐 nobreak.co.kr. 이라는 사설도메인 내에서의 주소, . 반드시 필요 zone "nobreak.co.kr." IN { type master; - 내 파일 안에서 읽어서 제공/slave 마스터에서 공유받아서 제공 file "data/nobreak.co.kr.zone"; - 디렉토리 기준 상대경로 }; - 빠뜨리면 서비스시작안됨

영역파일 위에서 설정한 zone file 위치에 만들기 sudo cp /var/named/named.empty /var/named/data/nobreak.co.kr.zone sudo vi /var/named/data/nobreak.co.kr.zone TTL 수명 @ origin 나자신? IN internet SOA 도메인에 대한 정보와 권한이 있음 -----수정 필요없음 마스터 네임서버 주소, 이 파일을 만드는 시스템의 주소 관리자의 이메일 주소, @는 약속문자이므로 .으로 대체 $TTL 3H 요청반환시 유지되는 시간 @ IN SOA ns.nobreak.co.kr. soomin.nobreak.co.kr. ( 이메일주소도 마지막에 . 1234 ; serial 마스터와 슬레이브 사이 확인하고 유지되는 기간 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS ns.nobreak.co.kr. ns (IN 생략가능) A 192.168.56.101 www A 192.168.56.10 blog A 192.168.56.20 news A 192.168.56.40 third CNAME map.nobreak.co.kr.

오류시 systemctl status 로 로그확인 sudo systemctl enable --now named host www.nobreak.co.kr 127.0.0.1 ㅡ> SERVERFAIL ls -l /var/named 소유권 확인 chown .named /var/named/data/nobreak.co.kr.zone restart 후 재검색 방화벽 추가 service dns

역방향 추가 sudo vi /etc/named.conf zone "56.168.192.in-addr.arpa" IN { type master; file "data/db.192.168.56"; }; sudo cp /var/named/named.empty /var/named/data/db.192.168.56 chown 그룹 추가 sudo vi /var/named/data/db.192.168.56 $TTL 3H @ IN SOA ns.nobreak.co.kr rname.invalid.io ( 0 ; serial 1D ; refresh 1H ; retry 1W ; expire 3H ) ; minimum NS ns.nobreak.co.kr. 101 PTR ns.nobreak.co.kr. 10 PTR www.nobreak.co.kr. 20 PTR news.nobreak.co.kr. 30 PTR blog.nobreak.co.kr.
host 192.168.56.10 localhost, 192.168.56.101 - dns 주소 설정은 named.conf 확인 localhost가 아닌 다른 주소로는 안될경우 방화벽 확인 SERVFAIL 접근이 안됨 NXDOMAIN 데이터가 없음

영역파일 만들고 관리 - master 복사해와서 사용 - slave

이중화 node 2 sudo dnf -y install bind sudo systemctl enable --now named sudo firewall-cmd --add-service=dns --permanent firewall reload

node1 allow transfer { SLAVE IP; }; sudo vi /etc/named.conf zone "nobreak.co.kr." IN { type master; file "data/nobreak.co.kr.zone"; allow-transfer { 192.168.56.102;}; };

zone "56.168.192.in-addr.arpa" IN { type master; file "data/db.192.168.56"; allow-transfer { 192.168.56.102; }; }; sudo systemctl rest named

node2 sudo vi /etc/named.conf listen on any; allow query any; zone "nobreak.co.kr." IN { type slave; file "slaves/nobreak.co.kr.zone"; masters { 192.168.56.101; }; }; zone "56.168.192.in-addr.arpa" IN { type slave; file "slaves/db.192.168.56"; masters { 192.168.56.101; }; masterfile-format text; - 안쓰면 복사할때 바이너리로, 쓰면 text로 가져옴 }; sudo systemctl rest named

방화벽 방화벽 기본설정 파일 /usr/lib/firewalld/zone, service block, drop, trusted 존 파일은 수정불가능 --get/set-default-zone --add/remove-port/service= --list-all --permanent --runtime-to-permanent --reload --change-interface 리스트 설정 {} rich rule - 더 세세하게

ntp ntpd or chronyd 둘중 하나만 켜져있어야함 allow 항목설정시 내가 제공해줄수 있음 + 방화벽설정

nfs v4를 주로씀 node1 sudo dnf -y install nfs-utils /etc/nfs.conf 건드릴 일은 많이 없음 /etc/exports, /etc/exports.d/ sudo mkdir /dirA sudo vi /etc/exports 어떤걸, 누구에게, 옵션 /dirA 192.168.56.102/32, *, 0.0.0.0 (sync/async,ro/rw,no_root_squash 클라이언트 root의 상속권한 무시. 주로 외부나스로 쓰려고할때 허용. sec. default sys, none 사용자권한 허용, krb5 인증, i 데이터 무결성, p 전부 암호화) sudo exportsfs -r 적용 exportfs 확인 sudo systemctl enable --now nfs-server 방화벽 체크

node2 sudo dnf -y install nfs-utils sudo mount -t nfs -o rw,sync 192.168.56.101:/dirA /mnt

클라이언트 쓰기권한 node1 sudo chmod +w /dirA

sudo systemctl enable --now remote-fs.target 필요? 적어도 클라이언트에는 필요한듯함 방화벽 active profile 확인

rpc-bind mountd 서버가 어떤 장치를 공유해주는지 검색해주는 기능

자동마운트 autofs 설치 sudo vi /etc/auto.master +dir:/etc/auto.master.d 확인 내부에 써도되고 새로 만들어도 됨 새로 만들때 확장자는 .autofs sudo vi /etc/auto.master.d/direct.autofs 직접맵 - 수동마운트와 비슷, 디렉토리 따로 만들고 연결 간접맵 - 조회될때 연결 간접와일드카드 - 서버가 공유해주는 모든 경로 vi mkdir /{direct,indirect,wild} vi mkdir /wild/{music,movie,doc} vi /etc/exportfs /direct (rw,sync) /indirect (rw,sync) /widl *(rw,sync) exportfs -r 매핑 파일 입력 vi /etc/auto.master.d/direct.autofs /- /etc/auto.direct start autofs

node2 vi /etc/auto.direct /direct -rw,sync 192.168.56.101:/direct sudo mkdir /direct sudo systemctl start autofs mount | grep autofs

node2 vi /etc/auto.master.d/indirect.autofs /indirect /etc/auto.indirect sudo vi /etc/auto.indirect nfs -rw,sync 192.168.56.101:/indirect dd

restart autofs

nfs-server, client, firewall 확인하기 직접맵 방식만 클라이언트에 포인트 자동생성 node2 마스터맵 파일 맵핑 파일 1 sudo dnf -y install nfs-utils 2 sudo dnf -y install autofs 3 sudi vi /etc/auto.master.d/direct.autofs 4 sudo vi /etc/auto.master.d/direct.autofs 5 sudo vi /etc/auto.direct 6 sudo vi /etc/auto.master.d/indirect.autofs 7 sudo vi /etc/auto.indirect 8 sudo vi /etc/auto.master.d/wild.autofs 9 sudo vi /etc/auto.wild 10 ls / 11 sudo mkdir /{wild,indirect} 12 sudo systemctl start autofs 13 sudo systemctl status nfs-client.target 14 ls / 15 ls /direct/ 16 mount 17 ls /indirect/ 18 cd /direct/ 19 sudo firewall-cmd --list-all 20 sudo firewall-cmd --add-service=nfs 21 sudo systemctl restart autofs.service

수동 mount, umount 로 접근, 해제 보안상 유리할수 있음, 세부설정 가능, 영구fstab 설정, 네트워크 점유 자동 접근하면 mount, 시간지나면 해제, 네트워크 효율

iscsi das 속도/보안 nas 파일단위 san 블록

설정 저장소추가 fdisk /dev/sdb install targetcli enable targetcli - 한줄로 실행도 가능 tab 명령어 목록

block 일반적 fileio 주어진 파일크기만큼 사용 passthrough scsi 블록과 같으나 오류 가능성이 있어 잘 안씀 ramdisk 메모리상, 저장안됨

/backstores/block create dev=/dev/sdb1 name=아무거나 ls iscsi create wwn=iqn.2024-09.kr.co.nobreak:server 이름순서가 크게 중요하진 않음 iscsi/iqn.2024-09.kr.co.nobreak:server/tpg1/acls create iqn.2024-09.kr.co.nobreak:client acl등록 iscsi/iqn.2024-09.kr.co.nobreak:server/tpg1/luns create /backstores/block/test_block 자원에 연결 ls 백스토어의 자원을 lun으로 할당하고 lun에 있는 유닛들만 acl에 등록될 수 있음 portal 서버의 인터페이스? exit firewall-cmd --add-service=iscsi-target

node2 install iscsi-initiator-utils enable --now iscsi cat /etc/iscsi/initiatorname.iscsi iqn.2024-09.kr.co.nobreak:client 서버측에 client로 등록했거나 등록할 값, 잘못쓰면 복구하기 어려워짐 sudo iscsiadm -m discovery -t st -p 192.168.56.101 서버검색 안되면 방화벽 문제 sudo iscsiadm -m node -T iqn.2024-09.kr.co.nobreak:server -l 로그인 안되면 이름 문제 sudo iscsiadm -m session -P3 확인 lsblk mkfs uuid는 lvm 혹은 파일시스템을 만들때 생김 mount iscsi 불러올때 이름이 달라질 수 있기때문에 fstab 등록시 uuid로 등록, 파일타입 _netdev - defaults 자리서버측과 네트워크가 안될경우 오랫동안 부팅시간이 걸린후 최종부팅실패

fstab - defaults 쓸값이 딱히 없을때 씀

이름 잘못설정했을때 로그인 실패 sudo iscsiadm -m node -T iqn..:server -o delete 로 검색 삭제후 리부팅 재부팅불가시 sudo systemctl stop iscsid.service sudo systemctl stop iscsid.socket 이름파일 수정후 검색후 로그인

디스크 추가 1.iscsiadm -m node -T iqn....:server -u 로그아웃후 -l fstab에 uuid로 등록된 경우가 아니면 랜덤으로 다시 읽어와서 순서가 바뀌기도 함 2.아니면 서버에서 server 혹은 client를 아이디를 여러개 운영해서 디스크마다 읽어오게 함

용량은 타겟에서 늘리고 파일시스템은 자동으로 늘어나지 않으니 growfs를 써야함

아파치 132 sudo dnf -y install httpd 133 sudo systemctl enable --now httpd 134 sudo firewall-cmd --add-service=http 135 sudo firewall-cmd --runtime-to-permanent

vi /etc/httpd/conf.d/httpd.conf ServerRoot 상대경로 설정시 시작위치 Listen Include 모듈위치 User Group ServerAdmin ServerName 특정도메인주소허용 루트 접근제어 DocumentRoot 제공디렉토리 <Directory /var/www/html> 접근제어 AllowOverride 추가설정 사용여부 - 설정이 많아질수록 페이지가 느려지기때문에 추천안함 Require 사용자권한 <IfModule 특정 모듈 실행 </IfModule 특정 모듈 거부 <Files 파일 접근제어 ErroLog 에러로그위치 Loglevel 기록레벨 LogFormat alias 모듈 동적인 경우 스크립트 저장위치 설정 수정후 restart httpd

가상호스트 - 접속방식에 따른 페이지 이름, ip, 포트 /etc/httpd/conf.d/00-default.conf 추천형식, 설정파일을 글자순으로 읽어오기 때문 한 파일에 여러개 써도 되고, 각 설정마다 파일을 만들어도됨 <virtualhost *:80> DocumentRoot /var/www/default ServerName www.nobreak.co.kr <directory /var/www/default> AllowOverride None Require all granted
144 sudo vi /etc/httpd/conf.d/00-default.conf 145 sudo mkdir /var/www/default 146 echo 'dwlknl' | sudo tee /var/www/default/index.html 147 ls -lZ /var/www/default/ 148 ls -dlZ /var/www/default/ selinux 쓸경우 컨텍스트 확인후 httpd_sys_content가 아닐경우 교체필요 151 sudo vi /etc/hosts 클라이언트 192.168.56.101 www.nobreak.co.kr 152 sudo systemctl restart httpd curl www.nobreak.co.kr 클라이언트

https openssl genrsa -out private.key 2048 openssl req -new -key private.key -out cert.csr openssl x509 -req -signkey private.key -in cert.csr file ls -lZ mv private.key /etc/pki/tls/private/ mv cert.crt /etc/pki/tls/certs/ restorecon -Rv /etc/pki/tls install mod_ssl http연결 패키지 vi /etc/httpd/conf.d/ssl.conf Listen <VirtualHost default(=*):443> SSLEngine SSLCertificateFile /etc/pki/tls/certs/certs.crt SSlCertificateKeyFile /etc/pki/tls/private.key restart httpd firewall add https

동적컨텐츠 Common Gateway Interface cgi

node2 mv /etc/httpd/conf.d/0* . mv /etc/httpd/conf.d/ssl.conf . http 패키지만 남기고 전부 가져오기 install php ls /etc/httpd/conf.d/ php.conf vi /var/www/html/index.php

restart httpd 192.168.56.102 접속

db란 무엇인가?

객체 제거 추가 수정 레코드 제거 추가 수정 권한 회수 부여 작업단위 트랜잭션 ~커밋, 롤백, ddl atomity 가 훼손되었을때 백업속도 물리>논리(텍스트로 변환해야하기 때문에)

마리아디비설치 node4 install mariadb-server - mariadb 는 클라이언트 ls /var/lib/mysql <- db저장공간, 서비스 실행전 공간을 확보해놓아야 추가작업이 없음 enable now mariadb sudo mysql - 패스워드설정이 되어있지않고 일반 사용자로 root 접속은 허용되지 않음 sudo mysql_sercure_installation unix_socket n mysql -u root -p firewall add mysql cat /etc/my.cnf vi /etc/my.cnf.d/mariadb-server.cnf 접근제어 설정 autocommit=0/1 restart mariadb

node2 install php-mysqlnd 기존 http, php 설치빼고 scp /home/vagrant db,index.php mv /var/www/html 컨텍스트 확인 chcon -t httpd_sys_content_t /var/www/html/.php mv 로 옮길경우 원본이기때문에 컨텍스트가 같이 가지만 cp로 복사할경우 새파일이기때문에 상속된다 mysql -u root -p create database mydatabase; create user "php-user"@"%" identified by "123"; 모든 접속주소 grant select,insert,update,delete on mydatabase. 모든 테이블 to "php-user"@"%"; flush privileges; create table mydatabase.messages ( message varchar(20) ); insert into mydatabase.messages (message) values ( 'kim' ); commit;

mariadb 서비스 확인 mysql 방화벽 확인 setenforce 0 httpd_can_network_connect_db on 접속

오류 /var/log/httpd 확인

프록시 ha proxy https://www.server-world.info/en/note?os=CentOS_Stream_9&p=haproxy&f=1 install haproxy vi /etc/haproxy/haproxy.cfg 웹서버가 아니라 다른 서비스일 경우 global에서 http가 아닌 tcp로 바꿔야함 selinux 설정도 front 자기자신 back 통해서 연결할 서버들 frontend main bind *:80 default_backend app

backend app balance roundrobin server app1 192.168.56.102:80 check server app1 192.168.56.103:80 check

ss -nlpt 포트확인 start haproxy

, >> 리다이렉트는 권한이 없는 경우 사용불가 echo "" | sudo tee -a ~ 추가쓰기

/usr/share/doc 설정파일 샘플들

/var 자동설정 selinux /srv 만들땐 아니고 restorecon -Rv 다른 곳은 fcontext -a -t restorecon -Rvs

nmcli ipv4.dns = /etc/resolve.conf

<virtualhost *:80> DocumentRoot /var/www/first ServerName first.nobreak.co.kr <directory /var/www/first> AllowOverride None Require all granted
semanage httpd_use_nfs

리눅스 서비스 전체 실습 가이드 (SELinux 까지 설정하는 방식이 어려우면 일단은 setenforce 0 하고 실습 진행)

  1. 각각의 서버 구성해보기

    1. NFS 서버를 구성하고 클라이언트에서 /nfs 디렉토리에 마운트해보기

    2. Apache Web 서버를 구성하고 간단한 글자를 출력하는 index.html 파일을 만들어서 접속해보기

    3. iSCSI 타겟에서 논리볼륨(파티션)을 공유해주고 이니시에이터에서 /iscsi 디렉토리에 마운트해보기

    4. MariaDB 서버 설치하고 클라이언트에서 조회할 수 있는 데이터베이스 및 사용자 구성하기

  2. 웹서버와 NFS 연동하기

    1. NFS 서버에서 공유해주는 디렉토리에 index.html 파일 준비

    2. 웹서버의 /var/www/html 디렉토리에 마운트설정

    3. 호스트(윈도우)에서 웹서버로 접속해보기

  3. DB와 iSCSI 연동

    1. iSCSI 타겟에서 스토리지 준비 및 공유 설정

    2. 데이터베이스 서버를 구성할 시스템에 iSCSI 이니시에이터 설정

    3. /var/lib/mysql 디렉토리에 iSCSI로 공유받은 별도의 스토리지를 마운트

    4. 데이터베이스 구성 및 확인

  4. 웹 - 디비 연동

    1. 1번 단계에서 설정한 NFS 서버에서 공유파일을 PHP파일로 변경

    2. 데이터베이스 서버에서 사용자 및 테이블 등의 설정을 PHP와 맞춰서 구성

    3. 웹서버 접속 및 데이터베이스 조작 확인

  5. HAproxy 구성

    1. 위의 웹서버말고 새로운 웹서버(테스트용)를 하나 더 준비

    2. HAProxy 서비스 구성 (백엔드에 웹서버 2개의 주소 지정)

    3. 호스트에서 HAProxy 서버의 주소로 접속 및 확인

  6. DNS 연동

    1. 위 모든 서버들의 주소 정보를 DNS 서버에 영역파일로 작성 (HAProxy 제외)

    2. 각 파일(설정파일 및 PHP파일)의 IP주소 부분을 모두 이름주소로 변경

    3. 접속해서 확인

vm8

  1. httpd

  2. nfs server

  3. iscsi-server

  4. mariadb server

  5. httpd2

  6. haproxy

  7. dns

lvcreate 시 -l 에 오류로 나온 extent 숫자를 써주면 된다 -n lv명 vg명 php 설정시 index를 nfs 디스크에 저장했다면 selinux의 httpd nfs를 확인할것 mkfs 하기전엔 uuid가 나오지 않는다 공유디스크의 경우 특정 프로그램 폴더에 마운트할 경우 마운트 하기전과 후의 소유권이 달라진다 컨텍스트는 확인못했지만 달라지는것 같음

0
Subscribe to my newsletter

Read articles from 김수민 directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

김수민
김수민