2016년 12월 12일 월요일

L2 스위치에서 포트 매핑

MRTG의 생성 할 때 골치 아픈 것중에 하나가 스위치의 각 포트별 서버가 어떤 서버인가 하는 것이다.

보통 MRTG는 스위치의 포트에 걸기 때문이다. 서버에 snmp를 설치하여 만들 수도 있지만, 서버의 접근 권한이 없는 경우도 많기 때문이다.

신입시절에는 그냥 랜선을 눈을 따라가서, 하나씩 기록하고 그걸로 등록하곤 했다.
이게 너무 불편한게 일단 IDC를 가야되고, 혼자서는 스위치와 서버에 연결된 랜선이 어떤 건지 확인하기가 매우 어렵다. 두명은 같이 가야 확인이 용이하다.

 

포트매핑 프로그램을 알고 나서는 한결 편해졌다. L2와 L3 스위치의 snmp 만 알면 L2스위치의 몇번 포트에 몇번 IP 가 할당되어 있는 지 바로 확인이 가능하기 때문이다.

그런데 이번에 L3 스위치가 없는 네트워크 작업이 있었다. L3가 없는 건 아니지만 IDC 소유라 접근 권한이 없다.

네트워크 작업은 L2 스위치를 교체한 것인데, 시스코의 2950 모델이다.
이것저것 알아보다 보니 스위치에서 'sh arp' 명령어가 가능 했다.

L2 스위치는 mac-address-table만 있는 줄 알았는데, 그게 아니였다.
그럼 역시 간단 하다.
arp 테이블(sh arp)의 mac과 mac-addres-table(sh mac-addres-table)의 mac 값을 비교하면 어느 포트가 어떤 아이피를 가지고 있는 지 알 수 있다.

포트 매핑 프로그램에 L3부분과 L2 부분을 같은 L2 스위치를 넣고 비교할 수도 있다.
L2의 arp 테이블에는 대개 자신의 IP와 게이트웨이에 IP 밖에 없을 것이다.
왜냐면 같은 네트워크 대역에 대해서는 물어봐 주는 사람이 없기 때문이다. 자신의 IP는 고정이라 제외하고, 포트에 물린 서버들은 통신할 때, 게이트웨이만 찾기 때문이다. 대개 외부로 나가는 연결일 것이다.

생각해보니 매핑 프로그램에서  L3란게 의미를 가지는 게 아니라 그 스위치가 게이트웨이 역할을 하기 때문에 의미가 있는 것 같다.

 

arp 테이블에 내가 원하는 서버의 IP를 넣어보자.

L2스위치에서 찾으려고 하는 서버의 IP에 핑을 날려보자. 그리고 arp 테이블을 확인 하면 IP가 등록되어 있을 것이다. 하위단의 서버에서 ping을 날려도 L2스위치에 등록된다.
문제는 ping을 막아 놓은 곳도 많은 게 문제인데, 이럴 때는 telnet을 이용해 보자. ping을 막아 놓은 서버가 웹서버라면 80포트는 열렸을 것이다.
telnet SERVER_IP 80

해당 서버에 연결이 되었다.
그리고 다시 arp 테이블 확인하면 역시 등록이 되었다.

스위치 포트별 서버의 IP를 체크하기 위해 직접 랜선을 일일이 비교하는 작업은 안해도 된다.

2016년 12월 8일 목요일

이벤트 실패 로그에 있는 공격 IP 뽑아내기.

이벤트 로그에 지속적인 공격이 들어오는 게 보인다. ㅅㅂㄹㄷ

이벤트 로그를 한개 한개 뒤져서 체크 하기가 힘들다.

예전에 작성했던 자동 차단 파워쉘을 조금 수정해서 목록만 뽑도록 만듬.

원격데스크탑(RDP)

###################### Config ######################

#아래의 형식으로 있는 IP 주소를 가져오기 위한 정규식
$regex2 = [regex] "원본 네트워크 주소:\t(\d+\.\d+\.\d+\.\d+)";

#아래 값 이상인 것만 차단 리스트($blacklist)에 추가
$deny_count = 5

#이벤트 로그가 많을 경우 어마무시하게 오래 걸림. 불러올 로그 개수
$newest = 1000

###################### Config ######################

##최종 공격자 IP 배열
$blacklist = @();

#초기화
$list=""

#메인 명령어( 이 스크립트의 코어임.)
#이벤트 실패 로그인 4625 ID 에서 아이피가 있는 message 부분에서 IP만 뽑아낸다.
#list 변수 = 이벤트 실패 로그 아이피 (중복포함)
$ips = get-eventlog Security -Newest $newest | Where-Object {$_.EventID -eq 4625 } | foreach {
$m = $regex2.Match($_.Message); $ip = $m.Groups[1].Value; $ip;
} | Sort-Object | Tee-Object -Variable list | Get-Unique
# ($list | Select-String 211.217.48.254 -SimpleMatch | Measure-Object).count;

foreach ($forIp in $ips) {
#로그인 실패 이벤트 로그 중에는 IP가 없는 것들도 있는 데, 그런 경우
#빈값이 들어오므로 continue로 넘겨준다.
if([string]::IsNullOrEmpty($forIp))
{
#'continue';
continue;
}
if (-not ($blacklist -contains $forIp)) {
$attack_count = ($list | Select-String $forIp -SimpleMatch | Measure-Object).count;
"Found RDP attacking IP on 3389: " + $forIp + ", with count: " + $attack_count;
if ($attack_count -ge $deny_count) {$blacklist = $blacklist + $forIp;}
}
}
""
"========$deny_count 회 이상 실패 IP==============="
#방화벽 등록 명령어를 이용해서 자동 차단으로 해도 된다.
$blacklist

 

MSSQL
로그 예제 : 사용자 'sa'이(가) 로그인하지 못했습니다. 원인: 암호가 제공된 로그인의 암호와 일치하지 않습니다. [클라이언트: 211.41.41.203]

###################### Config ######################

#아래의 형식으로 있는 IP 주소를 가져오기 위한 정규식
$regex2 = [regex] "클라이언트: (\d+\.\d+\.\d+\.\d+)";

#아래 값 이상인 것만 차단 리스트($blacklist)에 추가
$deny_count = 5;

#이벤트 로그가 많을 경우 어마무시하게 오래 걸림. 불러올 로그 개수
$newest = 1000

###################### Config ######################

##최종 공격자 IP 배열
$blacklist = @();

#초기화
$list=""

#메인 명령어( 이 스크립트의 코어임.)
#이벤트 실패 로그인 18456 ID 에서 아이피가 있는 message 부분에서 IP만 뽑아낸다.
#list 변수 = 이벤트 실패 로그 아이피 (중복포함)
$ips = get-eventlog Application -Newest $newest | Where-Object {$_.EventID -eq 18456 } | foreach {
$m = $regex2.Match($_.Message); $ip = $m.Groups[1].Value; $ip;
} | Sort-Object | Tee-Object -Variable list | Get-Unique
# ($list | Select-String 211.217.48.254 -SimpleMatch | Measure-Object).count;

foreach ($forIp in $ips) {
#로그인 실패 이벤트 로그 중에는 IP가 없는 것들도 있는 데, 그런 경우
#빈값이 들어오므로 continue로 넘겨준다.
if([string]::IsNullOrEmpty($forIp))
{
#'continue';
continue;
}
if (-not ($blacklist -contains $forIp)) {
$attack_count = ($list | Select-String $forIp -SimpleMatch | Measure-Object).count;
"Found RDP attacking IP on MSSQL: " + $forIp + ", with count: " + $attack_count;
if ($attack_count -ge $deny_count) {$blacklist = $blacklist + $forIp;}
}
}
""
"========$deny_count 회 이상 실패 IP==============="
#방화벽 등록 명령어를 이용해서 자동 차단으로 해도 된다.
$blacklist

 


언제 한번 날 잡아서 완성형으로 만들어야 될 듯...

2016년 12월 7일 수요일

디렉토리를 심볼릭링크 생성시 여러개가 만들어지는 원인.

디렉토리를 ln -s 명령으로 심볼릭 링크로 만들 때, 두 번 실행시 dest 폴더 안에 원하지 않는 링크가 생긴다.

명령을 두번 실행하면 첫번째 명령에서 만들어진 '심볼릭 링크 디렉토리'안에 또하나의 파일이 생긴다.

세번째부터는 깨진 파일이라도 있으니까 그 아래로는 더 이상 생성되지 않는다.

 

이럴 때는 -n 명령을 써보자

-n 옵션의 설명은 다음과 같다.

-n, --no-dereference
treat LINK_NAME as a normal file if it is a symbolic link to a directory

디렉토리의 심볼릭 링크면 일반 파일로 취급한다고 한다.

 

테스트 해보자.

n 옵션이 없으면 아래와 같이 두번까지 정상 실행되며, 세번째부터 에러가 나온다.
dirSym 으로 들어가 보면 깨진 dirSrc 심볼릭 링크가 만들어져있다.
[root@df tmp]# mkdir dirSrc
[root@df tmp]# ln -s dirSrc dirSym
[root@df tmp]# ln -s dirSrc dirSym
[root@df tmp]# ln -s dirSrc dirSym
ln: failed to create symbolic link `dirSym/dirSrc': 파일이 있습니다

 

dirSym 링크를 지우고 n 옵션을 주고 다시 실행하면 아래와 같이 두번째에 에러가 발생한다.
[root@df tmp]# rm dirSym
rm: remove 심볼릭 링크 `dirSym'? y
[root@df tmp]# ln -sn dirSrc dirSym
[root@df tmp]# ln -sn dirSrc dirSym
ln: failed to create symbolic link `dirSym': 파일이 있습니다

 

 

결론 : 디렉토리를 symbolic link로 만들 때는 n 옵션을 추가해서 만들자.
ln -sn src dest

2016년 11월 29일 화요일

Predictive Failure 란?

HP 서버중 한대에서 디스크 에러가 났다.
physicaldrive 1I:1:7 (port 1I:box 1:bay 7, SAS, 300 GB, Predictive Failure)
physicaldrive 1I:1:8 (port 1I:box 1:bay 8, SAS, 300 GB, OK)

 

Predictive Failure

문구 자체가 참 애매하다. 에러가 난 것도 아니고

에러가 날 거란 걸 예측해 주는 거라는 데, 그 원리가 무엇인지 궁금했다.

 

영문 위키에서 찾을 수 있었다.
he drive firmware compares the measured parameters against predefined thresholds and evaluates the health status of the drive.

드라이브의 측정 된 값과 사전정의 된 임계값과 비교하여 상태를 평가한다고 되어 있다.
 
참고 : http://comfix.kr/162
 

2016년 11월 25일 금요일

logrotate가 안될 때...

오랜만에 서버 점검을 하니 messages 로그가 비정상으로 크다.

무려 1.8G!
-rw-------. 1 root root 1915638280 2016-11-25 09:01 messages

 

접근 시도가 많은 것으로 알고 failer들 차단하고 나섰는 데, 뭔가 이상하다.

로그 파일이 messages밖에 없다. 기본적으로 rotate가 돌아서 messages.1이나

messages-날짜, 이런 형식으로 있어야 되는 데, 없다.

 

rotate가 안되고 있다!!.
 
아래 명령어로 확인. -d 옵션이 debug 모드.
/usr/sbin/logrotate -d /etc/logrotate.conf

출력 내용중 아래와 같이 이상점 발견
considering log /var/log/messages
log needs rotating

로테이트가 필요없다고!? 2G에 육박하고 있는 데 무슨 소리야.

 

logrotate는 /var/lib/logrotate.status 파일의 내용을 참조하여 rotate를 한다.

해당 파일을 살펴보니 내용이 없다.
#비정상(문제서버)
[root@localhost log]# cat /var/lib/logrotate.status
logrotate state -- version 2

#정상(비교대상 서버)
[root@localhost log]# cat /var/lib/logrotate.status
logrotate state -- version 2
"/var/log/yum.log" 2016-1-1
"/var/log/cups/error_log" 2016-10-9
"/var/named/data/named.run" 2016-11-20
"/var/log/sssd/*.log" 2015-1-6
"/var/log/dracut.log" 2016-1-1
"/var/log/wtmp" 2015-1-6
"/var/log/spooler" 2016-11-20
"/var/log/btmp" 2016-11-1
"/var/log/xferlog" 2016-11-20
"/var/log/maillog" 2016-11-20
"/var/log/cups/*_log" 2015-1-6
"/var/log/secure" 2016-11-20
"/var/log/messages" 2016-11-20
"/var/account/pacct" 2015-1-6
"/var/log/cron" 2016-11-20
"/var/log/vsftpd.log" 2015-1-7

 

열심히 검색 했으나, 원인은 찾을 수가 없다.

 

해결법은 아래 명령어로 rotate를 강제 적용 하는 것이다.
/usr/sbin/logrotate -f /etc/logrotate.conf

위와 같이 하면 /var/lib/logrotate.status 내용이 정상 서버와 같이 만들어지고,
아래와 같이 로테이트 된다. 기존 파일을 분할하는 건 아니다.
-rw------- 1 root root 148 2016-11-25 09:58 messages
-rw-------. 1 root root 1915641841 2016-11-25 09:58 messages-20161125

2016년 11월 16일 수요일

PPS cfgmaker

mrtg로 pps 를 체크하는 것에 대해서 글을 썼는데,
cfgmaker로 만들고 그걸 다시 수정하는 게 번거로웠다.

cfgmaker는 perl 로 작성되어 있어서 수정이 가능하다.

그래서 target 관련 부분만 수정해서 ppscfgmaker를 만들었다.

diff로 비교해 보면 알지만 한개 라인만 수정하였다.
[root@localhost bin]# diff cfgmaker ppscfgmaker 
730c730
< my $default_target_directive = "Target[$target_name]: $if_ref:$router_connect";
---
> my $default_target_directive = "Target[$target_name]: ifInUcastPkts.$if_ref&ifOutUcastPkts.$if_ref:$router_connect + ifInNUcastPkts.$if_ref&ifOutNUcastPkts.$if_ref:$router_connect";

ppscfgmaker
확장자가 없으면 업로드가 안되서 .txt를 추가했다.
.txt 부분만 지우고 사용하면 된다.

2016년 11월 9일 수요일

MRTG PPS(packet per second) 설정

MRTG는 기본 BPS 외에 파라미터를 통해서 여러가지 그래프를 그릴 수 있다.

그 중에서 PPS 를 그려보자.

MRTG 사이트를 보면 MIB 리스트가 있는데, 거기에 보면 여러가지 OID 값이 있다.

그 중 패킷 관련 아래의 4가지만 적용한다.
#유니캐스트
ifInUcastPkts
ifOutUcastPkts

#NON 유니캐스트
ifInNUcastPkts
ifOutNUcastPkts

MRTG 적용 방법은 아래 처럼 하면 된다.

기존 cfgmaker 로 생성한 Target 정보를 아래처럼 변경하면 된다.

BPS 적용(cfgmaker 로 생성된 내용.)
Target[SWITCH_pps]: 86:public@111.111.222.222:::::2

PPS 적용
Target[SWITCH_pps]: ifInUcastPkts.86&ifOutUcastPkts.86:public@111.111.222.222:::::2+ ifInNUcastPkts.86&ifOutNUcastPkts.86:public@111.111.222.222:::::2



다른 블로그 글을 보니 ifInUcastPkt 와 ifOutUcastPkts 만 적용하는 하는 글도 보았는데,
여기서는 NON 유니캐스트도 포함시킨 것에 주의 하자.