통합검색
로그인
회원가입
Open menu
로그인
회원가입
통합검색
Synology
7
AWS
5
Linux
30
PHP
9
Python
3
Javascript
24
HTML / CSS
12
ETC
4
떡볶이집앞 사진관
Synology
7
AWS
5
Linux
30
PHP
9
Python
3
Javascript
24
HTML / CSS
12
ETC
4
떡볶이집앞 사진관
Linux
nginx에서 http->https 리디렉션 설정된 경우 let's encrypt 인증서 갱신 안될때
nginx 를 사용할 때 특정 조건에서 let's encrypt 인증서가 갱신이 안되는 경우가 있다. 나의 경우 http 접속하는 경우 https로 리디렉션 함과 동시에, proxy 를 통해 목적지 서버로 트래픽을 전달하는데, 이 과정에서 webroot를 찾지 못해 갱신이 안되는 문제였다. 따라서, 아래와 같이 certbot에서 웹서버를 접근하는 경우 https로 리디렉션 되지 않도록 예외 처리 하였다. 기존 문제가 된 구문 server { listen 80; server_name note.chanyeongpark.com; index index.html; root /서버경로/; return 301 https://note.chanyeongpark.com$request_uri; // 문제가 되는 구문 } 301로 https로 리디렉션 되고 있는 구문을 아래와 같이 수정하였다. 수정된 구문 아래와 같이 certbot에서 접근하는 경우 예외처리하여 https로 리디렉션 되지 않도록 처리하였고 정상 갱신 되는 것을 확인 하였다. server { listen 80; server_name note.chanyeongpark.com; index index.html; location /.well-known/acme-challenge/ { root /서버경로/; } location / { return 301 https://note.chanyeongpark.com$request_uri; } }
[nginx] ip로 접속하지 못하도록 설정
아이피로 접속하는 경우 444에서가 노출되도록 하는 방법. ip주소 접근 차단 vi로 default.conf를 연다. (기본 virtualhosts 설정) vi /etc/nginx/conf.d/default.conf default.conf 파일 최상단에 아래와 같이 추가한다. # ip 접근을 막기 위한 설정(http) server { listen 80 default_server; server_name _; return 444; } # ip 접근을 막기 위한 설정(https) server { listen 443 ssl default_server; server_name _; ssl_certificate /etc/letsencrypt/live/본인의 ssl경로/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/본인의 ssl경로/privkey.pem; return 444; } https 설정에서 ssl 인증서 경로는 기존에 virtualhost 를 위해 생성해둔 아무 인증서를 연결해준다. # systemctl restart nginx nginx를 재부팅. 아이피주소로 접속한 경우 위와 같이 444 에러가 리턴되는 것을 확인할 수 있다.
[nginx] reverse proxy 에서 프록시 캐시서버(CDN) 적용하기 (centos 7)
사진등 용량이 큰 리소스를 별도 서버에서 reverse proxy하여 웹사이트에 노출시키고 있다면 접속자에게 1M 용량의 이미지를 노출시킬 때 프록싱간 in/out bound 를 합쳐 트래픽을 총 3M를 소진하게 되는데, 접속자를 통해 한번 호출된 파일을 프록시 서버에 캐시파일로 저장해 두고 반환한다면 out-bound 트래픽 1M만 소진하게 되어 트래픽을 1/3 수준으로 절감할 수 있다. 이를 Cache server (CDN)이라고 하며, nginx 에서는 간단한 설정으로 캐시서버 구축이 가능하다. 캐시서버가 필요하게 된 배경 내가 운영중인 사진 블로그는 웹서버와 사진이 보관된 스토리지 서버가 분리되어 있으며, 글 마다 노출되는 사진 파일이 총 10M이상 된다. 접속자 한명이 블로그 글 하나를 조회하게 되면 프록시 서버와 스토리지서버(사진이 보관된)간 통신하는 과정에 총 30M 이상의 트래픽을 소진하게 되는데 100명의 접속자가 글을 조회 한다면 3G 이상의 트래픽을 유발 시킨다. [접속자] <-- out 10M 소진 -- [프록시서버] <-- in/out 20M --> [스토리지서버] 블로그 글에서 제공되는 사진은 10M지만, 총 30M 트래픽을 소진하게 됨. 따라서, 캐시서버를 구축하여 이미지 파일을 프록시서버에 보관하게 된다면 트래픽이 스토리지 서버까지 다녀올 필요가 없기 때문에 클라이언트에게 out-bound 되는 10M만 소진하면 된다. nginx.conf 설정 먼저, 캐시와 temp등의 경로 설정을 위해 nginx.conf 파일을 수정한다. # /etc/nginx/nginx.conf vi로 설정 파일을 열어 아래와 같이 설정한다. ... http { ... proxy_cache_path /etc/nginx/cache/ levels=1:2 keys_zone=cache_zone:40m inactive=7d max_size=100m; proxy_temp_path /etc/nginx/cache_temp/; include /etc/nginx/conf.d/*.conf; ... } 1) proxy_cache_path : 캐시 저장소 경로를 설정한다. - levels : 하위 디렉토리의 깊이 - key_zone : 캐시존 이름 - inactive : 캐시 파일이 정해진 기간만큼 사용되지 않는다면 캐시에서 제거 2) proxy_temp_path : temp 파일이 저장될 경로를 설정한다. vietualhost 설정 특정 호스팅에 캐시를 적용하기 위해 conf 파일을 열어 세부 설정을 한다. # vi /etc/nginx/conf.d/000.net.conf (virtual host 설정을 위해 생성한 conf 파일을 연다.) virtual host 의 conf 파일을 vi로 연 다음 아래와 같이 작성한다. server { location / { ... # cache proxy_cache cache_zone; # cache data 7일 동안 보관 expires 7d; # cache 업데이트 충돌시 잠금시간 proxy_cache_lock_timeout 5s; # cache method 설정 proxy_cache_methods GET HEAD POST; # cache 결과코드를 20분동안 보관 proxy_cache_valid 200 401 301 304 20m; # cache 상태를 헤더로 보여줌. (MISS, HIT 등) add_header X-Proxy-Cache $upstream_cache_status; # cache-control 설정 add_header Cache-Control "public"; # 다음 클라이언트 헤더 무시 proxy_ignore_headers X-Accel-Expires Expires Cache-Control; ... } } 설정이 완료 되었다면 nginx 를 재시작 한다. # systemctl restart nginx 브라우저에서 캐싱 여부 확인하기 설정을 모두 마쳤다면, 프록싱이 적용된 사이트를 접속하여 브라우저 작업관리자를 통해 캐싱 여부를 확인해본다. 1) 최초 요청으로 캐싱되지 않은 이미지가 노출된 경우 > X-Proxy-Caches : MISS 노출 2) 캐싱이 적용된 이미지인 경우 > X-Proxy-Caches : HIT 노출
CentOS 에서 CPU 온도 체크하기 (lm_sensors)
centos(리눅스)에서는 간편하게 cpu 온도를 확인할 수 있는 모니터링 툴을 제공한다. ln_sensors 설치 cpu 온도 모니터링 툴 lm_sensors 를 yum을 통해 설치한다. # yum install lm_sensors 설치 후 대상 하드웨어를 인식 시킨다. 다만, vm 환경에서는 하드웨어 인식이 안될 수 있으니 lm_sensors 사용 가능 여부를 확인한다. # sensors-detect ln_sensors 사용 방법 lm_sensors는 명령어 한번으로 간편하게 사용 가능하다. # sensors sensors 명령어만 치면 바로 모니터링 할 수 있다. - Package : cpu의 평균 온도를 보여준다. - Core : 각 Core별 온도를 보여준다. CPU Core 개수에 따라 노출되는 개수가 다르다.
centos7 reverse proxy nginx
하나의 아이피로 연결된 같은 네트워크내 다수의 서버를 nginx reverse proxy 서버를 통해 프록싱 해본다. reverse proxy가 필요한 상황 나의 경우 아래 두가지 이유 때문에 리버스프록시 서버가 필요한 상황이었다. 1) 다수의 서버가 연결되어있는 게이트웨이에 단 하나의 외부 아이피만 존재하는 상황. 외부 트래픽이 유입하면 reverse proxy 서버를 통해 사설아이피로 트래픽을 유도하여 특정 서버로 유입되도록 한다. 2) 내가 운영중인 메인서버의 공인IP가 외부로 유출되면 DDOS 공격에 취약해지기 때문에 공인 IP를 은폐할 목적. AWS에 프록시 서버를 하나 더 두고 내 서버를 프록싱 하면 웹사이트의 외부 IP는 AWS의 IP로 노출된다. 프록시 서버로 nginx를 선택한 이유 nginx는 apache의 대량 트래픽 처리시 발생하는 부하 문제를 보완하기 위해 탄생한 웹서버다. 즉, 다수 서버에 유입될 트래픽이 모두 거쳐가게 되는 프록시 서버에는 nginx만큼 효율이 좋은 웹서버는 없었기 때문이다. 심지어 apache보다 가볍고, 설정 또한 직관적이고 쉽다. 최소 사양으로 구동되는 프록시 서버에 nginx보다 적합한 웹서버는 없다는 생각이다. nginx 설치 먼저, nginx를 설치한다. 내가 사용중인 centos7 OS는 공식 yum서버에서 nginx를 제공하지 않기 때문에 별도의 repo를 yum에 외부 저장소를 등록해주고 nginx를 설치한다. # vi /etc/yum.repos.d/nginx.repo yum.repos.d 디렉토리 내에 repo 파일을 하나 만들어 주고, 아래와 같이 vi로 작성하여 저장한다. [nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/7/$basearch/ gpgcheck=0 enabled=1 외부 저장소 등록이 완료 되었다면 yum 을 통해 nginx를 설치한다. # yum install nginx 클라이언트 최대 전송량 설정 클라이언트가 nginx 프록시 서버에서 목적지 서버로 요청할 때 body의 최대 전송량을 설정해준다. nginx의 기본 client_max_body_size는 1M로, 허용량을 초과하게 되면 요청 자체가 되지 않기 때문에 반드시 늘려줘야 한다. client_max_body_size를 모든 호스트에 대해 적용해 주려면 # vi /etc/nginx/nginx.conf 를 vi로 열어 http { ... client_max_body_size 40000M; ... } 를 추가해 주거나, 호스팅 개별적으로 적용해 주려면 # vi /etc/nginx/conf.d/[hostname].conf 를 vi로 열어 server { ... client_max_body_size 40000M; ... } 를 추가해준다. reverse proxy 구성을 위한 설정 reverse proxy 구성을 위해 설정파일을 생성해야 한다. #cd /etc/nginx/conf.d nginx 설정 파일은 /etc/nginx/conf.d/ 경로내에 저장한다. 파일명은 아무렇게나 설정해도 되지만, 반드시 확장자는 .conf 로 저장해야 한다. chanyeongpark.com 도메인에 대한 virtual host 및 reverse proxy 설정을 위해 아래와 같이 새로운 설정 파일을 생성한다. 나는 식별이 용이하도록 도메인 이름으로 설정 파일을 생성했다. # vi /etc/nginx/conf.d/note.chanyeongpark.com.conf vi 로 설정파일에 아래와 같이 내용을 작성했다. server { listen 80; #80번 포트로 들어오는 경우에만 실행 server_name note.chanyeongpark.com; #접속 주소가 note.chanyeongpark.com 인 경우에만 실행 # root /home/note.chanyeongpark.com/public_html; #virtual host 경로 설정 # index index.html #index 파일명 설정 return 301 https://note.chanyeongpark.com; #80번포트로 접속한 경우 https://로 리다이렉팅 } server { listen 443 ssl; #443포트로 접속한 경우에만 실행 server_name note.chanyeongpark.com; #접속 주소가 note.chanyeongpark.com 인 경우에만 실행 root /home/note.chanyeongpark.com/public_html; #virtual host 경로 설정 error_log /home/note.chanyeongpark.com/error_log; #error log 파일 위치 access_log /home/note.chanyeongpark.com/access_log; #access log 파일 위치 ssl_certificate /etc/letsencrypt/live/note.chanyeongpark.com/fullchain.pem; #ssl 적용을 위한 pem 위치 ssl_certificate_key /etc/letsencrypt/live/note.chanyeongpark.com/privkey.pem; #ssl 적용을 위한 privatekey 위치 location / { proxy_pass http://111.222.333.444/; #111.222.333.444를 목적지로 포워딩 한다. proxy_http_version 1.1; #proxy http 버전을 1.1로 설정(nginx 공식 문서에서 1.1로 권장함, 기본값은 1.0) proxy_set_header Host $http_host; #http host 정보를 header로 전달한다. proxy_set_header X-Real-IP $remote_addr; #요청 클라이언트의 IP를 header로 전달한다. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } } http로 접근한 경우 ssl이 적용된 도메인으로 리다이렉트 되어야 하기 때문에 virtual host 경로를 지정하여 인증서를 발급(재발급) 받을 수 있도록 하였으며, http 접속시 https로 301 리다이렉트 되도록 구성 하였다. 443포트로 접속시에는 요청 클라이언트의 정보를 header로 실어 목적지 서버로 전달할 수 있도록 설정하였다. # root /home/note.chanyeongpark.com/public_html; # index index.html 위 구문은 let's encrypt에서 인증서 발급시 http로 접속하는 경우 홈디렉토리로 연결 되어야 하기네 필요한 구문으로, ssl 연결 이후 연장할 때는 불필요하므로 주석처리 해뒀다. proxy_http_version 기본값 1.0으로 사용시 시놀로지 DSM을 reverse proxy 하는 경우 모바일에서 js, css 등 리소스를 로드하지 못하는 현상이 발견 되었다.
리눅스 실시간 모니터링 도구 htop 사용하기
기본적으로 리눅스에는 실시간 모니터링을 위한 도구인 'top' 을 제공한다. # top top 을 실행하면 아래와 같은 화면의 모니터링 정보가 노출 되는데 cpu, 메모리, 로드율등 기본적인 현황을 확인할 수 있다. htop으로 보다 세부적인 모니터링 htop 은 top 보다 세부적인 실시간 모니터링 정보를 확인할 수 있는 도구로 아래와 같이 yum으로 설치하여 사용할 수 있다. # yum install epel-release # yum install htop # htop 실행 화면은 다음과 같은데, cpu의 각 스레드별로 사용률을 확인할 수 있고, 다양한 설정을 통해 실시간 내역을 명확하게 확인 가능하다.
[mariadb] mariadb table schema (테이블 명세) 출력 쿼리
mysql table 명세서를 아래 쿼리를 통해 출력할 수 있다. 명세서 작성시 유용하게 활용할 수 있다. table schema 추출 아래 스키마명, 테이블명을 적절히 수정하여 사용한다. SELECT t1.table_name, t1.table_comment, column_name, data_type, column_type, column_key, is_nullable, column_default, extra, column_comment FROM (SELECT table_name, table_comment FROM information_schema.TABLES WHERE table_schema='스키마명' AND table_name='테이블명') t1, (SELECT table_name, column_name, data_type, column_type, column_key, is_nullable, column_default, extra, column_comment, ordinal_position FROM information_schema.COLUMNS WHERE table_schema='스키마명' AND table_name='테이블명') t2 WHERE t1.table_name = t2.table_name ORDER BY t1.table_name, ordinal_position; 아래와 같이 결과가 출력된다.
[centOS] 경로내 .DS_Store 파일 일괄 삭제
.DS_Store 파일은 맥에서 디렉토리 접근시 자동 생성되는 메타데이터를 저장하는 '숨김 파일'이다. 윈도우의 thumb.db 과 같은 맥락의 파일이다. 아래와 같이 맥에서 생성되는 .DS_Store 파일을 일괄 삭제할 수 있다. .DS_Store 일괄 삭제 아래와 일괄 삭제. #find . -type f -name .DS_Store -delete
[centOS] 버퍼메모리 초기화 방법
프로그램의 과부하 혹은 메모리 누수로 인해 버퍼메모리가 과도하게 발생한 경우 아래와 같이 강제로 메모리를 초기화 할 수 있다. 퍼버메모리 초기화 아래와 같이 버퍼 메모리를 초기화 할 수 있다. #echo 3 > /proc/sys/vm/drop_cache
[centOS] 현재 FTP/SSH 접속해있는 접속자 ip 확인하기
현재 FTP와 SSH에 접속해있는 접속 ip를 확인할 수 있다. 현재 FTP/SSH 접속 ip확인 아래와 같이 확인 #last | grep logged | awk '{print $1,$3}' | sort | uniq -c | sort -n | awk '{print $2,$3}'
[centOS] hosts.allow 와 hosts.deny 설정으로 서버 접근 ip 차단
iptable에서 아이피 접근을 차단할 수 있지만, hosts.allow 와 hosts.deny 파일 설정을 통해 트래픽 유형별로 세분화하여 아이피 차단/허용 처리 할 수 있다. hosts.allow 로 아이피 차단 아이피 접근 차단 방법을 안내한다. # vi /etc/hosts.deny 설정 파일을 vi로 연다. ... ALL: ALL 위와 같이 모든 아이피를 차단할 수 있으며, 이 경우 허용하고자 하는 특정 아이피만 hosts.allow 에서 열어줘야 한다. 입력 방법은 아래 참고. ... ALL: 111.222.333.444, 222.333.444.555 위와 같이 차단할 아이피를 지정할 수 있다. 여러 아이피인 경우 콤마(,)로 입력한다. ... sendmail: 111.222.333.444, 222.333.444.555 sendmail: ALL 위와 같이 sendmail 에 대한 접근 차단을 할 수도 있다. hosts.allow 로 아이피 허용 아이피 접근 허용 방법을 안내한다. # vi /etc/hosts.allow 설정 파일을 vi로 연다. ... ALL: 111.222.333.444, 222.333.444.555 위와 같이 허용할 아이피를 지정할 수 있다. 여러 아이피인 경우 콤마(,)로 입력한다. ... sendmail: 111.222.333.444, 222.333.444.555 위와 같이 sendmail 에 대한 접근 허용을 할 수도 있다.
[centOS] 포트별 접속자 수를 출력하는 sh 스크립트 파일 작성
현재 포트별 접속자 수를 출력하는 스크립트. 스크립트 파일 작성 vi로 스크립트 파일을 작성한다. # vi /var/log/port_stat.sh 파일 내용에 아래와 같이 입력한다. #!/bin/bash ports=("443" "80" "21000" "20000" "3306") for port in "${ports[@]}"; do count=$(netstat -an | grep ":${port}" | wc -l) echo "Port ${port} => ${count}" done 위 스크립트를 실행하면, 아래와 같이 포트별 접속자 수가 출력된다. # /var/log/port_stat.sh
[centOS] 아파치 access_log 에서 특정 시간동안의 아이피별 접속 횟수 추출하기
아파치의 access_log 파일 내용을 활용하여 특정 기간동안 아이피별로 접속 횟수를 추출해주는 스크립트 파일. 오늘동안의 아이피별 접속 횟수 출력 vi로 sh 파일을 생성한다. # vi /var/log/today_log.sh 파일 내용에 아래와 같이 입력한다. #!/bin/bash # 로케일을 영어(미국)으로 변경 export LC_TIME="en_US.UTF-8" LOG_FILES=( "/var/log/httpd/access_log" #"/home/zigger.net/access_log" #"/home/bboggi.com/access_log" #"/home/note.chanyeongpark.com/access_log" ) DATE=$(date +"%d/%b/%Y") for LOG_FILE in "${LOG_FILES[@]}"; do output=$(grep "${DATE}" "${LOG_FILE}" | grep -Ev '(\.js|\.css|\.woff|\.jpg|\.jpeg|\.gif|\.png|\.bmp|\.txt)' | awk '{ip_count[$1]++} END {for (ip in ip_count) {print ip, ip_count[ip]}}' | sort -k2,2n) echo "[ Log File: ${LOG_FILE} ]" echo "$output" echo echo ${DATE} done 위 스크립트중 LOG_FILES 배열은 추출할 다수의 로그 파일 경로를 지정하며, grep -Ev '(\.js|\.css|\.woff|\.jpg|\.jpeg|\.gif|\.png|\.bmp|\.txt)' 는 js, css, jpg 등 리소스 파일은 제외하고 순수한 웹페이지 파일 접속 아이피만을 추출한다. 위 스크립트를 실행하면, 아래와 같이 아이피별 접속 횟수가 출력된다. # /var/log/today_log.sh 현재 '시' 기준 아이피별 접속 횟수 출력 현재 '시'를 기준으로 아이피별 접속 횟수는 아래와 같이 작성한다. #!/bin/bash # 로케일을 영어(미국)으로 변경 export LC_TIME="en_US.UTF-8" # 로그 파일 경로 설정 LOG_FILES=( "/var/log/httpd/access_log" ) # 현재 시간을 구해서 DATE 변수에 저장 (한 시간 전으로 설정) DATE=$(date +"%d/%b/%Y:%H") for LOG_FILE in "${LOG_FILES[@]}"; do # 해당 로그 파일에서 최근 한 시간 동안의 접속 기록을 필터링하고 IP 주소별로 카운트 output=$(grep "${DATE}" "${LOG_FILE}" | grep -Ev '(\.js|\.css|\.woff|\.jpg|\.jpeg|\.gif|\.png|\.bmp|\.txt)' | awk '{ip_count[$1]++} END {for (ip in ip_count) {print ip, ip_count[ip]}}' | sort -k2,2n) echo "[ Log File: ${LOG_FILE} ]" echo "$output" echo echo ${DATE} done
[centOS] CentOS 7 에서 기본적인 iptables 설정 방법
centos7은 firewalld와 iptable이 함께 구동 되는데, 나의 경우 firewalld가 익숙하지 않기 때문에 firewalld를 비활성화 한 뒤 iptable 위주로 사용한다. 서버 앞단에 방화벽이 없는 경우 iptable 설정이 필수이기 때문에 기본적인 설정 방법을 정리해 본다. firewalld 사용을 원치 않는 경우 비활성화 하기 아래 명령어로 firewalld를 종료 및 비활성화 한다. # systemctl stop firewalld # systemctl mask firewalld iptables-services 설치 iptable-services 가 설치되어 있지 않은 경우 iptables 데몬 시작시 'Failed to start iptables.service: Unit not found.'와 같은 에러가 발생한다. 아래와 같이 iptables-services 를 설치한다. #yum install iptables-services iptables 정책 확인 아래와 같이 현재 설정되어 있는 iptable 정책 내용을 확인한다. # iptables -nL 모든 포트 접속을 차단한 뒤 특정 포트만 접속 허용 보안을 위해 서버에 들어오는 모든 포트를 기본적으로 차단하고 특정 필요한 포트만 개방시키는 정책을 설정한다. 먼저 설정되는 정책이 우선 순위를 갖게 되므로 허용할 포트를 먼저 설정한 뒤 모든 포트를 차단하는 정책을 마지막에 설정해야 한다. 차단 정책이 먼저 설정되는 경우 SSH 접속이 불가하니 주의해야 한다. 가장 먼저, 현재 등록되어 있는 정책을 모두 초기화 시킨다. # iptables -F output tcp/udp 포트는 모두 개방시킨다. # iptables -A OUTPUT -p tcp -j ACCEPT # iptables -A OUTPUT -p udp -j ACCEPT 한번 연결된 트래픽에 대한 응답을 지속 시키기 위해 아래와 같이 정책을 추가한다. 아래 정책이 없는 경우 pdo로 database를 연결하는 웹앱에서 문제가 발생할 수 있다. # iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT 그 다음, 필요한 포트를 아래와 같이 개방 시킨다. # iptables -A INPUT -p tcp --dport 22 -j ACCEPT 아래와 같이 범위로 포트를 지정할 수도 있다. # iptables -A INPUT -p tcp --match multiport --dports 5000:5050 -j ACCEPT 필요 포트를 모두 개방 하였다면, 마지막으로 나머지 포트를 모두 차단한다. # iptables -A INPUT -j DROP 등록된 정책의 우선순위 변경 아래와 같이 나중에 등록한 정책의 우선순위를 높일 수 있다. 원하는 우선순위를 숫자로 입력하여 설정한다. # iptables -I INPUT 1 -p tcp --dport 8080 -j ACCEPT 등록된 정책 삭제 등록된 정책 중 원치않는 정책을 삭제할 수 있다. 우선순위의 숫자로 지정 하거나, 포트 번호를 명시하여 지정할 수 있다. # iptables -D INPUT 1 # iptables -D INPUT -p tcp --dport 8080 -j ACCEPT 정책 저장 및 복구 iptable 사용시 주의해야 할 점은, 데몬을 restart하는 경우 정책이 모두 초기화 된다는 점이다. (이를 보완하기 위한 데몬이 존재하기는 하지만) 지금까지 설정한 정책을 시스템에 저장한 뒤 원할 때 마다 복구시킬 수 있는 방법이 있다. 먼저, iptable 정책 설정이 마무리 되었다면 아래와 같이 정책을 저장한다. # service iptables save or # iptables-save > /etc/sysconfig/iptables 데몬 재시작 후 정책이 초기화 되었다면 아래와 같이 저장된 정책을 다시 복구시킨다. # iptables-restore < /etc/sysconfig/iptables iptable을 통해 접속 ip 차단 시키기 iptable에서 특정 input ip를 접속 차단시킬 수 있는데, 정책 등록시 아이피 대역으로도 설정할 수 있다. 아래와 같이 ip를 지정하여 접속을 차단시킨다. (이때 아이피 차단을 가장 우선순위로 하기 위해 숫자 1을 함께 지정한다.) # iptables -A INPUT 1 -s 111.222.333.444 -j DROP [ ip대역으로 차단하는 경우 - 111.222.333.xxx ] # iptables -A INPUT 1 -s 111.222.333.0/24 -j DROP [ ip대역으로 차단하는 경우 - 111.222.xxx.xxx ] # iptables -A INPUT 1 -s 111.222.0.0/16 -j DROP [ ip대역으로 차단하는 경우 - 111.xxx.xxx.xxx ] # iptables -A INPUT 1 -s 111.0.0.0/8 -j DROP vi 로 iptable 관리하기 앞서 명령어를 통한 iptable 설정방법 외에도 아래와 같이 vi 로도 설정할 수 있다. iptable에 등록된 정보가 많은 경우 vi를 통해 손쉽게 관리 가능하다. # vi /etc/sysconfig/iptables
[centOS] CentOS 7 에서 여러 파일 동시에 개행처리 '\n' 으로 변경 (feat. vscode 개행 설정)
윈도우, mac, 리눅스는 vscode 나 에디트플러스 같은 IDE 등에서 코드를 작성하는 경우 개행(줄바꿈) 처리 방식이 다르다. 눈에 보이지 않지만, 라인의 끝(EOL)에는 각 os마다의 개행 코드가 들어간다. 윈도우 = \r\n mac = \r 리눅스 = \n 만약, 하나의 파일에 대해 윈도우와 mac을 왔다갔다 하며 코딩을 진행 했다면 두가지의 개행처리가 혼재되는 경우 vscode 등에서 줄바꿈이 두번 되거나, 컴파일이 안되는 등 문제가 발생할 수 있다. (문제가 되는 파일을 리눅스에서 vi로 열어보면 라인 끝에 ^M 이 비정상적으로 붙는 것을 확인할 수 있다.) 때문에, os를 혼용하며 코딩을 하더라도 개행처리가 한가지로 통일 되도록 해야 하는데, 호환성을 위해 리눅스 (\n) 기준으로 모두 통일시켜 작업하는 것이 좋다. 개행처리 오류가 발생한 파일들을 일괄적으로 '\n' 으로 변환하기 # find {폴더명} \( -name ".htaccess" -o -name "*.php" -o -name "*.html" -o -name "*.sql" -o -name "*.css" -o -name "*.js" -o -name "*.xml" -o -name "*.txt" -o -name "LEADME" -o -name "LICENSE" \) -type f -exec sed -i 's/\r//g' {} + 위 명령어를 리눅스에서 실행한다. 특정 폴더 내에서 .php / .html / .sql / .css / .js / .xml / .txt / LEADME / LICENSE 파일에 대해서 코드상의 개행을 '\n'으로 바꾼다. 쉽게 보면 윈도우 개행이 발견되면 '/r' 을 지워 리눅스 개행으로 바꾸는 것이다. vscode의 개행처리를 '\n'으로 변경 다시는 개행처리가 뒤섞이는 일이 없도록 vscode의 개행처리 설정을 변경한다. (\n 으로 통일.)
[centOS] 네임서버 구축 - PowerDNS 4.1 & Poweradmin 2.1 설치
일반적으로, 네임서버 구축시 bind를 많이 사용 하지만, DBMS와 연동되어 ui로 간편하게 DNS를 관리할 수 있도록 해주는 PowerDNS를 빼놓을 수는 없다. 다만, powerDNS는 아파치와 MariaDB 데몬이 항시 실행되고 있어야 하기 때문에 서버의 자원을 bind보다는 많이 점유하므로 서버 사양을 고려하여 bind를 대체하여 사용할 수 있을지 잘 판단해 봐야 한다. YUM으로 pdns 설치 YUM으로 간단하게 pdns를 설치할 수 있다. #yum install pdns CentOS 7.5 기준으로 yum 으로 설치되는 pdns 버전은 4.1.14다. pdns 에서 사용할 DB 생성 pdns는 DBMS를 기반으로 하기 서버에 mariaDB 데몬이 실행되고 있어야 하며 MariaDB 에서 사용할 DB를 하나 만들어야 한다. #mysql -u root -p 로 mysql에 접속한다. MariaDB [(none)] > use mysql; Mysql에 접속 되면 위와 같이 mysql DB를 선택한다. MariaDB [(mysql)] > create database pdns_db default character set utf8; pdns_db 데이터베이스를 생성한다. MariaDB [(mysql)] > flush privileges; 반영을 위해 flush privileges 한다. pdns DB에 관련 Table 생성 앞서 생성한 DB에 pdns 관련 table를 생성한다. pdns에서 필요로 하는 table은 16개다. 하나라도 누락되면 pdns구동이 되지 않으니 반드시 빠짐없이 생성해야 한다. 아래 sql구문을 복사-붙여넣기 하여 생성해도 된다. CREATE TABLE `comments` ( `id` int(11) NOT NULL, `domain_id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `type` varchar(10) NOT NULL, `modified_at` int(11) NOT NULL, `account` varchar(40) NOT NULL, `comment` text NOT NULL ) ENGINE=InnoDB; CREATE TABLE `cryptokeys` ( `id` int(11) NOT NULL, `domain_id` int(11) NOT NULL, `flags` int(11) NOT NULL, `active` tinyint(1) DEFAULT NULL, `content` text ) ENGINE=InnoDB; CREATE TABLE `domainmetadata` ( `id` int(11) NOT NULL, `domain_id` int(11) NOT NULL, `kind` varchar(32) DEFAULT NULL, `content` text ) ENGINE=InnoDB; CREATE TABLE `domains` ( `id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `master` varchar(128) DEFAULT NULL, `last_check` int(11) DEFAULT NULL, `type` varchar(6) NOT NULL, `notified_serial` int(11) DEFAULT NULL, `account` varchar(40) DEFAULT NULL ) ENGINE=InnoDB; CREATE TABLE `migrations` ( `domain_id` varchar(255) NOT NULL, `record_id` int(11) NOT NULL ) ENGINE=InnoDB; CREATE TABLE `perm_items` ( `id` int(11) NOT NULL, `name` varchar(64) NOT NULL, `descr` varchar(1024) NOT NULL ) ENGINE=InnoDB; CREATE TABLE `perm_templ` ( `id` int(11) NOT NULL, `name` varchar(128) NOT NULL, `descr` varchar(1024) NOT NULL ) ENGINE=InnoDB; CREATE TABLE `perm_templ_items` ( `id` int(11) NOT NULL, `templ_id` int(4) NOT NULL, `perm_id` int(4) NOT NULL ) ENGINE=InnoDB; CREATE TABLE `records` ( `id` int(11) NOT NULL, `domain_id` int(11) DEFAULT NULL, `name` varchar(255) DEFAULT NULL, `type` varchar(6) DEFAULT NULL, `content` varchar(255) DEFAULT NULL, `ttl` int(11) DEFAULT NULL, `prio` int(11) DEFAULT NULL, `change_date` int(11) DEFAULT NULL, `disabled` char(1) NOT NULL DEFAULT '0', `ordername` varchar(255) DEFAULT NULL, `auth` tinyint(1) NOT NULL DEFAULT '1' ) ENGINE=InnoDB; CREATE TABLE `records_zone_templ` ( `domain_id` int(11) NOT NULL, `record_id` int(11) NOT NULL, `zone_templ_id` int(11) NOT NULL ) ENGINE=InnoDB; CREATE TABLE `supermasters` ( `ip` varchar(25) NOT NULL, `nameserver` varchar(255) NOT NULL, `account` varchar(40) DEFAULT NULL ) ENGINE=InnoDB; CREATE TABLE `tsigkeys` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `algorithm` varchar(50) DEFAULT NULL, `secret` varchar(255) DEFAULT NULL ) ENGINE=InnoDB; CREATE TABLE `users` ( `id` int(11) NOT NULL, `username` varchar(64) NOT NULL, `password` varchar(128) NOT NULL, `fullname` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, `description` varchar(1024) NOT NULL, `perm_templ` int(1) NOT NULL, `active` int(1) NOT NULL, `use_ldap` int(1) NOT NULL ) ENGINE=InnoDB; CREATE TABLE `zones` ( `id` int(4) NOT NULL, `domain_id` int(4) NOT NULL, `owner` int(4) NOT NULL, `comment` varchar(1024) DEFAULT NULL, `zone_templ_id` int(4) NOT NULL ) ENGINE=InnoDB; CREATE TABLE `zone_templ` ( `id` int(11) NOT NULL, `name` varchar(128) NOT NULL, `descr` varchar(1024) NOT NULL, `owner` int(11) NOT NULL ) ENGINE=InnoDB; CREATE TABLE `zone_templ_records` ( `id` int(11) NOT NULL, `zone_templ_id` int(11) NOT NULL, `name` varchar(255) NOT NULL, `type` varchar(6) NOT NULL, `content` varchar(255) NOT NULL, `ttl` int(11) NOT NULL, `prio` int(11) NOT NULL ) ENGINE=InnoDB; ALTER TABLE `comments` ADD PRIMARY KEY (`id`), ADD KEY `comments_domain_id_idx` (`domain_id`), ADD KEY `comments_name_type_idx` (`name`,`type`), ADD KEY `comments_order_idx` (`domain_id`,`modified_at`); ALTER TABLE `cryptokeys` ADD PRIMARY KEY (`id`), ADD KEY `domainidindex` (`domain_id`); ALTER TABLE `domainmetadata` ADD PRIMARY KEY (`id`), ADD KEY `domainmetadata_idx` (`domain_id`,`kind`); ALTER TABLE `domains` ADD PRIMARY KEY (`id`); ALTER TABLE `perm_items` ADD PRIMARY KEY (`id`); ALTER TABLE `perm_templ` ADD PRIMARY KEY (`id`); ALTER TABLE `perm_templ_items` ADD PRIMARY KEY (`id`); ALTER TABLE `records` ADD PRIMARY KEY (`id`), ADD KEY `rec_name_index` (`name`), ADD KEY `nametype_index` (`name`,`type`), ADD KEY `domain_id` (`domain_id`); ALTER TABLE `tsigkeys` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `namealgoindex` (`name`,`algorithm`); ALTER TABLE `users` ADD PRIMARY KEY (`id`); ALTER TABLE `zones` ADD PRIMARY KEY (`id`); ALTER TABLE `zone_templ` ADD PRIMARY KEY (`id`); ALTER TABLE `zone_templ_records` ADD PRIMARY KEY (`id`); ALTER TABLE `comments` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `cryptokeys` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `domainmetadata` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `domains` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `perm_items` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `perm_templ` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `perm_templ_items` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `records` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `tsigkeys` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `users` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `zones` MODIFY `id` int(4) NOT NULL AUTO_INCREMENT; ALTER TABLE `zone_templ` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; ALTER TABLE `zone_templ_records` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT; pdns 설정파일 수정 pdns와 mariaDB 연동을 위해 pdns 설정 파일을 열어 수정한다. #vi /etc/pdns/pdns.conf vi 에디터로 설정 파일을 연다 launch=gmysql gmysql-host=127.0.0.1 gmysql-user=db 사용자 아이디 gmysql-password=비밀번호 gmysql-dbname=pdns_db 위 변수를 찾아 mariadb 사용자 정보와 DB명을 입력한다. #systemctl start pdns 설정을 마쳤다면, pdns를 가동시킨다. poweradmin 설치 pdns 설정을 위해 PHP로 개발된 pdns관리 인터페이스 poweradmin을 설치한다. poweradmin은 PHP기 때문에 서버에 apache 데몬이 실행되고 있어야 한다. #cd /home/poweradmin/public_html 설치할 홈디렉토리 #wget https://jaist.dl.sourceforge.net/project/poweradmin/poweradmin-2.1.7.tgz #tar xvf poweradmin-2.1.7.tgz 위와 같이 wget으로 공식 웹사이트에서 poweradmin 압축 파일을 다운로드 하고 홈디렉토리 내에 압축을 푼다. (wget 수행시 파일을 못찾는 경우 본 글 하단에 첨부된 파일로 시도하면 됨) #cp ./inc/config-me.inc.php ./inc/config.inc.php 번들로 들어있는 config-me.inc.php 파일을 복사하여 config.inc.php 파일을 새로 만든다. #vi ./inc/config.inc.php 설정파일 변경을 위해 config.inc.php를 vi에디터로 연다 $db_host = 'localhost'; $db_port = '3306'; $db_user = 'DB계정 아이디'; $db_pass = 'DB계정 패스워드'; $db_name = '생성한 DB명'; 위 변수를 찾아 생성한 DB 정보로 변경한다. poweradmin 실행 및 설치 웹브라우저에서 powerdns를 접속하여 설치를 진행하면 모든 설치 과정이 완료된다. 화면상에 안내된 설명대로 진행하면 어려움 없이 설치 가능하다.
1
2