IT배움/자격증

리눅스마스터 1급 2차 2401 실기 모범답안 예상문제 만들기 (1~16문)

DongT 2025. 10. 30. 17:34
728x90
반응형

 



자격증 취득 준비할 겸 포스팅을 합니다.

해당 게시글에 문제가 있을 경우 댓글 달아주세요. (수정이 필요한 문구가 있거나, 문제 공유가 불가한 경우 등)

설명을 못 쓴 문제가 있으니 참고해주세요.



[1번 답안]

① -g kait
② -d /home/kait/ihdman 또는 -b /home/kait
③ -d /home/kait/ihdgirl (3번과 4번은 순서 무관)

④ -m

 

🎯답안해석

유저 및 그룹을 만들고 홈디렉토리를 설정하는 문제


✅ 예상문제
ihdman 계정을 생성할때, 그룹을 kait로 설정하고 홈 디렉토리를 직접 지정하려면 다음 중 어떤 옵션을 사용할 수 있는가?
useradd ①                                       ihdman


ihdgirl 계정도 별도로 생성하려고 한다. 홈디렉토리를 /home/kait/ihdgirl로 지정하고 홈 디렉토리를 자동으로 생성하는방법?
useradd                                          ihdgirl

 

📝 useradd 주요 옵션

-g: 기본 그룹 지정(gid 또는group명)
-u: uid 지정
-d: 홈 디렉터리 지정
-b: 홈 디렉터리 기준 경로 지정 (보통 -d와 함께는 사용 안 함, 상황에 따라 선택적)
-m: 홈 디렉터리 자동 생성

 


[2번 답안]

① -x -c"limit bsoft=100m bhard=110m ihduser"
② -x -c "limit isoft=1000 ihard=1100 ihduser" (큰따옴표대신에 작은따옴표도 가능)

 

🎯답안해석

디스크quota 문제. 특히xfs_quota 임. xfs 이하 fs타입 문제는안나오길 기도합니다.

 

✅ 예상문제 
다음은 사용자 ihduser에 대해 XFS 파일 시스템 상에서 블록과 inode 사용량 제한을 설정하는 과정이다.
각 단계에서 빈칸에 들어갈 알맞은 명령어를 쓰시오.

 

사용자 ihduser에게 soft 제한 100MB, hard 제한 110MB의 블록 사용량 제한을 설정한다.
xfs_quota ①                   /home
이어서, 사용자 ihduser에게 inode 수 제한을 soft 1000개, hard 1100개로 설정한다.
xfs_quota ②                     /home

 

📝 옵션 설명 

-x: XFS 전용 옵션. xfs_quota 명령으로사용해야함. project 기반
-c: 명령어를 직접 인자로 전달
  bsoft, bhard: 디스크 용량(블록 단위) 제한
  isoft, ihard: 파일 개수(inode 개수) 제한

 

(추가) 옵션을 그냥 쓴다고 쿼터가 지정되는게 아니라 미리 설정을 해야함.

1) 마운트 옵션 추가

    /home 디렉토리는지정하려면재부팅해야함

prjquota = project quota
(참고) ext4는usrquota

 

2) 프로젝트 ID 지정

프로젝트ID는 아무거나 상관없지만 관리편의를 위해 uid와 동일하게함

 

3) 이제 xfs_quota 명령 사용가능

  (참고) 쿼터지정안했을때오류메시지

xfs_quota: cannot set limits: Function not implemented (함수를구현하지않았습니다)

 

 

 


[3번 답안]

① crontab
② -r -u 또는 -ru
③ 0 * * * * 또는 0 */1 * * *

④ 1 3 * * 1,4,5

 

🎯답안해석

사실 문제에서 분명 스케쥴이라는 키워드가 포함되었을 것. crontab 또는 at이 등장하겠지만, 높은 확률로 crontab.

✅예상문제
ihduser 계정에 등록 된 스케쥴을 모두 지우고, 새로운 스케쥴을 아래 정보로 다시 등록해야한다.
1) /home/ihduser/script1.sh 는 매시 정각에 수행 되어야함.
2) /home/ihduser/script2.sh 는 매주 월,목,금요일 03시01분에 수행 되어야함.
 _______ ② _______ ihduser
① _______ -eu ihduser
③ _______ /home/ihduser/script1.sh
_______ /home/ihduser/script2.sh
또 다른 스케쥴 추가방법:  sudo echo " _______ /home/ihduser/script1.sh" >> /var/spool/cron/ihduser

 

 

📝  crontab 명령어 옵션
-l : 스케쥴보기
-e : 스케쥴생성/수정(vi편집툴이용)
-r : 스케쥴모두제거
-u : 특정계정의스케쥴지정

 

📝  crontab 필드 설명
분(0~59) 시(0~23) 일(1~31) 월(1~12) 요일(1(월)~7(일=0)) 명령어(bash or script)

 

 

 

 

 


[4번답안]

① jxf 또는-jxf
② gcc
③ -c

④ -o calc

 

🎯답안해석

C언어 소스파일을 압축해제하여 컴파일 및 결과물 추출하는 과정. 압축, 컴파일 관련 명령어 사용 예상.

✅예상문제
다음은 calc.tar.bz2에 압축되어 있는 C 소스 파일을 해제하고, 이를 컴파일하여 실행 파일 calc를 생성하는 과정이다.
빈칸에 들어갈 알맞은 명령어나 옵션을 쓰시오.


tar ① __________ calc.tar.bz2  
__________ main.c __________
gcc main.c __________

 

✅ 설명

(1) bzip2(tar.bz2) 으로 tar 압축된 파일 압축해제
(2) GNU C 컴파일러를 이용한 소스파일 컴파일. 단, 오브젝트파일(main.c)까지만 생성

(3) 생성된 오브젝트파일로 실행파일을 이름 지정(calc)하여 생성

 

📝 tar 압축 종류

gzip .tar.gz, .tgz tar -czvf 빠르고 범용적, 기본 압축률
bzip2 .tar.bz2, .tbz2 tar -cjvf gzip보다 압축률 높음 (느림)
xz .tar.xz tar -cJvf 압축률 매우 높음 (더 느림)
lzma .tar.lzma tar --lzma -cvf xz의 이전 버전 (거의 안 씀)
zstd .tar.zst tar --zstd -cvf 매우 빠르고 압축률 좋음 (최신)
compress .tar.Z tar -Zcvf 아주 옛날 방식 (거의 사용 안 함)

 -c 압축

 -x 압축해제

 -v 진행상황 출력

 -f 파일 지

 

📝 GNU C 컴파일 순서

소스.c
  ↓ (전처리, -E)
전처리된 코드
  ↓ (컴파일, -S)
어셈블리 코드 (.s)
  ↓ (어셈블, -c)
오브젝트 파일 (.o)
  ↓ (링크)
실행파일 (a.out)

 

 


[5번답안]  보완필요

 

① lsmod
② modprobe
③ -c

④ -r

 

🎯답안해석

C

 

 

✅예상문제(커널모듈확인및관리)
문제
시스템 관리자는 특정 디바이스의 커널 모듈을 확인하고, 필요시 모듈을 삽입하거나 제거하려고 한다.
아래 설명을 참고하여 각 단계에 알맞은 명령어나 옵션을 빈칸에 쓰시오.
①현재커널에 로드된 모듈 목록을 확인하고자 한다. 다음 명령어를 사용한다.
(1) __________
②특정모듈을 커널에 로드(삽입)하려면 어떤 명령어를 사용하는가?
(2) __________ [모듈명]
③모듈설정정보를확인하려면 modprobe 명령어에 어떤 옵션을 사용하는가?
modprobe (3) __________
④커널에서 모듈을 제거하려면 modprobe 명령어에 어떤 옵션을 사용하는가?
modprobe (4) __________ [모듈명]

 

📝

 

 

 

 


[6번답안]

① /proc/mdstat
② -C /dev/md2 (또는 --create /dev/md2)
③ -l 5 (또는 --level 5)

④ -n 3 (또는 --raid-devices 3)

 

 

🎯답안해석

답안에 mdstat, raid라는 문구가 있는걸로 리눅스 소프트웨어 raid 명령을 사용했다는걸 유추할 수 있다.

 

 

예상문제 (RAID 구성 - mdadm)

시스템 관리자는 /dev/sdb1, /dev/sdc1, /dev/sdd1 세 개의 디스크를 사용하여 RAID5 구성을 /dev/md2 장치로 만들려고 한다.

다음은 RAID를 구성하고, 진행 상태를 확인하는 과정이다.

빈칸에 알맞은 명령어나 옵션을 쓰시오.

 

mdadm (2) __________ (3) __________ (4) __________  /dev/sdb1 /dev/sdc1 /dev/sdd1

watch -n 1 cat (1) __________  ( 또는 while true; do cat  (1) __________ ; sleep 1; done; )

 

 

💡 보충 설명

명령어/옵션 설명
/proc/mdstat 현재 활성화된 RAID 상태 확인
-C / --create 새로운 RAID 장치 생성
-l / --level RAID 레벨 지정 (예: 0, 1, 5 등)
-n / --raid-devices RAID에 포함할 디바이스 수

 

📝 raid 설정 명령어 모음

상태 확인  cat /proc/mdstat
상세 확인  mdadm --detail /dev/md0
생성  mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/sd[abc]1
추가  mdadm /dev/md0 --add /dev/sdd1
실패표시  mdadm /dev/md0 --fail /dev/sdc1
제거  mdadm /dev/md0 --remove /dev/sdc1    (remove 전에 fail을 해줘야 안전함)
슈퍼블록 삭제  mdadm --zero-superblock /dev/sdc1
설정파일 갱신  mdadm --detail --scan >> /etc/mdadm.conf
모니터 실행  mdadm --monitor --scan --daemonise --mail=you@dom
Raid 해제  mdadm --stop /dev/md0
디스크 초기화  sudo mdadm --zero-superblock /dev/sde1    ( 주로 디스크를 다른 md에 붙이기 전에 사용 )

 

 

📌  추가 팁: 만약 "/" 파일시스템을 mdadm으로 생성시에는 부팅시 커널에 등록해줘야한다.

명령어: dracut -f

 

📌 추가 팁: 디스크 파티션 생성 간단 설명

- fdisk /dev/sdX 파티션 

n (새 파티션)

p (primary 타입 지정)

Enter (파티션 번호 default 1)

Enter (조회된 First Sector 지정)

Enter (조회된 Last Sector 지정: 100%)

p (print 생성된 파티션 조회)

t 8e (LVM코드 8e로 파티션 유형 지정. 타입리스트보기 l)

w (현재 상태 저장하고 fdisk 종료)

q (저장하지 않고 종료)

 

- parted /dev/sdX 파티션 

mklabel GPT (GPT 타입으로 label 지정. msdos(MBR), mac, bsd, sun 등의 타입이 있음)

mkpart [이름] [파티션 타입] [첫번호] [끝번호] (파티션 생성. mkpart만 쓰면 대화식으로 만들 수 있음)

print (생성된 파티션 확인)

q (종료. 따로 저장 없음)

 

 


[7번답안]

① mail.warn 또는 mail.warning 또는 mail.notice;mail.!=notice
② authpriv.*
③ :omusmsg:ihdman

④ mail,cron.* 또는 mail.*;cron.*

 

🎯답안해석

authpriv, .cron, .warn 등의 키워드로 syslog.conf인걸 알 수 있음. 로그 심각도와 대표 기능 몇가지를 알고 있어야함.

 

예상문제 (rsyslog 설정 - 로그 레벨 대상별 필터)

시스템 관리자는 다양한 로그 메시지를 필터링하여, 특정 사용자에게 메시지를 전달하거나 로그를 별도로 저장하려고 한다.

다음은 /etc/rsyslog.conf에 작성될 설정 예시이다.

각 빈칸에 알맞은 표현을 채우시오.

다음은 메일 관련 로그(mail facility) 중 warning 이상의 로그만 처리한다.

(1) __________                         /var/log/mail.warn

보안 인증 관련 로그(authpriv) 모두 /var/log/secure로 저장하려고 한다.

(2) __________                         /var/log/secure

사용자 ihdman에게 직접 메시지를 보내기 위한 설정이다.

 *.*                                            (3) __________

메일 크론 관련 모든 로그를 파일로 통합 저장하고자 한다.

(4) __________                        /var/log/mc.log

 

 

 

💡 보충 설명

 - 로그 위치: /etc/(r)syslog.conf

 - 로그 설정 양식: [Facility].[Severity]                 [로그저장위치 or 로그작동방식]

 

 

📝  로그의 Facility와 Severity

Facility (시설) 로그의 발생 위치 또는 종류를 의미 auth, cron, daemon, kern, mail, user, authpriv, local0~7 등
Severity (심각도) 로그의 중요도 또는 긴급도 수준을 의미 emerg, alert, crit, err, warning, notice, info, debug

 

📝  Syslog 로그 심각도(Severity Level) 정리

숫자 이름 (영문) 한글 설명 의미
0 emerg (panic) 비상 시스템 사용 불가 상태, 즉시 조치 필요
1 alert 경보 즉시 수정해야 할 심각한 문제
2 crit (critical) 치명적 하드웨어/시스템 구성에 치명적 장애
3 err (error) 오류 일반적인 오류 상황
4 warning (warn) 경고 문제 가능성, 주의 필요
5 notice 주의메시지 정상 동작 중 특별히 알아둘 사항
6 info 정보 일반 정보 메시지
7 debug 디버그 개발/분석용 세부 정보

 

📝 특수 작업

원격으로 로그 보낼 때 *.*     @log.example.com:514
*.*     @@log.example.com:514
UDP(@)
TCP(@@)
     

 

 UDP(@) TCP(@@) 프로토콜을 이용한 원격지 로깅 차이

*.*    @log.example.com:514

*.*    @@log.example.com:514

 

📝 특정 사용자에게 메시지 알람 보낼  (alice,bob)

*.err     :omusrmsg:alice,bob

 

📌 추가 팁:  심각도 필터하여 조회

  - 시스템 로그 journalctl (systemd 환경에서 사용하는 로그 뷰어)

심각도 필터링 명령
긴급 ~ 오류 (0~3) journalctl -p err
경고 이상 (4 이상) journalctl -p warning
정보 로그 포함 (6) journalctl -p info
디버그까지 전체 (7) journalctl -p debug

  - dmesg (커널 메시지 전용)

필터 설명
dmesg -T 시간 포함 전체 로그
dmesg --level=err,warn 오류 + 경고만
dmesg --level=emerg,alert,crit 치명적 메시지만

 

📌 추가팀: 로그 관련 명령어

- syslog.conf 검사

rsyslogd -N1

 

- config 재로드

systemctl reload rsyslog

systemctl restart rsyslog   (강제)

 

- 로그 수동 입력 명령어

logger "이것은 테스트 로그입니다"

logger -p local0.info "local0 INFO 레벨 테스트 메시지"

logger -p auth.warning "AUTH WARNING 테스트"

logger -p cron.err "CRON ERROR 테스트"

logger -p user.emerg "USER EMERGENCY 테스트"

 

 


[8번답안]

 

① dmesg  또는  /usr/bin/dmesg
② last -f  
③ /var/log/wtmp

④ lastlog -t 3

 

 

🎯답안해석

사용자 로그인 이력 위주로 시스템 점검하는 명령어

 

 

예상문제

시스템 관리자는 시스템 부팅 메시지를 확인하고, 사용자 로그인 이력 및 최근 로그인 정보들을 점검하고자 한다.

아래 작업 절차를 참고하여 빈칸에 알맞은 명령어나 파일명을 쓰시오.

 

시스템이 부팅되면서 출력한 커널 메시지를 확인하려고 한다.

① __________

 

사용자 로그인 기록을 /root/login.log으로 백업하고 그 파일을 확인하려고 한다.

cp ③ __________  /root/login.log

  __________  /root/login.log

 

최근 3 이내 로그인한 사용자 목록을 확인하려고 한다.

④ __________

 

 

💡 보충 설명

명령어/파일 설명
dmesg 커널 부팅 메시지 출력 (드라이버/하드웨어 초기화 등)
last 로그인/로그아웃 기록 출력 (wtmp 파일 참조)
last -f [파일] 특정 로그 파일에서 로그인 이력 확인
/var/log/wtmp 로그인 이력 기록 파일
lastlog 각 사용자의 마지막 로그인 정보 확인
lastlog -t 3 최근 3일 이내 로그인 사용자 출력

 

📝 시스템,커널 관련 모든 로그: /var/log/messages

 

📝 [참고] 로그인 기록 관련 주요 파일과 명령어

로그인 기록  /var/log/wtmp  명령어:  last
로그인 실패 기록  /var/log/btmp  명령어:  lastb
마지막 로그인 시간  /var/log/lastlog  명령어:  lastlog
현재 로그인 사용자  /var/run/utmp  명령어:  who, w
그 외 로그인 성공/실패 로그  /var/log/secure 로그파일 직접 읽을 수 있음

 

📝  명령어 주요 기능 참조 파일 주요 옵션 설명

last 로그인·로그아웃·재부팅 이력 조회 /var/log/wtmp -f <file> 다른 wtmp 파일 지정
      -n <N> 표시할 줄 수 제한
      -R 호스트명 숨김
      -a 접속한 호스트를 마지막 열에 표시
lastb 잘못된 로그인 시도 조회 (보안 실패 로그) /var/log/btmp -f <file> 다른 btmp 파일 지정
      -n <N> 표시할 줄 수 제한
      -R 호스트명 숨김
lastlog 사용자 최종 로그인 시점 조회 /var/log/lastlog -t <DAYS> 지정한 일수 이내에 로그인한 사용자만 표시
      -b <DAYS> 지정한 일수 이전에 로그인한 사용자 표시
      -u <UID> 특정 UID 또는 사용자 ID만 표시
who 현재 로그인 사용자 목록 표시 /var/run/utmp -a 모든 정보 표시 (idle, PID 등 포함)
      -q 로그인 사용자 이름만 간단히 표시
      -u 로그인 시간 및 idle 시간 표시
w 현재 로그인 사용자 + 실행 중 프로세스 요약 /var/run/utmp -h 헤더(첫 줄) 숨김
      -s 짧은 형식 출력
      -f 접속한 호스트명 표시/숨김 토글

 


[9번답안]  보완필요

 

① lsipc   또는 ipcs -l
② /proc/sys/fs/file-max

 

🎯답안해석

 

 

예상문제 (IPC 시스템 파일 핸들 제한 확인)

시스템 관리자는 리눅스 시스템에서 공유 메모리, 메시지 큐, 세마포어 등의 IPC 자원 상태와, 시스템 전체에서 열 수 있는 파일 수의 한계를 확인하려고 한다.

다음 작업 절차를 참고하여 빈칸에 알맞은 명령어나 파일 경로를 채우시오.

 

시스템에서 사용 중인 IPC 자원들에 대한 상세 정보(메모리, 메시지 큐, 세마포어 등)를 확인하려고 한다.

① __________

 

시스템이 허용하는 최대 열 수 있는 파일 디스크립터 수(file descriptor limit)를 확인하기 위해 다음 파일을 조회한다.

cat ② __________

 

💡 보충 설명

명령어/파일 설명
lsipc 공유 메모리, 메시지 큐, 세마포어 등 IPC 리소스 정보를 요약 출력
ipcs -l IPC 자원의 시스템 한계값 출력 (max segments, bytes 등)
/proc/sys/fs/file-max 커널이 동시에 열 수 있는 최대 파일 수 (시스템 전체 기준)

 

🧠 친숙치 않고 잘 모르겠는건 그냥 패스할까

 


[10번답안]

 

① cpio
② -ovF
③ -tF  또는  -itF

④ -ivF


🎯답안해석

파일 및 디렉토리 백업 및 복구. 옵션 및 명령어 형식을 보고 cpio 인걸 유추함.

 

예상문제 (cpio - 백업 복원)

시스템 관리자는 특정 디렉토리의 파일을 백업하고, 백업된 내용을 확인한 뒤 복원하려고 한다.

아래 흐름에 따라 빈칸에 알맞은 명령어나 옵션을 쓰시오.

 

현재 디렉토리의 파일을 dir.backup라는 이름으로 백업 파일을 생성하고, 그 백업파일 내용 확인

find . -type f  | ① _______ ② ______ dir.backup

① _______  ③ _______ dir.backup

 

백업업 파일을 현재 디렉토리에 복원하려고 한다.

① _______  ④ _______ dir.backup

 

 

💡 cpio 백업/복구 차이점 구분 팁

cpio가 왼쪽에 있으면 복구(i), 오른쪽에 있으면 백업(o) 라고 생각하면 좋음

 

📝업 명령어 사용 모음

cpio  표준 입출력을 이용한 백업,복원 활용
find /etc | cpio -ov > etc_backup.cpio   # /etc 백업
cpio -idv < etc_backup.cpio              # 복원
  • -o : 백업 (archive)
  • -i : 복원 (extract)
  • -v : 상세 출력
  • -d : 디렉토리 자동 생성
  • -t : 목록 보기
  • -F : 파일 지정
dump & restore 복원시 restore 명령 사용
dump -0uf /backup/rootfs.dump /dev/sda1   # sda1 전체 백업
cd /restore_dir
restore -rf /backup/rootfs.dump   # 전체 복원
dump
  • 0~9 : 덤프 레벨 (0=전체, 1~9=증분)
  • -u : /etc/dumpdates 업데이트
  • -f : 백업 파일 지정
restore
  • -r : 전체 복원
  • -i : 대화식 복원
  • -x : 특정 파일만 복원
  • -f : 백업 파일 지정
dd 블록단위로 데이터를 복제,백업하는 명령어.
dd if=/dev/sda of=/backup/sda.img bs=1M status=progress   # 디스크 이미지 백업
dd if=/backup/sda.img of=/dev/sda bs=1M                    # 복원
  • if= : 입력 파일
  • of= : 출력 파일
  • bs= : 블록 크기
  • count= : 블록 수
  • status=progress : 진행상황 표시
rsync  원격지의 파일 동기화(복제)관리 프로그램 (rcp 상위호환)
rsync -av /home user@remote:/backup      # SSH로 /home 백업
rsync -av --delete /src/ /dst/           # 정확히 동기화
  • -a : 보존(재귀, 소유권, 권한 등)
  • -v : 상세 출력
  • -z : 압축 전송
  • --delete : 대상에 없는 파일 삭제
  • -e : SSH 사용

    복원시엔 소스, 타겟만 바꿔서 명령어 사용
tar
tar -cvf backup.tar /etc         # /etc를 backup.tar로 백업
tar -xvf backup.tar                # backup.tar 압축 해제
tar -czvf backup.tar.gz /var    # gzip으로 압축 백업
  • -c : 새 아카이브 만들기
  • -x : 아카이브 추출
  • -v : 처리 내용을 출력
  • -f : 아카이브 파일 지정
  • -z : gzip 사용
  • -j : bzip2 사용
  • -C : 작업 디렉토리 지정

 

 


[11번답안]  보완필요

 

① httpd 또는 apachectl 
② -M
③ AuthConfig

④ AuthUserFile

⑤ Require

 

 

예상문제 

Apache 서버를 제어하거나 설정을 테스트할 사용하는 기본 명령어는?

(1) __________

현재 Apache로드된 모듈 목록을 확인하려면 어떤 옵션을 사용하는가?

apachectl (2) __________

.htaccess 파일에서 인증 설정을 허용하기 위해, Apache 설정 파일의 <Directory> 항목에 다음 디렉티브를 설정한다.

AllowOverride (3) __________

사용자 인증 파일의 경로를 설정하려면 어떤 디렉티브를 사용하는가?

(4) __________ /etc/httpd/.htpasswd

인증에 성공한 사용자만 접근할 있도록 하기 위해 어떤 디렉티브를 사용하는가?

(5) __________ valid-user

 

 

 

💡 보충 설명

항목 설명
httpd / apachectl Apache 서버를 실행하거나 설정 점검에 사용
apachectl -M 현재 로드된 모듈 목록 확인 (mod_auth, mod_rewrite 등 포함 여부 확인)
AllowOverride AuthConfig .htaccess 파일에서 인증 관련 설정 허용
AuthUserFile 사용자 인증 파일 경로 지정 (htpasswd로 생성한 파일)
Require valid-user 인증에 성공한 사용자만 접근 허용

 

📝 

항목 설명 예시
Listen Apache가 요청을 수신할 포트를 지정 Listen 80 Listen 8080
ServerName 서버 도메인명과 포트를 지정 ServerName www.example.com:80
ServerAdmin 에러 페이지에 표시될 관리자 이메일 ServerAdmin admin@example.com
DocumentRoot 웹 문서의 기본 디렉터리 경로 DocumentRoot "/var/www/html"
Directory 특정 디렉터리에 대한 접근 권한/설정 지정 <Directory "/var/www/html"> ... </Directory>
Options 디렉토리에서 허용할 기능 설정 Options Indexes FollowSymLinks
AllowOverride .htaccess 사용 허용 여부 AllowOverride All
Require 접근 허용 조건 설정 (Apache 2.4+) Require all granted
Order / Allow / Deny 접근 제어 설정 (Apache 2.2 이하) Order allow,deny Allow from all
ErrorLog 에러 로그 파일 경로 지정 ErrorLog logs/error_log
CustomLog 접근 로그 경로 및 포맷 설정 CustomLog logs/access_log combined
LoadModule 모듈을 로딩함 (기능 추가 시 필요) LoadModule rewrite_module modules/mod_rewrite.so
Include 다른 설정 파일을 불러옴 (modular 설정) Include conf/extra/httpd-vhosts.conf
User / Group Apache 프로세스가 실행될 사용자/그룹 User apache Group apache
 
📝 

 

항목 설명 예시
Timeout 요청 처리 제한 시간 () Timeout 60
KeepAlive 연결 유지 여부 (성능 최적화) KeepAlive On
MaxKeepAliveRequests 하나의 연결에서 최대 요청 수 MaxKeepAliveRequests 100
KeepAliveTimeout 연결 대기 시간 KeepAliveTimeout 5
ServerTokens 서버 정보 노출 수준 조절 ServerTokens Prod
ServerSignature 에러 페이지 하단에 서버 정보 노출 여부 ServerSignature Off
FileETag 캐시 제어용 태그 설정 FileETag None

 

📌  시험 대비 팁

  • AllowOverride All → .htaccess 설정이 적용됨
  • Options Indexes → 디렉토리 목록 노출 허용
  • Require all granted → 모든 접근 허용 (Apache 2.4)
  • Listen, ServerName, DocumentRoot → 가상호스트 구성에서도 반드시 등장

 

📝  아파치 주요 명령어

항목 명령어
설정 검사 httpd -t 또는 apachectl configtest
전체 구조 확인 httpd -S
설정 반영 systemctl reload httpd 또는 apachectl graceful
상태 확인 systemctl status httpd
시작/중지/재시작 systemctl start/stop/restart httpd
자동실행 등록 systemctl enable httpd

 


[12번답안]

 

① /etc/exports 
② 192.168.12.0/24 또는 192.168.12.0/255.255.255.0
③ root_squash

④ no_root_sqush

⑤ all_squash

 

🎯답안해석

서버에서 NFS를 이용하여 파일공유시 Config 지정

✅예상문제

아래 조건에 따라 NFS 공유를 하려고 한다.

1) /nfs/share01를 192.168.12.0 대역의 모든 IP 클라이언트에 NFS 공유하고, root는 nobody 권한으로 연결

2) /nfs/share02를 192.168.12.0 대역의 모든 IP 클라이언트에 NFS 공유하고, root는 root로 일반유저는 nobody 권한으로 연결

 vi ① ______ 

~

/nfs/share01 ② ______ ③ ______

/nfs/share02  ______ ______  ______

~


📝 서버쪽 exports옵션

옵션명 설명
ro 읽기 전용 공유 (read-only)
rw 읽기/쓰기 허용 (read-write)
sync 데이터를 디스크에 즉시 기록 후 응답 (안정성 ↑)
async 데이터를 메모리에 저장한 뒤 응답 (속도 ↑, 안전성 ↓)
root_squash 클라이언트 root 사용자를 서버의 nobody로 매핑 (기본값)
no_root_squash 클라이언트 root가 서버에서도 root 권한 유지
all_squash 모든 클라이언트 사용자를 nobody로 매핑
anonuid=UID, anongid=GID 매핑될 익명 사용자 계정 UID/GID 지정
no_subtree_check 공유 디렉토리 하위 경로 변경 시 검사 생략 (성능 ↑)
subtree_check 하위 경로 변경 시 검사 수행 (기본값)

 

💡 보충 설명

클라이언트쪽 마운트 옵션 (/etc/fstab 에 적용)

옵션 설명
ro / rw 읽기 전용 / 읽기쓰기
soft 서버 응답 없으면 잠시 대기 후 실패 반환 (에러 발생 가능성 있음)
hard 서버 응답 없으면 계속 재시도 (기본값, 안정성 ↑)
intr hard 모드에서 중간에 인터럽트(취소) 가능하게 함
noac Attribute Caching을 비활성화.
파일/디렉터리 메타데이터(사이즈, 타임스탬프 등)를 캐시하지 않음.
항상 서버에서 직접 확인. (성능은 떨어지지만 최신 데이터 보장)
vers=3 / vers=4 NFS 버전 명시 (nfs3, nfs4와 관련)
nolock 파일 잠금(lock) 기능 비활성화 (경량 클라이언트에서 사용)
noatime 파일 접근 시간(atime) 업데이트 안 함 (속도 향상)
rsize=32768 서버로부터 읽어올 때 블록 크기를 32KB(변동가능)로 설정.
클라이언트가 한 번에 읽어오는 데이터 크기. (기본값보다 큼, 속도 최적화 가능)
wsize=32768 서버로 데이터를 쓸 때 블록 크기를 32KB(변동가능)로 설정. (쓰기 성능 최적화)
timeo=14 서버 응답 대기 시간 설정. 1.4초(변동가능) 기다리고 재시도
proto=tcp 전송 프로토콜을 TCP로 강제 설정.
(오래된 NFS는 UDP 기본인데 TCP는 연결지향이라 안정성이 더 좋음)

type nfs (rw,nolock,hard,noac,rsize=32768,wsize=32768,proto=tcp,vers=3,timeo=14,intr,addr=IP)

 

💡 보충 설명

exportfs 명령어 사용방법

명령어 설명
exportfs -v 현재 공유 보기
exportfs -a /etc/exports 파일에 설정된 내용 모두 적용
exportfs -r /etc/exports 파일 다시읽기
exportfs -u [클라이언트IP]:[볼륨명] 특정 클라이언트로만 볼륨 공유 해제

 


[13번답안] 보완필요

① .forward 또는 ~/.forward
② /etc/mail/access
③ Connect:192.168.12.22        DISCARD

④ makemap hash

⑤ <

 

🎯 답안해석

 

💡 보충 설명

항목 설명
.forward 사용자 메일 자동 전달용 파일 (내용: 전달할 이메일 주소)
/etc/mail/access 접속 허용/차단 정책 설정 파일 (IP, 도메인, RELAY 등)
makemap hash 텍스트 파일을 해시 기반 DB 파일로 변환
< 파일 내용을 명령어의 표준 입력으로 전달

 

예상문제 (Sendmail – 메일 전달 접속 제어 설정)

문제

시스템 관리자는 특정 사용자의 메일을 다른 주소로 전달하고, 특정 IP 대역에서의 메일 접속을 차단하고자 한다.

다음은 Sendmail 설정 과정이다. 빈칸에 들어갈 내용을 쓰시오.

 

특정 사용자가 수신한 메일을 다른 이메일 주소로 자동 전달하도록 설정하려고 한다.

사용자의 홈 디렉토리에 생성해야 하는 파일은?

(1) __________

 

특정 IP 주소(192.168.12.22)에서 들어오는 메일 접속을 차단하기 위해 설정해야 접속 제어 파일은?

(2) __________

 

파일에서 192.168.12.22 대해 접속 거부(discard) 하도록 설정하는 줄을 작성하시오.

(3) __________

 

설정한 access 파일을 Sendmail 읽을 있는 **DB 파일(.db)** 변환하려면 다음 명령어를 사용한다.

(4) __________ /etc/mail/access.db < /etc/mail/access

 

명령어에서 사용된 리다이렉션 연산자 <는 어떤 의미인가?

(5) _________

 

📝 예시 전체 흐름:

 

# 메일 차단 설정
echo "Connect:192.168.12.22  DISCARD" >> /etc/mail/access

# DB 파일로 변환
makemap hash /etc/mail/access.db < /etc/mail/access

 

💡 보충 설명

기타 옵션 여기 참조

https://raisonde.tistory.com/entry/리눅스마스터-sendmail-설정-파일들 [지식잡식:티스토리]


[14번답안]

① any;
② allow-transfer 
③ forward only;

④ forwarders

⑤ allow-query

⑥ 203.247.60/24;  또는 203.247.60.0/24;

 

🎯답안해석

DNS의 named.conf 설정에 들어가는 값들이다. named.conf의 구조를 알아야한다.

named.conf와 domain.zone에 들어가는 값들을 구분해야한다.


✅예상문제

시스템 관리자는 BIND(DNS) 서버를 설정하면서 접근 제어와 포워딩 정책 등을 구성하고자 한다.

다음은 /etc/named.conf 파일 내 options 블록 설정 예시이다.

조건에 맞게 빈칸에 들어갈 알맞은 설정 키워드나 값들을 쓰시오.

 

options {
    directory "/var/named";

    recursion yes;
    allow-query { ① __________ };
    allow-transfer { ② __________ };
    __________
     ④ __________ { 8.8.8.8; 8.8.4.4; };
};

zone "qwer.com" IN {
    type master;
    file "qwer.com.zone";
    ⑤ __________ { 

⑥ __________ };
};

 

조건

1. 네임 서버에 질의를 요청하는 모든 호스트에게 질의를 허용하도록 설정.
2. 도메인 영역(Zone) 파일의 전송을 제어하는 항목을 명시.
3. 들어온 질의를 지정된 포워더(forwarder)에게 전달만 하고, 포워더가 응답하지 않을 경우 자체적인 재귀 질의는 수행하지 않음.
4. 외부 DNS 서버(8.8.8.8, 8.8.4.4)로 질의를 전달할 때 사용하는 항목을 명시.
5. 특정 도메인 영역(zone "qwer.co.kr")에 대해 질의를 허용할 호스트를 제한하는 항목을 명시.
6. 위 ⑤번 조건에서, 해당 영역에 대한 질의를 203.247.60.0/24 네트워크 대역에 속한 호스트만 허용하도록 설정.

 

💡 보충 설명

디렉티브 의미
any; 모든 클라이언트 허용 (보안상 실제 운영 환경에선 최소화 필요)
allow-query 질의 허용 대상 설정
allow-transfer 존 정보 전송 허용 대상 (다른 DNS 서버에게만 허용하는 것이 일반적)
forward only; 질의를 오직 지정된 포워더에게만 전달 (캐싱 DNS에 주로 사용)
forwarders { ... }; 포워딩 대상 DNS 서버 (예: 구글 DNS 등)

 

📝 named.conf 설명과 예시

directory 존(zone) 파일이 저장될 기본 디렉터리 directory "/var/named";
listen-on port 53 { ... }; DNS 서버가 수신할 네트워크 인터페이스 지정 listen-on port 53 { any; };
listen-on-v6 port 53 { ... }; IPv6용 포트 리슨 설정 listen-on-v6 port 53 { none; };
recursion yes/no; 재귀 질의 허용 여부 recursion yes;
allow-query { ... }; 질의 허용할 클라이언트 범위 지정 allow-query { any; };
allow-recursion { ... }; 재귀 질의를 허용할 IP대역 지정 allow-recursion { 192.168.0.0/16; };
allow-transfer { ... }; 존 파일 복제(전송) 허용 IP 지정. 슬레이브IP 지정 allow-transfer { 203.247.60.0/24; };
allow-update { ... }; DDNS(dynamic update) 허용 대상 지정 allow-update { none; };
dnssec-enable yes/no; DNSSEC 기능 사용 여부 dnssec-enable no;
dnssec-validation yes/no; DNSSEC 검증 수행 여부 dnssec-validation no;
pid-file 프로세스 ID 저장 파일 지정 pid-file "/run/named/named.pid";
dump-file zone dump 저장 위치 dump-file "/var/named/data/cache_dump.db";
statistics-file 통계 데이터 저장 위치 statistics-file "/var/named/data/named_stats.txt";
querylog yes/no; DNS 질의 로그 활성화 여부 querylog yes;
forward only/first; 포워딩 방식 지정 forward only;
forwarders { ... }; 포워더 DNS 서버 지정 forwarders { 8.8.8.8; 1.1.1.1; };

 

 * named.conf의 zone 영역

루트 힌트 zone "." IN { type hint; file "named.ca"; }; 루트 DNS 정보
정방향 존 zone "qwer.com" IN { type master; file "qwer.com.zone"; }; 도메인→IP. 기본 디렉토리 참조.
역방향 존 zone "0.168.192.in-addr.arpa" IN { type master; file "192.168.0.zone"; }; IP→도메인
슬레이브 존 zone "qwer.com" IN { type slave; masters { 192.168.0.10; }; file "slaves/example.com.zone"; }; Slave 서버용 존

 

 * acl로 라벨링(또는 alias)처럼 사용할 수 있음

acl "internal_net" { 192.168.0.0/16; 127.0.0.1; };
acl "trusted_slaves" { 203.247.60.0/24; };
acl로 값을 특정 이름으로 정의
options {
    allow-query { internal_net; };
    allow-transfer { trusted_slaves; };
}
정의한 네이밍으로 값 입력. 아래와 동일한 설정이 됨.
  allow-query { 192.168.0.0/16; 127.0.0.1; };
  allow-transfer { 203.247.60.0/24; };

 

 

📝 레코드 설명 예시

vi example.zone 보통 주 도메인 이름으로 파일명 작성
$TTL 1D
@       IN SOA  ns1.qwer.com. admin.qwer.com. (
                2025102201 ; Serial
                1H         ; Refresh
                10M        ; Retry
                1W         ; Expire
                1D )       ; Minimum TTL
;
          IN  NS         ns1.qwer.com.
          IN  NS          ns2.qwer.com.
ns1    IN   A           192.168.0.10
ns2    IN   A           192.168.0.11
www  IN   A           192.168.0.20
mail   IN   A           192.168.0.30
@      IN   MX  10  mail.qwer.com.
ftp      IN  CNAME www.qwer.com.
zone파일 예시
url 뒤에는 "." 붙여야한다


@ IN SOA ns1.qwer.com. admin.qwer.com. (
        2025102201 ; Serial        ← 변경 시 증가
        1H         ; Refresh       ← Slave가 갱신 요청 간격
        10M        ; Retry         ← Slave에서 갱신 실패 시 재시도 간격
        1W         ; Expire        ← Slave 데이터 만료 시간
        1D )       ; Minimum TTL   ← 캐시 유지시간
";" 로 끝난다.
ns1.example.com.: 주 DNS서버 이름
admin.example.com.: 관리자 이메일
Serial: zone 파일 버전(보통 날짜+순번: YYYYMMDDnn)
$TTL 모든 레코드의 기본 TTL(Time To Live) $TTL 1D → 1일
@ 현재 zone의 도메인 이름 (qwer.com.)을 의미 @ IN MX 10 mail.qwer.com.
Serial zone파일 버전. Slave에서 확인하고 설정 복사해감. 2025102801
(보통 현재시간으로 작성)
IN Internet 클래스 (거의 항상 IN) IN A 192.168.0.20
SOA 권한 시작 레코드, 존의 관리자 정보 포함 아래에 상세
NS 네임서버 지정 IN NS ns1.qwer.com.
A 호스트 이름 → IPv4 주소 매핑 www IN A 192.168.0.20
AAAA 호스트 이름 → IPv6 주소 매핑 www IN AAAA 2001:db8::1
MX 메일 서버 지정 (숫자가 낮을수록 우선순위 높음) IN MX 10 mail.qwer.com.
CNAME 별칭(alias) 지정 ftp IN CNAME www.qwer.com.
TXT 텍스트 정보 (SPF, 인증 등) @ IN TXT "v=spf1 include:_spf.google.com ~all"

 

📝 역방향 레코드 설명 예시

named.conf에 zone 명시
zone "0.168.192.in-addr.arpa" IN {
    type master;
    file "192.168.0.zone";
};
"0.168.192.in-addr.arpa"
→ IP 192.168.0.x 대역을 의미


file "192.168.0.zone"
→ 해당 대역의 PTR 매핑정보가 들어 있는 파일명
vi 192.168.0.zone
$TTL 1D
@       IN SOA  ns1.qwer.com. admin.qwer.com. (
                2025102201 ; Serial
                1H         ; Refresh
                10M        ; Retry
                1W         ; Expire
                1D )       ; Minimum TTL
;
          IN NS   ns1.qwer.com.
10      IN PTR  ns1.qwer.com.
20      IN PTR  www.qwer.com.
30      IN PTR  mail.qwer.com.
$TTL 기본 TTL 설정 $TTL 1D
SOA 권한 시작(정방향과 동일) IN SOA ns1.qwer.com. admin.qwer.com.
NS 해당 네트워크의 네임서버 지정 IN NS ns1.qwer.com.
PTR IP 주소 → 도메인 이름 매핑 10 IN PTR ns1.qwer.com. 역방향은 모두 PTR 레코드다.

 

 

 

📌 추가 팁: DNS 관련 명령어 사용 예제

 

DNS 서비스 관리 명령어

DNS 데몬 실행 명령 (보통 systemd로 관리) systemctl start named
설정 변경 후 재시작 systemctl restart named
동작 상태 확인 systemctl status named
서비스 재시작 없이 설정 다시 읽기 rndc reload
BIND 상태 정보 출력 rndc status
캐시 데이터 비우기 rndc flush
named.conf 문법 검사 named-checkconf /etc/named.conf
특정 존 파일 구문 검사 named-checkzone qwer.com /var/named/qwer.com.zone
역방향 존 검사 named-checkzone 0.168.192.in-addr.arpa /var/named/192.168.0.zone

 

DNS 확인 명령어

기본 질의 dig www.qwer.com 기본 A 레코드 조회
특정 DNS서버 지정 dig @8.8.8.8 www.qwer.com 8.8.8.8로 직접 질의
NS 레코드 조회 dig qwer.com NS 네임서버 목록 조회
MX 레코드 조회 dig qwer.com MX 메일서버 확인
PTR 조회 (역방향) dig -x 192.168.0.10 IP → 도메인 변환
TTL 확인 dig www.qwer.com +ttlunits TTL 단위 포함 출력
캐시 테스트 dig www.qwer.com +trace 루트→TLD→Authoritative 단계 추적
기본 질의 nslookup www.qwer.com 간단히 확인
특정 서버 지정 nslookup www.qwer.com 8.8.8.8 8.8.8.8에 질의
역방향 질의 nslookup 192.168.0.10 IP → 도메인 변환


📌 추가 팁: 리눅스 서버에 DNS 사용설정

vi /etc/resolv.conf 구성
nameserver 192.168.0.10
nameserver 8.8.8.8
search corp.qwer.com localdomain
options timeout:2 attempts:3 rotate
- nameserver는 위부터 순서대로 질의 시도
- search corp.com localdomain → ping web 입력시 ping web.qwer.com 으로 자동 보정
- options timeout:2 attempts:3 rotate → 2초 안에 응답 없으면 다음 서버로 최대 3회 시도, 순환 질의

 

 

🧠 정리할게 이렇게 많이 필요한가 싶지만.. 이렇게 많이 필요하다.


[15번답안]

① http_port 8080
② acl hacker srcdomain .hacker.com
③ http_access deny hacker

④ http_access allow all

 

 

🎯답안해석

squid proxy를 이용한 내부사용자의 http 이용 통제

사용자 웹 접근제어가 필요한 경우 squid proxy를 쓴다고 생각하면 될 듯

 


 예상문제 (Squid 프록시 서버 설정 - 접속 제어  포트 설정)

문제: 시스템 관리자는 Squid Proxy 서버를 운영하면서 악성 도메인의 접근을 차단하고 특정 포트를 사용하도록 설정하고자 합니다. 다음 조건에 맞게 squid.conf 파일에 추가해야 할 설정 내용을 순서대로 작성하시오.
■ 조 건
1. Proxy 서버의 리스닝 포트를 기본 포트(3128) 대신 8080 포트로 변경하여 설정해야 합니다.
2. .hacker.com 도메인을 소스 도메인(srcdomain)으로 하는 ACL을 hacker라는 이름으로 정의해야 합니다.
3. 정의된 ACL hacker에 해당하는 클라이언트의 HTTP 접근을 명시적으로 거부해야 합니다.
4. 접근 제어 목록은 순차적으로 적용되며, 위에 명시된 악성 도메인을 제외한 모든 클라이언트의 HTTP 접근은 허가되도록 최종 정책을 설정해야 합니다.

 

 

 

💡 보충 설명

디렉티브 설명
http_port Squid가 수신 대기할 포트 번호 지정
acl [이름] [유형] [값] 접근 제어 목록 정의 (도메인, IP, 시간 등으로 제어 가능)
http_access [allow|deny] [ACL이름] 해당 조건(ACL)에 부합하면 접근 거부

그 외 구성 설명

acl, http_access 접근제어 핵심 구성. acl로 조건 생성, http_access로 정책 생성
cache_mem, cache_dir 캐시 메모리/디스크 설정
visible_hostname 호스트명 지정
auth_param 사용자 인증 설정
access_log, cache_log 로그 경로
refresh_pattern 캐시 유효기간 패턴
cache_peer 상위 프록시 설정

 

📝 사용 예시

http_port 3128 Squid가 클라이언트 요청을 수신할 포트를 지정합니다. (default 3128)
visible_hostname squid.local Squid 서버의 호스트명을 지정합니다. (squid.local)
acl localnet src 192.168.0.0/16 “내부망 IP 대역(192.168.x.x)”을 localnet이라는 이름으로 정의합니다.
acl SSL_ports port 443 HTTPS(SSL) 요청을 허용할 포트 번호를 정의합니다.
acl Safe_ports port 80 443 21 1025-65535 허용할 수 있는 안전한 포트(Safe Ports) 리스트를 정의합니다.
http(80), https(443), ftp(21), 사용자정의포트(1025-65535)
acl CONNECT method CONNECT CONNECT 메서드(HTTPS 터널링용) 을 정의하기 위한 ACL입니다.
http_access allow localnet 위에서 정의한 localnet ACL(내부망 IP 대역)을 허용합니다.
http_access deny !Safe_ports Safe_ports에 포함되지 않은 포트(!Safe_ports)로 접근하면 차단합니다.
http_access deny CONNECT !SSL_ports CONNECT 메서드(HTTPS) 요청이지만, 443(SSL_ports) 외 포트로 연결하려 하면 차단합니다.  ➜ HTTPS 터널링 악용 방지
http_access deny all 위 조건에 해당하지 않는 모든 요청 차단. 화이트 리스트로 접근제어.
cache_mem 256 MB 메모리 캐시 크기를 256MB로 지정합니다.
maximum_object_size 4096 KB 캐시에 저장할 수 있는 최대 파일 크기(4MB) 를 지정합니다.
➜ 너무 큰 파일은 캐시에 넣지 않고 바로 전달합니다.
refresh_pattern . 0 20% 4320 캐시 갱신 정책(유효기간) 을 지정합니다.
. : 모든 URL에 적용
0 : 최소 TTL (분 단위)
20% : 문서 나이에 따른 갱신율
4320 : 최대 TTL(분 단위, = 3일) ➜ 일정 시간 내에는 원본 서버 대신 캐시에서 응답.
access_log /var/log/squid/access.log squid 접근 로그 파일 경로 및 포맷을 지정합니다.
/var/log/squid/access.log : 저장 위치
squid : 기본 포맷 사용  ➜ “언제 누가 어떤 사이트를 요청했는가”를 기록합니다.

 

 

📌 추가 팁:

  • ACL은 반드시 http_access 규칙보다 먼저 정의해야 함 (정의 만든 다음 정책 지정)
  • deny 규칙이 allow보다 먼저 선언되어야 제대로 동작함 (위에서부터 순서대로 정책적용)

 * ACL의 유형과 값 설명

  - acl [이름] [유형] [값]

src 요청을 보낸 클라이언트의 IP 주소 기준 acl office src 192.168.0.0/24
dst 요청 대상 서버의 IP 주소 기준 acl extnet dst 8.8.8.8
dstdomain 요청 대상의 도메인명 기준 acl blocksite dstdomain .hacker.com
srcdomain 클라이언트의 도메인명 기준 acl localdomain srcdomain .company.local
port 요청 포트 기준 acl Safe_ports port 80 443
proto 프로토콜 기준 acl ftp proto FTP
method HTTP 메서드(GET, POST 등) 기준 acl onlyget method GET
time 요일/시간 기준 acl worktime time MTWHF 09:00-18:00
url_regex URL 경로를 정규식으로 매칭 acl adblock url_regex "/ads/"
browser User-Agent(브라우저 정보) 기준 acl oldie browser MSIE
maxconn 한 IP당 동시 연결 수 제한 acl too_many_conns maxconn 5

  - acl [이름] [유형] [값]

src IP 주소 / CIDR 192.168.0.0/16
dstdomain 도메인명 (앞에 . 붙이면 하위 도메인 포함) .youtube.com
time 요일 + 시간대 MTWHF 09:00-18:00 (월~금 오전 9시~오후6시)
method HTTP 메서드명 GET / POST / CONNECT
url_regex 정규 표현식 "youtube"
port 포트 번호 80 443 8080

 

 

📌 참고) Squid (/etc/squid/squid.conf)   vs   Apache (/etc/httpd/conf/httpd.conf)

  - 물론 용도가 명백히 다르나 설정에서 헷갈리 수 있으므로 주요 설정 비교

역할 프록시 서버 (클라이언트 ↔ 인터넷 중계) 웹 서버 (클라이언트에게 직접 콘텐츠 제공)
포트 설정 http_port Listen
접근제어 acl, http_access Require, Allow, Deny (Apache 2.2 이하)
도메인 기반 차단 acl srcdomain 등 불가능 (Apache는 클라이언트 기준 제어 X)
로그 /var/log/squid/access.log /var/log/httpd/access_log
기본 동작 클라이언트 요청을 중계 요청에 직접 응답

 

 


[16번답안]

-P INPUT ACCEPT (번부터 번까지 ‘-t filter’ 추가 가능)

-F INPUT (번부터 번까지 옵션 표기 관련 추가 정답 있음)

-A INPUT -s 192.168.4.14 -j DROP

-A INPUT -p tcp --dport 22 -j ACCEPT

-A INPUT -p tcp --dport 20:30 -j DROP

 

🎯답안해석

iptable을 이용한 OS level 방화벽 설정 특정 IP,port의 차단과 특정 port만 허용

NAT를 하는지 Filter를 하는지도 잘 봐야함

 

예상문제 (iptables – 기본 정책, 규칙 추가/삭제)

 

시스템 관리자는 리눅스 서버의 방화벽을 설정하여, 기본 수신 정책을 지정하고 특정 IP/포트에 대한 접근을 제어하려고 한다.

다음은 iptables를 사용한 설정 과정이다. 각 빈칸에 들어갈 알맞은 명령어 옵션을 쓰시오.

(모든 명령어는 -t filter를 생략하거나 포함할 수 있음)

 

수신 체인(INPUT) 기본 정책을 **ACCEPT(허용)**으로 설정하려고 한다.

iptables (1) ______________________________________

INPUT 체인의 기존 규칙을 모두 초기화(삭제) 하려 한다.

iptables (2) ______________________________________

특정 IP(192.168.4.14)에서 들어오는 모든 패킷을 차단(DROP) 하려 한다.

iptables (3) ______________________________________

TCP 프로토콜의 **22 포트(SSH)** 수신 허용하려고 한다.

iptables (4) ______________________________________

TCP 프로토콜의 20번부터 30번까지의 포트 범위를 차단하려고 한다.

iptables (5) ______________________________________

 

 

💡 보충 설명

필드 예시 간단 설명

iptables [테이블옵션] [동작옵션] [체인] [조건] [타깃]
테이블 옵션 (-t) -t filter, -t nat 어떤 테이블을 다룰지 지정 (생략 시 기본은 filter)
동작 옵션 -A, -I, -D, -F, -L, -P 규칙 추가·삽입·삭제·초기화·조회·정책설정 등
체인 (CHAIN) INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING 패킷이 통과하는 경로 단계 지정
조건 (조건절) -p, -s, -d, --dport, --sport, -i, -o 어떤 패킷을 대상으로 할지 지정
타깃 (-j) -j ACCEPT, -j DROP, -j REJECT, -j LOG 규칙이 일치했을 때 수행할 동작 지정
명령어 설명
-P 기본 정책 설정 (ACCEPT or DROP) (블랙리스트 or 화이트리스트)
-F 또는 --flush 기존 규칙 전체 삭제
-s, -d 출발지 IP 지정, 도착지 IP 지정. 범위 지정하려면 ":" 사용. (100부터 200포트 -> 100:200)
--sport, --dport 출발지, 목적지 포트 (-t tcp or -t udp 뒤에 이어서 사용)
-j 행동 지정 (ACCEPT, DROP, REJECT 등)
iptables-save > iptable.rule
iptables-restore < iptable.rule
iptables 정책 백업, 복원
service iptables save
또는 iptables-save
현재 정책 영구적용. 재부팅시 그대로 가져옴. (iptables-persistent : Ubuntu용)

명령어 기능 예시

iptables -P <CHAIN> <POLICY> 체인의 기본 정책 설정  iptables -P OUTPUT ACCEPT
iptables -F <CHAIN> 지정 체인의 모든 규칙 초기화 iptables -F INPUT
iptables -A <CHAIN> 체인의 끝에 새로운 규칙 추가 iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -s <IP> 출발지 IP 지정 iptables -A INPUT -s 10.0.0.5 -j DROP
iptables -p <프로토콜> 프로토콜 지정 (tcp, udp 등) iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables --dport <포트> 목적지 포트 지정 iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -j <ACTION> 수행할 동작 지정 (ACCEPT, DROP, REJECT 등) iptables -A FORWARD -j DROP
iptables -I <CHAIN> <number> 지정한 숫자의 행에 룰 입력 iptables -I INPUT 4 -p tcp -doprt 88 -j DROP

 

 

💡 보충 설명2 : nat 테이블 관련 (default는 filter 테이블)

  • PREROUTING 체인 (Destination NAT, DNAT): 패킷이 라우팅되기 전에 목적지 주소를 변경함 (주로 포트 포워딩)
  • POSTROUTING 체인 (Source NAT, SNAT): 패킷이 라우팅을 마친 후 출발지 주소를 변경함 (주로 내부망의 공인 IP 공유)
-t nat 테이블 변경하여 조회/수정
--to-source 출발지 IP 변환 지정
--to-destination 도착지 IP 변환 지정
iptables -t nat -L nat 테이블 규칙 확인
iptables -t nat -A PREROUTING -j DNAT  목적지에 관한 포트 포워딩 (DNAT)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 포트 포워딩 (DNAT - 외부 8080 → 내부 서버 80)
iptables -t nat -A PREROUTING -p udp -s 192.168.1.50 --dport 53 -j DNAT --to-destination 8.8.8.8 내부사용자가 DNS를 사용할 때, 8.8.8.8로 포트 포워딩
iptables -t nat -A POSTROUTING -j SNAT 출발지에 관한 포트 포워딩 (SNAT)
iptables -t nat -A PREROUTING -i eth0 -p tcp -j DNAT --to-destination 192.168.1.101 eth0 인터페이스로 들어오는 모든 TCP 트래픽을 내부 서버로 포워딩합니다. (인터페이스를 명시하여 규칙 적용 범위를 제한)
iptables -t nat -A OUTPUT -d 203.0.113.10 -p tcp --dport 3306 -j DNAT --to-destination 127.0.0.1:3307 내부에서 외부 IP, 특정 포트(3306)로 접속을 시도할 때, 내부의 다른 포트(3307)로 리다이렉트합니다. (개발 환경에서 내부 서비스 포트를 변경할 때 유용) (e.g. 80 try를 443으로 변경)
iptables -t nat -A POSTROUTING -s 192.168.1.200 -j SNAT --to-source 203.0.113.5 내부 서버에서 나가는 모든 트래픽의 출발지 IP 주소를 고정된 공인 IP로 변경합니다.
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE 내부 서버에서 나가는 모든 트래픽의 출발지 IP 주소를 동적 공인 IP 주소로 변경합니다. (공유기 역할 시 가장 많이 사용)

  * 마스커레이딩 -> 내부 사설IP들이 외부로 나갈 때 동적 공인IP를 달고 나가는 것.

 

📌 추가 :

  • FORWARD, OUTPUT 차이

FORWARD - 다른 네트워크로 전달되는 트래픽. 리눅스 서버가 라우터/게이트웨이 역할을 할 때, 서버를 통과하는 패킷을 제어OUTPUT - 리눅스 서버 자체에서 생성되어 나가는 트래픽. 서버 자체에서 실행된 프로세스 (SSH, HTTPD, Redis 등)가 외부로 접속하는 것을 제어.

 

  •  iptables vs firewalld
서비스 시작 systemctl start iptables systemctl start firewalld
규칙 보기 iptables -L -n -v firewall-cmd --list-all
규칙 추가 iptables -A INPUT -p tcp --dport 22 -j ACCEPT firewall-cmd --add-service=ssh
영구 적용 iptables-save > /etc/iptables/rules.v4 firewall-cmd --add-service=ssh --permanent
규칙 삭제 iptables -D INPUT 1 firewall-cmd --remove-service=ssh
설정 반영 즉시 반영 (현재 세션) --permanent 설정 후 firewall-cmd --reload 필요

 

firewall-cmd 예시

firewall-cmd --state firewalld 서비스 상태 확인 (running / not running)
firewall-cmd --get-active-zones 현재 활성화된 Zone 확인
firewall-cmd --zone=public --list-all public 존의 전체 설정(서비스, 포트, 인터페이스 등) 확인
firewall-cmd --add-service=ssh SSH 서비스 임시 허용 (즉시 적용, 재부팅 시 사라짐)
firewall-cmd --add-service=http --permanent HTTP 서비스(80/tcp) 영구 허용
firewall-cmd --reload 영구 설정(--permanent) 변경사항을 반영
firewall-cmd --add-port=8080/tcp --permanent 8080/tcp 포트를 영구 허용
firewall-cmd --remove-service=ftp --permanent FTP 서비스 영구 차단
firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.10" reject' --permanent 특정 IP(192.168.1.10)에서 오는 요청을 거부
firewall-cmd --zone=internal --change-interface=ens33 --permanent 네트워크 인터페이스(ens33)를 internal 존에 할당

 

firewall-cmd --list-services 현재 허용된 서비스 목록 표시
firewall-cmd --list-ports 허용된 포트 목록 표시
firewall-cmd --get-default-zone 기본 zone 확인
firewall-cmd --set-default-zone=public 기본 zone 변경
firewall-cmd --zone=public --remove-port=8080/tcp --permanent 포트 제거

 

 

 


덤) 잘 모르는 부분은 특히 설명에 힘이 들어간 것 같다



 

 

 

728x90