FreeBSD 핸드북 : 보안 : 방화벽 : IPFW 설정하기
Previous: FreeBSD에서 IPFW 기능 넣기
Next: ipfw의 예제 명령

6.4.4. IPFW 설정하기

IPFW 소프트웨어의 설정은 ipfw(8) 유틸리티로 합니다. 이 명령의 문법은 꽤나 복잡하게 보이겠지만, 일단 그 구조를 이해하면 비교적 간단합니다.

유틸리티는 현재 4가지 다른 명령어 카테고리를 갖습니다. 추가/삭제 (addition/deletion), 목록(listing), 전체 삭제(flushing), 재설정 (clearing)입니다. 추가/삭제는 패킷을 받아들이고, 거부하고, 기록하는 방법을 제어하는 규칙을 만들어냅니다. 목록은 규칙 집합(다른 말로 사슬)의 내용과 패킷 카운터(어카운팅)을 조사하는데 사용합니다. 전체 삭제는 사슬에서 모든 엔트리를 지웁니다. 재설정은 하나 이상의 어카운팅 엔트리를 0으로 만듭니다.

6.4.4.1. IPFW 규칙 바꾸기

이 형태의 명령어의 문법은 다음과 같습니다:

ipfw [-N] 명령 [인덱스] 동작 [log] 프로토콜 주소 [옵션]

이 형태의 명령어를 사용할 때에 유효한 옵션은 하나 뿐입니다:

-N

출력시 주소와 서비스 명을 단어로 바꾸어 줍니다.

주어진 명령은 가장 짧은 유일한 형태로 쓸 수 있습니다. 유효한 명령은 다음과 같습니다:

add

방화벽/어카운팅 규칙 목록에 추가

delete

방화벽/어카운팅 규칙 목록에서 삭제

IPFW의 이전 버전은 방화벽과 어카운팅 엔트리를 따로 사용했습니다. 현재 버전은 각 방화벽 엔트리에 대해 패킷 어카운팅을 제공합니다.

인덱스값이 주어지면, 엔트리를 사슬 내의 특정 지점에 놓습니다. 그렇지 않으면, 엔트리는 마지막 사슬 엔트리보다 100이 큰 인덱스 사슬의 끝에 놓여집니다(기본 정책인 규칙 65535는 거부합니다).

log 옵션은 대응 규칙이 IPFIREWALL_VERBOSE로 컴파일된 경우에 시스템 콘솔에 출력되도록 합니다.

여러가지 규칙은:

reject

패킷을 버리며, ICMP 호스트나 포트에 소스로 도착할 수 없다는(적절하게) 패킷을 보낸 사람에게 보냅니다.

allow

패킷을 그냥 통과시킵니다(다른 이름: pass와 accept)

deny

패킷을 버립니다. 보낸 사람은 ICMP메시지를 통해 알려지지 않았습니다. (따라서 패킷은 도착지에 전혀 도착하지 않던 것 같습니다).

count

패킷 카운터를 갱신하지만 이 규칙에 기반하여 패킷을 허용/금지하지 마세요. 검색은 다음 사슬 엔트리로 계속됩니다.

각 동작 은 가장 짧게 알아볼 수 있도록 쓰면 됩니다.

지정할 수 있는 프로토콜은 다음과 같습니다:

all

모든 IP 패킷에 대응

icmp

ICMP 패킷에 대응

tcp

TCP 패킷에 대응

udp

UDP 패킷에 대응

주소 지정은 다음과 같습니다:

from <주소/넷마스크>[포트] to <주소/넷마스크>[포트] [via <인터페이스>]

포트은 포트를 지원하는 프로토콜과 함께만 사용할 수 있습니다(UDP와 TCP).

via는 옵션이며 해당 인터페이스에서 오는 패킷만을 처리하도록 IP주소나 지역 IP 인터페이스의 도메인명, 인터페이스명(예: ed0)을 지정할 수 있습니다. 인터페이스 유닛 번호는 와일드카드를 옵션으로 써서 지정할 수도 있습니다. 예를 들면, ppp*는 모든 커널 PPP 인터페이스에 대응합니다.

<주소/넷마스크>를 지정하는데 사용하는 문법은 다음과 같습니다:

<주소>
또는
<주소>/마스크-비트
또는
<주소>:마스크-패턴

유효한 호스트명은 IP주소의 자리에 지정할 수 있습니다. 마스크-비트는 주소 마스크를 지정하는 비트 수를 나타내는 십진 숫자입니다.

192.216.222.1/24

를 지정하면 C 클래스 서브넷(이 경우, 192.216.222)의 모든 주소에 해당하는 마스크를 만들어냅니다. 마스크-패턴은 주어진 주소에 논리적 AND를 하는 것입니다. any키워드는 ``모든 IP 주소''를 지정하는데 사용할 수 있습니다.

막는 포트 번호는 다음과 같이 지정합니다:

포트[,포트[,포트[...]]]

하나의 포트나 여러개의 포트를 지정하려면,

포트-포트

와 같이 써서 포트의 범위를 지정할 수 있습니다. 범위와 단일 포트 지정을 결합할 수 있지만, 범위가 항상 먼저 지정되어야 합니다.

사용할 수 있는 옵션은 다음과 같습니다:

frag

데이터그램의 첫번째 조각이 아닌 패킷에 대응됩니다.

in

들어오는 패킷에만 대응합니다.

out

나가는 패킷에만 대응합니다.

ipoptions 스펙

IP 헤더가 스펙에 지정한 옵션 목록(쉼표로 분리한)에 들어 있다면 대응합니다. 지원하는 IP 옵션 목록은 다음과 같습니다: ssrr (엄격한 소스 라우팅), lsrr (느슨한 소스 라우팅), rr (패킷 라우팅 기록), ts (타임스탬프). 특정 옵션을 지정하지 않음을 나타낼 때에는 앞에 `!'을 쓰면 됩니다.

established

패킷이 이미 확립된 TCP 연결(예: RST나 ACK비트가 지정된)의 일부인 경우에 대응합니다. 규칙 사슬 앞부분에 established 규칙을 지정하여 방화벽의 성능을 최적화할 수 있습니다.

setup

TCP 연결 확립 시도를 하는 패킷에 대응합니다. (SYN 비트는 지정되었지만 ACK비트가 지정되지 않은 것).

tcpflags 플래그

TCP헤더가 플래그의 (쉼표로 분리한) 목록에 들어 있으면 대응합니다. 지원하는 플래그는 fin, syn, rst, psh, ack, urg 입니다. 특정 플래그을 지정하지 않음을 나타낼 때에는 앞에 `!'을 쓰면 됩니다.

icmptypes 형태

형태의 목록에 ICMP 형태가 있으면 대응합니다. 형태 목록은 쉼표로 분리한 개별 형태나 범위의 조합으로 표시할 수 있습니다. 공통적으로 사용하는 ICMP 형태는 0 에코 응답 (ping 응답), 5 방향 재지정, 8 에코 요청(ping 응답), 11 시간 초과(traceroute(8)과 같이 TTL 시한을 지정하기 위해 사용) 입니다.

6.4.4.2. IPFW 규칙 목록 보기

이런 명령 형태의 문법은 다음과 같습니다:

ipfw [-atN] l

이런 명령 형태를 사용할 때에는 세가지 유효한 플래그가 있습니다:

-a

목록 나열시 카운터 값을 보여줍니다. 이 옵션은 어카운팅 카운터를 보고 싶은 경우에만 사용합니다.

-t

각 사슬 엔트리의 마지막 적용 시간을 보여줍니다. 여기 나오는 시간은 ipfw(8) 유틸리티에 의해 사용되는 입력 문법과 비호환적입니다.

-N

주어진 주소와 서비스 이름을 영문으로 표시하려 합니다.

6.4.4.3. IPFW 규칙 전체 삭제

사슬을 모두 삭제하는 문법은 다음과 같습니다:

ipfw flush

이는 방화벽 사슬의 모든 엔트리를 커널에 의해 강제되는 고정된 기본 규칙(인덱스 65535)을 제외하고 삭제하도록 합니다. 규칙을 삭제할 때에 주의할 것은 사슬에 허용 엔트리가 추가될 때 까지는 기본 거부 원칙에 의해 시스템에 네트워크에서 단절된다는 것입니다.

6.4.4.4. IPFW 패킷 카운터 재설정

하나 이상의 패킷 카운터를 재설정하는 문법은 다음과 같습니다:

ipfw zero [인덱스]

인덱스 인수 없이 사용하면 모든 패킷 카운터가 0이 됩니다. 인덱스를 지정하면 재설정 연산은 특정 사슬 엔트리에만 영향을 미칩니다.


FreeBSD 핸드북 : 보안 : 방화벽 : IPFW 설정하기
Previous: FreeBSD에서 IPFW 기능 넣기
Next: ipfw의 예제 명령