RSS구독하기:SUBSCRIBE TO RSS FEED
즐겨찾기추가:ADD FAVORITE
글쓰기:POST
관리자:ADMINISTRATOR
'Linux/NetWork'에 해당되는 글 4
2007/10/01  OSI 7 Layer 계층  
2006/09/08  nmap + 포트스캔방어  
일단 우선적으로 ...

ㅅㅂ -_- 우분투 사용자가 이렇게 없었던 것인가 ??

왜 아무도 !! 포스트가 없냔 말이다 ..

다들 각자 사설 firewall 을쓰나보다 ㄷㄷㄷ;;;

난 프로그래머고 한때 서버 관리자였던 생각에 ..

힘든것도 아닌 oops 설치기를 적어본다 ..

우선 ~ ftp://mirror.oops.org 이곳에서 oops-firewall 을 다운 받는다.
난 oops-firewall-6.2.4 버젼이다.. 이걸로 설명하겠다.

받고 . 압축을 풀고 ..

./configure --perfix=/usr --bindir=/usr/sbin --confdir=/etc/firewall --shareddir=/usr/share/ --initdir=/etc/init.d/

난 이렇게 잡아줬다 . 이게 우분투의 설정에 제일 잘맞는거 같다.

근대 .. 보면 난 3개가 없어서 멈췃다!... 그게 모냐묜 ..
apt-get install gcc+;
apt-get install ipcalc ;
apt-get install gettext ;
apt-get install bridge-utils;
(이것들 찾아보니깐 김정균님이 애내들의 힘을 빌려서 ;;; 쿨럭;; 여튼 설치해야된다.)
해서 .. 돌리면 ...

컹 먼가 configure 에서 오류난다고 씹덕된다...
324 라인.. 멍미 ?
머 어쩌구 저쩌구 tmp 에 CVS 걸린것들은 다 삭제인데 .. 왜있는건지 ?? 난 모른다 . 이딴거 생각할 시간도없다.
난 지금 이게 급한게 아니라고 !!
그래서 주석처리했다 -_-v

이렇게 땡기면 MAKEFILE 이 po 에 있다고 한다 .. 가서 쳐 보면...
사실별거 없다 . -_- 그냥 po 인거 찾아서 1번째 . 인자 찾아서 .mo 를  install 명령어로 넘겨줘서 make 되는거;;;쿨럭 ;; 잘은 모르는데 보니깐 그러네 ;; (졸랭 5년전 서버관리 쟞뉴비일땐 이런거 안보이던데 .. 역시 짬밥은 속일수가 없다;;)

잡설 지버 치고 난 빨리 이거 올리고 다시 플그램 짜야되는데 이따위가 시간 소비하면안되지 ...

여튼 make ; make install 충분히 날려주시고 ~

알아서 아웃풋으로 쳐 나왔다고 알려주고 그경로들에 파일들 잘있나 함 확인해주고 .

바로 !!


/etc/init.d/oops-firewall start  ....
.....
Starting OOPS Firewall:                                    failuer

ㅅㅂ -_- 이딴게 속석이냐...
혹시나 해서 vi /etc/init.d/oops-firewall 보니깐
sh 이었네 -_- bash 로 변경해준다 ...

다시 이얍 ~
/etc/init.d/oops-firewall start  ....
.......
Starting OOPS Firewall:                                    failuer

ㅅㅂ -_- 또 멍미...
이번엔 echo 로 찍어 봤다 -_- 돌아가면서 .
결국 /usr/sbin/oops-firewall 이걸로 돌리는거네 -_-;;
근대 전부 변수선언이 안된다고 한다 .. 역시 sh 로 되어있을거 같은...

vi /usr/sbin/oops-firewall 봤더니.. 역시나 bash 로 바꿔주고 나니 ~

Starting OOPS Firewall:                                    success

자 그럼.. 마지막으로 잘 올라왔나 함 보고 ..

iptables -L

우옷 잘 올라온다 우왕ㅋ굳ㅋ

총 15분 걸렸네 우왕ㅋ굳ㅋ 이글 쓰는데 30분이 걸린다 .. 멍미 ?...
여튼 수고하시고 .. 담에뵈용 ~




ps . 이건 환경 파일이다 . 심심하면 보삼.

/etc/firewall/interface.conf     - firewall 설정 파일(ethernet 설정)
/etc/firewall/application.conf   - firewall 설정 파일(특정 기능 관련)
/etc/firewall/bridge.conf        - firewall 설정 파일(Bridge 기능 관련)
/etc/firewall/filter.conf        - firewall 설정 파일(패킷 필터링 관련)
/etc/firewall/masq.conf          - firewall 설정 파일(공유 기능 관련)
/etc/firewall/forward.conf       - firewall 설정 파일(포트 포워딩 관련)
/etc/firewall/tos.conf           - firewall 설정 파일(고급 설정 관련)
/etc/firewall/user.conf          - firewall 설정 파일(사용자 정의 설정 관련)
/etc/firewall/modules.list       - oops-firewall 구동시 같이 올릴 netfilter module
/etc/init.d/oops-firewall             - 부팅시 실행할 init file
/usr/sbin/oops-firewall               - firewall 구동 sctip
/usr/include/oops-firewall/*.h        - firewall 의 함수 정의
/usr/include/oops-firewall/config.sed - config file parse script
/usr/share/locale/ko/LC_MESSAGES/oops-firewall.mo - i18N 언어 파일

 


2008/10/16 02:00 2008/10/16 02:00
이 글에는 트랙백을 보낼 수 없습니다
Linux/NetWork  2007/10/01 11:18

OSI(Open Systems Interconnection) 계층 구조는 7계층으로 되어있다.


1. Physical (=물리 계층)

 -상위 계층에서 내려온 비트들을 전송 매체를 통하여 어떤 전기적 신호로 전송할 것인가    을 담당.

2. Data Link (=데이터 링크 계층)

-신호수준의 데이터 비트들이 물리계층을 통과하면 데이터블록을 형성하는데, 이 데이터 블   록에 대한 전송을 담당

-인접한 개방형 시스템 간에 발생하는 다음과 같은 문제를 담당.

  ① 데이터 블록의 시작과 끝을 인식하는 동기화 문제

  ② 발생된 오류를 검출하고 복원하는 오류문제

  ③ 혼선 제어문제

3. Network (=네트워크 계층)

- 송신측과 수신측 사이에 보이지 않는 논리적인 링크를 구성

- 데이터를 패킷(packet)단위로 분할하여 전송한 후 조립함

- 패킷 전송의 최적의 경로를 찾아주는 라우팅 기능 제공

4. Transport (=전송 계층)

- 사용자와 사용자, 컴퓨터와 컴퓨터 간에 연결을 확립하고 유지

- 송수신 시스템간의 논리적인 안정과 균일한 서비스 제공

- 세션 계층에서 넘어온 데이터를 세그먼트(segment) 단위로 분할하고 번호를 붙임

- 오류 검출 코드를 추가하고 통신 흐름 제어를 제공

5. Session (=세션 계층)

- 세션을 확립하여 순차적인 대화의 흐름이 원활하게 이루어지도록 동기화 기능 제공

- 데이터 전송 방향 결정

*session : 사용자가 접속 중인 응용 프로그램을 한 쌍으로 연결하는 작업

6. Presentation (=표현 계층)

- 데이터를 표현하는 방식을 다루는 계층

- 데이터의 안정성을 높이기 위해 데이터 압축이나, 데이터 암호화 기능 제공

- 상이한 데이터 표현을 서로 가능케 하는 표준인터페이스 제공

7. Application (=응용 계층)

- 사용자의 응용 PㆍG(Program)이 네트워크 환경에 접근하는 창구역할을 하는 최상위 계    층


OSI 7계층모델 [7layer-model for OSI]-장점

 1. 네트워크 통신이 훨씬 단순하고 작은 부분들로 나뉨

 2. 네트워크 구성요소를 표준화 함 으로써 호환성 증대

 3. 서로 다른 유형의 네트워크 하드웨어나 소프트웨어 간의 통신이 가능

 4. 한 계층을 변경해도 다른 계층에 영향을 미치지 않기 때문에 개발 속도 증대

 5. 네트워크 통신을 여러 작은 요소로 분리함으로써 통신과정을 쉽게 학습가능


OSI 7 Layer의 기능 - 계층 기능

1. APPLICATION

- 전자우편 및 네트워크 유틸리티가 존재하는 계층

2. PRESENTATION

- 애플리케이션이 네트워크로 들어가는 방법

- 네트워크상에서 데이타를 전송하기위해 생산되고 소비되는 데이터의 형태를 번역하는

  방법 정의.

3. SESSION

- 애플리케이션에 대해 Transport Layer에 개념적인 Interface를 제공하는 계층

- 장비들이 네트워크 주소 대신 NAME으로 인식되도록 해준다.

4. TRANSPORT

- 네트워크상에서 물리적인 Location을 Address하는 방법과 노드간의 연결을 확립하고

  끊는 방법 정의

5. NETWORK

- 패켓 들이 어떻게 네트워크상에서 ROUTER되는지 정의

- 네트워크상의 노드에 전송되는 패켓 흐름을 통제하고

- 상태 메시지 가 네트워크상에서 어떻게 노드로 전송되는가를 정의

6. PHYSICAL

- 기계적인 측면(케이블, LAN카드)과 전기적인 측면(전압, 신호를 변조하는 기술)을 포함한

  컴퓨터와 네트워크 사이의 물리적인 연결정의

- 네트워크 토플로지 정의

7. DATA LINK

- 컴퓨터가 메세지를 주고 받기위한 프로토콜 정의


위의 7계층이 이해가 안 되는 경우는 그냥 어플리케이션층, 프로토콜층, 물리층으로 이해하면 편하다. 실제로 랜카드에는 1,2 층이 탑재되어 있고 프로토콜에는 3,4 층이, 웹브라우져 등 에는 5,6,7 층이 탑재되어 있다.


실제 ISO 7 계층을 만든 이유 중 하나는 전 세계 사람이 공용하여 쓸 수 있는 공짜의, 공개된 프로토콜을 만들기 위한 것도 있었다. 그러나 7 계층이 발표된 시점에 이미 많은 프로토콜이 사용되고 있었고 특히 WAN에서는TCP/IP가 표준으로 자리 잡아 독보적인 위치를 확보하고 있었다. 그 이후, 1계층과 2계층에서는 Ethernet이, 3계층과 4계층에서는 TCP/IP, NetBUEI, IPX등이 업계표준으로 자리 잡게 되었다.


OSI 7계층에 따른 프로토콜(OSI 프로토콜)이 교과서 같은 곳에 소개되다가 차세대 시리얼 버스 규격인 IEEE1394에 사용되고 있다. 5,6,7계층은 따로 따로 구현되기보다 통합되어 여러 가지 '서비스'라는 이름으로 제공된다. Telnet, FTP, e-mail(SMTP, POP), News(NNTP), NetBIOS 등이 이 서비스 층에 해당된다.


PS :  본인은 -_- 이거 잘모른다 걍 개념만 잡으면 되지 ;; 구체적으로 알필요는 없다
실무에서 자연스럽게 알게 될테니..


- 출처: 프로젝트 “cafe.daum.net/vlan”

2007/10/01 11:18 2007/10/01 11:18
이 글에는 트랙백을 보낼 수 없습니다
출처 블로그 > jks3500님의 블로그
원본 http://blog.naver.com/jks3500/40002554697
nmap은 열린 포트를 확인하여 보안 점검을 위한 대표적인 툴이면서
원치 않는 서버를 대상으로 포트 스캐닝과 시스템의 OS 종류와 버전을 알아내는데 사용되기도 한다.
최근에 나온 nmap 3.45버전은 오픈된 서비스의 버전 정보까지도 확인시켜준다.

--------------------------------------------------------------
# nmap -A -T4 -F localhost

Starting nmap 3.45 (
http://www.insecure.org/nmap/ ) at 2003-09-16 22:45 KST
Interesting ports on truefeel (127.0.0.1):
(The 1203 ports scanned but not shown below are in state: closed)
PORT   STATE SERVICE  VERSION
21/tcp  open ftp    vsFTPd 1.2.0
25/tcp  open smtp    Sendmail smtpd Securing..214-2.0.0 This is sendmail version 8.12.
80/tcp  open http    Apache httpd 2.0.44 ((Unix) DAV/2 PHP/4.3.2)
... 중략 ...
Running: Linux 2.4.X|2.5.X
OS details: Linux Kernel 2.4.0 - 2.5.20, Linux kernel 2.4.20
Uptime 0.505 days (since Tue Sep 16 10:38:25 2003)

Nmap run completed -- 1 IP address (1 host up) scanned in 16.859 seconds
--------------------------------------------------------------

위에서 보는 것처럼 nmap의 뛰어난 기능으로 어느 OS를 사용하는지 쉽게 알 수 있다.

이러한 nmap의 OS를 알아내는 기능은 7단계(T1~T7)를 거치게 된다.
T1 단계에서 열린 포트로 SYN 패킷을 보내고, T2에서 열린 포트로 null 패킷 전송,
T3에서 열린 포트로 SYN, FIN, URG, PSH 패킷을 전송
T5 부터는 닫혀진 포트로 비슷한 과정을 거치게 된다.

자~ 이제 nmap OS fingerprinting을 막는 방법을 알아보자.

1. iplog 툴

iplog는 포트 스캐닝으 로깅하는 툴이다. TCP 포트, UDP 포트 스캐닝, TCP null 스캔, FIN 스캔,
smurf 공격, Xmas 스캔, ping 플러딩, IP fragment 공격 등을 감지할 수 있다.
procmisc 모드를 지원하여 같은 서브넷으로 들어오는 스캐닝을 감지할 수 있다.
또한 OS 정보를 숨기기한 목적으로도 사용할 수 있다.

1) 설치

http://ojnk.sourceforge.net/ 에서 iplog-2.2.3.tar.gz 을 받아온다.

--------------------------------------------------------------
# tar xvfz iplog-2.2.3.tar.gz
# cd iplog-2.2.3
# ./configure
# make
# make install
# cp example-iplog.conf /etc/iplog.conf
--------------------------------------------------------------

iplog.conf에서 다음 2가지를 수정한다.

--------------------------------------------------------------
user nobody          # default는 iplog 사용자로 실행함
pid-file /var/run/iplog.pid  # default는 /var/run/iplog/iplog.pid 임
--------------------------------------------------------------

소스 설치가 귀찮은 분 중
레드햇 사용자는
http://www.rpmfind.net/ 에서 iplog-2.2.3-fr2.i386.rpm 받아 설치한다.

FreeBSD 사용자는 포트 시스템을 이용해서 설치한다.
실행 파일은 /usr/local/sbin에, 설정파일은 /usr/local/etc에 설치된다.

--------------------------------------------------------------
# cd /usr/ports/net/iplog/
# make install
# make clean
--------------------------------------------------------------

'포트시스템이 뭐에요?' 하는 분은 최준호님이 쓴 글을 참고하기 바란다.
http://www.bsdnet.co.kr/articles/article.qsp?no=14

2) 실행

--------------------------------------------------------------
# iplog -o -z -i lo (테스트를 위해 lo interface를 지정함)
--------------------------------------------------------------

-o 등의 옵션의 의미는 nmap 테스트 후에 알아본다.

--------------------------------------------------------------
# nmap -sS -O localhost

Starting nmap 3.45 (
http://www.insecure.org/nmap/ ) at 2003-10-29 23:37 KST
Insufficient responses for TCP sequencing (2), OS detection may be less accurate
Insufficient responses for TCP sequencing (3), OS detection may be less accurate
Interesting ports on truefeel (127.0.0.1):
(The 1651 ports scanned but not shown below are in state: closed)
PORT   STATE SERVICE
25/tcp  open smtp
80/tcp  open http
... 중략 ...
No exact OS matches for host (If you know what OS is running on it, see
http://www.insecure.org/cgi-bin/nmap-submit.cgi).
TCP/IP fingerprint:
SInfo(V=3.45%P=i686-pc-linux-gnu%D=10/29%Time=3F9FD0B9%O=25%C=1)
T1(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW)
T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BAPRSF%Ops=)
T2(Resp=Y%DF=N%W=0%ACK=O%Flags=BARS%Ops=)
T2(Resp=Y%DF=Y%W=100%ACK=O%Flags=BPRF%Ops=)
T3(Resp=Y%DF=Y%W=7FFF%ACK=S++%Flags=AS%Ops=MNNTNW)
T4(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
T5(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
T6(Resp=Y%DF=Y%W=0%ACK=O%Flags=R%Ops=)
T7(Resp=Y%DF=Y%W=0%ACK=S++%Flags=AR%Ops=)
PU(Resp=N)


Uptime 0.303 days (since Wed Oct 29 16:21:04 2003)

Nmap run completed -- 1 IP address (1 host up) scanned in 21.301 seconds
--------------------------------------------------------------

nmap은 T1~T7까지 OS 탐지 테스트 과정을 거쳤지만 OS 종류는 알아내지 못했음을 확인했다.
그럼 도대체 스캐닝 로그는 어디에 있는건가? /etc/iplog.conf 설정에 따라 /var/log/iplog에 저장된다.

--------------------------------------------------------------
... 생략 ...
Oct 29 23:37:09 ICMP: echo from truefeel (127.0.0.1) (8 bytes)
Oct 29 23:37:09 TCP: port 5901 connection attempt from truefeel (127.0.0.1):49574
Oct 29 23:37:09 TCP: port 516 connection attempt from truefeel (127.0.0.1):49574
Oct 29 23:37:09 TCP: port 657 connection attempt from truefeel (127.0.0.1):49574
Oct 29 23:37:09 TCP: port 32 connection attempt from truefeel (127.0.0.1):49574
Oct 29 23:37:09 TCP: port 2044 connection attempt from truefeel (127.0.0.1):49574
Oct 29 23:37:09 TCP: port 737 connection attempt from truefeel (127.0.0.1):49574
Oct 29 23:37:09 TCP: pop2 connection attempt from truefeel (127.0.0.1):49574
Oct 29 23:37:09 TCP: port 872 connection attempt from truefeel (127.0.0.1):49574
Oct 29 23:37:09 TCP: port 670 connection attempt from truefeel (127.0.0.1):49574
Oct 29 23:37:09 TCP: SYN scan detected [ports 5901,516,657,32,2044,737,109,872,670,374,...] from
truefeel (127.0.0.1) [port 49574]
Oct 29 23:37:12 TCP: Bogus TCP flags set by truefeel (127.0.0.1):49581 (dest port 25)
Oct 29 23:37:14 TCP: ipp connection attempt from truefeel (127.0.0.1):40509
... 생략 ...
--------------------------------------------------------------

3) 옵션과 설정은?

-o : 백그라운드로 실행하지 않는다. (기본 백그라운드)
-z : 이게 바로 핵심이다. nmap로 OS 정보 알아내는 것을 막는다.
-L : log를 화면으로 출력한다.
-i : interface를 지정한다. (기본 eth0)
-u : iplog 실행 사용자 또는 UID를 지정한다. (기본 nobody)
-g : iplog 실행 그룹명 또는 GID를 지정한다. (기본 nobody)
-l : 로그파일을 지정한다. (기본 /var/log/iplog)
-a : promisc 모드로 전환하여 지정한 네트워크 내의 스캐닝을 로깅한다. (예. -a 192.168.123.0/24)
-k : iplog 프로세스를 kill한다. 백그라운드, 포그라운드 실행중인 것과 상관없이 kill.
-R : iplog를 재실행한다.

이 많은 옵션을 어떻게 사용하면 좋을까?

화면으로 모니터링한다면

# iplog -o -z -L

파일로 로깅을 한다면 (부팅시 실행되도록 하려면 /etc/rc.d/rc.local 등에 추가)

# iplog -z

/etc/iplog.conf 설정 파일에서는 옵션으로 사용할 것을 미리 지정해 둘 수 있다.
실행 사용자, interface, 감지에서 제외할 포트 등

2. iptables 이용하는 방법

iptables를 이용하는 방법이 있으나 커널 패치+iptables 패치를 해야하는 과정이 필요하며
커널 2.4.19 이후의 버전에 대해서는 더이상의 발표도 있지 않아 간단하게 설명한다.

http://ippersonality.sourceforge.net/ 에서 ippersonality-20020819-2.4.19.tar.gz 를
받아 커널과 iptables 각각 패치를 한 후 컴파일을 한다.

ippersonality-20020819-2.4.19/samples 디렉토리에는 OS를 속이기 위한 총 10개의 파일이 있다.
AmigaOS, Dreamcast, FreeBSD, Linux 2.0x, Linux 2.2, MacOS 9, Solaris 8, Tru64 UNIX,
Win Me 또는 Win 2000, Win 9x 이렇게 10개.

Windows를 사용하는 것 처럼 속이려면 어떻게 해야 하는가?

패치된 iptables를 이용해서

--------------------------------------------------------------
# insmod ipt_PERS (모듈을 로딩, 커널 컴파일시에 CONFIG_IP_NF_PERS=m로 했을 때)
# /usr/local/sbin/iptables -t mangle -A PREROUTING -s ! 서버IP -d 서버IP -j PERS --tweak dst --local --conf win2k.conf
# /usr/local/sbin/iptables -t mangle -A OUTPUT   -s 서버IP -d ! 서버IP -j PERS --tweak src --local --conf win2k.conf
--------------------------------------------------------------

3. 참고 자료

* A practical approach for defeating Nmap OS-Fingerprinting
 
http://coffeenix.net/doc/security/nmap_os_fingerprinting.html
* IP Personality 프로젝트
 
http://ippersonality.sourceforge.net/
* iplog
 
http://ojnk.sourceforge.net/
* nmap 3.45의 새기능, 버전 스캐닝 (글 좋은진호)
 
http://coffeenix.net/board_view.php?bd_code=71
2006/09/08 22:29 2006/09/08 22:29
이 글에는 트랙백을 보낼 수 없습니다
--tcp-flags
'!' 옵션을 사용한다면 이것 뒤에 두개의 단어를 사용한다. 첫번째 것은 검사하고자 하는 지시자 리스트의 마스크이다. 두번째 단어는 지시자에게 어떤것이 설정 될 것인지를 말해준다. 예를들어,

# iptables -A INPUT -s 192.168.1.1 --protocol tcp --tcp-flags SYN,RST,ACK,SYN -j DENY
192.168.1.1로 부터 tcp방식에 의한 접속 차단

--syn
이것은 '--tcp-flags SYN,RST,ACK,SYN'의 약어이다.

# iptables -A INPUT -p TCP -s 192.168.1.1 --syn -j DENY

--source-port or --sport
Source 포트

--destination-port or --dport
도착지 포트

*****UDP 확장
이 확장은 '--protocol udp'가 지정되고 적용이 저정되지 않으면 자동으로 적재된다. 이것은 '--source-port', '--sport', '--destination-port', '-dport'를 지원하고 내용은 TCP 설명에서 자세히 나왔다.

*****새로운 타겟

타겟의 다른 형태는 확장이다. 타겟 확장은 커널 모듈로 구성된다. 그리고 iptables 에 대한 선택적 확장은 새로운 명령행의 옵션을 제공한다. 기본적으로 넷필터 배포에 포함된 몇몇의 확장은 다음과 같다.

LOG
일치하는 패킷의 커널 로그를 제공한다. 이것은 부가의 옵션을 제공한다.

--log-level 레벨 숫자나 이름 지정
'debug' 'info', 'notice', 'warning', 'err', 'crit', 'alert', 'emerg' 이름은 각각 숫자 7 에서 0 에 대응된다.
--log-prefix 14자 까지의 문장을 지정

REJECT
이 모듈은 'DROP'과 같은 효과를 나타낸다. 다만, 'port unreachable' 이라는 에러 메세지를 ICMP 로 보낸다.

RETURN
RETURN은 한 체인의 끝으로 보내지는 것과 같은 효과가 있다. : 미리 만들어진 체 인의 경우 그 체인의 정책은 실행이다. 사용자 정의 체인의 경우 이 체인으로 점프 하는 규칙의 바로 다음인 이전 체인으로 이동한다.

QUEUE
QUEUE은 특별한 타겟으로, 사용자공간의 작업을 위해 패킷을 대기하도록 한다. 패킷 을 위해서 대기하고있는 것이 없다면(즉, 이 패킷을 다룰 프로그램이 아직 씌어져 있지 않다면) 패킷은 DROP 될 것이다.

***3.4 타겟 지정

이제 패킷에서 어떤 검사를 할 수 있는지를 알았다. 이제 우리의 검사에 일치 하는 패킷을 어떻게 할 것인지를 말하는 것을 알아야 한다. 이것을 규칙 타겟 이라고 한다.

두개의 이미 만들어진 단순한 타겟이 있다. : DROP 과 ACCEPT. 이미 이것에 대해서는 이야기를 한 적이 있다. 적용이 되는 패킷과 그것의 타겟이 위의 두 개중 하나라면 더이상의 참고할 규칙은 없다. : 패킷의 운명은 결정 되는 것 이다.

이미 만들어진 두개의 타겟외에 두가지 형태의 타겟이 있다.: 확장과 사용자 지정의 체인들 이다.

****사용자 지정의 체인들

ipchains로 부터 상속되는 iptables의 강력한 기능중의 하나는 능력되는 사용 자가 기존의 세개의 체인(입력, 출력, 포워드)외에 새로운 체인을 생성할 수 있다는 것이다. 모임의 결과 사용자 지정의 체인은 그것을 구분하기 위하여 소문 자로 나타낸다. (아래 전체 체인에 대한 작용 부분에서 어떻게 사용자 지정의 새로운 체인을 만드는지 기술할 것이다.)

타겟이 사용자 지정의 체인인 규칙에 패킷이 맞으면 패킷은 사용자 지정의 체인을 따라 움직이게 된다. 그 체인이 패킷의 운명을 결정하지 못하면 그리고 그 체인에 따른 이송이 끝나면, 패킷은 현제 체인의 다음 규칙으로 돌아온다.

그림을 보자. 두개의 체인이 있고 그것이 입력과 테스트라는 사용자 지정의 체인이 라고 가정하자.

         `INPUT'                         `test'
        ----------------------------    ----------------------------
        | Rule1: -p ICMP -j DROP   |    | Rule1: -s 192.168.1.1    |
        |--------------------------|    |--------------------------|
        | Rule2: -p TCP -j test    |    | Rule2: -d 192.168.1.1    |
        |--------------------------|    ----------------------------
        | Rule3: -p UDP -j DROP    |
        ----------------------------

192.168.1.1 로부터 와서 1.2.3.4 로 향하는 TCP 패킷이 있다고 가정한다. 이것은 입력 체인으로 들어온다. Rule1 을 검사한다. 맞지 않음. Rule2 맞음. 그것의 타겟 은 테스트, 고로 다음 검사할 규칙은 테스트의 시작이다. 테스트의 Rule1 이 맞다. 그러나 이것이 타겟을 지정하지 않는다. 그러므로 다음 규칙이 검사된다. Rule 2. 맞지 않다. 그 체인의 끝에 도달했다. 다시 입력 체인으로 돌아가서 Rule3 을 검사 한다. 그것도 맞지 않다.

여기서 패킷의 이동경로를 그림으로 나타냈다.

                               v    __________________________
        `INPUT'                |   /    `test'                v
       ------------------------|--/    -----------------------|----
       | Rule1                 | /|    | Rule1                |   |
       |-----------------------|/-|    |----------------------|---|
       | Rule2                 /  |    | Rule2                |   |
       |--------------------------|    -----------------------v----
       | Rule3                 /--+___________________________/
       ------------------------|---
                               v

사용자 지정의 체인에서 대를 사용자 지정의 체인으로 갈수 있다. (그러나 루프 를 돌수는 없다. 루프를 발견하게 되면 패킷은 DROP 된다.)

잘못 설정한 예 - 순서를 바꾸어야 정상적으로 작동할 것이다.
iptables -A input -p tcp --dport 0:1023 -j DROP
iptables -A input -p tcp --dport 80 -j ACCEPT

***3.5 전체 체인에 대한 작용.

iptables의 유용한 기능주 하나는 여러 관계가 있는 규칙을 하나의 체인속으로 그룹화 하는 것이다. 체인의 이름은 어떤 것을 사용할 수도 있으나 미리 만들어 진 체인과의 혼동을 막기 위하여 소문자를 사용하기를 권한다. 체인의 이름은 16 자 까지 가능하다.

****새로운 체인 생성

# iptables -N test

****체인 제거
'-X' 나 '--delete-chain' 사용

# iptables -X test
체인을 지우기 위해서는 체인이 비어있어야 하며 다른 규칙의 타겟이 아니어야 한다.

****체인 비우기
'-F' ('--flush') 사용

# iptables -F forward

체인을 지정하지 않으면 모든 체인의 규칙이 지워진다.

****체인 규칙 나열하기
'-L' 사용
예)
iptables -L INPUT
iptables -t nat -L

**4. NAT(Network Address Translation) 활용

***4-1 NAT 이란
SNAT(Source Nat), DNAT(Destination Nat)

[PREROUTING](DNAT) --> Routing ------------> [POSTROUTING](SNAT) -->
                        |                          ^
                        |                          |
+- local Process ----------+  

****NAT의 활용

*****예1)MASQUERADING
   iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

*****예2) 고정IP 하나로 내부호스트들에 대한 서비스하기

   # soribada & dialpad for Sung-ho
   iptables -A PREROUTING -t nat -p udp --dport 9068 -j DNAT --to 192.168.1.7:9068
   iptables -A PREROUTING -t nat -p udp --dport 9067 -j DNAT --to 192.168.1.7:9067
   iptables -A PREROUTING -t nat -p udp --dport 9066 -j DNAT --to 192.168.1.7:9066
   iptables -A PREROUTING -t nat -p udp --dport 9065 -j DNAT --to 192.168.1.7:9065
   iptables -A PREROUTING -t nat -p tcp --dport 51210 -j DNAT --to 192.168.1.7:51210
   iptables -A PREROUTING -t nat -p udp --dport 51200 -j DNAT --to 192.168.1.7:51200
   iptables -A PREROUTING -t nat -p udp --dport 51201 -j DNAT --to 192.168.1.7:51201
   iptables -A PREROUTING -t nat -p tcp --dport 51210 -j DNAT --to 192.168.1.7:51210
   iptables -A PREROUTING -t nat -p udp --dport 51200 -j DNAT --to 192.168.1.7:51200
   iptables -A PREROUTING -t nat -p udp --dport 51201 -j DNAT --to 192.168.1.7:51201

   # nanumi for Sung-ho
   iptables -A PREROUTING -t nat -p udp --dport 9292 -j DNAT --to 192.168.1.7:9292
   iptables -A PREROUTING -t nat -p tcp --dport 9292 -j DNAT --to 192.168.1.7:9292

   # Winamp broadcast for Sung-ho
   iptables -A PREROUTING -t nat -p udp --dport 8000 -j DNAT --to 192.168.1.7:8000
   iptables -A PREROUTING -t nat -p tcp --dport 8000 -j DNAT --to 192.168.1.7:8000

   # ftp for Bokyu
   iptables -A PREROUTING -t nat -p udp --dport 2100 -j DNAT --to 192.168.1.5:2100
   iptables -A PREROUTING -t nat -p tcp --dport 2100 -j DNAT --to 192.168.1.5:2100

   # telnet for Bokyu
   iptables -A PREROUTING -t nat -p udp --dport 2300 -j DNAT --to 192.168.1.5:2300
   iptables -A PREROUTING -t nat -p tcp --dport 2300 -j DNAT --to 192.168.1.5:2300

   # www for Bokyu
   iptables -A PREROUTING -t nat -p udp --dport 8080 -j DNAT --to 192.168.1.5:8080
   iptables -A PREROUTING -t nat -p tcp --dport 8080 -j DNAT --to 192.168.1.5:8080

*****예3) 투명프록시

111.111.111.112   <->   192.168.1.2
111.111.111.113   <->   192.168.1.3
111.111.111.114   <->   192.168.1.4

내부 호스트의 Gateway 192.168.1.1

/etc/network/interfaces
------------------------------------------------------------------------
# /etc/network/interfaces -- configuration file for ifup(8), ifdown(8)

# The loopback interface
# automatically added whe upgrading
auto lo
iface lo inet loopback

# The first network card - this entry was created during the Debian installatio
# (network, broadcast and gateway are optional)
# automatically added whe upgrading

auto eth0
iface eth0 inet static
     address 111.111.111.112
     netmask 255.255.255.0
     broadcast 111.111.111.255
     network 111.111.111.0
     gateway 111.111.111.1

auto eth0:0
iface eth0:0 inet static
     address 111.111.111.113
     netmask 255.255.255.0
     broadcast 111.111.111.255
     network 111.111.111.0

auto eth0:1
iface eth0:1 inet static
     address 111.111.111.114
     netmask 255.255.255.0
     broadcast 111.111.111.255
     network 111.111.111.0

auto eth1
iface eth1 inet static
     address 192.168.1.1
     netmask 255.255.255.0
     broadcast 192.168.1.255
     network 192.168.1.0

auto eth1:0
iface eth1:0 inet static
     address 192.168.1.2
     netmask 255.255.255.0
     broadcast 192.168.1.255
     network 192.168.1.0
------------------------------------------------------------------------
*nat
-A PREROUTING -d 111.111.111.112 -j DNAT --to-destination 192.168.1.2
-A PREROUTING -d 111.111.111.113 -j DNAT --to-destination 192.168.1.3
-A PREROUTING -d 111.111.111.114 -j DNAT --to-destination 192.168.1.4    

-A POSTROUTING -s 192.168.1.2 -j SNAT --to-source 111.111.111.102
-A POSTROUTING -s 192.168.1.3 -j SNAT --to-source 111.111.111.103
-A POSTROUTING -s 192.168.1.4 -j SNAT --to-source 111.111.111.104

*****예4) 부하분산

RoundRobin 방식에 의한 부하분산
목적지 주소를 192.168.1.2 이나 192.168.1.3 또는 192.168.1.4로 바꾸기
iptables -t nat -A PREROUTING -i eth1 -j DNAT --to 192.168.1.2-192.168.1.4


**5. 시스템 부트시 초기화하기

위에서 적용하였던 여러가지 Rule들을 저장하거나 복구하는 도구로서 iptables-save 와 iptables-restore 가 있다.
간단한 예를 살펴보면
# iptables-save > myRule

아래는 생성된 myRule 파일이다.
------------------------------------------------------------------------------------
# Generated by iptables-save v1.2.3 on Sat Oct 27 15:06:49 2001
*nat
:PREROUTING ACCEPT [865:65046]
:POSTROUTING ACCEPT [4:752]
:OUTPUT ACCEPT [162:9841]
-A PREROUTING -p udp -m udp --dport 9068 -j DNAT --to-destination 192.168.1.7:9068
-A PREROUTING -p udp -m udp --dport 9067 -j DNAT --to-destination 192.168.1.7:9067
-A PREROUTING -p udp -m udp --dport 9066 -j DNAT --to-destination 192.168.1.7:9066
-A PREROUTING -p udp -m udp --dport 9065 -j DNAT --to-destination 192.168.1.7:9065
-A PREROUTING -p tcp -m tcp --dport 51210 -j DNAT --to-destination 192.168.1.7:51210
-A PREROUTING -p udp -m udp --dport 51200 -j DNAT --to-destination 192.168.1.7:51200
-A PREROUTING -p udp -m udp --dport 51201 -j DNAT --to-destination 192.168.1.7:51201
-A PREROUTING -p tcp -m tcp --dport 51210 -j DNAT --to-destination 192.168.1.7:51210
-A PREROUTING -p udp -m udp --dport 51200 -j DNAT --to-destination 192.168.1.7:51200
-A PREROUTING -p udp -m udp --dport 51201 -j DNAT --to-destination 192.168.1.7:51201
-A PREROUTING -p udp -m udp --dport 9292 -j DNAT --to-destination 192.168.1.7:9292
-A PREROUTING -p tcp -m tcp --dport 9292 -j DNAT --to-destination 192.168.1.7:9292
-A PREROUTING -p udp -m udp --dport 8000 -j DNAT --to-destination 192.168.1.7:8000
-A PREROUTING -p tcp -m tcp --dport 8000 -j DNAT --to-destination 192.168.1.7:8000
-A PREROUTING -p udp -m udp --dport 2100 -j DNAT --to-destination 192.168.1.5:2100
-A PREROUTING -p tcp -m tcp --dport 2100 -j DNAT --to-destination 192.168.1.5:2100
-A PREROUTING -p udp -m udp --dport 2300 -j DNAT --to-destination 192.168.1.5:2300
-A PREROUTING -p tcp -m tcp --dport 2300 -j DNAT --to-destination 192.168.1.5:2300
-A PREROUTING -p udp -m udp --dport 8080 -j DNAT --to-destination 192.168.1.5:8080
-A PREROUTING -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.1.5:8080
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
# Completed on Sat Oct 27 15:06:49 2001
--------------------------------------------------------------------------------------
                                             
# iptables-restore myRule

위의 과정은 현재 설정되어 있는 Rule 을 myRule 파일에 저장하고 다시 저장되었던 Rule 을 복구하는 방법이다.
하지만 이러한 방법보다는 필자의 경우는 다음과 같은 형식의 스크립트를 /etc/init.d/myRule 이라는 스크립트로 만들어서 저장하고 Runlevel 2 에서 이를 적용하여 사용하고 있다.


----------------------------------------------------------------------------
/etc/init.d/myRule
#/bin/sh

case "$1" in
   start)
   echo "iptables myRule start"
   iptables-restore /etc/myRule.conf
stop)
   echo "iptables myRule stop"
   iptables -F
   iptables -t nat -F
   ;;
restart)
   echo "iptables stop"
   iptables -F
   iptables -t nat -F
   echo "iptables start"
   iptables-restore /etc/myRule.conf
esac
exit 0
----------------------------------------------------------------------------

스크립트에서는 myRule.conf 파일을 읽어서 시스템 부트시 설정을 복구하고 있다.
myRule.conf 파일을 만드는 법은 아마도 다 아시리라는 생각을 한다. ^^;
iptables-save 로 해서 만들경우의 단점은 아무래도 주석부분이 아닐까 한다.
즉 iptables-save로서 만든후에 부분부분 주석을 넣어놓는것도 좋은 방법중의 하나일 것이다.

**6. 방화벽 설정의 예

아래의 예는 조대원님(PCHarley)의 설정입니다. 참고로 첨부하였습니다.
----------------------------------------------------------------------
#!/bin/sh

###### TCP 변수 설정 ######

# 외부로 서비스할 데몬의 포트 지정
# 20 : ftp-data port
# 21 : ftp port
# 22 : ssh port
# 25 : smtp port
# 80 : http port
# 113 : auth ident port
TCP_ALLOWPORT="20 21 22 25 80 113"
TCP_DENYPORT=1024

# 특정 호스트에 특정 포트를 개방
# 선별적인 호스트에 대하여 선별적인 서비스 오픈과 DNS Zone Transfer를 위해
# 사용하면 편리 
# <호스트ip주소>:<포트> 형식으로 사용
#TCP_HOSTPERPORT=""

# 출발지 포트로 오픈을 결정
# 클라이언트 프로그램을 사용하기 위하여 1024 이하의 특정 포트를 개방
# 21 : ftp 서버 응답 포트
# 22 : ssh 서버 응답 포트
# 23 : telnet 서버 응답 포트
# 25 : mail 서버 응답 포트
# 43 : whois 응답 포트
# 53 : dns 서버 응답 포트
# 79 : finger 서버 응답 포트
# 80 : httpd 서버 응답 포트
# 110 : pop3 서버 응답 포트
# 113 : AUTH 서버 응답 포트
# 119 : nntp 서버 응답 포트
# 443 : https 서버 응답 포트
TCP_ALLOWSPORT="21 22 23 25 53 80 110 113 119 443"

###### UDP 변수 설정 #######

# UDP의 경우에는 이 프로토콜의 특성상 위험한 서비스가 많다.
# 이 프로토콜을 이용하는 서비스를 허용해야 할 경우에는 주의를 하는것이 좋다

# 외부로 서비스할 데몬의 포트
#UDP_ALLOWPORT=""
UDP_DENYPORT=1024

# 특정 호스트에 특정 포트를 개방
# 선별적인 호스트에 대하여 선별적인 서비스 오픈과 DNS Zone Transfer를 위해
# 사용하면 편리 
# <호스트ip주소>:<포트> 형식으로 사용
#UDP_HOSTPERPORT=""

# 출발지 포트로 오픈을 결정
# 클라이언트 프로그램을 사용하기 위하여 1024 이하의 특정 포트를 개방
# 53 : dns 서버 응답 포트
UDP_ALLOWSPORT="53"

###### 디폴트변수 설정 ######

IPTABLES=/sbin/iptables
IPADD="<ip Address>"

# 루트 권한으로 운영되는 포트들
PRIVPORTS="0:1023"

# 일반 권한으로도 운영될수 있는 포트들
UNPRIVPORTS="1024:65535"


# 리눅스 머신이 GATEWAY나 MASQ로 사용될 경우 spoof 공격이나 잘 알려진
# 위험한 주소로 부터 오는 공격을 막기 위한 변수 설정
LOOPBACK="127.0.0.0/8"
BROADCAST_SRC="0.0.0.0"
BROADCAST_DEST="255.255.255.255"
CLASS_A="10.0.0.0/8"
CLASS_B="172.0.0.0/8"
CLASS_C="192.0.0.0/8"
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED_NET="240.0.0.0/5"

###### kernel tunable parameter ######

# 어떤 인터페이스에서도 ping 에 반응하지 못하도록
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

# 브로드캐스트, 멀티캐스트 주소에 ICMP 메세지 보내는것 막기.
# smuf 공격 방지
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

# ip 소스 라우팅을 방지(디폴트로 0이 되어 있지만 확실하게 하기 위함)
# ip 소스 라우팅이 허용될 경우 모든 방화벽 설정이 필요없게 된다.
for f in /proc/sys/net/ipv4/conf/*/accept_source_route
do
  echo 0 > $f
done

# DOS(서비스 부인 공격)의 방법인 SYN Attack을 방지하기 위하여 TCP syncookies를 enable
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

# icmp_redirect 메세지를 거부
for f in /proc/sys/net/ipv4/conf/*/accept_redirects
do
   echo 0 > $f
done

# gateway나 Masquerading 머신으로 사용한다면 이 옵션은 반드시 포함 하여야 한다.
# echo 1 > /proc/sys/net/ipv4/ip_always_defrag

# 정의되지 않은 에러 메세지를 막음
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses

# ip sppof 방지
for pfile in /proc/sys/net/ipv4/conf/*/rp_filter
do
   echo 1 > $pfile
done

# Log Spoofed Packets, Source Routed Packets, Redirect Packets 등을 탐지하면 로그파일에 기록
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians

##### 초기화 #####
# 호스트가 X 윈도도 깔리지 않은 서버용으로 운영될 경우에는 OUTPUT 기본 정책도
# DROP으로 하는것이 안전하다.
${IPTABLES} -F INPUT
${IPTABLES} -P INPUT DROP
${IPTABLES} -F OUTPUT
${IPTABLES} -P OUTPUT ACCEPT
${IPTABLES} -F FORWARD
${IPTABLES} -P FORWARD DROP

###### INPUT ######
###### TCP ######

# local loopback 허용
${IPTABLES} -A INPUT -i lo -j ACCEPT

# 1024 밑에 루트에 의해 서버가 사용할 포트 오픈
for values in ${TCP_ALLOWPORT}
do
   ${IPTABLES} -A INPUT -i eth0 -p tcp --dport ${values} -j ACCEPT
done

# 특정 호스트로의 포트를 개방
#for values in ${TCP_HOSTPERPORT}
#do
#   echo ${values} | {
#   IFS=':' read hosts ports
#        ${IPTABLES} -A INPUT -s ${hosts} -p tcp --dport ${ports} -j ACCEPT
#        }
#done

# 출발 포트가 초기 접속이 아닌 경우 허가된 포트에 대해서만 허가
for values in ${TCP_ALLOWSPORT}
do
   ${IPTABLES} -A INPUT -i eth0 -p tcp ! --syn --sport ${values} ! --dport ${PRIVPORTS} -j ACCEPT
done

# ftp 노말 모드의 경우 클라이언트에서 서버로 접속을 요청할 경우 서버의
# 20포트에서 클라이언트로 초기 접속을 요청하므로 20번 포트에서 초기 접속을
# 허가해줘야함 이는 일종에 보안 구멍을 유발 하므로 passive mode 나 proxy를
# 사용해서 이 hole을 막을는 것이 좋다
# 만약 일반 모드로의 접속을 허용해야 한다면 잘 알려진 위험한 포트를 제외한
# 나머지 포트로만 허용을 해야한다.

# open window 포트로의 서비스 요구 거부
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2000 -j LOG --log-prefix "To 20 From 2000 DROP"
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2000 -j DROP
# NFS 포트로의 서비스 요구 거부
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2049 -j LOG --log-prefix "To 20 From 2049 DROP"
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 2049 -j DROP
# xwindow 포트로의 서비스 요구 거부
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 6000:6010 -j LOG  --log-prefix "To 20 From 6000:6010 DROP"
${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport 6000:6010 -j DROP

${IPTABLES} -A INPUT -i eth0 -p tcp --sport 20 --dport ${UNPRIVPORTS} -j ACCEPT

# 1024:65535 포트는 초기 접속이 아닌경우 허가 - ftp passive mode와 apt-get
# 에서 필요.
# 1023이하 허용할 출발 포트는 사용하는 클라이언트에 따라 위에서 직접 지정

${IPTABLES} -A INPUT -i eth0 -p tcp ! --syn --sport ${UNPRIVPORTS} --dport ${UNPRIVPORTS} -j ACCEPT

###### UDP ######

# 열어줄 포트 개방 1024 밑에 포트
# for values in ${UDP_ALLOWPORT}
# do
#     ${IPTABLES} -A INPUT -p tcp --dport ${values} -j ACCEPT
# done

# 특정 호스트로의 포트를 개방
# for values in ${UDP_HOSTPERPORT}
# do
#     echo ${values} | {
#     IFS=':' read hosts ports
#         ${IPTABLES} -A INPUT -s ${hosts} -p udp --dport ${ports} -j ACCEPT
#         }
# done

# 상대편 포트를 보고 허가
# UDP는 특성상 -syn같은 옵션으로 초기 접속을 제한할 수가 없다.
# 그렇기때문에 UDP 프로토콜에 대해서는 허가할 서비스에 대해 상당한 주의가
# 요망 된다.
for values in ${UDP_ALLOWSPORT}
do
   ${IPTABLES} -A INPUT -i eth0 -p udp --sport ${values} ! --dport ${PRIVPORTS} -j ACCEPT
done


# ICMP

# 죽음의 핑이라 불리는 DOS(서비스 거부)공격에 사용되는 프로토콜이다.
# 내부 호스트에 이익이 되는것만을 선별해서 허용해야 한다.

# echo-reply (pong) - 0
# destination-unreachable - 3
# source-quench - 4
# redirect - 5
# echo-request (ping) - 8
# time-exceeded (ttl-exceeded) - 11
# parameter-problem - 12

# icmp 패킷 유형중 echo-reply(0)를 허가함
# 이 호스트가 외부 호스트로 ping을 사용하기 위해 pong은 허가
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type echo-reply -j ACCEPT

# icmp 패킷 유형중 destination-unreachable(3) 을 허가함
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type destination-unreachable -j ACCEPT

# icmp 패킷 유형중 source-quench(4) 를 허가함
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type source-quench -j ACCEPT

#  host에서 실행하는 traceroute 를 허용하기 위해 icmp time-exceeded(11)을
# 허용
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type time-exceeded -j ACCEPT

# icmp 패킷 유형중 parameter-problem(12)을 허가함
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type parameter-problem -j ACCEPT



###### deny 정책 #######
# deny 정책을 하기전에 먼저 허가할 것을 명시해야만 한다.

# ping을 이용한 DOS 공격에 대비하여 echo-request를 거부
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type echo-request -j LOG --log-prefix "PING REJECT"
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type echo-request -j REJECT

# icmp-type redirect(5) 거부
# 이것이 허용되면 외부에서 이 호스트의 라우팅 테이블을 임의로 조작할 수가 있게 된다.
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type redirect -j LOG --log-prefix "icmp-type 5 DROP"
${IPTABLES} -A INPUT -i eth0 -p icmp --icmp-type redirect -j DROP

# 그외 허가 되지 않은 1023이하의 포트 모두를 막음
${IPTABLES} -A INPUT -i eth0 -p tcp --dport 1:${TCP_DENYPORT} -j LOG --log-prefix "Under 1024 Tcp DROP"
${IPTABLES} -A INPUT -i eth0 -p udp --dport 1:${TCP_DENYPORT} -j LOG --log-prefix "Under 1024 Udp DROP"
${IPTABLES} -A INPUT -i eth0 -p tcp --dport 1:${TCP_DENYPORT} -j DROP
${IPTABLES} -A INPUT -i eth0 -p udp --dport 1:${TCP_DENYPORT} -j DROP

# 외부에서 허가된 tcp 접속 요청 제외한 모든 tcp접속 요청을 거부함
${IPTABLES} -A INPUT -i eth0 -p tcp --syn -j LOG --log-prefix "TCP SYN REJECT"
${IPTABLES} -A INPUT -i eth0 -p tcp --syn -j REJECT


# 그밖의 확인할수 없는 패킷을 모두 DROP
${IPTABLES} -A INPUT -i eth0 -m state --state INVALID -j LOG --log-prefix "INVALID DROP"
${IPTABLES} -A INPUT -i eth0 -m state --state INVALID -j DROP


###### OUTPUT ######


# local loopback 은 모든 패킷을 허용
${IPTABLES} -A OUTPUT -o lo -j ACCEPT

#ICMP OUTPUT DROP
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j LOG --log-prefix "ICMP output DROP"
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type destination-unreachable -j LOG --log-prefix "ICMP output DROP"
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type time-exceeded -j LOG --log-prefix "ICMP output DROP"
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type echo-reply -j DROP
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type destination-unreachable -j DROP
${IPTABLES} -A OUTPUT -o eth0 -p icmp --icmp-type time-exceeded -j DROP


###### 사설 ip 및 기타 거부 ######
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_A} -j LOG --log-prefix "CLASS_A DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_A} -j DROP
${IPTABLES} -A INPUT -i eth0 -d ${CLASS_A} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_A} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_A} -j DROP

${IPTABLES} -A INPUT -i eth0 -s ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_B} -j LOG --log-prefix "CLASS_B DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_B} -j DROP
${IPTABLES} -A INPUT -i eth0 -d ${CLASS_B} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_B} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_B} -j DROP

${IPTABLES} -A INPUT -i eth0 -s ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_C} -j LOG --log-prefix "CLASS_C DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_C} -j DROP
${IPTABLES} -A INPUT -i eth0 -d ${CLASS_C} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -s ${CLASS_C} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_C} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -d ${CLASS_C} -j DROP
${IPTABLES} -A INPUT -i eth0 -s ${LOOPBACK} -j LOG --log-prefix "INPUT loopback DROP"
${IPTABLES} -A OUTPUT -o eth0 -s ${LOOPBACK} -j LOG --log-prefix "INPUT loopback REJECT"
${IPTABLES} -A INPUT -i eth0 -s ${LOOPBACK} -j DROP
${IPTABLES} -A OUTPUT -o eth0 -s ${LOOPBACK} -j REJECT

${IPTABLES} -A INPUT -i eth0 -s ${BROADCAST_DEST} -j LOG --log-prefix "Broadcast_dest DROP"
${IPTABLES} -A INPUT -i eth0 -d ${BROADCAST_DEST} -j LOG --log-prefix "Broadcast_src DROP"
${IPTABLES} -A INPUT -i eth0 -s ${BROADCAST_DEST} -j DROP
${IPTABLES} -A INPUT -i eth0 -d ${BROADCAST_DEST} -j DROP

# class D multicast address 거부
# multicast 는 소스 주소로는 불법
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_D_MULTICAST} -j LOG --log-prefix "class D Multicast DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_D_MULTICAST} -j DROP

${IPTABLES} -A INPUT -i eth0 -s ${CLASS_E_RESERVED_NET} -j LOG --log-prefix "class E reserved net DROP"
${IPTABLES} -A INPUT -i eth0 -s ${CLASS_E_RESERVED_NET} -j DROP

# refuse addresses defined as reserved by the IANA
# 0.*.*.*, 1.*.*.*, 2.*.*.*, 5.*.*.*, 7.*.*.*, 23.*.*.*, 27.*.*.*
# 31.*.*.*, 37.*.*.*, 39.*.*.*, 41.*.*.*, 42.*.*.*, 58-60.*.*.*
# 65-95.*.*.*, 96-126.*.*.*, 197.*.*.*, 201.*.*.* (?), 217-223.*.*.*
${IPTABLES} -A INPUT -i eth0 -s 1.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 2.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 5.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 7.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 23.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 27.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 31.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 37.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 39.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 41.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 42.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 58.0.0.0/7 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 60.0.0.0/8 -j LOG --log-prefix "IANA reserved DROP"
${IPTABLES} -A INPUT -i eth0 -s 1.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 2.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 5.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 7.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 23.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 27.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 31.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 37.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 39.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 41.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 42.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 58.0.0.0/7 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 60.0.0.0/8 -j DROP

#65: 01000001    - /3 includes 64 - need 65-79 spelled out
${IPTABLES} -A INPUT -i eth0 -s 65.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 66.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 67.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 68.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 69.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 70.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 71.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 72.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 73.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 74.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 75.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 76.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 77.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 78.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 79.0.0.0/8 -j LOG --log-prefix "65-79 DROP"
${IPTABLES} -A INPUT -i eth0 -s 65.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 66.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 67.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 68.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 69.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 70.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 71.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 72.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 73.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 74.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 75.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 76.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 77.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 78.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 79.0.0.0/8 -j DROP

#80: 01010000   - /4 masks 80-95
${IPTABLES} -A INPUT -i eth0 -s 80.0.0.0/4 -j LOG --log-prefix "80-95 DROP"
${IPTABLES} -A INPUT -i eth0 -s 80.0.0.0/4 -j DROP

# 96: 01100000    - /4 makses 96-111
${IPTABLES} -A INPUT -i eth0 -s 96.0.0.0/4 -j LOG --log-prefix "96-111 DROP"
${IPTABLES} -A INPUT -i eth0 -s 96.0.0.0/4 -j DROP

#126: 01111110    - /3 includes 127 - need 112-126 spelled out
${IPTABLES} -A INPUT -i eth0 -s 112.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 113.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 114.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 115.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 116.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 117.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 118.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 119.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 120.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 121.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 122.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 123.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 124.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 125.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 126.0.0.0/8 -j LOG --log-prefix "112-126 DROP"
${IPTABLES} -A INPUT -i eth0 -s 112.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 113.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 114.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 115.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 116.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 117.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 118.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 119.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 120.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 121.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 122.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 123.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 124.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 125.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 126.0.0.0/8 -j DROP

#217: 11011001    - /5 includes 216 - need 217-219 spelled out
${IPTABLES} -A INPUT -i eth0 -s 217.0.0.0/8 -j LOG --log-prefix "217-219 DROP"
${IPTABLES} -A INPUT -i eth0 -s 218.0.0.0/8 -j LOG --log-prefix "217-219 DROP"
${IPTABLES} -A INPUT -i eth0 -s 219.0.0.0/8 -j LOG --log-prefix "217-219 DROP"
${IPTABLES} -A INPUT -i eth0 -s 217.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 218.0.0.0/8 -j DROP
${IPTABLES} -A INPUT -i eth0 -s 219.0.0.0/8 -j DROP

#223: 11011111    - /6 masks 220-223
${IPTABLES} -A INPUT -i eth0 -s 220.0.0.0/6 -j LOG --log-prefix "220-223 DROP"
${IPTABLES} -A INPUT -i eth0 -s 220.0.0.0/6 -j DROP

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

**참고자료:
패킷필터링, 조대원
리눅스 2.4 패킷필터링 하우투, Rusty Russel
리눅스 2.4 NAT 하우투, Rusty Russel

2006/09/08 22:20 2006/09/08 22:20
이 글에는 트랙백을 보낼 수 없습니다
웅쓰:웅자의 상상플러스
웅자의 상상플러스
전체 (379)
게임 (5)
영화 (2)
기타 (23)
맛집 (5)
영어 (2)
대수학 (3)
형태소 (5)
Hacking (9)
Linux (112)
HTML (48)
Application_developing (48)
Web_developing (102)
Window (11)
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        
  1. 2016/01 (1)
  2. 2015/12 (3)
  3. 2015/10 (3)
  4. 2015/03 (2)
  5. 2015/01 (4)