리눅스 서버에 들어가면 자주 사용하는 커맨드들을 잊지 않게 하기 위해서 기록해 둡니다.
로그인 실패 건수 확인
1. root 계정의 로그인 실패 정보 확인
> perl -ne 'print "$1\n" if(/Failed password for (\w.+) from/)' /var/log/secure | sort | uniq -c | sort -rn |head -10
248 root
43 invalid user 123456
25 invalid user admin
6 invalid user test
3 invalid user user
2 invalid user 123
1 invalid user oracle
1 invalid user com
1 invalid user ubuntu
1 invalid user password2.IP별로 로그인 실패 시도 건수
> perl -ne 'print "$1\n" if(/Failed password\D+((\d+\.){3}\d+)/)' /var/log/secure | sort | uniq -c | sort -rn |head -10
98 197.248.10.108
34 115.238.236.74
21 51.38.57.78
14 195.154.112.70
3 92.222.216.71
2 203.115.15.210
1 5.39.79.48
1 203.110.179.26
1 195.154.113.173
1 94.191.108.176계정별 로그인 실패 건수를 확인하고 로그인 실패가 1000단위가 넘어갈 경우 주기적으로 ssh 포트 변경, root 계정의 패스워드를 변경해 주고, IP별로 로그인 실패 시도 건수이고 건수가 IP는 블럭킹해준다.
시스템 오류 메세지 확인
- dmesg를 통해 segfault, oom-killer os레벨의 오류 메세지 확인.
> dmesg | tail- messages에서 커널과 OS의 표준 프로세스의 로그를 봄.
> cat /var/log/messages | egrep -i "emerg|alert|crit|error|warn|fail"- secure 로그를 통해 ssh 연결 실패 정보를 보고 횟수가 많은지 파악해서 패스워드 변경 주기를 앞당기는 근거로 활용함.
> cat /var/log/secure |tail메모리 확인(free)
CentOs7에서 메모리 용량을 확인하는 free 명령으로 얻을 수 있는 버퍼 및 캐시 영역에는 스왑 영역도 포함되어 있으며, 단순히 메모리 사용 용량 = 메모리 전체 - free - buff/cache 식으로 계산하면 메모리 사용 용량을 과소 평가하게 된다. 최신의 linux 커널은 이러한 부분을 고려하여 메모리 정보를 표시하고 있다.
# free
total used free shared buff/cache available
Mem: 7747768 4060148 219100 402732 3468520 2964992
Swap: 2097148 347400 1749748
# cat /proc/meminfo |grep 'MemTotal\|MemFree\|Buffers\|Cached'
MemTotal: 7747768 kB
MemFree: 217628 kB
Buffers: 434212 kB
Cached: 2604220 kB
SwapCached: 42892 kB메모리 정보 확인 스크립트.
# cat memory-usage-free.sh
#!/bin/bash
export LANG=C, LC_ALL=C
free | awk '
BEGIN{
total=0; used=0; available=0; rate=0;
}
/^Mem:/{
total = $2;
available = $7;
}
END {
used = total - available;
rate= 100 * used / total;
printf("total(KB)\tused(KB)\tavailable(KB)\tused-rate(%)\n");
printf("%d \t %d \t %d \t %.1f\n", total, used, available, rate);
}';
# ./memory-usage-free.sh
total(KB) used(KB) available(KB) used-rate(%)
7747768 4783068 2964700 61.7파일 시스템 확인(df)
# df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/xvda3 ext4 17G 8.2G 7.6G 52% /
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.7G 0 3.7G 0% /dev/shm
tmpfs tmpfs 3.7G 467M 3.3G 13% /run
tmpfs tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup
/dev/xvda1 ext4 969M 184M 719M 21% /boot
tmpfs tmpfs 757M 0 757M 0% /run/user/0
/dev/mapper/DataVG-Data00 ext3 79G 45G 31G 60% /app
tmpfs tmpfs 757M 0 757M 0% /run/user/500
tmpfs tmpfs 757M 0 757M 0% /run/user/302디스크 사용량 순으로 확인하려면 아래와 같다.
# ionice -c 2 -n 7 nice -n 19 du -scm /* | sort -rn
54234 total
45280 /app
3047 /data
2339 /usr
1558 /logs
603 /var
584 /opt
475 /run
182 /boot
132 /home
38 /etc네트워크 상태 확인
netmon.sh 스크립트를 실행하여 TIME_WAIT가 많을 경우 커널 튜닝을 진행하고 CLOSE_WAIT 등이 있을 경우 비정상적인 상황을 모니터링 한다.
#!/bin/bash
COUNT=10
while :
do
if [ $COUNT = 10 ]
then
printf "+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ \n"
printf "| TIME |ESTAB|LISTN|T_WAT|CLOSD|S_SEN|S_REC|C_WAT|F_WT1|F_WT2|CLOSI|L_ACK| \n"
printf "+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+ \n"
COUNT=0
fi
COUNT=`expr $COUNT + 1`
TIME=`/bin/date +%H:%M:%S`
printf "|%s" ${TIME}
netstat -an | \
awk 'BEGIN {
CLOSED = 0;
LISTEN = 0;
SYN_SENT = 0;
SYN_RECEIVED = 0;
ESTABLISHED = 0;
CLOSE_WAIT = 0;
FIN_WAIT_1 = 0;
FIN_WAIT_2 = 0;
CLOSING = 0;
LAST_ACK = 0;
TIME_WAIT = 0;
OTHER = 0;
}
$6 ~ /^CLOSED$/ { CLOSED++; }
$6 ~ /^CLOSE_WAIT$/ { CLOSE_WAIT++; }
$6 ~ /^CLOSING$/ { CLOSING++; }
$6 ~ /^ESTABLISHED$/ { ESTABLISHED++; }
$6 ~ /^FIN_WAIT1$/ { FIN_WAIT_1++; }
$6 ~ /^FIN_WAIT2$/ { FIN_WAIT_2++; }
$6 ~ /^LISTEN$/ { LISTEN++; }
$6 ~ /^LAST_ACK$/ { LAST_ACK++; }
$6 ~ /^SYN_SENT$/ { SYN_SENT++; }
$6 ~ /^SYN_RECV$/ { SYN_RECEIVED++; }
$6 ~ /^TIME_WAIT$/ { TIME_WAIT++; }
END {
printf "| %4d| %4d| %4d| %4d| %4d| %4d| %4d| %4d| %4d| %4d| %4d|\n",ESTABLISHED,LISTEN,TIME_WAIT,CLOSED,SYN_SENT,SYN_RECEIVED,CLOSE_WAIT,FIN_WAIT_1,FIN_WAIT_2,CLOSING,LAST_ACK;
}'
sleep 2
done실행을 하면 아래와 같은 결과물을 볼 수 있다.
> netmon.sh
+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
| TIME |ESTAB|LISTN|T_WAT|CLOSD|S_SEN|S_REC|C_WAT|F_WT1|F_WT2|CLOSI|L_ACK|
+--------+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+-----+
|18:28:27| 230| 24| 88| 0| 0| 0| 1| 0| 0| 0| 0|
|18:28:29| 230| 24| 88| 0| 0| 0| 1| 0| 0| 0| 0|부하 상황 확인
# ionice -c 2 -n 7 nice -n 19 top -c
top - 16:23:33 up 708 days, 5:16, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 216 total, 1 running, 215 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.6 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 7747768 total, 1486568 free, 3926668 used, 2334532 buff/cache
KiB Swap: 2097148 total, 1797684 free, 299464 used. 3085096 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
21086 user1 20 0 4939348 1.052g 14316 S 0.7 14.2 2:06.99 /bin/java -Djava.util.logging.config.file=....
28596 user1 20 0 138788 4412 2928 S 0.7 0.1 46:37.03 /bin/httpd -f ...
63578 user1 20 0 4891980 1.090g 14840 S 0.7 14.7 8:26.39 /bin/java -server -XX:+UseG1GC -XX:G1RSetUpdatingPauseTimePercent=5 ...
28632 user1 20 0 138364 4256 2916 S 0.3 0.1 47:08.71 /app/apache/bin/httpd -f /app/apache/conf/httpd.conf -k start
30213 user1 20 0 4897136 862568 11164 S 0.3 11.1 137:15.45 /bin/java -server -XX:+UseG1GC -XX:G1RSetUpdatingPauseTimePercent=5 ...DNS Look Up 확인
for i in {1..10}; do curl -k -o /dev/null -s -w "DNS-Lookup [%{time_namelookup}] Time-Connect [%{time_connect}] Time-PreTransfer [%{time_pretransfer}] Time-StartTransfer [%{time_starttransfer}] Total-Time [%{time_total}] Response-Code [%{http_code}]\n" https://www.mimul.com; done결과하면은 아래와 같다.
DNS-Lookup [0.061] Time-Connect [0.151] Time-PreTransfer [0.446] Time-StartTransfer [0.938] Total-Time [1.479] Response-Code [200]
DNS-Lookup [0.004] Time-Connect [0.079] Time-PreTransfer [0.315] Time-StartTransfer [0.391] Total-Time [0.834] Response-Code [200]
DNS-Lookup [0.004] Time-Connect [0.079] Time-PreTransfer [0.315] Time-StartTransfer [0.391] Total-Time [0.835] Response-Code [200]
DNS-Lookup [0.004] Time-Connect [0.076] Time-PreTransfer [0.305] Time-StartTransfer [0.378] Total-Time [0.804] Response-Code [200]
DNS-Lookup [0.004] Time-Connect [0.079] Time-PreTransfer [0.315] Time-StartTransfer [0.392] Total-Time [0.838] Response-Code [200]
DNS-Lookup [0.004] Time-Connect [0.094] Time-PreTransfer [0.359] Time-StartTransfer [0.451] Total-Time [0.991] Response-Code [200]
DNS-Lookup [0.004] Time-Connect [0.092] Time-PreTransfer [0.354] Time-StartTransfer [0.444] Total-Time [0.970] Response-Code [200]
DNS-Lookup [0.004] Time-Connect [0.077] Time-PreTransfer [0.305] Time-StartTransfer [0.379] Total-Time [0.811] Response-Code [200]
DNS-Lookup [0.004] Time-Connect [0.076] Time-PreTransfer [0.302] Time-StartTransfer [0.376] Total-Time [0.803] Response-Code [200]
DNS-Lookup [0.004] Time-Connect [0.076] Time-PreTransfer [0.305] Time-StartTransfer [0.380] Total-Time [0.810] Response-Code [200]




