[linux] Iptables & Filter logging

리눅스 패키지중 강력한 네트워크 패킷 필터링 도구인 iptables의 간단한 내용을 정리합니다..

제가 사용하는 개인서버에서는 아래와 같은 설정만을 이용합니다.

iptables 명령어를 이용하거나,  system-config-firewall   또는 스크립트를 생성하여 이용하기도합니다만

/etc/sysconfig/iptables 에 룰을 직접 지정하여 사용하는 것이 편할 수 도 있습니다.

 

아래 처럼 제가 사용하고 있는 샘플을 보시면, 개인 vpn 에 대해서는 모두 허용하고 그 외 모든 인터페이스에서

접근하는 패킷에 대해서는 INPUT Chain 에서 차단합니다.

 

해당 서버가 프록시, 메일, vpn, db 등으로 꾹꾹 눌러담아 사용하다보니 외부에서 의도적으로 접속하는 경우가 있는데요.

해당 부분에 대해서는 과도한 접근 시도를 확인하면, DROPLOG 라는 체인을 별도로 만들어서 해당 체인으로 점프 시킨 후 로그를 확인 하거나, 패킷을 드랍 시키는 용도로 사용하고 있습니다.

 

생성 시킨 로그는 별도 커스텀 로그로 생성하여 관리 할 수도 있는데 관련해서는 syslog 설정에 별도로 추가하여,  제가 따로 명시한 로그 프리픽스인 [Firewall] 을 필터로 /var/log/firewall.log 등으로 커스텀하게 생성할 수 있습니다.

생성 시 아래와 같은 형태로 로그를 남겨 필터링 할 수 있습니다.

아래 예시에서는 로그 프리픽스를 iptables denied 와 iptables VPN으로 생성하여 모니터링 한 예입니다.

 

방화벽 로그

[255434.143314] iptables denied: IN=eth0 OUT= MAC=06:3e:a8:fd:1b:86:06:dc:04:XX:XX:XX:XX SRC=1.2.3.4 DST=10.10.10.100 LEN=52 TOS=0x00 PREC=0x00 TTL=107 ID=19009 DF PROTO=TCP SPT=58139 DPT=25 WINDOW=8192 RES=0x00 SYN URGP=0 

 

[255982.927075] iptables VPN: IN=sunghovpn OUT= MAC= SRC=192.168.192.6 DST=10.10.10.100 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=43356 DF PROTO=TCP SPT=51934 DPT=22 WINDOW=65535 RES=0x00 SYN URGP=0 

 

 

방화벽 설정

[root@mail ~]# cat /etc/sysconfig/iptables

# Firewall configuration written by system-config-firewall

# Manual customization of this file is not recommended.

*filter

:INPUT ACCEPT [0:0]

:FORWARD ACCEPT [0:0]

:OUTPUT ACCEPT [0:0]

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-A INPUT -p icmp -j ACCEPT

-A INPUT -i lo -j ACCEPT

# LOG to VPN

# IF YOU NEED MONITORING , THIS OPTION ENABLE

#-A INPUT -m limit --limit 5/min -s 192.168.192.0/24 -j LOG --log-prefix "[Firewall] VPN: " --log-level 6

# BAN IP LIST

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

# create RULE

-N DROPLOG 

# Input Drop IP rule

-A INPUT -s 185.125.6.105/32 -j DROPLOG

-A INPUT -s 50.243.196.29/32 -j DROPLOG

-A INPUT -s 120.92.233.86/32 -j DROPLOG

-A INPUT -s 197.14.14.150/32 -j DROPLOG

-A INPUT -s 203.198.207.61/32 -j DROPLOG

# Drop RULES logging and Drop

# IF YOU NEED DROP PACKET MONITORING, THIS OPTION ENABLE

#-A DROPLOG -m limit --limit 5/min -j LOG --log-prefix "[Firewall] Drop: " --log-level 6

-A DROPLOG -j DROP

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

# FTP 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 20 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT

# manage console with private key

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

# SMTP mail server 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT

# sungho POP3 port

-A INPUT -m state --state NEW -m tcp -p tcp --dport 110 -j ACCEPT

# sungho IMAP port 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 143 -j ACCEPT

# sungho IMAPS port 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 993 -j ACCEPT

# VPN for sungho

-A INPUT -m state --state NEW -m tcp -p tcp --dport 1234 -j ACCEPT

# Proxy for sungho

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3333 -j ACCEPT

# Database sunghoDB

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -s 10.10.10.0/24 -j ACCEPT

-A INPUT -m state --state NEW -m tcp -p tcp --dport 3306 -s 192.168.192.0/24 -j ACCEPT

# FTP data transfer (Passive )

-A INPUT -m state --state NEW -m tcp -p tcp --dport 50020 -j ACCEPT

# Forward for interface

-A FORWARD -i sunghovpn -o eth0 -j ACCEPT

-A FORWARD -i eth0 -o sunghovpn -j ACCEPT

-A FORWARD -i sunghovpn -j ACCEPT

-A INPUT -i sunghovpn -j ACCEPT

 

# Another Input All deny with host not accepts message

-A INPUT -j REJECT --reject-with icmp-host-prohibited

COMMIT

 

 

 

1) 테이블(tables)

우선 iptables에는 테이블이라는 광범위한 범주가 있는데, 이 테이블은 filter, nat, mangle, raw 같은 4개의 테이블로 구성되며, 이중에서 우리에게 필요한 것은 필터링 규칙을 세우는 filter 테이블이다.

2) 체인(chain)

iptables에는 filter 테이블에 미리 정의된 세가지의 체인이 존재하는데 이는 INPUT, OUTPUT, FORWARD 이다. 이 체인들은 어떠한 네트워크 트래픽(IP 패킷)에 대하여 정해진 규칙들을 수행한다.

가령 들어오는 패킷(INPUT)에 대하여 허용(ACCEPT)할 것인지, 거부(REJECT)할 것인지, 버릴(DROP)것인지를 결정한다.

  • INPUT : 호스트 컴퓨터를 향한 모든 패킷
  • OUTPUT : 호스트 컴퓨터에서 발생하는 모든 패킷
  • FORWARD : 호스트 컴퓨터가 목적지가 아닌 모든 패킷, 즉 라우터로 사용되는 호스트 컴퓨터를 통과하는 패킷

3) 매치(match)

iptables에서 패킷을 처리할때 만족해야 하는 조건을 가리킨다. 즉, 이 조건을 만족시키는 패킷들만 규칙을 적용한다.

  • –source (-s) : 출발지 IP주소나 네트워크와의 매칭
  • –destination (-d) : 목적지 ip주소나 네트워크와의 매칭
  • –protocol (-p) : 특정 프로토콜과의 매칭
  • –in-interface (i) : 입력 인테페이스
  • –out-interface (-o) : 출력 인터페이스
  • –state : 연결 상태와의 매칭
  • –string : 애플리케이션 계층 데이터 바이트 순서와의 매칭
  • –comment : 커널 메모리 내의 규칙과 연계되는 최대 256바이트 주석
  • –syn (-y) : SYN 패킷을 허용하지 않는다.
  • –fragment (-f) : 두 번째 이후의 조각에 대해서 규칙을 명시한다.
  • –table (-t) : 처리될 테이블
  • –jump (-j) : 규칙에 맞는 패킷을 어떻게 처리할 것인가를 명시한다.
  • –match (-m) : 특정 모듈과의 매치

4) 타겟(target)

iptables는 패킷이 규칙과 일치할 때 동작을 취하는 타겟을 지원한다.

  • ACCEPT : 패킷을 받아들인다.
  • DROP : 패킷을 버린다(패킷이 전송된 적이 없던 것처럼).
  • REJECT : 패킷을 버리고 이와 동시에 적절한 응답 패킷을 전송한다.
  • LOG : 패킷을 syslog에 기록한다.
  • RETURN : 호출 체인 내에서 패킷 처리를 계속한다.

REJECT는 서비스에 접속하려는 사용자의 액세스를 거부하고 connection refused라는 오류 메시지를 보여주는 반면 DROP은 말 그대로 telnet 사용자에게 어떠한 경고 메시지도 보여주지 않은 채 패킷을 드롭한다. 관리자의 재량껏 이러한 규칙을 사용할 수 있지만 사용자가 혼란스러워하며 계속해서 접속을 시도하는 것을 방지하려면 REJECT를 사용하는 것이 좋다.

5) 연결 추적(Connection Tracking)

iptables는 연결 추적(connection tracking)이라는 방법을 사용하여 내부 네트워크 상 서비스 연결 상태에 따라서 그 연결을 감시하고 제한할 수 있게 해준다. 연결 추적 방식은 연결 상태를 표에 저장하기 때문에, 다음과 같은 연결 상태에 따라서 시스템 관리자가 연결을 허용하거나 거부할 수 있다.

  • NEW : 새로운 연결을 요청하는 패킷, 예, HTTP 요청
  • ESTABLISHED : 기존 연결의 일부인 패킷
  • RELATED : 기존 연결에 속하지만 새로운 연결을 요청하는 패킷, 예를 들면 접속 포트가 20인 수동 FTP의 경우 전송 포트는 사용되지 않은 1024 이상의 어느 포트라도 사용 가능하다.
  • INVALID : 연결 추적표에서 어디 연결에도 속하지 않은 패킷

상태에 기반(stateful)한 iptables 연결 추적 기능은 어느 네트워크 프로토콜에서나 사용 가능하다. UDP와 같이 상태를 저장하지 않는 (stateless) 프로토콜에서도 사용할 수 있다.

6) 명령어(commond)

  • -A (–append) : 새로운 규칙을 추가한다.
  • -D (–delete) : 규칙을 삭제한다.
  • -C (–check) : 패킷을 테스트한다.
  • -R (–replace) : 새로운 규칙으로 교체한다.
  • -I (–insert) : 새로운 규칙을 삽입한다.
  • -L (–list) : 규칙을 출력한다.
  • -F (–flush) : chain으로부터 규칙을 모두 삭제한다.
  • -Z (–zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만든다.
  • -N (–new) : 새로운 chain을 만든다.
  • -X (–delete-chain) : chain을 삭제한다.
  • -P (–policy) : 기본정책을 변경한다.

7) 기본 동작

  1. 패킷에 대한 동작은 위에서 부터 차례로 각 규칙에 대해 검사하고, 그 규칙과 일치하는 패킷에 대하여 타겟에 지정한 ACCEPT, DROP등을 수행한다.
  2. 규칙이 일치하고 작업이 수행되면, 그 패킷은 해당 규칙의 결과에 따리 처리하고 체인에서 추가 규칙을 무시한다.
  3. 패킷이 체인의 모든 규칙과 매치하지 않아 규칙의 바닥에 도달하면 정해진 기본정책(policy)이 수행된다.
  4. 기본 정책은 policy ACCEPT , policy DROP 으로 설정할 수 있다.

일반적으로 기본정책은 모든 패킷에 대해 DROP을 설정하고 특별히 지정된 포트와 IP주소등에 대해 ACCEPT를 수행하게 만든다.

 

 

[linux] Mailx 를 이용한 HTML 폼 전송.

지난번 글에는 mailx를 이용하여 파일을 첨부하여 전달하는 방법에 대해 공유 드렸습니다.

관련 링크 : http://blog.hongstalk.com/?p=310

 

이번에는 mailx 를 이용한 HTML 컨텐츠 타입의 폼을 생성하여 전송하는 방법에 대해 공유 합니다.

방법은 subject , 제목을 입력 할때 subject header 밑에 content-type을 명시하는 방법을 사용합니다.

 

커멘드는 아래와 같습니다.

mail -S smtp=localhost:25 -s "$(echo -e 'HI TEST\nContent-type: text/html')" -r noreply@jinstalk.com nic2hong@jinstalk.com < hong.html

위의 부분에 hong.html 에는 테스트를 위해 적당한 내용을 작성합니다.

<html>

<head> sungho </head>

<body>

<h1><center>Sungho TEST</center></h1>

<br>

<br>

<font color=red>This is</font> Sparta.

</body>

</html>

 

위와 같은 형태로 하실때 주의 하실 점은

-s 뒤에 “$( 부분에 echo -e 옵션입니다. \n을 통해서 줄 바꿈을 적용하기 위해서는 해당 옵션을 꼭 넣어주세요.

 

발송이 완료 되면 다음과 같은 형태로 메일이 날아갑니다.

아래 부분은 실제 HTML 타입으로 날아간 메일의 해더 순서에 주목해주시면 됩니다.

(제목 바로 밑에 컨텐츠 타입 : 하이퍼텍스트 명시되어 있는 부분이 echo 를 통해서 추가된 헤더입니다. )

[linux] mail command 를 이용하여 파일 첨부 발송.

간혹 커멘드 라인을 이용한 메일을 보낼 시 특정 SMTP를 이용하며, 또 파일을 첨부하여 메일을 보내야할 필요가 있습니다.

주로 백업 확인이나, 스케쥴링등에 사용될 것 같은데요. 아래와 같은 커멘드를 이용하시면 됩니다.

 

 

mail -S smtp=mail.jinstalk.com:25 -s “file test by hong” -r noreply@jinstalk.com -v -a ./test.sh nic2hong@jinstalk.com < sungho.txt

 

해당 구문은 ./test.sh 라는 파일을 첨부한 메일을

sungho.txt 라는 파일 내용을 본문으로 하여 메일을 발송해주는 mailx 커멘드입니다.

해당 커맨드는 당연히  mailx 패키지가 설치되어 있어야합니다.

 

Rsync + SSH 키인증 싱크 방식

서비스를 운영하다보면, 22 (SSH) 는 접근이 가능하지만,

Rsync 데몬을 올려 873 (rsync protocol) 을 통해서 받아올 수 없는 경우가 종종 존재한다.

단순 scp는 remote copy를 진행할때 파일에 대한 체크나 비교를 거치지 않고 overwrite를 진행하기때문에, 기존 파일과 싱크를 맞추는 경우보다 더 많은 트래픽이 발생할 수 있다.

 

일반적으로 Rsync 에 SSH 를 이용한 싱크에는 remote host 에 authorized_keys에 퍼블릭 키를 입력하는 경우가 다수였으나,

실제로는 아래와 같은 형태를 통해서 접속이 가능하다.

다음과 같은 명령어를 통해서 ssh의 인증을 획득하여 통신한다.

 

rsync -av -e ‘ssh -i /pathtokey/id_rsa’ user@hongstalk.com:/pathtofile/ /targettofile/

 

 

 

[linux] 컬러풀하고 사용이 간단한 모니터링 도구 dstat

Dstat 패키지를 설치한다.

패키지가 없으면 여기서 직접 wget 으로 다운받아서 설치하면 된다.

 

http://dag.wieers.com/

 

 

사용법

아래와 같은 형식으로 사용가능하며

dstat [-afv] [options..] [delay [count]]

 

여기서 사용하는옵션들에 대해 간단히 알아보자

 

-c, –cpu  cpu 상태를 모니터링 한다

-C 옵션을 주고 각코어별로 모니터링도 가능하다

ex) -c -C 0,1,2,3,total

-d, –disk disk 상태를 모니터링 한다

-D 옵션을 주고 각디스트별로 모니터링도 가능하다

ex) -d -D sda,sdb,hda,total

-g, –page page 상태를 모니터링 한다

-i, –int  interrupt 상태를 모니터링 한다

-I 5,10 include interrupt 5 and 10

-l, –load  load 상태를 모니터링 한다

-m, –mem  memory 상태를 모니터링 한다

-n, –net  network 상태를 모니터링 한다

-N 옵션을 주고 각 이더넷 인터페이스 별로 모니터링도 가능하다

ex) -n -N eth1,total

-p, –proc  process 상태를 모니터링 한다

-s, –swap  e swap 상태를 모니터링 한다

-S 옵션을 주고 각 SWAP 별로 모니터링도 가능하다

ex) swap1,total

-t, –time    아웃풋 주기와 카운터를 설정하다

-y, –sys  system 상태를 모니터링 한다

–ipc      ipc 상태를 모니터링 한다

–lock      lock 상태를 모니터링 한다

–raw      raw 상태를 모니터링 한다

–tcp      tcp 상태를 모니터링 한다

–udp      udp 상태를 모니터링 한다

 

–output file  CVS현태로 저장되며 파일경로를 설정한다

 

짧게 모니터링을 하고 싶을때는

 

# dstat -f 명령어를 통해서 Full 상태 모니터링을 진행한다.

 

 

 

[linux] Rsyslog 설정 , 추가 MySQL로 저장하는 법

Rsyslogd

 

시스템 로그를 기록하는 Rsyslog 데몬 동작에 대한 설명

 

참고.1 : # /sbin/rsyslogd -d  [디버깅 모드] 

참고.2 : 참고 문서 URL (http://www.rsyslog.com/doc)

 

Rsyslog 설정 파일 위치

 

/etc/rsyslog.conf

 

Mysql 을 사용하는 방법

yum install rsyslog-mysql 설치

설정을 다음과 같이 수정

$ModLoad ommysql.so

 ## mysql 라이브러리 모듈 로드

## DB 템플릿에 맞춰 넣어주는 센스 

$template dbFormat,”insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values (‘%msg%’, %syslogfacility%, ‘%FROMHOST%’, %syslogpriority%, ‘%timereported:::date-mysql%’, ‘%timegenerated:::date-mysql%’, %iut%, ‘%syslogtag%’)”,SQL

*.* :ommysql:127.0.0.1,디비명,아디,비번;dbFormat

 

예시

포트 접근 허용이되어있어야한다.

$ModLoad ommysql.so

$template dbFormat,”insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values (‘%msg%’, %syslogfacility%, ‘%FROMHOST%’, %syslogpriority%, ‘%timereported:::date-mysql%’, ‘%timegenerated:::date-mysql%’, %iut%, ‘%syslogtag%’)”,SQL

*.info;mail.none;authpriv.none;cron.none :ommysql:10.0.0.60,Syslog,root,tobicom;dbFormat

 

 

 

 

파일을 로드하는법

$ModLoad imfile

 $InputFileName /var/log/test.log

 $InputFileTag Sungho-Tag:

 $InputFileStateFile stat-Custom

 $InputFileSeverity info

 $InputRunFileMonitor

 

# Provides UDP syslog reception

#$ModLoad imudp

#$UDPServerRun 514

# Provides TCP syslog reception

#$ModLoad imtcp

#$InputTCPServerRun 514

*.* @@10.0.0.60:514

 골뱅이 하나면 UDP, 두개면 TCP

[linux] Self Signed Certificate SSL

OpenSSL 에서 self signed certificate 생성 및 apache httpd 에 SSL 적용

웹서비스에 https 를 적용할 경우 SSL 인증서 발급 기관에서 유료로 해당 도메인에 대해 발급 받으면 되지만 테스트 서버거나 예산등의 이유로 발급 받지 못할 경우가 있다.

이럴때 OpenSSL 을 이용하여 Self signed certificate 를 생성 & apache httpd 에 연계하는 법을 정리해 본다

Self Signed Certificate 생성

Self Signed Certificate(SSC) 란 무엇일까?

digital certificate는 발급기관(CA) 이 있게 마련이다. Web Browser 마다 VeriSign 이나 comodo 같은 유명 CA 들의 인증서를 신뢰하는 CA로 미리 등록해 놓으므로 저런 기관에서 발급된 SSL 인증서를 사용해야 browser 에서는 웹서비스를 신뢰할수 있는데

SSC 는 인증서를 만들고 개인키로 직접 인증서에 서명한 것이다. 당연히 browser는 모르는 기관이 발급한 인증서이므로 보안 경고를 발생시킬 것이나 테스트 사용에는 지장이 없다.

CSR(Certificate Signing Request)?

공개키 기반(PKI) private key(개인키) public key(공개키)로 이루어져 있다. 인증서라고 하는 것은 내 공개키가 맞다고 인증기관(CA)이 전자서명하여 주는 것이며 나와 보안 통신을 하려는 당사자는 내 인증서를 구해서 그 안에 있는 공개키를 이용하여 보안 통신을 할 수 있다.

CSR 은 인증기관에 인증서 발급 요청을 하는 특별한 ASN.1 형식의 파일이며 그안에는 내 공개키 정보와 사용하는 알고리즘 정보등이 들어 있다. 개인키는 외부에 유출되면 안 되므로 저런 특별한 형식의 파일을 만들어서 인증기관에 전달하여 인증서를 발급 받는다.

(사용자들이 CSR 생성등을 어려워하니 인증서 발급 대행 기관에서 개인키까지 생성해서 보내주고는 한다.)

OpenSSL 

      1. RSA 기반의 private key 생성
        cd /etc/pki/tls/private
        openssl genrsa -des3 -out myhost.key 1024
      2. CSR(Certificate Signing Request) 생성
        custom_openssl.conf

[ req ]

default_bits            = 2048

default_md              = sha1

default_keyfile         = privkey.pem

distinguished_name      = req_distinguished_name

[req_distinguished_name ]

countryName                     = Country Name (2 letter code)

countryName_default             = KR

countryName_min                 = 2

countryName_max                 = 2

# 회사명 입력

organizationName              = Organization Name (eg, company)

organizationName_default      = University of Wisconsin — Madison

# 부서 입력

organizationalUnitName          = Organizational Unit Name (eg, section)

organizationalUnitName_default  = Condor Project

# SSL 서비스할 domain 명 입력

commonName                      = Common Name (eg, your name or your server’s hostname)

commonName_default             = myhost.co.kr

commonName_max                  = 64

openssl req -new -key myhost.key -out myhost.csr -config custom_openssl.conf

      1. Remove Passphrase from key
        개인키를 보호하기 위해 Key-Derived Function 으로 개인키 자체가 암호화되어 있다. 인터넷 뱅킹등에 사용되는 개인용 인증서는 당연히 저렇게 보호되어야 하지만 SSL 에 사용하려는 키가 암호가 걸려있으면 httpd 구동때마다 pass phrase 를 입력해야 하므로
        암호를 제거한다.

        cp myhost.key myhost.key.enc
        openssl rsa -in myhost.key.enc -out myhost.key

보안 경고

개인키의 유출 방지를 위해 group 과 other의 permission 을 모두 제거한다.

chmod 600 myhost.key

      1. self-signed certificate 생성시 입력할 custom_openssl.conf 생성
      2. self-signed 인증서 생성
        openssl x509 -req -days 365 -in myhost.csr -signkey myhost.key -out ../certs/myhost.crt
      3. 제대로 생성되었는지 확인을 위해 인증서의 정보를 출력해 본다.
        openssl x509 -text -in ../certs/myhost.crt 
      4.  msts

apache httpd 에 SSL 적용

      1.  vi /etc/httpd/conf.d/ssl.conf 
      2. 다음 내용 추가
        NameVirtualHost *:443 
      3. SSL 을 적용할 VirtualHost 를 설정한다.

<VirtualHost *:443>

ServerName myhost

SSLEngine on

SSLCertificateFile /etc/pki/tls/certs/myhost.crt

SSLCertificateKeyFile /etc/pki/tls/private/myhost.key

SetEnvIf User-Agent “.*MSIE.*” nokeepalive ssl-unclean-shutdown

CustomLog logs/ssl_request_log \

   “%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \”%r\” %b”

</VirtualHost>

      1. service httpd restart
      2. Web browser에서 https 로 연결해서 제대로 보이는지 확인한다.

    • Browser가 Host Header 를 보내야하나 SSL의 경우 Host Header를 보내기전 서버 인증서가 오므로
      SSL 에 대해서 Multiple VirtualHost 가 불가함.
    • 위 문제를 해결하기 위해서는 SNI(Server Name Indication – RFC 4366) 을 지원하는 SSL Library
      (OpenSSL 0.9.8j 이상, Java 7 JSSE 이상)와 
      Web Server(apache 경우 2.2.12 이상),
      Web Browser(IE7 이상, FF2 이상 등)를 사용해야 함.
    • Windows XP 는 SNI 를 지원하지 않으므로 IE 버전과 상관없이 에러 발생(관련 링크).

원본 위치 <http://lesstif.tistory.com/entry/OpenSSL-%EC%97%90%EC%84%9C-self-signed-certificate-%EC%83%9D%EC%84%B1-%EB%B0%8F-apache-httpd-%EC%97%90-SSL-%EC%A0%81%EC%9A%A9>

[linux] 헷갈리기 쉬운 fstab 의 옵션 설정

# cat /etc/fstab

[파일시스템 장치명] [마운트 포인트] [파일시스템 종류] [옵션] [dump관련설정] [파일점검 옵션]

LABEL=/                         /                         ext3     defaults                  1 1

LABEL=/boot1                 /boot                    ext3     defaults                 1 2

tmpfs                             /dev/shm              tmpfs   defaults                 0 0

devpts                           /dev/pts                devpts  gid=5,mode=620      0 0

sysfs                             /sys                     sysfs   defaults                 0 0

proc                              /proc                     proc    defaults                 0 0

LABEL=SWAP-sda3         swap                    swap    defaults                0 0

-파일시스템 장치명 : 장치명을 지정

-마운트 포인트 : 장치가 연결된 마운트 지점

-파일시스템 종류 : 파티션이 사용하는 파일시스템 지정

-옵션 : 파일시스템의 속성을 설정하는 옵션

defaults (rw, nouser,auto,exec suid 속성을 모두 가지는 옵션)

auto : 부팅시 자동 마운트

noauto : 부팅시 자동마운트 안함

exec : 실행파일이 실행되는 것을 허용

no exec : 실행파일이 실행되는 것을 허용 안함

suid : setuid, setgid의 사용을 허용하는 옵션

nosuid : setuid, setgid의 사용을 거부

ro (read only) : 읽기 전용

rw (ead write) : 읽고 쓰기 가능

user : 일반 계정 사용자들도 마운트 할 수 있는 옵션

nouser : root만 mount 가능

usrquota : 일반 사용자 quota적용

grpquota : 그룹 quota 적용

-dump 관련 설정

0 : 덤프되지 않은 파일시스템

1 : 데이터 백업을 위해 dump가능

-파일점검 옵션

0 : 부팅시 fsck를 사용하지 않음

1 : 루트 파일시스템을 의미

2 : 루트 파일시스템 이외의 파일시스템을 의미

[linux] lsof 사용

lsof  lisopen files 약자로 시스템에서 열린 파일 목록을 알려주고 사용하는 프로세스, 디바이스 정보, 파일의 종류등 상세한 정보를 출력해 준다.

리눅스와 유닉스는 추상화된 파일 시스템(VFS – Virtual File System) 사용하므로 일반 파일, 디렉터리, 네트워크 소켓, 라이브러리, 심볼릭 링크 등도 모두 파일로 처리되며 lsof 에서 상세한 정보를 확인할 있다.

 

유닉스마다 고유의 lsof 비슷한 용도의 명령어가 있지만 명령어와 옵션이 제각각이고 출력 정보가 상이하여 OS 바뀌면 사용하기가 힘들다.

lsof 리눅스, AIX, Solaris, FreeBSD, Mac OS X 종류에 상관없이 일관된 옵션과 출력 형식을 갖는 장점이 있다.

 

 

모든 열린 파일 출력 

옵션 없이 lsof 실행하면 모든 열린 파일 정보를 출력한다.

lsof

COMMAND    PID      USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME

init         1      root  cwd       DIR              253,0     4096          2 /

init         1      root  rtd       DIR              253,0     4096          2 /

init         1      root  txt       REG              253,0   150352       3932 /sbin/init

init         1      root  mem       REG              253,0    65928     784927 /lib64/libnss_files-2.12.so

init         1      root  DEL       REG              253,0              784911 /lib64/libc-2.12.so

init         1      root  DEL       REG              253,0              785325 /lib64/libgcc_s-4.4.7-20120601.so.1.#prelink#.YDRQV5

init         1      root  DEL       REG              253,0              784939 /lib64/librt-2.12.so

init         1      root  DEL       REG              253,0              784935 /lib64/libpthread-2.12.so.#prelink#.0jHMuJ

init         1      root  DEL       REG              253,0              785344 /lib64/libdbus-1.so.3.4.0.#prelink#.HCYJdq

init         1      root  mem       REG              253,0    39896     785047 /lib64/libnih-dbus.so.1.0.0

init         1      root  mem       REG              253,0   101920     785049 /lib64/libnih.so.1.0.0

init         1      root  DEL       REG              253,0              784904 /lib64/ld-2.12.so

init         1      root    0u      CHR                1,3      0t0       4160 /dev/null

init         1      root    1u      CHR                1,3      0t0       4160 /dev/null

init         1      root    2u      CHR                1,3      0t0       4160 /dev/null

init         1      root    3r     FIFO                0,8      0t0       8845 pipe

init         1      root    4w     FIFO                0,8      0t0       8845 pipe

init         1      root    5r      DIR               0,10        0          1 inotify

init         1      root    6r      DIR               0,10        0          1 inotify

init         1      root    7u     unix 0xffff880037504680      0t0       8846 socket

컬럼별 의미는 다음과 같다.

  1. COMMAND : 실행한 명령어
  2. PID : process id
  3. USER : 실행한 사용자
  4. FD: File Descriptor, 파일의 종류
  1. cwd: current working directory
  2. rtd: root directory
  3. mem : memory-mapped file
  4. txt: program text (code and data);
  5. TYPE: 파일 종류
  1. DIR: 디렉터리
  2. CHR:  character special file
  3. REG: regular file
  4. unix: 유닉스 도메인 소켓 (MySQL 등이 사용하는 소켓으로 로컬 프로세스에서만 사용 가능하며 TCP/UDP 보다 속도가 매우 빠름)
  5. DEVICE : 장치 번호
  6. SIZE/OFF: 파일의 크기나 오프셋
  7. NODE: 노드 번호
  8. NAME:  파일명

 

특정 사용자의 열린 파일 출력 

-u 옵션으로 사용자를 지정할 있다.

lsof -u lesstif

COMMAND  PID    USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME

sshd    7320 lesstif  cwd    DIR              253,0     4096       2 /

sshd    7320 lesstif  rtd    DIR              253,0     4096       2 /

sshd    7320 lesstif  txt    REG              253,0   546680  931362 /usr/sbin/sshd

sshd    7320 lesstif  DEL    REG                0,4            22174 /dev/zero

sshd    7320 lesstif  mem    REG              253,0    18592  785075 /lib64/security/pam_limits.so

sshd    7320 lesstif  mem    REG              253,0    10224  785073 /lib64/security/pam_keyinit.so

sshd    7320 lesstif  mem    REG              253,0    10240  785078 /lib64/security/pam_loginuid.so

sshd    7320 lesstif  mem    REG              253,0    18664  785090 /lib64/security/pam_selinux.so

sshd    7320 lesstif  mem    REG              253,0    41088  925568 /usr/lib64/libcrack.so.2.8.1

sshd    7320 lesstif  mem    REG              253,0    14432  785059 /lib64/security/pam_cracklib.so

 

특정 포트를 사용하는 프로세스 정보 보기

개인적으로 가장 많이 쓰는 명령어이다. -i 옵션뒤에 프로토콜과 포트를 명시해 주면 된다. 다음은 TCP 22 포트(ssh) 쓰는 프로세스의 정보를 출력한다.

lsof -i TCP:22

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

sshd    1550    root    3u  IPv4  13931      0t0  TCP *:ssh (LISTEN)

sshd    1550    root    4u  IPv6  13933      0t0  TCP *:ssh (LISTEN)

sshd    1895    root    3r  IPv4  15005      0t0  TCP 192.168.152.131:ssh->192.168.152.1:55859 (ESTABLISHED)

sshd    7316    root    3r  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

sshd    7320 lesstif    3u  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

sshd    7474    root    3r  IPv4  22763      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57197 (ESTABLISHED)

특정 명령어가 사용하는 포트

apache httpd 같은 경우 fork 하여 여러 개의 프로세스가 뜨게 된다. -c 옵션과 httpd 주면 httpd 오픈한 파일 정보를 출력한다.

lsof -c httpd

특정 파일을 사용하는 프로세스 보기

특정 파일을 사용하고 있는 프로세스의 자세한 정보를 있다. 옵션 없이 파일의 경로를 지정하면 된다.

lsof /var/log/httpd/access_log

 

특정 디렉터리내 열린 파일 보기

특정 디렉터리 하위의 열린 파일을 표시하고 싶은 경우가 있다. +D 옵션 뒤에 디렉터리 경로를 명시하면 된다. 아래는 /tmp 디렉터리 밑에 열린 파일을 표시한다.

lsof +D /tmp

 

포트 범위 지정

TCP 포트 22 에서 80 까지 출력

lsof -i TCP:22-80

COMMAND  PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

master  1349    root   12u  IPv4  12888      0t0  TCP localhost:smtp (LISTEN)

master  1349    root   13u  IPv6  12890      0t0  TCP localhost:smtp (LISTEN)

sshd    1550    root    3u  IPv4  13931      0t0  TCP *:ssh (LISTEN)

sshd    1550    root    4u  IPv6  13933      0t0  TCP *:ssh (LISTEN)

sshd    1895    root    3r  IPv4  15005      0t0  TCP 192.168.152.131:ssh->192.168.152.1:55859 (ESTABLISHED)

sshd    7316    root    3r  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

sshd    7320 lesstif    3u  IPv4  22126      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57127 (ESTABLISHED)

httpd   7400    root    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7402  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7403  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7404  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7405  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7406  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7407  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7408  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

httpd   7409  apache    4u  IPv6  22492      0t0  TCP *:http (LISTEN)

sshd    7474    root    3r  IPv4  22763      0t0  TCP 192.168.152.131:ssh->192.168.152.1:57197 (ESTABLISHED)

 

IPv4 또는 IPv6 포트만 표시

-i 옵션 뒤에 4(IPv4), 또는 6(IPV6) 지정하여 특정 IP 버전만 확인할 있다./

lsof -i 4

COMMAND    PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME

rpcbind   1068     rpc    6u  IPv4  11858      0t0  UDP *:sunrpc 

rpcbind   1068     rpc    7u  IPv4  11860      0t0  UDP *:819 

rpcbind   1068     rpc    8u  IPv4  11861      0t0  TCP *:sunrpc (LISTEN)

rpc.statd 1086 rpcuser    5r  IPv4  11949      0t0  UDP *:838 

rpc.statd 1086 rpcuser    8u  IPv4  11955      0t0  UDP *:47492 

rpc.statd 1086 rpcuser    9u  IPv4  11959      0t0  TCP *:38374 (LISTEN)

cupsd     1159    root    7u  IPv4  12195      0t0  TCP localhost:ipp (LISTEN)

 

특정 사용자 제외

사용자 지정 옵션인 -u ^ 추가하면 특정 사용자는 제외할 있다. 다음은 lesstif root 사용자가 열은 파일은 제외하고 정보를 출력한다.

lsof -u^lesstif -u ^root

 

열린 모든 네트워크 포트 표시

모든 네트워크 포트를 표시한다. -i 뒤에 프로토콜을 명시하면 해당 프로토콜 관련 포트만 표시한다.

## 모든 포트

lsof -i

## TCP

lsof -i TCP 

## UDP

lsof -i UDP

특정 프로세스가 오픈한 파일 표시

특정 프로세스가 오픈한 파일만 표시한다. -p(소문자) 옵션뒤에 PID  주면 된다.

lsof -p 123

 

특정 사용자가 오픈한 모든 프로세스 중지

-t 옵션은 자세한 정보를 출력하지 않고 pid 정보만 출력한다. 다음 명령은 lesstif 사용자로 구동한 프로세스의 id 리턴한다.

lsof -t -u lesstif

13324

이를 응용하여 kill 명령어에 pid 전달할 있으므로 아래와 같이 사용하면 lesstif 사용자의 모든 프로세스를 중지하게 된다.

kill -KILL `lsof -t -u lesstif`

 

Ref

[linux] 다수 서버 호스트명 수정하기 – bash

자체적으로, ReserveDNS 를 운영하면서 질의 하면 더욱 좋겠지만 그렇지 못한 경우를 위해서 다음과 같이

호스트 파일을 일괄 수정한다.

 

 

Java 등에서 inetaddress.getbyname  또는

InetAddress[] ipAddress = DNSNameService.lookupAllHostAddr(“hostName”);

등을 사용하는 경우 호스트명을 통해서 아이피를 가져오게 됨

 

이럴때 일일히 서버에서 등록하지 말고 매니지먼트 서버에서 아래와 같이 쉘을 하나 만들어서 원격지 배쉬로 실행시켜서 적용하면 좋다.

 

쉘스크립트 작성..

#!/bin/bash

a=(`hostname`)

b=`ifconfig eth0 | grep 10.11 | cut -d ‘:’ -f2 | cut -d ‘ ‘ -f1`

echo -e “$b $a” >> /etc/hosts

 

이렇게 작성한 쉘을 아래와 같이 원격지에 뿌려줌. (remotehost.txt 에 대상이 되는 서버를 미리 등록해놓자~)

for i in $(cat remotehost.txt ); do ssh $i ‘/bin/bash -s’ < myname.sh  ;done