AWS CloudWatch에서 CentOS의 메모리와 디스크 사용량을 모니터링 하는 방법

아쉽게도 CloudWatch가 기본으로 제공하는 EC2 metrics에는 메모리와 디스크 사용량이 포함되어 있지 않습니다. 하지만 아래 링크를 보고 따라하면 custom metrics 형태로 모니터링 할 수 있습니다.

http://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html

문제는 CentOS에서는 위 링크대로 잘 되지 않습니다. Prerequisites 부분부터 막히게 됩니다. 그 부분만 넘어가면 나머지는 문제없이 잘 되구요.

삽질하다가 쉽게 Prerequisites관련 부분을 해결할수 있는 방법을 찾게되서 공유합니다.

$ yum -y install wget make gcc perl-ExtUtils-CBuilder cpan
$ wget http://xrl.us/cpanm -P /usr/bin
$ chmod +x /usr/bin/cpanm
$ cpanm -f Bundle::LWP5_837

Prerequisites 관련되서 설정하는 부분을 위 방법으로 대체하시고 Getting Started부터 진행 하시면 됩니다.

AWS EC2 user-data를 이용해서 chef node를 설정 및 생성하는 AMI 만들기

1. 깨끗한 CentOS AMI로 EC2 인스턴스 생성

2. chef-client 및 유틸리티 프로그램 설치

# install chef-client
curl -L https://www.opscode.com/chef/install.sh | bash
# install wget
yum -y install wget
# install jsonparser
wget http://stedolan.github.io/jq/download/linux64/jq -P /usr/bin
chmod +x /usr/bin/jq
# make chef directory
mkdir /etc/chef

3. validation.pem 복사

chef-server의 /root/chef-repo/.chef/chef-validator.pem을
chef-client의 /etc/chef/validation.pem으로 복사

4. startup.sh 생성 및 부팅할때 실행되도록 /etc/rc.local에 startup.sh 등록

startup.sh는 Using Chef to bootstrap AutoScaled EC2 instance 에 있는 스크립트를 이용해서 만들었습니다.

#!/bin/bash

# The script is set to run at multiple RC runlevels so make sure it can only be ran once
if [ -f /etc/chef/chef-bootstrap.done ]
then
 exit
fi
touch /etc/chef/chef-bootstrap.done

# define a function for later use
function getmeta() {
 wget -qO- http://169.254.169.254/latest$1
}

# get EC2 meta-data
env=`(getmeta /user-data) | jq '.chef' | jq '.env'`
jsonattribute=`(getmeta /user-data) | jq '.chef' | jq '.jsonattribute'`
runlist=`(getmeta /user-data) | jq '.chef' | jq '.jsonattribute' | jq '.run_list'`
hostname="$(getmeta /meta-data/local-hostname)"

# write first-boot.json to be used by the chef-client command.
# this sets the ROLE of the node.
echo -e $jsonattribute >> /etc/chef/first-boot.json

# write client.rb
# this sets the ENVIRONMENT of the node, along with some basics.
echo -e "log_level :info" >> /etc/chef/client.rb
echo -e "log_location STDOUT" >> /etc/chef/client.rb
echo -e "chef_server_url 'https://ip-172-31-23-206.ap-northeast-1.compute.internal'" >> /etc/chef/client.rb
echo -e "validation_client_name 'chef-validator'" >> /etc/chef/client.rb
echo -e "environment $env" >> /etc/chef/client.rb

# append the node FQDN to knife.fb
echo -e "node_name '$hostname'" >> /etc/chef/knife.rb

# run chef-client to register the node and to bootstrap the instance
chef-client -d -j /etc/chef/first-boot.json

5. 해당 EC2 인스턴스를 AMI로 저장.

6. AMI로 EC2 인스턴스를 만들때 user-data에 JSON형식으로 node 설정 정보를 포함시킨다.

아래와 같은 user-data를 입력하여 생성된 node에는 6379 port를 사용하는 redis master와 6380 port를 사용하는 redis slave가 설치되어 실행되게 됩니다. 단 이링크를 수행하셔서 redisio cookbook이 설치되어 있고, role에 redis가 추가 되어있는 경우에만 가능합니다.

run_list 및 env를 상황에 맞게 변경하시고, 필요한 attributes를 추가해서 사용하시면 됩니다.

{ "chef": {
 "env" : "dev",
 "jsonattribute" : {
 "run_list": ["role[primarydb]"],
 "redisio" : {
 "servers" : [
 {"port" : "6379"},
 {"port" : "6380", "slaveof" : { "address" : "127.0.0.1", "port" : "6379" }}
 ]
 }
 }
 }
}

MongoDB의 질의 결과를 file에 저장하기

1. 질의 스크립트를 생성해주세요.
query.js

var dbname = 'log';
var db = db.getSiblingDB(dbname);
var cursor = db.ItemLogData.find();

while(cursor.hasNext()) {
 printjson(cursor.next());
}

query.js의 내용중에 dbname과 collection, 질의 내용을 본인에 맞게 수정해주세요.

2 mongo 명령어를 사용해서 질의 스크립트를 실행해주시면 됩니다.
$mongo –quiet query.js > result.txt

Chef 서버가 설치된 머신의 IP가 변경 되었을때 같이 변경해주어야 하는것

AWS에서 학습용으로 CentOS에 Chef서버를 설치한 후, 유지비가 아쉬어서 인스턴스를 꺼두었다가 다시 공부하기 위해 켰습니다. Chef서버가 설치된 인스턴스의 IP는 기존과 달라졌고, 기존에 잘 작동하던 Chef의 knife명령어가 작동을 하지 않게 되었습니다.

[root@ip-172-31-21-96 chef-repo]# knife client list
ERROR: Server returned error for https://54.238.235.209/clients, retrying 1/5 in 3s
ERROR: Server returned error for https://54.238.235.209/clients, retrying 2/5 in 7s
ERROR: Server returned error for https://54.238.235.209/clients, retrying 3/5 in 11s
ERROR: Server returned error for https://54.238.235.209/clients, retrying 4/5 in 19s
ERROR: Server returned error for https://54.238.235.209/clients, retrying 5/5 in 63s
ERROR: bad gateway
Response: <html>
<head><title>502 Bad Gateway</title></head>
<body bgcolor="white">
<center><h1>502 Bad Gateway</h1></center>
<hr><center>nginx/1.2.3</center>
</body>
</html>

몇시간의 삽질끝에 위 에러는 knife.rb를 수정하면서 해결했습니다.

  • $vi /root/chef-repo/.chef/knife.rb
  • chef_server_url  항목을 변경된 IP로 수정

그 후 테스트로 knife ec2 server create를 해보니 cookbook syncing 하는 단계에서 문제가 있내요.

ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com Synchronizing Cookbooks:
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com ================================================================================
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com Error Syncing Cookbooks:
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com ================================================================================
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com Networking Error:
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com -----------------
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com Error connecting to https://ip-172-31-19-139.ap-northeast-1.compute.internal/bookshelf/organization-00000000000000000000000000000000/checksum-cab742118ad189a0ce294a7237aacd66?AWSAccessKeyId=5e7260ff7bfe2c7401f4695883b2d47382cc2268&Expires=1384651008&Signature=xfBGBilY9jsKRXCkXbB1/tUT6qM%3D - Connection timed out - connect(2)
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com
ec2-54-238-153-102.ap-northeast-1.compute.amazonaws.com Your chef_server_url may be misconfigured, or the network could be down.

결국 또 몇시간의 삽질끝에 chef-pedant와 erchef의 설정을 수정해서 해결했습니다.

  • $vi /var/opt/chef-server/chef-pedant/etc/pedant_config.rb
  • chef_server 항목을 변경된 IP로 수정
  • $vi /var/opt/chef-server/erchef/etc/app.config
  • {s3_url, 항목을 변경된 IP로 수정
  • $chef-server-ctl restart

결론은 Chef서버 IP가 바뀌면 이것저것 귀찮게 수정해줘야 하는게 있으니 되도록 Chef서버 IP는 바꾸지 맙시다. ㅜㅜ

————————————————내용추가————————————————

결론을 위와 같이 내리려다가 연습용 인스턴스를 계속 켜두기에는 돈이 아까워서, 서버가 실행될때 현재IP로 위 내용을 수정하는 스크립트를 만들었습니다.

startup.sh

#!/bin/sh

knife_replacefrom="chef_server_url.*"
knife_replaceto="chef_server_url ""\'https:\/\/"`hostname -f`":443\'"
sed -i "s/$knife_replacefrom/$knife_replaceto/g" /root/chef-repo/.chef/knife.rb

pedant_replacefrom="chef_server.*"
pedant_replaceto="chef_server ""\"https:\/\/"`hostname -f`"\""
sed -i "s/$pedant_replacefrom/$pedant_replaceto/g" /var/opt/chef-server/chef-pedant/etc/pedant_config.rb

erchef_replacefrom="{s3_url,.*"
erchef_replaceto="{s3_url, ""\"https:\/\/"`hostname -f`"\"},"
sed -i "s/$erchef_replacefrom/$erchef_replaceto/g" /var/opt/chef-server/erchef/etc/app.config

/opt/chef-server/bin/chef-server-ctl restart

startup.sh를 실행하도록 /etc/rc.local을 수정해주세요.

ps : AWS에서 Chef 서버는 최소 m1.small이상에서 돌려 주세요. t1.micro는 사양 문제로 알수없는 오류가 많이 납니다.

실수로 AWS AMI를 날려 먹을뻔한 이야기;

여러 Region을 사용하기 위해서 작업을 하고 있는 중입니다.
Region마다 서로 다른 Key Pairs를 사용하기 귀찮아서 단일 Key Pairs를 사용할수 없나 검색 해보니, 기존에 AWS에서 생성한 Key Pairs는 사용할수 없고 직접 키를 하나 생성해서 여러 Region의 Key Pairs에 등록하라는 내용이 나오더군요.

아무 생각없이 기존 Key Pairs는 삭제하고, 직접 키를 생성해서 Key Pairs에 등록했습니다. 그리고 기존 AMI로 EC2를 만들어서 새로 생성한 키로 접속을 시도해 보니 왠걸 유효하지 않은 키라고 로그인이 되지를 않더군요.

키를 잘못 만들었나 싶어서 다시 계속 생성해서 시도해 봐도 안됐습니다. 혹시나 싶어서 기존 생성된 AMI말고 Market에 있는 CentOS AMI로 시도해보니 잘되내요.

알고보니 기존 AMI를 이용해서 새로운 Key Pairs로 EC2를 생성해도, AMI에 포함된 authorized_keys를 새로운 Key Pairs의 public key로 갱신을 안해주더군요.

어떻게든 authorized_keys에만 접근해서 수정하면 되는 문제라고 생각되서, 기존 AMI에서 Volume만 띠어내서 Market의 CentOS AMI로 만든 EC2에 붙이려고 했습니다.

하지만 “‘vol-xxxxxxxx’ with Marketplace codes may not be attached as a secondary device.”라는 에러가 뜨면서 절대 붙지를 않더군요. 검색 해보니 Market 보안 문제 이슈로 제공을 안하고 있고, AWS Marketplace team은 이를 지원하기 위해서 열심이 노력중이라는군요.

그걸 보고 잠시 멘붕이 왔습니다. 하하;

멘탈을 잠시 회복하고 생각을 해보니, private key를 구글드라이브에도 보관하고 있었으니 휴지통에 남아있을 거라는 생각이 들었습니다. 뒤져보니 다행이 private key가 휴지통에 곱게 모셔저 있더군요!

휴지통에서 건진 private key로 public key를 만들어서 Key Pairs를 등록하니 다행이 기존 AMI에서 만든 EC2에 접속이 가능 해졌습니다.

그때 뭔가 문득 떠올라서 다른 Region에도 똑같은 방식으로 Key Pairs를 등록했더니 다른 Region에서도 잘 사용 되내요.

그냥 자기가 기존에 만들어서 사용하던 Key Pairs의 private key로 public key 만들어서 다른 Region에 등록하면 되는거 였던 겁니다.

이렇게 쉬운걸 지금까지 삽질하고 있었다니… ㅜㅜ

삽질한걸 적다보니 스크롤이 많이 길어 졌내요. 짧게요약하면 아래와 같습니다.

1. 기존 AMI에 새로운 Key Pairs를 사용해서 EC2를 만들어도, AMI가 포함하고 있는 authorized_key는 갱신되지 않는다.
2. 새로운 Region에 기존 사용하던 Key Pairs를 사용하고 싶으면, 기존 Key Pairs의 private key로 publick key만 만들어서 새로운 Region의 Key Pairs에 등록하면 된다.

3. AMI로 생성한 EC2의 Volume은 다른 EC2에 붙일수 없다(이걸 허용하면 AWS Marketplace vendor software의 보안에 문제가 생길수 있어서 현재 막혀있다).

CentOS에서 vsfptd 설치 및 설정하기

설치

  • $yum -y install vsftpd

vsftpd 누구나 접속가능 설정 끄기

  • $vi /etc/vsftpd/vsftpd.conf
  • anonymous_enable=NO

방화벽 21번 포트 허용

  • $vi /etc/sysconfig/iptables
  • -A INPUT -m state –state NEW -m tcp -p tcp –dport 21 -j ACCEPT
  • $service iptables restart

ftp 사용불가 리스트에서 user 제거

  • $vi /etc/vsftpd/user_list
  • $vi /etc/vsftpd/ftpusers

홈 디렉토리를 읽고 쓸수있도록 SeLinux 수정

  • $setsebool -P ftp_home_dir 1

업로드 전용 user 추가 및 소유권 root로 변경

  • $useradd ftpUpload
  • $chown root:root /home/ftpUpload

FileZilla 접속설정

  • 전송설정 : 능동형

CentOS 명령어 정리

설치

  • wget [URL] : URL에 있는 파일을 다운로드 받는다.
  • rpm
    • rpm -Uvh [rpm] : 패키지를 설치하거나, 업그레이드 한다.
    • rpm -qi [rpm] : 패키지가 설치 되어있는지 확인한다.
    • rpm -e [rpm] : 패키지를 삭제 한다.
  • yum(의존성이 있는 패키지 그룹 단위)
    • yum -y install [패키지] : 패키지를 설치한다.
    • yum -y erase [패키지] : 패키지를 삭제한다.
    • yum list : 설치 가능한 패키지 목록.
    • yum list updates : 업데이트가 가능한 패키지 목록.
    • yum list installed : 설치된 패키지 목록.
    • yum update [패키지] : 패키지명이 없으면 전체 업데이트 있으면 해당 패키지만 업데이트
  • make
    • configure : 컴파일 옵션이 되는 설정파일을 만든다.
    • make : 소스코드를 컴파일 해서 binary 파일을 만든다.
    • make install : 만들어진 binary 파일을 지정된 경로로 이동 시킨다.
    • make uninstall : 설치된 binary 파일을 삭제 한다.

디렉토리

  • pwd : 현재 위치한 디렉토의 절대경로를 출력한다.
  • cd
    • cd [디렉토리] : 디렉토리를 이동할 때에 사용한다.
    • cd .. : 상위 디렉토리로 이동한다.
    • cd ~ : 자신의 홈 디렉토리로 이동한다.
    • cd ~[사용자명] : 특정 사용자의 홈 디렉토리로 이동한다.
  • ls
    • ls : 파일의 목록을 간단히 출력한다.
    • ls -al : 숨겨진 파일을 포함해 자세히 출력한다.
  • mkdir [디렉토리] : 디렉토리를 생성한다.
  • rmdir -p [디렉토리] : 디렉토리를 삭제한다.

파일

  • touch [파일명] : 파일을 만든다.
  • cp [원본] [사본] : 파일을 복사한다.
  • mv [원본] [목적지] : 파일을 이동한다. 이것을 응용해 파일명도 바꿀수 있다.
  • rm
    • rm [파일] : 파일을 삭제한다.
    • rm -rf [파일] : 삭제 동의를 묻지 않고, 파일은 그냥 지우고 디렉리면 하위경로 파일까지 모두 지운다.
  • cat [파일] : 파일의 내용을 출력한다.
  • | : 명령어의 출력결과를 다른 명령어의 입력으로 전환한다. 파이프라고 부른다.
  • less [파일] : 파일의 내용을 한줄씩 출력하고, 위 아래로 이동할수 있다. 출력이 많을때 파이프로 연결해서 많이 사용한다. ex) cat a.log | less
  • find
    • find / -name *linux* : linux가 파일명에 포함된 모든 파일을 찾는다.
    • find / -user linux : 소유자가 linux인 모든 파일을 찾는다.
    • find / -perm 755 : 퍼미션이 755인 모든 파일을 찾는다.
  • grep : 파일 또는 입력값내에서 특정 패턴을 검색한다. 파이프와 조합해서 출력에서 검색하고 싶을때 사용한다. ex) yum list | grep jdk, ps -ef | grep java
  • [명령어] > [파일] : 명령어의 출력을 파일에 저장한다. 덮어쓴다.
  • [명령어] >> [파일] : 명령어의 출력을 파일에 저장한다. 추가한다.
  • [명령어] < [파일] : 파일에서 표준 입력을 받는다.
  • chmod [퍼미션] [파일] : 소유자, 그룹, 다른 사용자가 가지는 퍼미션(읽기, 쓰기, 실행)을 설정한다. 퍼미션은 읽기4, 쓰기2, 실행1을 조합해서 표시한다.
    • chmod 750 [파일] : 소유자 읽고 쓰고 실행 가능, 그룹 읽고 실행 가능
    • chmod 4xxx [파일] : 실행될때 root권한으로 실행된다.
    • chmod 2xxx [파일] [그룹] : 파일에 설정된 그룹명으로 실행된다.
    • chmod 1xxx [디렉토리] : 해당 디렉토리에 누구나 쓰기는 가능하지만, 자신이 만든 파일에 대해서는 자신과 root만이 수정과 삭제가 가능하다.
  • chown [소유자:그룹] [파일] : 파일 소유자와 사용자 그룹을 설정한다.
  • chgrp [그룹] [파일] : 파일 사용자 그룹을 설정한다.
  • chattr +i [파일] : 파일을 수정, 복사, 삭제 할 수 없게 한다.
  • tar
    • tar -cvzf [파일] [경로] : tar로 파일을 압축한다.
    • tar -xvzf [파일] [경로] : tar로 파일을 압축 해제한다.

파일  시스템

  • fdisk -l : 현재 시스템의 파티션 목록과 파티션이 생성안된 disk를 보여준다.
  • fdisk [disk] : disk에 파티션을 생성한다.
  • badblocks -v  [disk] : disk의 배드블록을 체크한다.
  • mkfs -V -t ext4 [장치] : 파일 시스템을 생성한다.
  • mount
    • mount : 현재 마운트된 목록을 보여준다.
    • mount [장치] [디렉토리] : 장치를 디렉토리에 마운트 시킨다.
    • vi /etc/fstab : /etc/fstab을 수정해야 재부팅이 되어도 마운트 설정이 유지된다.
  • umount [디렉토리] : 마운트를 해제한다.
  • df -h : 디스크의 남은 용량을 본다.
  • du
    • du -sh [디렉토리] : 디렉토리의 전체 사용량을 보여준다.
    • du -h [디렉토리] : 모든 하위 디렉토리들의 사용량과 합계를 보여준다.

사용자

  • useradd [사용자명] : 사용자를 생성한다.
  • userdel [사용자명] : 사용자를 제거한다.
  • passwd [사용자명] : 사용자의 비밀번호를 설정한다.
  • groupadd [그룹명] : 그룹을 생성한다.
  • groupdel [그룹명] : 그룹을 삭제한다.
  • id [사용자명] : 사용자의 uid, gid, group을 보여준다.
  • usermod
    • usermod -d [원본홈] -m [변경홈] : 홈디렉토리를 변경하고 파일을 이동한다.
    • usermod -L [사용자명] : 계정을 잠궈서 로그인이 불가능해 진다.
    • usermod -U [사용자명] : 잠긴 계정을 푼다.
  • su – [사용자명] : 다른 사용자의 권한으로 shell을 실행해서, 사용자 전환을 한다.

시간

  • clock
    • clock -r : CMOS 시간을 출력한다.
    • clock -w : 리눅스 시스템 시간으로 CMOS 시간 설정한다.
    • clock -s : CMOS 시간으로 리눅스 시스템 시간 설정한다.
  • date
    • date : 현재 시스템 시간을 출력한다.
    • date [MMDDhhmmYY] : 현재 시스템 시간을 변경한다.

프로세스

  • ps -ef : 현재 실행중인 프로세스의 목록을 보여준다.
  • pgrep -fl [단어] : 해당 단어를 이름으로 가지거나 인자로 받는 프로세스 목록을 보여준다.
    • ex) $pgrep -fl chef

      967 /opt/chef/embedded/bin/ruby /usr/bin/chef-client -d -j /etc/chef/first-boot.json
            970 chef-client worker: ppid=967;start=09:41:34;

           1075 /opt/chef/embedded/bin/ruby /usr/bin/chef-client

           1086 chef-client worker: ppid=1075;start=09:41:37;

  • pkill -f [단어] : 해당 단어를 이름으로 가지거나 인자로 받는 프로세스를 모두 종료 시킨다.
  • pstree : 프로세스 정보를 트리형태로 보여준다.
  • kill
    • kill [PID] : 프로세스를 종료 시킨다.
    • kill -9 [PID] : 프로세스를 강제로 종료 시킨다.
  • top : 프로세스의 CPU, MEMORY 사용량등을 실시간으로 모니터링 해준다.

데몬

  • chkconfig
    • chkconfig –list : 런레벨에 따라 자동으로 실행되는 데몬을 보여준다.
    • chkconfig –add [데몬] : 데몬을 추가한다.
    • chkconfig –del [데몬] : 데몬을 삭제한다.
    • chkconfig –level [런레벨] [데몬] on : 데몬의 런 레벨을 활성화 시킨다.
    • chkconfig –level [런레벨] [데몬] off : 데몬의 런 레벨을 비활성화 시킨다.
  • service
    • service [데몬] status : 데몬 상태를 보여준다.
    • service [데몬] start : 데몬을 시작한다.
    • service [데몬] stop : 데몬을 정지한다.
    • service [데몬] restart : 데몬을 재시작한다.

시스템

  • crontab
    • crontab -e : crontab 설정을 연다.
    • 형식 : 분(0~59) 시간(0~23) 일(1~31) 월(1~12) 요일(0~6) 명령
    • 01 * * * * [명령] : 매시간 1분에 명령 실행한다.
    • 02 4 * * * [명령] : 매일 4시 2분에 명령을 실행한다.
    • 22 4 * * 0 [명령] : 매주 월요일 1일 4시 22분에 명령을 실행한다.
    • */10 * * * * [명령] : 10분마다 명령을 실행한다.
  • uname -a : 커널 버전을 보여준다.
  • poweroff : 종료시킨다.
  • reboot : 재부팅 시킨다.

네트워크

  • ping [호스트] : 다른 시스템의 네트워크가 현재 동작중인지 확인한다.
  • ifconfig
    • ifconfig : 현재 네트워크 인터페이스의 정보를 보여준다.
    • ifconfig [인터페이스] down : 인터페이스를 중지한다.
    • ifconfig [인터페이스] up : 인터페이스를 작동 시킨다.
    • curl ifconfig.me : public ip를 보여준다.
  • nslookup [도메인] : 도메인 정보를 보여준다.
  • netstat
    • netstat -anp  : 네트워크 연결, 라우팅 테이블, 네트워크 장치의 통계정보등 네트워크에 관련된 여러 정보를 보여준다.
    • netstat -anpl : LISTENING 중인 정보만 보여준다.
  • hostname
    • hostname : 현재 시스템의 호스트네임을 보여준다.
    • hostname [변경할네임] : 호스트네임을 변경한다.
    • vi /etc/sysconfig/network : HOSTNAME 항목을 변경해야 리부팅 후에도 변경된 호스트 네임이 유지된다.
  • iptables
    • iptables -A INPUT -s [발신지] –sport [발신지 포트] -d [목적지] –dport [목적지 포트] – j [정책] : 방화벽 정책을 추가한다.
    • iptables -D INPUT [필터링 번호] : 방화벽 정책을 삭제한다.
    • iptables-save : 설정한 방화벽을 저장해서, 재부팅시에도 적용되게 한다.
    • iptables -A INPUT -s 1.1.1.1 -p tcp –dport 8080 -j ACCEPT : 1.1.1.1에서 8080 포트로 tcp 요청하는것을 허락한다.
    • iptables -A INPUT -p tcp –dport 8080 -j DROP : 8080포트로 tcp 요청하는것을 막는다.
    • iptables -A INPUT -p rcp –dport 1:65535 -j DROP : 서비스 이외의 서비스포트 모두 거부한다.
  • nmap [ip] : 현재 오픈되어 있는 포트를 보여준다.

CentOS에서 서버에 장애가 발생 했을때 gmail로 받는법

1. 서버를 체크해서 장애가 발생했을때 메일을 보내는 스크립트를 만듭니다.


# 메일제목
SUBJECT="Server is not working"
# 메일을 전달받을 주소
EMAIL="foo@gmail.com"
# 메일 내용이 적힌 파일
EMAILMESSAGE=/home/admin/ServerChecker/emailmessage.txt

# 서버를 체크하기
# - 본인의 경우 웹서버라서 curl로 웹서버에게 hello를 요청하고 응답을 받았습니다.
# - 웹서버가 문제 없는 경우 it works timestamp를 리턴

SERVER="14.14.14.14:28080/hello"
CHECKRESULT=$(curl $SERVER)

# 서버의 응답 내용중 it works가 포함 되어 있지 않으면 메일을 보냅니다.
case $CHECKRESULT in
 *"it works"*)
 echo "$CHECKRESULT";;
 *)
 /bin/mail -s "$SUBJECT" "$EMAIL" < $EMAILMESSAGE;;
esac

2. 1에서 만든 스크립트를 crontab에 등록해서 1분마다 실행 시킵니다.

  • crontab 편집창 열기
    • $ crontab -e
  • 1분마다 serverCheck.sh를 실행 하게 등록
    • * * * * * /home/admin/ServerChecker/was.sh
  • crontab 재시작하기
    • $ service crond restart

여기까지 완료 했다면 이제 서버가 문제가 생겼을때 발송한 이메일이 gmail로 오게 됩니다. 단 문제가 스팸함으로 오게 됩니다. gmail의 경우 스팸을 방지하기 위해서 메일을 보낸 서버가 믿을만한 서버인지 판단하는 여러가지 까다로운 기준이 있는대 이를 만족하지 못하면 스팸함으로 가차없이 보내버립니다. 이를 만족시키기 위해서 여러가지 세팅을 해야 합니다. 하지만 저는 시간도 없고 귀찮아서 꼼수를 썻습니다.

3. 보낸 메일이 gmail에서 스팸처리 되지 않게 꼼수쓰기

  • gmail에서 “검색 옵션 표시” 클릭
  • “보낸사람” 항목에 CentOS에서 메일을 보내는 계정명 입력
  • “이 검색 기준으로 필터만들기” 클릭
  • “스팸아님” 체크
  • “필터 만들기” 클릭