'LOG'에 해당되는 글 3건

  1. 2010.03.15 DBCC SHRINKFILE 트랜잭션 로그파일 축소
  2. 2009.07.14 SQL로 Oracle Alert Log 파일 조회
  3. 2008.10.27 리눅스 방화벽 설정 iptables 옵션과 샘플
2010.03.15 19:43

DBCC SHRINKFILE 트랜잭션 로그파일 축소

SQL Server 2005에서 DBCC SHRINKFILE 문을 사용하여 트랜잭션 로그 파일을 축소하는 방법

SQL Server 2005에서는 축소 작업(DBCC SHRINKFILE)이 지정한 트랜잭션 로그 파일을 요청된 크기로 즉시 축소하려고 합니다. 전체 복구 모델에서 트랜잭션 로그 파일을 수동으로 축소하려면 먼저 트랜잭션 로그 파일을 백업한 다음 DBCC SHRINKFILE 문을 사용하여 트랜잭션 로그 파일을 축소하십시오.

일반적으로 SQL Server 2005에서 트랜잭션 로그 파일을 축소하는 것은 SQL Server 2000에서 트랜잭션 로그 파일을 축소하는 것보다 빠릅니다. 이는 SQL Server 2005 로그 관리자가 실제 디스크 저장 장치 순서에 따라 비활성 가상 로그 파일을 만들거나 다시 사용하기 때문입니다. 따라서 트랜잭션 로그 파일의 비활성 부분은 대개 파일의 끝에 있습니다.

예를 들어, 트랜잭션 로그 파일에 100개의 가상 로그 파일이 있을 수 있고 2개의 가상 로그 파일만 사용되는 경우 SQL Server 2000은 첫 번째로 사용된 가상 로그 파일을 트랜잭션 로그 파일의 시작 부분에 저장하고 두 번째로 사용된 가상 로그 파일을 트랜잭션 로그 파일의 중간 부분에 저장합니다. 트랜잭션 로그 파일을 두 개의 가상 로그 파일로만 축소하기 위해 SQL Server는 더미 로그 항목을 사용하여 두 번째 가상 로그 파일의 나머지 부분을 채웁니다. SQL Server는 논리 로그의 시작 부분을 로그 관리자가 지정하는 사용 가능한 다음 가상 로그 파일로 이동합니다. 로그 관리자는 마지막 활성 가상 로그 파일 바로 앞에 있는 트랜잭션 로그 파일의 중간 부분에 가상 로그 파일을 만들 수 있습니다. 이 경우 트랜잭션 로그 파일을 두 개의 가상 로그 파일로 축소하기 위해 여러 개의 로그 백업 작업과 로그 축소 작업을 사용해야 합니다. 최악의 경우 트랜잭션 로그 파일을 두 개의 가상 로그 파일로 축소하기 위해 각각 50개씩의 로그 백업 작업과 로그 축소 작업을 사용해야 할 수도 있습니다.

그러나 SQL Server 2005에서는 하나의 DBCC SHRINKFILE 문을 사용하여 트랜잭션 로그 파일을 즉시 두 개의 가상 로그 파일로 축소할 수 있습니다. 이는 SQL Server 2005 로그 관리자가 실제 디스크 저장 장치 순서에 따라 두 개의 가상 로그 파일을 만들기 때문입니다. 이 두 개의 가상 로그 파일은 모두 트랜잭션 로그 파일의 시작 부분에 저장됩니다.

SQL Server 2005에서 여유 공간이 거의 없는 트랜잭션 로그 파일을 축소하려는 경우 추가 로그 백업 작업을 수행해야 할 수 있습니다. 추가 로그 백업 작업을 수행하면 트랜잭션 로그 파일이 더 작은 크기로 잘립니다. 이 로그 백업 작업은 SQL Server 2000에서 트랜잭션 로그 파일의 축소를 위해 수행하는 세 단계 이외에 추가로 수행하는 작업입니다. 자세한 내용은 "소개" 절에서 언급한 Microsoft 기술 자료 문서를 참조하십시오. SQL Server 2005에서 여유 공간이 거의 없는 트랜잭션 로그 파일을 축소하려면 다음과 같이 하십시오.
  1. 트랜잭션 로그 파일을 백업하여 대부분의 활성 가상 로그 파일을 비활성화합니다. 이렇게 하면 나중에 비활성 가상 로그 파일을 제거할 수 있습니다. 이렇게 하려면 다음 Transact-SQL 문과 유사한 Transact-SQL 문을 실행하십시오.
    BACKUP LOG <DatabaseName> TO DISK = '<BackupFile>'
    참고 이 문에서 <DatabaseName>은 백업할 데이터베이스 이름의 자리 표시자이고, <BackupFile>은 백업 파일의 전체 경로에 대한 자리 표시자입니다.

    예를 들어, 다음 Transact-SQL 문을 실행하십시오.
    BACKUP LOG TestDB TO DISK='C:\TestDB1.bak'
  2. 트랜잭션 로그 파일을 축소합니다. 이렇게 하려면 다음 Transact-SQL 문과 유사한 Transact-SQL 문을 실행하십시오.
    DBCC SHRINKFILE (<FileName>, <TargetSize>) WITH NO_INFOMSGS
    참고 이 문에서 <FileName>은 트랜잭션 로그 파일 이름의 자리 표시자이고, <TargetSize>는 트랜잭션 로그 파일의 대상 크기에 대한 자리 표시자입니다. 대상 크기는 합리적이어야 합니다. 예를 들어, 두 개의 가상 로그 파일보다 작은 크기로 트랜잭션 로그 파일을 축소할 수는 없습니다.
  3. DBCC SHRINKFILE 문이 트랜잭션 로그 파일을 대상 크기로 축소하지 않을 경우 1단계에서 언급한 BACKUP LOG 문을 실행하여 가상 로그 파일을 추가로 비활성화합니다.
  4. 2단계에서 언급한 DBCC SHRINKFILE 문을 실행합니다. 이 작업을 수행하고 나면 트랜잭션 로그 파일이 대상 크기와 비슷해집니다.
요약하면 SQL Server 2005에서는 다음 가상 로그 파일을 선택하는 로그 관리자의 알고리즘이 변경되었습니다. 따라서 SQL Server 2005에서 트랜잭션 로그 파일을 축소하는 방법이 SQL Server 2000에서 트랜잭션 로그 파일을 축소하는 방법과 다를 수 있습니다.
  • 로그 파일에 여유 공간이 많으면 SQL Server 2005에서 트랜잭션 로그 파일을 축소하는 것이 SQL Server 2000에서 트랜잭션 로그 파일을 축소하는 것보다 빠릅니다.
  • 로그 파일에 여유 공간이 없으면 SQL Server 2005에서 트랜잭션 로그 파일을 축소하는 것과 SQL Server 2000에서 트랜잭션 로그 파일을 축소하는 것이 같습니다.
  • 로그 파일에 여유 공간이 거의 없으면 SQL Server 2000에서 수행해야 하는 것보다 더 많은 추가 로그 백업 작업을 SQL Server 2005에서 수행해야 합니다.

SQL Server 2000에서 DBCC SHRINKFILE을 사용하여 트랜잭션 로그를 축소하는 방법

DBCC SHRINKFILE을 실행할 때 SQL Server는 먼저 가상 로그 파일을 제거하여 로그 파일을 축소합니다. 대상 파일 크기로 축소되지 않았으면 SQL Server는 가상 로그가 채워질 때까지 마지막 가상 로그 파일에 더미(Dummy) 로그 항목을 넣고 로그의 윗 부분을 파일의 시작 위치로 옮깁니다. 그런 다음 트랜잭션 로그를 축소하는 작업을 완료하기 위해 아래와 같은 작업이 필요합니다.

  • 로그의 활성 부분을 비우기 위해 BACKUP LOG 문을 실행합니다.
  • 로그 파일이 대상 크기로 줄어들 때까지 원하는 대상 크기를 사용하여 DBCC SHRINKFILE을 다시 실행합니다.
아래 예제에서는 pubs 데이터베이스를 사용할 때 이 방법을 사용하여 pubs_log 파일을 2MB로 축소하는 단계를 보여줍니다.
  1. DBCC SHRINKFILE(pubs_log, 2)을 실행합니다.
  2. 대상 크기로 축소되지 않고 아래와 같은 메시지가 반환됩니다.
    모든 논리 로그 파일이 사용 중이므로 로그 파일 2(Pubs_log)을(를) 축소할 수 없습니다.
    DbId  FileId  CurrentSize  MinimumSize UsedPages     EstimatedPages 
    ----- ------- ------------ ----------- ------------- ------------------ 
    6     2       3048         128         3048          128  <- 여기 있는 모든 값은 변할 수 있습니다.
    
    (1개 행 적용됨)
    
    DBCC 실행이 완료되었습니다. DBCC에서 오류 메시지를 출력하면 시스템 관리자에게 문의하십시오.
    
  3. BACKUP LOG pubs WITH TRUNCATE_ONLY를 실행합니다.
  4. DBCC SHRINKFILE(pubs_log,2)을 실행합니다.
  5. 이제 트랜잭션 로그가 대상 크기로 줄어듭니다.

자세한 내용은 SQL Server 2000 Books Online에서 "Shrinking the Transaction Log" 항목과 "DBCC SHRINKFILE" 항목을 참조하십시오.


SQL Server 7.0 트랜잭션 로그를 줄이는 방법

  • Microsoft SQL Server 7.0에서 SHRINKFILE 및 SHRINKDATABASE 명령은 줄이려는 목표 크기를 설정합니다. 각 로그 파일은 이들 명령에 의해 표시되지만, 실제로 파일을 줄이기 위해 로그 백업이나 로그 자르기를 시도하지는 않습니다. 따라서 SHRINKFILE 또는 SHRINKDATABASE 명령을 사용한 후에는 로그 자르기 명령을 통해 파일을 줄이기 전에 로그를 자르는 명령을 실행해야 합니다.
  • 아래의 기준에서 허용하는 크기보다 작은 크기로 로그를 줄일 수 없습니다.

    • 원래 크기보다 로그를 작게 줄이려면 개별 파일을 DBCC SHRINKFILE을 사용하여 줄여야 합니다. DBCC SHRINKDATABASE를 사용하면 로그를 원래 크기나 명시적으로 정의한 크기보다 작게 줄일 수 없습니다. CREATE DATABASE에 모든 명시적 ALTER DATABASE 명령이 더해지므로 원래 크기는 로그의 크기로 정의됩니다. 로그의 자동 증가는 원래 크기에 포함되지 않습니다.

    • 실제 로그 파일은 해당 로그 파일 내에서 현재 사용되고 있는 공간의 양보다 작을 수 없습니다. DBCC SQLPERF (LOGSPACE) 명령을 사용하면 사용된 공간의 양을 모니터 할 수 있습니다.

    • Model 데이터베이스 로그의 현재 크기는 해당 서버에 있는 모든 데이터베이스 로그의 최소 크기입니다. 기본적으로 Model 데이터베이스의 로그는 1MB보다 작습니다.

    • 로그를 가상 로그 파일(VLF) 경계까지만 줄일 수 있으므로 공간을 사용하고 있지 않은 경우에도 로그 파일을 VLF보다 작은 크기로 줄이는 것은 불가능합니다. 마찬가지로 VLF의 일부를 사용 중인 경우 해당 VLF에서 사용 중인 공간은 줄일 수 없습니다. 자세한 내용은 SQL Server Books Online의 "Virtual Log Files" 및 "Transaction Log Physical Architecture" 항목을 참조하십시오

  • 트랜잭션 로그는 "랩어라운드" 로그입니다. 이는 특정 시간에 로그 시작 부분 및/또는 끝 부분에 "여유" 또는 "재사용 가능" 공간이 있는 VLF가 있을 수 있음을 의미합니다. 로그를 줄이려면 해당 로그의 여러 곳에 여유 공간이 있어야 하는 것이 아니라 해당 로그의 끝 부분에 "여유" 공간이 있어야 합니다. 또한, 전체 VLF를 줄일 수만 있습니다. 트랜잭션 로그를 줄이려면 로그 파일의 끝에 있는 VLF가 비활성화되어 잘려야 합니다. 자세한 내용은 SQL Server Books Online의 "Truncating the Transaction Log" 항목을 참조하십시오.
다음 몇 가지 사항에 유의하십시오.
  • 시스템에 영향을 미치는 변경 작업을 수행하기 전이나 후에 항상 시스템 데이터베이스 및 사용자 데이터베이스 백업을 수행하십시오. DBCC SHRINKFILE 및 DBCC SHRINKDATABASE는 로깅되는 작업이 아니며, 이들을 실행하면 향후 트랜잭션 로그 백업도 무효화됩니다. DBCC SHRINKFILE 명령이나 DBCC SHRINKDATABASE 명령 중 하나를 실행한 후에는 반드시 전체 데이터베이스 백업을 수행해야 합니다.

  • 축소가 진행될 시간에 예약된 백업이 없는지 확인하십시오.

  • 오래되거나, 장기간 실행하거나 또는 복제되지 않은 트랜잭션이 없는지 확인하십시오. 이렇게 확인하려면 다음과 유사한 코드를 사용하십시오.
    DBCC OPENTRAN (database_name)
  • DBCC SHRINKFILE 명령이나 DBCC SHRINKDATABASE 명령을 실행하여 축소 지점을 표시하십시오. DBCC SHRINKFILE 및 DBCC SHRINKDATABASE 사용 권한은 sysadmin 고정 서버 역할이나 db_owner 고정 데이터베이스 역할의 멤버에 기본적으로 제공되며, 권한 전가는 불가능합니다. 이들 명령의 차이점에 대한 자세한 내용은 SQL Books Online의 다음 항목을 참조하십시오. 매개 변수가 다름에 유의하십시오.

    DBCC SHRINKFILE     (file_name, target_size)
    DBCC SHRINKDATABASE (database_name, target_percent)
  • 더미(dummy) 트랜잭션을 몇 개 만들어 로그를 겹치게 만든 후 BACKUP 명령을 실행하여 로그를 자르십시오. BACKUP 문은 실제로 표시된 목표 크기로 로그를 줄이고자 시도합니다.

    다음은 줄일 수 있도록 단일 논리 로그 파일에 대해 로그를 겹치고 로그가 잘리게 하는 더미 트랜잭션을 만드는 방법의 샘플입니다. 필요하면 사용자 환경에 맞게 샘플을 수정하십시오.
    SET NOCOUNT ON
    DECLARE @LogicalFileName sysname,
            @MaxMinutes INT,
            @NewSize INT
    
    -- *** MAKE SURE TO CHANGE THE NEXT 3 LINES WITH YOUR CRITERIA. ***
    USE     Your_Database_Name              -- This is the name of the database 
    for which the log will be shrunk.
    SELECT  @LogicalFileName = 'Your_log',  -- Use sp_helpfile to identify the logical file name that you want to shrink.
            @MaxMinutes = 10,               -- Limit on time allowed to wrap log.
            @NewSize = 100                  -- in MB
    
    -- Setup / initialize
    DECLARE @OriginalSize int
    SELECT @OriginalSize = size -- in 8K pages
      FROM sysfiles
      WHERE name = @LogicalFileName
    SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
            CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
            CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
      FROM sysfiles
      WHERE name = @LogicalFileName
    CREATE TABLE DummyTrans
      (DummyColumn char (8000) not null)
    
    
    -- Wrap log and truncate it.
    DECLARE @Counter   INT,
            @StartTime DATETIME,
            @TruncLog  VARCHAR(255)
    SELECT  @StartTime = GETDATE(),
            @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'
    -- Try an initial shrink.
    DBCC SHRINKFILE (@LogicalFileName, @NewSize)
    EXEC (@TruncLog)
    -- Wrap the log if necessary.
    WHILE     @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
          AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  -- the log has not shrunk    
          AND (@OriginalSize * 8 /1024) > @NewSize  -- The value passed in for new size is smaller than the current size.
      BEGIN -- Outer loop.
        SELECT @Counter = 0
        WHILE  ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
          BEGIN -- update
            INSERT DummyTrans VALUES ('Fill Log')  -- Because it is a char field it inserts 8000 bytes.
            DELETE DummyTrans
            SELECT @Counter = @Counter + 1
          END   -- update
        EXEC (@TruncLog)  -- See if a trunc of the log shrinks it.
      END   -- outer loop
    SELECT 'Final Size of ' + db_name() + ' LOG is ' +
            CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
            CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
      FROM sysfiles 
      WHERE name = @LogicalFileName
    DROP TABLE DummyTrans
    PRINT '*** Perform a full database backup ***'
    SET NOCOUNT OFF
    로그가 원래 크기에서 줄여졌는지 확인하십시오.필요한 경우 앞의 단계를 반복하십시오. 로그가 줄여지지 않을 경우 본 문서의 시작 부분에 나와 있는 요약 정보를 점검하여 로그를 줄이는 데 문제가 있는지 확인하십시오.
로그를 줄였으면 다음을 수행하십시오.
  1. 마스터 데이터베이스를 전체 데이터베이스 백업합니다.
  2. 사용자 데이터베이스를 전체 데이터베이스 백업합니다. SHRINK 명령이 로깅되지 않고, 전체 데이터베이스 백업을 완료하지 않으면 향후 트랜잭션 로그 백업이 무효화되기 때문에 이러한 작업이 필요합니다.

로그가 커지는 이유를 확인하려면 열린 트랜잭션, 장기간 실행되는 트랜잭션, 복제되지 않은 트랜잭션 또는 많은 양의 데이터를 사용하는 트랜잭션을 점검하면 됩니다.


데이터베이스 파일명 찾기

sp_helpfile
GO

위의 쿼리를 실행하면 트랜잭션 로그명을 알수 있습니다.


원문:
http://support.microsoft.com/kb/907511/ko
http://support.microsoft.com/kb/272318/
http://support.microsoft.com/kb/256650/KO/


Trackback 0 Comment 0
2009.07.14 15:16

SQL로 Oracle Alert Log 파일 조회

DBMS LOG용 디렉토리 생성

CREATE OR REPLACE DIRECTORY DIR_BDUMP AS '/oracle/admin/SID/bdump/';

DBMS LOG 외부 테이블 생성

CREATE TABLE DBMSLOG (
  LOG_TEXT VARCHAR2(4000)
)
ORGANIZATION EXTERNAL (
  TYPE ORACLE_LOADER
  DEFAULT DIRECTORY DIR_BDUMP
  ACCESS PARAMETERS (
    RECORDS DELIMITED BY NEWLINE
    FIELDS TERMINATED BY '~'
    MISSING FIELD VALUES ARE NULL (
      LOG_TEXT CHAR(4000)
    )
  )
  LOCATION ('alert_SID.log')
)
REJECT LIMIT UNLIMITED;

DBMS LOG 뷰 생성

CREATE OR REPLACE VIEW DBMSLOG_VI
AS
SELECT LOG_RNUM
, LAST_VALUE(LOG_LNUM IGNORE NULLS)
OVER(ORDER BY LOG_RNUM ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) LOG_SNUM
, LAST_VALUE(LOG_DATE IGNORE NULLS)
OVER(ORDER BY LOG_RNUM ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW) LOG_DATE
, TRC_FILE
, LOG_TEXT
FROM (SELECT ROWNUM LOG_RNUM
, NVL2(LOG_DATE, ROWNUM, NULL) LOG_LNUM
, LOG_DATE
, TRC_FILE
, LOG_TEXT
FROM (SELECT CASE REGEXP_INSTR(LOG_TEXT,
'[[:digit:]]{2}:[[:digit:]]{2}:[[:digit:]]{2}'
|| ' [[:digit:]]{4}')
WHEN 0 THEN NULL
ELSE TO_DATE(LOG_TEXT
, 'Dy Mon DD HH24:MI:SS YYYY'
, 'NLS_DATE_LANGUAGE=AMERICAN')
END LOG_DATE
, CASE REGEXP_INSTR(LOG_TEXT, '^Errors in file')
WHEN 1 THEN REGEXP_REPLACE(LOG_TEXT
, '^Errors in file (.*):$'
, '\1')
ELSE NULL
END TRC_FILE
, LOG_TEXT
FROM DBMSLOG));

COMMENT ON TABLE DBMSLOG_VI IS 'DBMS Alert 로그 뷰';

COMMENT ON COLUMN DBMSLOG_VI.LOG_RNUM IS 'DBMS Alert 로그 순번';
COMMENT ON COLUMN DBMSLOG_VI.LOG_SNUM IS 'DBMS Alert 로그 시작 순번 그룹';
COMMENT ON COLUMN DBMSLOG_VI.LOG_DATE IS 'DBMS Alert 로그 일시';
COMMENT ON COLUMN DBMSLOG_VI.TRC_FILE IS 'DBMS Alert Trace 파일';
COMMENT ON COLUMN DBMSLOG_VI.LOG_TEXT IS 'DBMS Alert 로그 내용';

DBMS LOG 파일 조회

SELECT A.LOG_DATE
, A.TRC_FILE
, A.LOG_TEXT
FROM (SELECT TO_CHAR(MIN(LOG_DATE), 'YYYY-MM-DD HH24:MI:SS') LOG_DATE
, SUBSTR(XMLAGG(XMLELEMENT(TEMP, CHR(10) || TRC_FILE)
ORDER BY LOG_RNUM)
.EXTRACT('//text()').GETSTRINGVAL(), 2) TRC_FILE
, SUBSTR(XMLAGG(XMLELEMENT(TEMP, CHR(10) || LOG_TEXT)
ORDER BY LOG_RNUM)
.EXTRACT('//text()').GETSTRINGVAL(), 2) LOG_TEXT
FROM DBMSLOG_VI
WHERE LOG_DATE BETWEEN TRUNC(SYSDATE - :DAY)
AND SYSDATE - :DAY
GROUP BY LOG_SNUM
ORDER BY LOG_SNUM DESC) A
WHERE LOG_TEXT LIKE '%' || :TEXT || '%';

참고

Query the Oracle Alert Log using SQL commands
Oracle Regular Expression(정규표현식)


Trackback 0 Comment 0
2008.10.27 09:49

리눅스 방화벽 설정 iptables 옵션과 샘플


// 넷필터라는 방화벽을 사용하기 위해 정보를 볼수 있는 홈페이지

http://www.netfilter.org


// 커널에 넷필터가 포함되어 있는지 확인하는 작업.. 커널에 필요한 파일은 /boot 안에 있습니다..

serv 컴: cd   /boot  &&  ls  -l
 vi  config-2.6.9-42.EL  ->   /NETFILTER  검색어 입력

 service   iptables  status -> 정지 상태면  start

 하지만 start는 안된다.. 왜?? 방화벽 활성화는 lokkit 으로 하자!!

 // 방화벽을 보여주는 명령어 입니다.. 우린 여기서 방화벽을 활성화를 시킵시다..

 lokkit

// 집중해서 잘 봐주시기 바랍니다...

@NETFILTER 방화벽의 구조
   1. 3개의 기본 table(filter,nat,mangle)로 구성
   2. 각 table 은 chain(패킷의 이동통로) 으로 구성
   3. 각 chain 에 rule 설정


        filter - 패킷의 허용/차단 판단
             FORWARD - 방화벽을 통과하는 패킷의 통로
             INPUT - 방화벽 자체의 서비스로 들어오는 패킷의 통로
             OUTPUT - 방화벽 자체에서 외부(내부망/외부망)으로 나가는 패킷의 통로


        nat - 패킷의 주소변환
             OUTPUT
             POSTROUTING
             PREROUTING


        mangle - 패킷의 속성(ttl,tos,,,) 변경
             FORWARD
             INPUT
             OUTPUT 
             POSTROUTING
             PREROUTING


@ iptables 문법
  1. table name (예: -t  filter/ -t  nat/  -t  mangle)
  2. chain name (예: -A  INPUT/ -D  FORWARD/ -I POSTROUTING)
  3. layer 3 object (예: -s 192.168.x.10 / -d 10.1.1.0/24)
  4. layer 4 object (예: -p tcp --dport 80/ -p udp  --sport 123)
  5. Jump (예: -j DROP/  -j  ACCEPT/ -j  REJECT/ -j  LOG ,,,)

예> 내부망의 특정 HOST(10.1.1.20)가 업무 시간에 업무는 등한시하고
     증권거래,웹서핑,채팅을 하는 것을 방화벽 로그를 통해 확인하였다.
     해당 HOST의 모든 인터넷 서비스 접속을 차단할 수 있도록 네트웍
     방화벽 셋팅을 하세요


iptables  -t  filter  -A  FORWARD  -s 10.1.1.20  -j  DROP

// iptables 의 룰 정보를 보여주는 명령어 입니다...

serv 컴: iptables  -L 

// iptables 의 룰을 전부 제거 하는 명령어 입니다..

 iptables  -F

주의: xp,work 컴에서 serv의 telnet,ftp,ssh 접속이 잘 되는지 반드시 확인

퀴즈> serv 컴에서  work 컴으로부터의 모든 서비스 접속을 차단할 수
        있도록 방화벽 셋팅을 하세요.
iptables  -t  filter  -A  INPUT  -s  192.168.x.20  -d 192.168.x.10 -j  DROPT


// 하지만 iptables 의 룰을 셋팅하고 서비스를 재시작 시키면 모든게 원상태 즉 초기화 되버리는 것을

   우리는 지금 볼수 잇습니다...

serv 컴: service   iptables   restart
 iptables   -L

 iptables   -F
 

// 그리하여 iptables-save 라는 명령으로 파일로 저장을 하는 모습입니다..
 iptables-save  >   /root/firewall.txt

// 그리고 다시 iptables의 룰 정보를 다시 보았습니다.. 하지만 또 다시 돌아가버렸네요 그쵸???

 service   iptables   restart   &&  iptables  -L

// 아까전에 firewall.txt라는 파일로 우린 룰 정보를 저장을 하였습니다.. 그걸로 다시 복구를 하네요..

 iptables-restore   <  /root/firewall.txt
 iptables   -L


// 이렇게 매번 부팅할때마다 iptables를 restore 해줘야 하냐구요??? 아닙니다.. ^^

// 밑에 환경설정 폴더로 가서 iptables-config 파일을 한번 열어볼까요~

 ls   /etc/sysconfig/
 
 vi   /etc/sysconfig/iptables-config

 // 19행에 보시면  IPTABLES_SAVE_ON_STOP="no" 를 yes로 바꿔주세요... 무슨뜻이냐구요?

    iptables가 정지를 할때에 저장을 할것이냐 하고 물어본것입니다.. 초기값은 no 이므로 우리는

    당연히 yes 를 눌러주시면 정지했을때 저장이 되겠죠... 또하나!!!
  -> 19행  IPTABLES_SAVE_ON_STOP="yes"


 // IPTABLES_SAVE_ON_RESTART="no" 를 yes로 변경~!!! 이건 iptable가 재부팅할때 저장

    할것인지 물어보는겁니다.. 당연히 yes!! 그럼 우린 정지했을때나 재부팅 했을때 전부 저장이 되는

    것입니다.. 한번 확인해 볼까요??
  -> 25행  IPTABLES_SAVE_ON_RESTART="yes"

 service   iptables   restart   &&  iptables  -L



* filter 라는 테이블에 -A (해당 체인의 맨 밑에 추가) 하는 구조이다..

serv 컴: iptables  -t  filter  -A  INPUT  -s 1.1.1.1  -d  2.2.2.2 
   -p tcp   --dport  80  -j   ACCEPT
 iptables  -L

 iptables  -t  filter  -A  INPUT  -s  3.3.3.3  -j  DROP
 iptables  -L

* -I 는 삽입될 체인의 위치를 지정할수 있다.. 생략하게 되면 맨위에 추가가 된다..

 iptables  -t  filter  -I  INPUT  -s  192.168.x.1  -j   REJECT
 iptables  -L

* 해당 체인의 3번째에 룰이 삽입 되는 모습이다..

 iptables  -t  filter  -I  INPUT  3   -s  192.168.x.20  -j  LOG
 iptables  -L

* 특정위치의 룰을 -D 라는 옵션으로 제거를 한다..

 iptables  -t  filter  -D  INPUT  4   
 iptables  -L

* 특정위치의 룰을 다시 재설정 하는 장면이다.. -s 는 192.168.x.30, -j ACCEPT 허용으로 ~

 iptables  -t  filter  -R  INPUT  3  -s  192.168.x.30  -j  ACCEPT
 iptables  -L

* iptables 의 정보를 보여주는데 -v를 써서 패킷과 바이트 까지 보여주게 된다.

 iptables  -L   -v   =  iptables  -vL

* iptables 의 정보를 패킷 즉 전체 체인의 패킷을 숫자형태로 보여주게 된다.

 iptables  -L   -n  =  iptables  -nL

* iptables 의 정보를 줄넘버를 붙여 보여준다.

 iptables  -L  --line-numbers

* iptables -Z 는 해당 패킷 및 바이트를 Zero로 초기화 하는 장면..!!

 iptables  -vL    ->   iptables  -Z    ->  iptables  -vL

* -X 는 사용자 정의 체인을 지우는 장면.. INPUT, FORWARD, OUTPUT 는 지울수 없다.

 iptables   -X   RH-Firewall-1-INPUT
 iptables  -L

* 밑에처럼 해보면 안지워짐을 알것이다..

 iptables  -X   INPUT

* 사용자 정의 체인을 TEST라는 이름으로 생성하는 모습.

 iptables  -N  TEST &&   iptables  -nL

* 사용자 정의 체인을 TEST 에서 SSH로 Rename을 하는 모습.

 iptables  -E   TEST   SSH   &&  iptables  -nL

* 사용자 정의 채인에 룰을 생성한다.. 해당체인의 맨 밑에 시작지의 ip를 허용을 한다.

 iptables  -A  SSH  -s  192.168.x.1  -j   ACCEPT

* 하지만 사용자 정의 체인에 허용을 한다고 했음에도 불구하고 INPUT에서  192.168.x.1을 차단하여

   xp 는 접속이 않됨을 알수 있다.. 접속이 되기 위해선 링크를 걸어주자...
 iptables  -nL
  -> xp 에서 serv 로 접속이 되는지 확인

* INPUT 1번째 라인에 xp를 DROP 했으니 우리는 그 위에 룰을 하나 생성하자..

   해당 룰 위치에 오면 SSH 사용자 정의 체인으로 점프를 시켜준다..

   이리 하여 이제 xp 에서 접속이 됨을 알수 있다..

 iptables  -I  INPUT  1  -j   SSH   &&  iptables  -nL


* 사용자 정의 체인을 삭제하기 위해선 아래와같은 순서가 필요하다..
 -> 실습 확인 다 하신 분은  사용자 정의 체인 SSH 를 삭제
       1. 링크 연결 해제
  iptables  -D  INPUT  1
       2. 사용자 정의 체인내의 모든 rule 삭제
  iptables  -F  SSH
       3. 사용자 정의 체인 삭제
  iptables  -X  SSH


* iptables (-t filter) 괄호 안의 부분은 생략이 가능하다.. 왜냐하면 filter 라는 테이블이 기본이기

   때문이다..


* -P 라는 옵션은 INPUT, FORWARD, OUTPUT의 Policy 기본정책을 의미한다..

   기본정책은 처음설정시 ACCEPT 로 허가가 되어있다.. 

* 그리하여 우리는 기본정책을 거부로 바꿔준다..

serv 컴: iptables  -P  INPUT  DROP
 iptables  -P  FORWARD  DROP
 iptables  -nL

 iptables  -D  INPUT  1   &&  iptables  -nL

* 하지만 OUTPUT 체인은 ACCEPT가 되어있다.. 그런데 ping 며 모든게 되지 않는다...

   아.......왜일까..???

확인> input,forward chain 의 기본정책을 DROP 바꾼후 serv 컴에서
        work로, 외부로 핑에 대한 응답이 오는지, "yum -y install  lynx"
        명령어 실행이 되는지 확인해 보세요.

* 잘 들어보자.. ping를 실행시켰을때 맨처음일어나는 일들이 무엇일까??.....

   3 way hand shake 계념을 잘 생각해보면 왜 ping가 않되는지 알것이다...

   그렇다 -0-;; 바로 설명하겠다..

   1 way -> SYN 을 보낸다. (즉 접속할라는데 괜찬냐??)

   2 way <- ACK/SYN 을 받는다.. (나 괜찬아.. 접속해~)

   3 way -> ACK 을 보낸다.. (알았어 접속한다~!!!)

   이리하여 tcp 세션이 맺어졌다.. 신뢰성있는 통신을 하기위해서 하는 과정이다..


   OUTPUT는 ACCEPT 인데 INPUT 가 DROP 라서 2 way 가 왔지만 거부당한다..


* 상태추적테이블이 있다.. 내가 나가면서 시작지 주소와 목적지 주소를 상태추적테이블에 저장한다.

   내가 목적지에 SYN 을 날려서 ACK/SYN을 유도한다.. 그러면 상태추적테이블에서 방화벽 룰

   검사를 하지 않고 내가 요청한거에 대해서는 허용을 해준다.. 그게 바로 ESTABLISHED 이다..


1. 상태추적은 메모리에 적재가 된다.. 그리하여 일정 시간이 지나면 자동으로 free가 된다..

   메모리를 바로 볼수 없으니 cat  /proc/net/ip_conntrack 를 통해 임시로 저장된 파일을

   볼수 있다..  이리하여 -m state --state ESTABLISHED 로 설정을 한다...


2. 또하나 그럼 RELATED는 무엇인가?? FTP 를 예로 들어보자.. FTP는 접속할때 21번 포트로 접속

   을 한다.. 모든 TCP 세션처리는 21번 포트에서 실행되지만 정작..데이터를 주고 받음에는

    20번 포트를 사용하게 된다.. 3way hand shake 로 21번 포트로 상태추적테이블에 저장이

    되었는데.. 전혀 생소한 20번 포트로 데이터가 전송이 되면 우리 컴퓨터는 당연히 INPUT에서

    DROP 된다.. ESTABLISHED의 이런점을 보안하고자 RELATED가 생겨났다..

    RELATED = 연관성을 가진 패킷을 허용한다.. 라는 의미로 알고 넘어가자!!!


* 이제 밑에처럼 설정 후 다시한번 ping 를 날려보자~ 그럼 시원하게 답이 올것이다..

serv 컴: iptables  -I  INPUT  -m  state  --state  ESTABLISHED,
 RELATED  -j   ACCEPT


* 아까 말했던 상태추적 메모리를 직접적이 아닌 간접적 으로 볼수 있는 파일이다..

 cat  /proc/net/ip_conntrack

serv 컴: telnet   localhost

 iptables  -A  INPUT  -i  lo  -j  ACCEPT
 telnet   localhost

 iptables  -F


퀴즈>  serv 컴에는 많은 서비스(ssh,telnet,ftp)가 동작중이다. 이러한
         서비스중 xp에는 telnet 서비스만 접속허용하고, work 에는
         ssh 서비스만 접속을 허용할 수 있도록 rule 셋팅하세요.
 iptables  -A  INPUT  -s  192.168.x.1  -d  192.168.x.10 
  -p  tcp  --dport  23  -j   ACCEPT


 iptables  -A  INPUT  -s  192.168.x.20  -d  192.168.x.10 
  -p  tcp  --dport  22  -j   ACCEPT



// 현재 iptables 의 정보를 -F 라는 옵션으로 제거 한 후 리스트를 찍어봅니다..

serv 컴: iptables  -F  &&  iptables  -nL


퀴즈> work 컴(관리자)의 ping test 에 대해서만 응답을 할 수 있도록
        serv 컴의 방화벽을 셋팅하세요.

// ping는 icmp 프로토콜을 사용하며 echo-request 는 클라이언트에서 들어오는 메시지를

   허용한다는 뜻이다... echo-request는 우리컴퓨터에서 보는게 되는것이다..

    하지만 지금은 OUTPUT 체인이 기본정책이 모든게 허용이 되있으니 이것만 추가하자!!
  iptables  -A  INPUT  -s  192.168.x.20   -p icmp  --icmp-type
  echo-request  -j  ACCEPT


// ESTABLISHED 는 관련성이 있는 어제 설명을 다 했다.. 어제껄 참조해 보기 바람..

serv 컴: iptables  -I INPUT -m state  --state  ESTABLISHED,
 RELATED  -j   ACCEPT

 yum  -y  install    httpd

 vi   /var/www/html/index.html
  <html>
  <body  bgcolor=green>
  <h1> Host Firewall</h1>
  </body>
  </html>
 service  httpd  start
 
퀴즈> serv 컴에는 많은 서비스(web,ftp,telnet,ssh) 가 동작중이다.
        이러한 서비스중 xp컴에는 web,telnet 접속을 허용할 수 있도록
        rule 셋팅을 하세요.(multiport 이용)

// 아래와 같이 처리하면된다.. -m multiport 여러개의 포트를 허가 및 거부할때 ~ 쓰인다.

 iptables  -A  INPUT  -s  192.168.x.1  -p tcp  -m multiport  --dport
 23,80  -j  ACCEPT

serv 컴: iptables  -A  INPUT  -s 192.168.x.20  -j  ACCEPT

work 컴: ifconfig   eth0   192.168.x.200
 -> serv 컴으로 ping test, telnet,ssh 접속을 시도
 -> ifconfig  eth0

serv 컴: iptables  -nL  --line-numbers


// 아이피를 차단했을 경우 그 사용자가 눈치를 까고 ip를 변경 해 주면 그사람은 또 인터넷에 접속을

   할수 잇다.. 그렇지 않기 위해서는 우린 맥 어드레스로 도 iptables를 사용할수 잇다는 점을 알자.


// 밑에는 해당 맥 어드레스만 확인하여 모든걸 다 허용을 해준다.

 iptables   -R  INPUT  -m  mac  --mac-source  00:0C:29
 :xx:xx:xx   -j   ACCEPT

serv 컴: iptables  -F
 iptables  -P  INPUT   ACCEPT
 iptables  -nL

// DROP과 REJECT의 차이점을 보기 위해 우린 두가지 상황을 만든다.

// DROP은 무조건 차단을한다.. 하지만 REJECT는 차단된 메시지를 보여준다..

// 여기서 DROP가 더 효율적이라 한다.. 이유는 REJECT같이 CPU 연산을 통하여 다시 해당

// Client로 메시지를 보내지 않아도 되기 때문이다.. CPU 작업 효율상 말이다.. ㅎ

 iptables  -A  INPUT  -s  192.168.x.1  -j  DROP
 iptables  -A  INPUT  -s  192.168.x.20  -j  REJECT
 iptables  -nL
   -> work, xp에서 serv 로 각각 ping test 시도


// 커널의 접속에 관란 정보를 LOG에 저장을 하기 위해 우리는 syslog.conf 파일의 주석을 풀어

    준다.. 하지만 이게 해당위치에 저장을 할뿐만 아니라 화면에도 계속적으로 뿌려주니 좀 귀찬다..

    그래서 Default는 주석이다 ㅎ

serv 컴: vi   /etc/syslog.conf
       -> 3행 주석제거후  kern.info      /var/log/firewall   수정
 service   syslog   restart

 ls   -l   /var/log/firewall

serv 컴: iptables  -F


// 해당 체인의 기본정책을 DROP로 설정하는 부분이다.. 어제 다 했지 않은가?ㅎㅎ
 iptables  -P   INPUT   DROP

// 항상 iptables 는 순서가 아주 중요하다.. 밑에 두 문장이 순서가 바뀌면 로그는 저장이 되지 않는다

   왜냐하면 INPUT 체인의 해당 룰을 체크하는 도중에 조건이 맞아버리면 바로 거기서 멈쳐버리기때문.

 iptables  -I  INPUT  -p tcp  --dport  80  -j  LOG
 --log-prefix " Web Access : "

 iptables   -A  INPUT  -d  192.168.x.10  -p tcp --dport  80
   -j  ACCEPT

 iptables   -nL

 tail   /var/log/firewall


// 여기도 어려울거 하나 없다.. 단지 추가된 계념이란건 내부망의 전체만 허용하면 된다는것..

    그건 192.168.59.0/24 로 ACCEPT 하면 이 네트워크는 전부다 허용이 되는 것이다..

    그리고 LOG를 기록해주면 된다.. 뭣만?? Telnet으로 접속하는 사람만!! ^^

퀴즈> TELNET 이란 사용자 정의 체인을 만들고, 내부망(192.168.X.0/24)
        의 사용자만 접속을 할 수 있도록 RULE 셋팅을 해당 체인에
        설정하세요. 또한 serv 컴에 telnet 접속을 한 사용자를 추적하기
        위해 log 가 남겨질 수 있도록 방화벽을 셋팅하세요.

iptables  -N  TELNET
iptables  -A  INPUT  -p tcp  --dport  23  -j  TELNET
iptables  -A  TELNET  -s  192.168.x.0/24  -p tcp  --dport  23 
  -j  ACCEPT
iptables  -I  TELNET  -s  192.168.x.0/24  -p tcp  --dport  23  -j
LOG  --log-prefix  " Telnet Access : "


serv 컴: iptables-restore   <  /root/firewall.txt
 iptables   -nL


// 이거는 각자 해보기 바란다.. 지난날 배웠던 기억을 마구마구 꺼내라..ㅎ

   그럼 기억나겠지 ^-^*

총정리 퀴즈> 1. serv 컴에는 여러 서비스(web,telnet,ftp,ssh) 가 동작중
     2. 내부망(192.168.x.0/24) 의 clinet 에게는 web,ftp,telnet
         접속만 허용(multiport 이용).
     3. 외부망(인터넷) 의 clinet 에게는 web 서비스만 허용
     4. 관리자컴(192.168.x.20) 는 ip주소가 바뀌더라도 항상
                     모든 서비스에 접속이 되도록 설정
     5. client 의 서비스 접속시에 방화벽에 log 가 남도록 설정
     6. serv 컴이 내부/외부망의 client 의 ping test 에
         응답하도록 설정
     7. 위에서 언급된 서비스 이외의 모든 접속은 차단.

iptables -L  ==> 목록 열람
iptables -F  ==> 기존에 설정된 것을 전부다 없앤다.

iptables 명령어순서
1. chain name - 체인에 설정할 내용 (insert/delete/replace..) ex) -I CHAIN 3, -A, -D, -R, -F
2. table name - filter(기본값),nat,mangle ex) -t nat, -t filter(기본값)
3.Layer 3 - ex) -s ip주소, -d ip주소
4.Layer 4 - ex) -p tcp --dport 80, -p udp --sport 21
5.Target - ex) -j ACCEPT,LOG,DROP,REJECT

호스트기반의 방화벽에서, serv컴이 방화벽이 설치되어있다.
퀴즈1) serv컴퓨터로 접속할 수 있는 client 중 ip가 192.168.247.20(work)가 있다.
         serv컴에서 이 컴퓨터의 모든 접속을 차단하고자 한다.
         어떻게 방화벽을 셋팅을 해야 할까..
===>INPUT 기본 정책이 ACCEPT로 되어있기에 work컴만 DROP또는 REJECT 시키면 된다.
     iptables -I INPUT -t filter -s 192.168.247.20 -j DROP (DROP은 ping도 거절한다.모든응답차단)    
                       (REJECT는 ping응답을 받고 보낸다)

iptables-save > /root/firewall.rule  ==>룰을 저장
iptables-restore < /root/firewall.rule  ==>룰을 불러옴

컴퓨터가 재부팅되면 설정되었던 iptables룰이 없어진다.
==>/etc/sysconfig/iptables ==> 기본설정룰
    /etc/sysconfig/iptables-config  ==> 환결설정화일
vi iptables-config
19행 IPTABLES_SAVE_ON_STOP="yes"
25행 IPTABLES_SAVE_ON_RESTART="yes"
로 바꾸면 재부팅되어도 설정된 룰이 사라지지 않는다.
iptables -L -v ==> 차단한 패킷의 수와 사이즈를 확인
iptables -L --line-numbers  ==> 룰의 순서를 보여준다.
iptables -L -n ==> 문자주소가 숫자주소로 바뀌어 출력된다. or -nL

iptables -R INPUT 3 -t filter -s 10.1.1.0/24 -j REJECT
iptables -D INPUT 3

iptables -Z  ==>iptables -L -v 로 확인했던 차단패킷 사이즈등을 초기화시킴(모니터링을위해)

<사용자정의체인>:관리의 편의성을 위해서 사용한다.
iptables -X RH-Firewall-1-INPUT  ==>사용자정의 체인 삭제
iptables -N INTRANET  ==>사용자정의 생성
iptables -E INTRANET EXTRANET  ==>사용자정의 이름 변경

*매칭되는 룰이 없을경우는 기본정책의 적용을 받는다.
iptables -A EXTRANET -t filter -s 192.168.247.1 -j ACCEPT
*사용자 정의 체인은 만들어도 쓸수 없다. 링크가 되어 있어야 쓸 수 있다.(0 references)
*INPUT체인에서 EXTRANET에 링크로 갔다가 다시 INPUT으로 돌아와서 다 적용해본후 아무런 매칭된 경우가 없을 경우 INPUT의 기본정책에 적용된다.
iptables -I INPUT 2 -j EXTRANET ==>EXTRANET을 링크시킨다.
iptables -D INPUT 2

*1)사용자 정의를 삭제하기 위해서는 링크를 먼저 삭제해야한다.
*2)사용자 정의를 삭제하기 위해서는 체인내의 모든 RULE을 삭제
iptables -D INPUT 3
iptables -X EXTRANET
iptables -F EXTRANET  ==>EXTRANET 사용자정의체인내의 룰만 삭제한다..

퀴즈) serv컴퓨터에서는 work컴퓨터에서의 telnet접속만 차단할 수 있도록 rule셋팅하세요.
iptables -I INPUT -t filter -s 192.168.247.20 -p tcp --dport 23 -j DROP
iptables -P FORWARD DROP
iptables -P INPUT DROP

퀴즈) serv컴에서는 work 컴에게 ssh접속만 허용하고 xp컴에게는 telnet 접속만 허용하도록 설정하시고 그 이외의 모든 접속을 차단하도록 설정해보세요.
iptables -P INPUT DROP
iptables -A INPUT -t filter -s 192.168.247.20 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -t filter -s 192.168.247.1 -p tcp --dport 23 -j ACCEPT
iptables -A INPUT -t filter -p tcp --sport 1:1023 -j ACCEPT  ==>1세대방화벽의 단점(ssh,telnet등의 서비스들의 ack/syn패킷을 받기 위해서 사용)

 

상태추적기능을 이용해보자.

*ping은 echo-request와 echo-reply를 사용한다.
              <-m state --state>

NEW상태는  접속요청하면 아무나 다 접속된다.(SYN패킷을 가져오는 컴은 다 접속된다.)
ESTABLISH상태는 접속요청에대한 응답패킷을 establish상태라고 한다.요청으로 나갔다가 다시들어오는 패킷들을 허용한다.
RELATED ftp서버를 위해서
INVALID 연결상태를 알수 없거나 잘못된 페더를 가진 경우

iptables -I INPUT 1 -t filter -m state --state ESTABLISHED,RELATED -j ACCEPT 이제는 외부로의 ftp나 ping등의 접속이 된다.나갔다가(sync) 다시 되돌아오는 패킷(sync ack)들을 허용하기위해서(상태추적테이블을 이용한다.)

cat /proc/net/ip_conntrack ==> 상태추적 테이블 저장

방화벽은 2-3계층사이에서 동작한다.

iptables -I INPUT 1 -t filter -m state --state NEW,RELATED,ESTABLISHED ==> 모든 서비스가 다 접속이 되어 버린다. ( 절대로 이런설정은 하면 안된다.)

UDP:123
SysLog-UDP:514
TFTP UDP:69
UDP포트는 서비스를 제공받을시 똑같은 포트를 이용한다. 123/UDP <---------------->123/UDP
                                                                          SERVER                             CLIENT

퀴즈) work 컴퓨터에서만 핑을 허용하고 그외의 모든 핑은 차단한다.
iptables -A INPUT -t filter -s 192.168.149.20 -p icmp --icmp-type echo-request -j ACCEPT

멀티포트
iptables -I INPUT 1 -p tcp -m multiport --dport 80,22,25 -j ACCEPT

노트북을 이용해서 이동하면서 원격접속시는 ip어드레스가 바뀌므로 방화벽에 의해 접속이 안되는 경우를 위해서 맥어드레스를 이용해서 방화벽허용을 한다.
00:0C:29:D4:46:58
iptables -I INPUT 3 -t filter -m mac --mac-source 00:0C:29:D4:46:58 -p tcp --dport 22 -j ACCEPT

 

-j LOG  --> /var/log/messages

vi /etc/syslog.conf
3행수정 kern.*                      /var/log/firewall
-j LOG는 순서를 맨위로 하는 것이 좋다. 로그기록을 하고 바로 밑으로 순서대로 진행한다.
iptables -I INPUT -t filter -p tcp --dport 23 -j LOG --log-prefix "Warning telnet access"
사용자체인을 걸어서 로그기록들의 링크를 걸어놓는 것이 좋은 방법이다.

우리가 열어놓지 않는 포트에의 접속시도의 로그를 남기는 것이 더 효율적이다.

퀴즈)serv컴퓨터에서 접속을 허용한 ssh,web 서비스 이외의 접속에 대해서 로그를 생성할 수 있도록 방화벽 셋팅을 하세요(단 로그를 남길때 "not permit access" 코맨트를 첨부하세요) (not,multiport이용)
==>iptables -I INPUT 1 -t filter -p tcp -m multiport --dport ! 21,22,23,80 -j LOG --log-prefix "not permit access"

iptables의 LOG는 확장 타겟이며 커널레벨의 로그를 제공한다. syslogd에 의해 처리된다.

옵션은 --log-lever,과 --log-prefix가 있다. 일반적으로 --log-lever은 실제로 꼭 필요한 경우를 제외하고, 룰에 잘 명시하지 않으며 기본값인 warning을 쓴다.

loglevel은 총 7가지 옵션이 프로퍼티가 있는데, 유효한 이름은 (상황에 따라 다르다). 'debug' 'info', 'notice', 'warning', 'err', 'crit', 'alert', 'emerg' 이고 이것 은 각각 숫자 7 에서 0 에 대응한다.

이런 레벨에 대한 설명은 syslog.conf 의 man 페이지를 보라.

그 다음 --log-prefix옵션이다.

--log-prefix옵셔은
14자 까지의 별도의 문자로 로그메세지에 선행될 수있다.

ex) iptables -A INPUT -i eth0 -p tcp -J LOG --log-prefix="IPTABLES TCP:"

위와 같이 설정을 하면 INPUT 체인의 인터페이스 eth0에 대해여 tcp프로토콜일때 로그를 남기되 선행되는 메세지는 'IPTABLES TCP:로그내용' 이된다.

주의할것은 로그는 패킷의 운명을 결정하지 않으며 적용되든 되지않든 다음 룰을 검사하게 한다.
그리고 LOG는 LOG를 남기고자 하는 정책 위에 세워져야 한다.

예는 다음과 같다.

# iptables -A INPUT -p tcp --syn -j LOG --log-prefix 'SYN refuse'
# iptables -A INPUT -p tcp --syn -j REJECT

위와 같이 설정한다면 만약 tcp의 접속형 패킷의 로그를 남기고 패킷을 거절한다.

만약 해당룰에 대한 로그를 설정하고 운영중 로그파일(보통 /var/log/messages) 에서 iptables해당로그가 너무 많다거나 또는 너무 없어서(?) 조절하고 싶으면 limit모듈을 사용하면 효과적이다.

※ limit모듈은 기본값으로 한시간에 3번의 로그를 남긴다.
limit모듈은 '-m limit'로 사용할수 있다.

이것은 적용검사의 속도를 제한하는데 로그메세지와 함께 쓰일경우 로그메세지를 남기는 속도를 제어하게된다.

예를 보자
# iptables -A INPUT -p tcp -m limit -j LOG

위와 같이 한다면 한시간에 3번 로그를 남길것이다. limit는 위에도 말했듯이 기본적으로 한시간에 3번의 로그를 남긴다. 이를 조정할려면 --limit옵션을 사용하여 조절할수있다.

--limit
숫자가 따라온다 : 초당 평균 최대 적용 검사 수를 지정한다.  숫자뒤 에 시간단위를 지어할 수 도 있다. ('/second', '/minute', '/hour', '/day'형태이다. 예로, '5/second' 또는 '5/s'가 가능하다)

# iptables -A IPUT -p tcp -m limit --limit '5/minute' -j LOG

위와 같이 설정한다면 1분에 평균 5번의 로그를 쓸것이다.

로그는 syslogd에서 kernel message를 다른곳으로 남기지 않게 한 이상은 /var/log/messages에 남게 된다.

세밀한 로그정책을 세울려면 더 세세하게 설정하는 확장옵션들이 있으나 이정도면 충분히 로그정책을 수립할수있을것이다.


출처 : http://blog.mping.co.kr/


Trackback 0 Comment 0