[네트워크][보안] linux bridge firewall 서버 구축 하기 [2]

3.4. Bridge utils 설치

bridge 기능을 사용하기 위한 프로그램 설치

bridge utils 소스 컴파일 및 설치 # tar vxzf bridge-utils-0.9.6.tar.gz

# cd bridge-utils

~/bridge-utils# ./configure

~/bridge-utils# make

~/bridge-utils# make install

——————————————————————————–

3.5. iptables 설치

패킷제어 명령을 내리기위한 iptables설치

iptables 소스 컴파일 및 설치, KERNEL_DIR=/usr/src/linux 에는 커널 소스가 있는 경로를 적어준다. # tar vjxf iptables-1.2.8.tar.bz2

# cd iptables-1.2.8

~/iptables-1.2.8# make KERNEL_DIR=/usr/src/linux

~/iptables-1.2.8# make install KERNEL_DIR=/usr/src/linux

~/iptables-1.2.8# make install-devel

——————————————————————————–

4. 실행 스크립트 및 세부 설정

4.1. 패킷에 대한 기본적인 이해

패킷(packet)이란 한글로 번역하자면 소포, 편지묶음 이라는 뜻을 가지고 있다. 그렇다면 패킷이란 도대체 무엇인가?

전화 통신을 예로 들어 보겠다. 지금의 아날로그 전화는 회선 방식이다. 우리가 전화를 걸면 교환기를 통해 다른 집의 전화로 연결된다. 전화를 받든 안 받든 일단 연결을 한다. 그렇다면 연결 된 회선을 점유하고 있다는 것 이다. 전화를 받지 않아 통화를 하지 않는다 해도 연결이 되었기 때문에 회선을 쓰고 있는 것이 된다.

그런데 이것을 인터넷에 적용시킨다면 엄청나게 비효율적으로 된다. 그래서 인터넷에서는 패킷을 사용한다. 패킷은 작은 데이터의 덩어리 이다. FTP를 통해서 파일을 받는다고 할 때. 우리 눈으로 볼때는 파일이 한꺼번에 받아진다. 하지만 실제로 파일들은 수백 수천개의 패킷들로 조각나 우리에게로 전송되는 것이다. 컴퓨터는 그 패킷을 받아 조립하여 다시 파일을 만들어 낸다.

우리가 인터넷을 한다면 웹 브라우저로 웹서핑도 하고 FTP로 파일도 받고 메신저로 메시지도 주고 받을 것이다. 우리 컴퓨터에 연결된 랜선에는 웹 브라우저에서 요청한 HTML파일의 패킷, FTP에서 전송하고 있는 파일 패킷들, 메신저에서 주고 받는 메시지 패킷들이 서로 뒤섞여 오고 간다. 이렇게 섞여서 오고 간다해도 패킷들에는 각각의 정보가 존재 한다. 그래서 패킷이 섞이지 않고 여러가지 일을 동시에 할 수 있는 것이다. 전화 같으면 회선을 완전 점유해서 사용하기 때문에 한가지 일 밖에 할 수가 없다.

이제 방화벽의 원리를 알아보자. 방화벽은 패킷을 구분하여 그 패킷을 통과 시킬 것인지 아니면 거부, 혹은 버릴 것인지를 결정하는것이다. iptables를 통해서 패킷을 어떻게 제어 하느냐에 따라서 접속을 막거나 혹은 열거나, 스트링 검색을 통해서 웜의 패킷을 막을 수 있는 것이다.

——————————————————————————–

4.2. bridge 및 iptables 스크립트 작성

iptables는 명령을 내려줘도 메모리에만 올라가 있기 때문에 재부팅을 하면 설정 내용이 사라진다. 따라서 부팅할 때 실행되도록 스크립트를 만들어 줘야 한다.

iptables 명령 스크립트는 인터넷 상에 많은 예제들이 올라와 있다. 본인도 처음에는 그대로 복사해서 사용을 했지만. 내용을 이해하지 않고 사용을 해서 제대로 작동하지 않았다. 가장 중요한 부분은 패킷에 대한 이해와 프로토콜에 대한 기본적인 지식을 갖추어야 한다는 것이다. 지금 만든 방화벽이 설치되는 네트워크가 본인이 사용하고 있는 네트워크하고 똑같다고 할 수는 없을 것이다, 그러므로 자신의 네트워크 상황에 맞게 스크립트를 재작성 해야 할 것이다.

아래 스크립트는 부팅될 때 실행될 수 있도록 /etc/init.d/bridgefirewall 로 저장한다. 스크립트의 주석을 보고 각자 네트워크 상황에 맞게 설정하기 바란다. 네트워크 설정은 자신의 네트워크에 맞게 설정하기 바란다. 앞으로 예를 들 네트워크 구성은다음과 같다. 물론 존재하지 않는 IP이다. 방화벽과 방화벽 뒤에서 보호받는 네트워크 모두 공인 IP를 사용한다.

방화벽 자체 IP : 234.234.200.10

브로드캐스트 : 234.234.200.255

사용중인 IP : 234.234.200.0 ~ 234.234.200.255

#!/bin/sh

BR_IP=”234.234.200.10″  

# 방화벽의 자체 IP. 원래 Bridge firewall은 IP 주소가 없다. 하지만 IP를

# 할당하지 않으면 원격에서 접속할 수 없고 직접 방화벽 머신 앞에 앉아서

# 작업을 해야 하기 때문에 관리하기가 불편하다. 그래서 관리를 위해

# IP를 할당한다. 내부네트워크 에서만 접속이 가능하도록 설정 할 것이다.

# 보안상 걱정이 된다면 IP주소를 할당하지 않아도 된다. 그러면 원격에서는

# 절대 접속할 수 없다.

BR_IFACE=”pyrasis-br”     # 브리지 이름, 마음에 드는 이름을 준다.

LAN_BCAST_ADDRESS=”234.234.200.255″       # 브로드 캐스트

INTERNAL_ADDRESS_RANGE=”234.234.200.0/24″ # 네트워크 범위.

INTERNAL_ADDRESS=”255.255.255.0″          # 넷 마스크

#GATEWAY=”234.234.200.254”               # 게이트웨이 내부망이 아닌 외부에서도 접속을 하려면 설정한다.

INET_IFACE=”eth0″ # 외부에서 들어오는 선을 연결 할 랜카드

LAN_IFACE=”eth1″  # 내부로 나가는 선을 연결하는 랜카드

LO_IFACE=”lo”

LO_IP=”127.0.0.1″

IPTABLES=”/usr/local/sbin/iptables” # iptables 의 절대 경로

#########

/sbin/depmod -a

# 아래 부분은 iptables에서 사용 할 모듈을 적재하는 작업이다.

# 데비안 리눅스의 경우 modconf에서 적재할 모듈을 선택을 하면

# 부팅 할 때마다 아래와 같이 적어줄 필요는 없다.

# 다른 배포판의 경우 아래와 같이 필요한 모듈들을 올려줘야 iptables에서

# 각각의 명령들이 인식 될 것이다.

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/iptable_filter.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ip_conntrack.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/iptable_nat.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ip_conntrack_ftp.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ip_conntrack_irc.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ipt_string.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ipt_state.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ipt_REJECT.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ipt_REDIRECT.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ipt_MASQUERADE.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ip_nat_snmp_basic.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ip_nat_ftp.o

/sbin/insmod /lib/modules/2.4.19/kernel/net/ipv4/netfilter/ip_nat_irc.o

ifconfig $INET_IFACE down   # 모든 랜카드의 설정을 초기화

ifconfig $LAN_IFACE down

ifconfig $BR_IFACE down

ifconfig $INET_IFACE 0.0.0.0  # 브리지가 될 랜카드에 0.0.0.0의 아이피를 준다.

ifconfig $LAN_IFACE 0.0.0.0

$IPTABLES -F  # 체인의 규칙들을 지운다.

$IPTABLES -X  # 체인을 지운다, 초기화 작업.

# 초기 정책.

# INPUT(들어오는 것) DROP(버린다)

# OUTPUT(나가는 것) ACCEPT(허용), INPUT OUTPUT은 방화벽 자체에서 오고 나가는 패킷을 뜻함.

# FORWARD DROP : 가장 중요한 부분이다.

# 브리지 방화벽을 통해 지나가는 모든 패킷은 FORWARD에서 제어한다.

$IPTABLES -P INPUT DROP

$IPTABLES -P OUTPUT ACCEPT

$IPTABLES -P FORWARD DROP

# 브리지 설정

/usr/local/sbin/brctl addbr $BR_IFACE

/usr/local/sbin/brctl addif $BR_IFACE $INET_IFACE

/usr/local/sbin/brctl addif $BR_IFACE $LAN_IFACE

# 브리지 IP 설정

if [ “$BR_IP” != “” ] ; then

    ifconfig $BR_IFACE $BR_IP broadcast $LAN_BCAST_ADDRESS netmask $INTERNAL_ADDRESS

    #route add default gw $GATEWAY  # 게이트웨이 설정 위의 게이트웨이 변수를 선언 했을 경우

    else

        ifconfig $BR_IFACE up

fi

# Firewall SSH

# 방화벽 컴퓨터 자체의 설정.

# 234.234.200.0 부터 255 까지 아이피에서 방화벽 22번 포트로 접속하는 것을 허용

# 따라서 회사내부에서만 접속이 가능하며 SSH로만 접속이 가능하다.

# 관리자의 특정 IP만 허용하려면 234.234.200.0/24대신 234.234.200.12 이런식으로

# 적어주면 된다

$IPTABLES -A INPUT -p tcp -s 234.234.200.0/24 –dport 22 -j ACCEPT

#$IPTABLES -A INPUT -p tcp –dport 22 -j ACCEPT  # 위에서 게이트웨이 설정을 해주었고 이 설정을 해주면

                                                # 내부가 아닌 외부에서도 접속이 가능하다.

# Deny IP list

# 이것은 예를 든 것이다. 사용하고 싶은 사람은 사용하기 바란다.

# 첫번째는 10.105.4.202에서 오는 icmp 패킷을 버린다는 뜻, tcp, udp를 사용할 수 있다

# 두번째는 MAC 주소를 차단하는 방법으로 아래의 MAC 주소에서 오는 패킷은 차단된다.

#$IPTABLES -A FORWARD -p icmp -s 10.105.4.202 -j DROP

#$IPTABLES -A FORWARD -m mac –mac-source 00:02:2A:C4:86:17 -j DROP

# Nimda, CodeRed

# 님다 패킷 및 코드레드 패킷 차단하는 명령

$IPTABLES -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string –string “/default.ida?” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string –string “XXXXXXXX” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string –string “cmd.exe” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string –string “root.exe?” -j REJECT –reject-with tcp-reset

# SQL Slammer

# SQL 슬래머 웜의 패킷을 차단하는 명령

$IPTABLES -A FORWARD -p udp -m string –string “Qh.dllhel32hkern” -j REJECT

# 80번 포트만 사용하는 웹 서버의 경우 80번포트만 열고 나머지 80포트로 오고 가는 패킷에 대한

# 스트링 검사를 해서 Nimda, CodeRed의 패킷을 막는다.

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –dport 80 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –tcp-flags ACK ACK –dport 80 -m string –string “/default.ida?” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –tcp-flags ACK ACK –dport 80 -m string –string “XXXXXXXX” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –tcp-flags ACK ACK –dport 80 -m string –string “cmd.exe” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –tcp-flags ACK ACK –dport 80 -m string –string “root.exe?” -j REJECT –reject-with tcp-reset

# MSN

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 1863:1864 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 6901 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 7801:7825 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 6891:6900 -j ACCEPT

# KTiman

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 10020 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 10250 -j ACCEPT

# IRC

$IPTABLES -A FORWARD -p tcp –dport 6667 -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 6667 -j ACCEPT

# Remote

$IPTABLES -A FORWARD -p tcp –sport 6009 -j ACCEPT

$IPTABLES -A FORWARD -p tcp –dport 6009 -j ACCEPT

# FTP Client

$IPTABLES -A FORWARD -p tcp –sport 21 -m state –state ESTABLISHED -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 20 -m state –state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 1024:65535 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT

$IPTABLES -A FORWARD -p tcp –dport 113 -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 113 -j ACCEPT

# syn packet drop

$IPTABLES -A FORWARD -p tcp –syn -d 234.234.200.0/24 -j DROP

# net send drop

$IPTABLES -A FORWARD -p tcp –syn -d 234.234.200.0/24 –sport 139 -j DROP

$IPTABLES -A FORWARD -p tcp –syn -d 234.234.200.0/24 –sport 2603 -j DROP

$IPTABLES -A FORWARD -p udp -d 234.234.200.0/24 –dport 135 -j DROP

$IPTABLES -A FORWARD -p ALL -j ACCEPT

네트워크 범위 설정의 뜻

우리는 앞에서 네트워크 범위 설정이라는 부분을 하였다. 234.234.200.0 부터 255까지를 234.234.200.0/24라고 설정 하였다. 이것이 왜 이렇게 설정되는지 알아보자

표 1. IP 주소의 범위 표현

1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1 . 1 1 1 1 1 1 1 1

0 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

위의 표는 255.255.255.255를 2진수로 표현한 것이고 두번째 줄은 각 비트의 순서이다.

234.234.200.0/24라고 할때 234.234.200.0부터 234.234.200.255까지 되는 이유는 0/24 에서 24번째 비트까지를 의미한다.

표 2. 0/24

. 1 1 1 1 1 1 1 1

. 24 25 26 27 28 29 30 31

24 번째 비트까지 이면 1 1 1 1 1 1 1 1즉 255다. 0부터 255까지라는 말이다

0/25라고 하면 0 1 1 1 1 1 1 1로 128이 된다. 0부터 128이 된다.

0/26이면 0 0 1 1 1 1 1 1로 0부터 64

128/25라면. 128 부터 255까지 사용한다는 것이다.

——————————————————————————–

4.3. 정책변경

방화벽을 부팅을 해놓고 정책을 수정할 수 있어야 한다. 그러려면 스크립트를 하나 더 만들어 줘야 하는데.. 매우 쉽게 할 수 있다. 위의 부팅 스크립트에서 브리지 설정 부분만 뺀 iptables명령 부분만 잘라서 스크립트로 만들면 스크립트 실행만으로 간단한 정책 변경이 가능하게 된다.

다음은 방화벽이 부팅되고 정책을 변경 할 수 있는 스크립트이다. ipt-sh라고 저장하고 chmod 755 ipt-sh 한뒤 ./ipt-sh 라고 실행하면 된다. IPTABLES=”/usr/local/sbin/iptables”

$IPTABLES -F  # 체인의 규칙들을 지운다.

$IPTABLES -X  # 체인을 지운다, 초기화 작업.

# Firewall SSH

$IPTABLES -A INPUT -p tcp -s 234.234.200.0/24 –dport 22 -j ACCEPT

#$IPTABLES -A FORWARD -p icmp -s 10.105.4.202 -j DROP

#$IPTABLES -A FORWARD -m mac –mac-source 00:02:2A:C4:86:17 -j DROP

# Nimda, CodeRed

$IPTABLES -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string –string “/default.ida?” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string –string “XXXXXXXX” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string –string “cmd.exe” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp –tcp-flags ACK ACK –dport 80 -m string –string “root.exe?” -j REJECT –reject-with tcp-reset

# SQL Slammer

$IPTABLES -A FORWARD -p udp -m string –string “Qh.dllhel32hkern” -j REJECT

# WebServer

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –dport 80 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –tcp-flags ACK ACK –dport 80 -m string –string “/default.ida?” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –tcp-flags ACK ACK –dport 80 -m string –string “XXXXXXXX” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –tcp-flags ACK ACK –dport 80 -m string –string “cmd.exe” -j REJECT –reject-with tcp-reset

$IPTABLES -A FORWARD -p tcp -d 234.234.200.5 –tcp-flags ACK ACK –dport 80 -m string –string “root.exe?” -j REJECT –reject-with tcp-reset

# MSN

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 1863:1864 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 6901 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 7801:7825 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 6891:6900 -j ACCEPT

# KTiman

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 10020 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 10250 -j ACCEPT

# IRC

$IPTABLES -A FORWARD -p tcp –dport 6667 -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 6667 -j ACCEPT

# Remote

$IPTABLES -A FORWARD -p tcp –sport 6009 -j ACCEPT

$IPTABLES -A FORWARD -p tcp –dport 6009 -j ACCEPT

# FTP Client

$IPTABLES -A FORWARD -p tcp –sport 21 -m state –state ESTABLISHED -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 20 -m state –state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 1024:65535 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT

$IPTABLES -A FORWARD -p tcp –dport 113 -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 113 -j ACCEPT

# syn packet drop

$IPTABLES -A FORWARD -p tcp –syn -d 234.234.200.0/24 -j DROP

# net send drop

$IPTABLES -A FORWARD -p tcp –syn -d 234.234.200.0/24 –sport 139 -j DROP

$IPTABLES -A FORWARD -p tcp –syn -d 234.234.200.0/24 –sport 2603 -j DROP

$IPTABLES -A FORWARD -p udp -d 234.234.200.0/24 –dport 135 -j DROP

$IPTABLES -A FORWARD -p ALL -j ACCEPT

$IPTABLES -L

——————————————————————————–

4.4. 기본적인 명령 사용법

iptables에 명령을 내려 어떻게 패킷들을 조작하는지 기본적인 것들을 알아보자.

-A FORWARD : FORWARD체인에 정책 추가, 가장 많이 사용한다.

-A INPUT, -A OUTPUT : INPUT, OUTPUT 체인에 정책 추가, 방화벽 자체의 오고 나가는 패킷정책. 거의 사용하지 않는다.

-p tcp : TCP프로토콜, Web, FTP, Telnet, SSH, 등

-p udp : UDP프로토콜

-p icmp : ICMP프로토콜, PING

-d : Destination IP, 목적지 IP 예) -d 234.234.200.123

-s : Source IP, 발생지 IP 예) -s 234.234.200.123

–dport : Destination Port, 목적지 포트 예) –dport 80 혹은 –dport 80:90 80번부터 90번까지

–sport : Source Port, 발생지 포트 예) –sport 80 혹은 –sport 80:90 80번부터 90번까지

앞에서 우리는 INTERNAL_ADDRESS_RANGE=”234.234.200.0/24″ 라고 설정했다. 내부 네트워크를 뜻하는데 아래 두줄의 명령은 같다. 단지 INTERNAL_ADDRESS_RANGE라고 변수를 주고 IP를 대입시켜 주었는데 이해를 돕기 위해 IP를 그대로 넣는 방식으로 하겠다. 변수만 한가득히 나오면 처음 보는 사람은 잘 이해가 가지 않기 때문이다. 처음에는 IP를 그대로 넣고 변수를 사용하고 싶은 사람은 사용해도 상관 없다. $IPTABLES -A FORWARD -p tcp -d $INTERNAL_ADDRESS_RANGE –dport 80 -j DROP

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 80 -j DROP

iptables 에서 FORWARD체인을 기본적으로 DROP으로 해놨었다. 그렇게 되면 모두 막히게 된다. 정책을 설정 할 때 열어줄 포트를 먼저 열고 모두 막아야 한다. 모두 막고 열어줄 것을 열면 열리지 않게 된다.

위의 부팅 스크립트에서는 syn 패킷을 드롭 한다. 이 말은 FORWARD체인에 (-A FORWARD) TCP프토로콜 (-p tcp) syn패킷 (–syn) 목적지 IP가 234.234.200.0/24일 때 (-d 234.234.200.0/24) 드롭한다. (-j DROP) # syn packet drop

$IPTABLES -A FORWARD -p tcp –syn -d 234.234.200.0/24 -j DROP

$IPTABLES -A FORWARD -p ALL -j ACCEPT

syn 패킷을 드롭 하는 이유는 234.234.200.0/24라는 내부 네트워크에 TCP 접속을 막기 위해서이다. TCP를 사용하는 telnet, web, FTP등 내부로의 접속을 막는 것이다. syn패킷은 TCP프로토콜의 초기 접속 요구 패킷이다. 목적지 IP가 내부 네트워크로 돼있고 그것을 드롭한다. 내부에서 외부로 나가는 것은 막히지 않는다. 주의할 점은 syn 패킷을 막지 않고 그냥 목적지가 내부 네트워크인 TCP프로토콜을 막는 경우 웹을 포함한 모든 TCP를 사용하는 것들은 통신을 하지 못한다. 외부로 나갈 수는 있지만 그 결과를 내부로 가져 올 수 없기 때문에 통신이 되지 않는 것이다. 두번째 줄의 모든 프로토콜을 허용한다는 명령인데 저것을 하지 않으면 통신이 되지 않는다. 꼭 해주어야 한다. FORWARD의 기본 정책이 DROP이기 때문이다.

특정 포트 열기와 특정 포트 막기 # 21번 포트 막기, 목적지IP가 내부, 목적지 포트가 21번인 패킷을 드롭, 효과는 TCP프로토콜 21번 포트를 사용하는

# 프로그램은 내부에서 통신을 할수 없다. -s 234.234.200.0/24로 하더라도 효과는 같다. 발생지 IP가 내부이고 목적지가 외부

# 21번 포트 이므로 효과는 같다.

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 21 -j DROP

# 21번 포트 열기, 목적지 IP가 내부, 목적지 포트가 21번인 패킷을 허용, 효과는 외부에서 내부로 TCP연결을 할 수 있게 된다.

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 21 -j ACCEPT

# 정책 마지막 줄에는 항상 위의 syn패킷 드롭을 해주어야 한다. 그러지 않으면 아무리 열고 닫는다 해도 FORWARD체인의 기본

# 정책을 DROP로 해놨기 때문에 통신이 안 된다.  

특정 포트를 막는 것은 회사 같은 곳에서 특정 포트를 사용하는 프로그램(P2P 등)의 사용을 막고자 할 때 사용한다.

특정 포트를 열고자 하는 것은 방화벽 뒤에 메일서버, 웹서버 등이 있을때 그 서버들이 사용하는 포트를 열어 줄때 사용한다.

——————————————————————————–

4.5. 자주 사용되는 것들

방화벽을 사용하다 보면 자주 생기는 일들이 있다. 인스턴트 메신져, FTP등의 설정을 알아보자.

인스턴트 메신져. MSN 등. 각각 메신저의 홈페이지에 사용하는 포트를 표시 해놓고 있다. 그 포트를 보고 알맞게 고치면 된다. 메신저가 사용하는 포트를 열어주지 않았다고 해도 메신저는 동작 할 것이다. 그러나 파일전송 같은 것이 동작이 되지 않는 경우가 발생한다. # MSN

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 1863:1864 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 6901 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 7801:7825 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 6891:6900 -j ACCEPT

# KTiman

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 10020 -j ACCEPT

$IPTABLES -A FORWARD -p tcp -d 234.234.200.0/24 –dport 10250 -j ACCEPT

FTP클라이언트를 사용할 수 있게 설정 # FTP Client

$IPTABLES -A FORWARD -p tcp –sport 21 -m state –state ESTABLISHED -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 20 -m state –state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 1024:65535 –dport 1024:65535 -m state –state ESTABLISHED -j ACCEPT

$IPTABLES -A FORWARD -p tcp –dport 113 -j ACCEPT

$IPTABLES -A FORWARD -p tcp –sport 113 -j ACCEPT

패킷 스트링 검색 String match Support, Nimda, CodeRed Packets #$IPTABLES -A FORWARD -p tcp -d 234.234.200.1 –tcp-flags ACK ACK –dport 80 -m string –string “/default.ida?” -j REJECT –reject-with tcp-reset

#$IPTABLES -A FORWARD -p tcp -d 234.234.200.1 –tcp-flags ACK ACK –dport 80 -m string –string “XXXXXXXX” -j REJECT –reject-with tcp-reset

#$IPTABLES -A FORWARD -p tcp -d 234.234.200.1 –tcp-flags ACK ACK –dport 80 -m string –string “cmd.exe” -j REJECT –reject-with tcp-reset

#$IPTABLES -A FORWARD -p tcp -d 234.234.200.1 –tcp-flags ACK ACK –dport 80 -m string –string “root.exe?” -j REJECT –reject-with tcp-reset

위의 명령에서 –string “cmd.exe” 는 패킷 속에 cmd.exe라는 스트링을 포함하고 있으면 차단하거나 거부한다는 것이다 –tcp-flags ACK ACK 는 TCP프로토콜에서 초기 연결하는 패킷을 뜻한다.

net send (팝업 스팸) 윈도우2000이상의 운영체제에 메세지 창이 뜨는 스팸을 막는 방법 # net send drop

$IPTABLES -A FORWARD -p tcp –syn -d 234.234.200.0/24 –sport 139 -j DROP

$IPTABLES -A FORWARD -p tcp –syn -d 234.234.200.0/24 –sport 2603 -j DROP

$IPTABLES -A FORWARD -p udp -d 234.234.200.0/24 –dport 135 -j DROP

——————————————————————————–

4.6. 커널 로그 데몬 설정

방화벽을 사용하다 보면 화면에 수많은 메세지가 출력 될것입니다. 이것때문에 명령을 입력하기가 불편한 경우 커널 로그 데몬의 설정을 바꾸어 줍니다.

/sbin/klogd_start 파일을 만들어 줍니다. 커널 로그 데몬의 로깅 레벨을 설정합니다. 레벨에 따라 화면에 출력되는 메세지를 조절할 수 있습니다. #!/bin/sh

/sbin/klogd -c 1

/etc/init.d/klogd 파일입니다. 이 파일은 부팅할때 커널 로그 데몬을 실행합니다. #! /bin/sh

# /etc/init.d/klogd: start the kernel log daemon.

PATH=/bin:/usr/bin:/sbin:/usr/sbin

pidfile=/var/run/klogd.pid

#binpath=/sbin/klogd

binpath=/sbin/klogd

binpath_start=/sbin/klogd_start #위에서 만든 스크립트 입니다.

test -f $binpath || exit 0

#  Use KLOGD=”-k /boot/System.map-$(uname -r)” to specify System.map

#

KLOGD=””

running()

{

    # No pidfile, probably no daemon present

    #

    if [ ! -f $pidfile ]

    then

        return 1

    fi

    pid=`cat $pidfile`

    # No pid, probably no daemon present

    #

    if [ -z “$pid” ]

    then

        return 1

    fi

    cmd=`cat /proc/$pid/cmdline | tr “\\000” “\\n”|head -1`

    # No syslogd?

    #

    if [ “$cmd” != “$binpath” ]

    then

        return 1

    fi

    return 0

   }

case “$1” in

  start)

    echo -n “Starting kernel log daemon: klogd”

    start-stop-daemon –start –quiet –exec $binpath_start — $KLOGD

    # 시작할때 위에서 만든 스크립트를 실행하도록 만듭니다.

    echo “.”

    ;;

  stop)

    echo -n “Stopping kernel log daemon: klogd”

    start-stop-daemon –stop –quiet –exec $binpath –pidfile $pidfile

    echo “.”

    ;;

  restart|force-reload)

    echo -n “Stopping kernel log daemon: klogd”

    start-stop-daemon –stop –quiet –exec $binpath –pidfile $pidfile

    echo “.”

    sleep 1

    echo -n “Starting kernel log daemon: klogd”

    start-stop-daemon –start –quiet –exec $binpath –exec $binpath — $KLOGD

    echo “.”

    ;;

  reload-or-restart)

    if running

    then

        start-stop-daemon –stop –quiet –signal 1 –exec $binpath –pidfile $pidfile

    else

        start-stop-daemon –start –quiet –exec $binpath — $KLOGD

    fi

    ;;

  *)

    echo “Usage: /etc/init.d/klogd {start|stop|restart|force-reload|reload-or-restart}”

    exit 1

esac

exit 0

위 의 시작 스크립트는 배포판 마다 다를수 있지만 klogd_start 스크립트를 실행하게만 하면 됩니다.

이정도로 마치도록 하겠습니다. 처음 리눅스를 접하는 사람은 아무래도 커널 컴파일이나 설정 부분이 어려울 것입니다. 부족한 문서이지만 많은 도움이 되었으면 합니다. 문서의 잘못된 점이 있다면 바로 메일을 보내 주시기 바랍니다.

서진우

슈퍼컴퓨팅 전문 기업 클루닉스/ 상무(기술이사)/ 정보시스템감리사/ 시스존 블로그 운영자

You may also like...

페이스북/트위트/구글 계정으로 댓글 가능합니다.