B.2. p-o-m 옵션 선택

DSCP.patch NOT APPLIED ( 2 missing files)

Status: Pending for kernel inclusion.

0x0부터 0x4f 사이 값으로 DSCP(Differentiated Services Code Point, 이전에는 TOS, Type Of Sevice라 불렀지요) 필드를 설정할 수 있는 CONFIG_IP_NF_TARGET_DSCP 옵션을 보탭니다. 좋은 일들이 있습니다. TOS에 대해서는 본문을 참고하세요.

ECN.patch

Status: Pending for kernel inclusion.

iptables mangle 테이블에서 사용할 수 있는 ECN 타깃을 추가합니다. 인터넷에서 ECN 블랙홀을 피해갈 때 꽤 유용하지만, 일반적으로 ECN 비트를 조작해서 쓸모 없이 만드는 일은 별로 바라지 않습니다.

REJECT_mark.patch

Status: working

TCP 리셋으로 거절할 때에 지난 패킷의 nfmark 값을 새 RST 패킷에 복사하지 마세요.

ip_route_output는 nfmark 라우팅을 제대로 이해해서, 나중에 그 패킷을 다시 라우팅하지 않도록 mangle OUTPUT을 막기위해 mark 값을 바꿀 만큼 똑똑하지 못합니다.

ahesp-static.patch

Status: working

Make the init and fini functions of ipt_ah.c static.

conntrack+nat-helper-unregister.patch

Status: Submitted to the kernel at 2.4.18-pre3 time

ip_{conntrack,nat}_{irc,ftp}.o가 모듈로 컴파일했을 때 helper 등록에 실패하는 사소한 문제들을 바로잡는 패치입니다.

아주 아주 드물게 발생합니다 (어떤 이가 같은 포트 번호로 서로 다른 핼퍼에 등록하려 할 때)

conntrack.patch

Status: Works For Me.

일반적인 conntrack 매치 모듈로, 상태 패치 수퍼셋(superset)입니다. (커널 2.4.18-pre4나 그 이상이 필요합니다)

다중 인터넷 링크나 터널에서 NAT 게이트웨이처럼 복잡한 환경에서 매우 유용하게 쓰이는 추가적인 conntrack 정보를 매칭합니다.

현재 아래 옵션들을 지원합니다:

표 B-1. conntrack options:

optiondesc
[!] --ctstate [INVALID|ESTABLISHED|NEW|RELATED|SNAT|DNAT][,...] State(s) to match
[!] --ctproto proto Protocol to match; by number or name, eg. `tcp'
--ctorigsrc [!] address[/mask] Original source specification
--ctorigdst [!] address[/mask] Original destination specification
--ctreplsrc [!] address[/mask] Reply source specification
--ctrepldst [!] address[/mask] Reply destination specification
[!] --ctstatus [NONE|EXPECTED|SEEN_REPLY|ASSURED][,...] Status(es) to match
[!] --ctexpire time[:time] Match remaining lifetime in seconds against value or range of values (inclusive)

"새로운" SNAT, DNAT 상태는 가상의 것으로 진짜 소스 주소가 응답 목적지와 다르거나 진짜 목적지 주소가 응답 출발지와 다른 경우 매칭합니다.

dscp.patch

Status: Pending for kernel inclusion.

IPv4 패킷에서 DSCP 필드를 검사합니다.

ecn.patch

Status: Pending for kernel inclusion.

IPv4에서 TCP 헤더의 ECN 비트를 검사합니다.

helper.patch

Status: Pending for inclusion after newnat

ipt_helper 모듈은 새로운 매칭 기법을 제공합니다. 동적으로 할당된 연결이라도 특정 conntrack 헬퍼와 관련지어 패킷을 검사할 수 있습니다.

여러분이 ftp 데이터 세션에 속한 모든 패킷을 검사하려 한다면: (오로지 데이터 연결만 원할 뿐, 컨트롤 연결은 필요 없을 때)

iptables -A INPUT -m helper --helper ftp -j ACCEPT

irc-dcc-sessions 에는 irc를 사용하세요.

ipv6-agr.patch.ipv6

Status: It worked w/o problems

EUI64 (MAC 주소로부터 받은) 주소에서 마지막 64 비트와 IPv6 출발지 주소를 비교 검사합니다.

Example:

ip6tables -N ipv6ok
ip6tables -A INPUT -m eui64 -j ipv6ok
ip6tables -A INPUT -s ! 3FFE:2F00:A0::/64 -j ipv6ok
ip6tables -A INPUT -j LOG
ip6tables -A ipv6ok -j ACCEPT

length.patch.ipv6

Status: Should Work.

IPv6 데이터그램 전체 길이를 검사합니다 (IPv6 헤더 + 확장 헤더들을 포함, 그런 것들이 있다면)

--length '!' 기호를 사용할 수 있으며, 0부터 65536 사이 값을 허용합니다 (16진수로 값을 설정할 수도 있습니다)

범위를 지정할 때에 첫번째 값은 최소 길이, 두번째 값은 최대 길이를 제한합니다:

--length '!' 기호를 사용할 수 있으며, 최소값:최대값 형식을 사용하세요. 0부터 65536 사이 값을 허용하며, 최소값이 최대값보다 크면 안됩니다.

예:

# ip6tables -A FORWARD -p udp -m length --length 85:0xffff -j DROP
# iptables -A FORWARD -p udp -m length --length ! :84 -j DROP

(두 예문은 완전히 똑같은 일을 합니다)

범위값을 사용자가 지정하지 않으면: 최소값으로는 0, 최대 값으로는 0xffff을 대체합니다.

nat-memoryleak-fix.patch

Status: Submitted for kernel inclusion at 2.4.19-pre10 time

모듈을 내릴 때 자원을 깨끗이 돌려주지 않는 경우 메모리 청크가 어느 정도 발생하는데, 이 옵션은 iptable_nat load/unload에서 메모리 누수 현상을 바로잡습니다.

ownercmd.patch

Status: Works For Me.

--cmd-owner 옵션으로 여러분 자신만의 프로세스 이름을 사용할 수 있습니다.

이 기능을 이용해 ssh 디먼에 의해 포워드되는 연결들을 필터할 수 있습니다: You can use this feature to filter connections forwarded by

iptables -N CheckSSHSyns
# allow forwarded connections to rsync port on 192.168.1.1
iptables -A CheckSSHSyns -p tcp -d 192.168.1.1 --dport 873 -j RETURN
# refuse everything else
iptables -A CheckSSHSyns -j REJECT --reject-with tcp-reset
iptables -I OUTPUT -p tcp --syn -m owner --cmd-owner sshd -j CheckSSHSyns

pkttype.patch

Status: It works

BROADCAST, MULTICAST 등 "class"에 따라 패킷을 검사합니다.

iptables -A INPUT -m pkttype --pkt-type broadcast -j LOG

z-newnat16.patch

Status: Submitted for 2.4.20-pre1

커널 2.4.19-pre4나 그 이상에서 지원하는 new nat API를 제공합니다.

- H.323, IRC, PPTP 등을 제대로 추적할 수 있습니다.

- timeout를 예정할 수 있습니다.

- NAT 코드에 완전한 SACK 기능을 추가합니다

IPV4OPTSSTRIP.patch

The base/IPV4OPTSSTRIP patch: Status: Works For Me.

패킷에서 IP 옵션을 모두 벗겨낼 수 있는 타깃 모듈 CONFIG_IP_NF_TARGET_IPV4OPTSSTRIP 기능을 추가합니다.

이 타깃은 옵션이 없으며, 따라서 사용법이 무척 쉽습니다:

# iptables -t mangle -A PREROUTING -j IPV4OPTSSTRIP
# iptables -t mangle --list -n
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
IPV4OPTSSTRIP all -- 0.0.0.0/0 0.0.0.0/0
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

NETLINK.patch

Status: Working, will not go into main kernel

넷림크 소켓을 통해 유저스페이스로 드랍된 패킷을 보내는 NETLINK 타깃을 추가합니다(CONFIG_IP_NF_TARGET_NETLINK) ipchains -o 옵션을 대신합니다.

NETMAP.patch

Status: Experimental

nat 테이블에 새로운 타깃을 만듭니다(CONFIG_IP_NF_TARGET_NETMAP 옵션) 호스트 주소는 그대로 둔 채 네트워크 주소만 바꾸는 고정 1:1 매핑을 만듭니다. PREROUTING 체인에 적용해서 들어오는 연결들을 목적지 주소를 바꿀 수 있으며, POSTROUTING 체인이 적용해서 나가는 연결들의 출발지 주소를 바꿀 수 있으며, 둘 다 한꺼번에 바꿀 수도 있습니다.(룰을 구분해서)

Examples:

iptables -t nat -A PREROUTING -d 1.2.3.0/24 -j NETMAP --to 5.6.7.0/24
iptables -t nat -A POSTROUTING -s 5.6.7.0/24 -j NETMAP --to 1.2.3.0/24

REJECT.patch.ipv6

Status: In Development, REQUIRES ipv6-fixes.patch

icmp-type은 icmpv6 형식과 다릅니다. 잊지 마세요. (ip6tables -j REJECT -h 명령으로 더 많은 정보를 볼 수 있습니다)

SAME.patch

The base/SAME patch: Status: In Development/Works For Me

SNAT하고 비슷한 기능을 제공합니다(CONFIG_IP_NF_TARGET_SAME): 주소 범위를(`--to 1.2.3.4-1.2.3.7') 사용하더라도 클라이언트가 한 번 연결되고 나면 똑같은 주소를 가집니다.

--nodst 옵션을 사용하면 새로운 출발지-ip를 선택할 때 목적지-ip를 이용해서 계산하지 않습니다.

주소 하나부터 다중 범위까지 지원합니다.

TTL.patch

The base/TTL patch: Status: Stable, needs new checksum handling

IP 패킷에 TTL 값을 설정하거나 이미 들어 있는 값을 늘이고/줄일 수 있는 CONFIG_IP_NF_TARGET_TTL 옵션을 추가합니다.

ahesp6.patch.ipv6

Status: It works 4 me!

AH나 ESP 헤더를 검사합니다.

표 B-2. AH options:

optiondesc
--ahspi [!] spi[:spi] match spi (range)
--ahlen [!] length total length of this header
--ahres check the reserved filed, too

표 B-3. ESP options:

optiondesc
--espspi [!] spi[:spi] match spi (range)

frag6.patch.ipv6

Status: It works 4 me!

IPv6 패킷의 분절 헤더(fragmentation header) 필드를 기반으로 패킷을 선택합니다.

표 B-4. FRAG options:

optiondesc
--fragid [!] id[:id] match the id (range)
--fraglen [!] length total length of this header
--fragres check the reserved filed, too
--fragfirst matches on the first fragment
[--fragmore|--fraglast] there are more fragments or this is the last one

iplimit.patch

Status: ItWorksForMe[tm]

클라이언트 IP 주소마다 동시에 서버에 연결할 수 있는 숫자를 제한하는 CONFIG_IP_NF_MATCH_IPLIMIT를 추가합니다. (or address block).

Examples:

# 클라이언트마다 텔넷 연결을 둘씩 허용합니다:
iptables -p tcp --syn --dport 23 -m iplimit --iplimit-above 2 -j REJECT

# 같은 규칙을 다른 방법으로:
iptables -p tcp --syn --dport 23 -m iplimit ! --iplimit-above 2 -j ACCEPT

# 24비트 넷매스크를 이용해서,
# http 동시 접속을 16개로 제한
iptables -p tcp --syn --dport 80 -m iplimit --iplimit-above 16 --iplimit-mask 24 -j REJECT

ipt_unclean-ubit.patch

Status: Works for me

사용하지 않는 비트가 조작된 IP로 패킷을 검사하는 unclean 모듈을 제공합니다. 이 오프셋에는 두 필드가 있습니다: 3 bit fragmentation flags 13 bit fragmentation offset

Exerpt from RFC 791:

Flags: 3 bits

Various Control Flags.

표 B-5. unclean bits:

desc
Bit 0: reserved, must be zero Bit 1: (DF) 0 = May Fragment, 1 = Don't Fragment. Bit 2: (MF) 0 = Last Fragment, 1 = More Fragments. 0 1 2 +---+---+---+ | | D | M | | 0 | F | F | +---+---+---+

Ofir Arkin이 "검증되지 않은 필드 - 오늘날 방화벽 & 방화벽 기술에 문제점"에서 설명한 OS fingerprinting 헛점을 이용합니다. 아래 사이트에서 이 글을 읽어볼 수 있습니다: http://www.sys-security.com/archive/papers/Unverified_Fields_1.0.pdf http://www.sys-security.com/archive/papers/Unverified_Fields_1.0.ps

ipv4options.patch

Status: experimental

ip 옵션을 검사하는 CONFIG_IP_NF_MATCH_IPV4OPTIONS 옵션을 추가합니다.

지원하는 옵션들은:

표 B-6. IPv4 options:

optiondesc
--ssrr To match packets with the flag strict source routing.
--lsrr To match packets with the flag loose source routing.
--no-srr To match packets with no flag for source routing.
[!] --rr To match packets with the RR flag.
[!] --ts To match packets with the TS flag.
[!] --ra To match packets with the router-alert option.
[!] --any-opt To match a packet with at least one IP option, or no IP option at all if ! is chosen.

Example:

$ iptables -A input -m ipv4options --rr -j DROP

will drop packets with the record-route flag.

$ iptables -A input -m ipv4options --ts -j DROP

timestamp 플래그를 살펴 패킷을 버립니다.

Bug ? --ts와 --rr을 테스트했지만, 내가 그다지 잘 알지 못하는 소스 라우팅이나 router-alert은 살펴보지 못했습니다. 그러니, 그런 곳에서 제대로 동작하는지 제게 알려주시면.. :)

ipv6header.patch.ipv6

Status: Under development, please test it!

IPv6 패킷의 특별한 헤더를 짝짓습니다. match 모듈의 헬프 메시지에서 리스트를 찾을 수 있습니다.

이 모듈을 사용하는 방법은(e.g.):

ip6tables -t filter -A INPUT -m ipv6header --header frag -j ACCEPT
ip6tables -t filter -A INPUT -m ipv6header --header 44 -j ACCEPT
ip6tables -t filter -A INPUT -m ipv6header --header route --soft -j ACCEPT

syntax: --header [!] headers --soft

지원하는 포맷: hop,dst,route,frag,auth,esp,none,prot hop-by-hop,ipv6-opts,ipv6-route,ipv6-frag,ah,esp,ipv6-nonxt,protocol 0,60,43,44,51,50,59 proto means that the packet has got a protocol payload.

The soft mode means that the packet contains the header.

Warning: 쪼개진 패킷에는 문제가 있습니다! 분절 헤더 다음에 확장-헤더가 있으면 첫번째 분절만 매칭합니다.

mport.patch

Status: It works for me.

멀티포트 매치를 지원합니다. 싱글포트 못지않게 바이트 범위도 잘 다룹니다.

Examples:

# iptables -A FORWARD -p tcp -m mport --ports 23:42,65

15포트까지 지원합니다. 포트범위는 콜론과 포트 값 둘을 사용합니다.

nth.patch

Status: Works For Me.

N번째 패킷마다 규칙을 적용하는 CONFIG_IP_NF_MATCH_NTH 옵션을 추가합니다. 여러분이 사용할 수 있는 열 여섯가지 서로 다를 카운터가 있습니다.

다음 두 가지 방법 가운데 하나를 사용합니다.

1) N번째 패킷마다, N번째 패킷만을 매치

example:

iptables -t mangle -A PREROUTING -m nth --every 10 -j DROP

열 번째 패킷마다 버립니다.

2) 매 패킷마다 다른 룰을 적용합니다. 이 트릭은 인바운드와 아웃바운드 양 쪽에 로드밸런싱하는 쉽고도 간단한 방법입니다.

example:

iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 0 -j SNAT --to-source 10.0.0.5
iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 1 -j SNAT --to-source 10.0.0.6
iptables -t nat -A POSTROUTING -o eth0 -m nth --counter 7 --every 3 --packet 2 -j SNAT --to-source 10.0.0.7

이 예문에서는 SNAT 주소 셋 사이에서 접속들을 분산합니다.

mangle 테이블과 iproute2를 이용한 복잡한 로드밸런싱이 많이 알려진 방법입니다. 다들 그렇게 하지요. 창조적으로 활용해보세요.

지원하는 옵션은:

표 B-7. nth options:

optiondesc
--every Nth N번째 패킷마다
[--counter] num 0부터 15 사이 카운터를 사용합니다.(default:0)
[--start] num 0 대산 다른 숫자로 카운터를 초기화합니다. 0부터 N-1 사이여야합니다.
[--packet] num 'num' 패킷을 매치합니다. 0 부터 N-1 사이 --packet이 카운터에 쓰이면 0부터 N-1 사이 값들을 모두 통틀어 커버하는 N번째 --packet 룰이 반드시 있어야 합니다.

opts6.patch.ipv6

Status: It works 4 me!

IPv6 패킷에서 옵션 헤더에 있는 필드들을 기반으로 패킷을 선택합니다.

표 B-8. HBH options:

optiondesc
--hbh-len [!] length 헤더의 총 길이
--hbh-opts TYPE[:LEN][,TYPE[:LEN]...] 옵션들과 그 길이

표 B-9. DST options:

optiondesc
--dst-len [!] length total length of this header
--dst-opts TYPE[:LEN][,TYPE[:LEN]...] Options and its length (list, max: 16)

pool.patch

Status: Development: please tell me if and where I fucked up on the locks.

어떤 IP 주소 범위로부터 주소당 한 비트씩 비트맵을 사용할 수 있게 하는 매치입니다; 풀(pool)에 출발지나 목적지 비트가 들어 있는지지 검사합니다. 풀에 패킷 주소를 보태거나 없앨 때 사용하는 POOL 타깃이 추가됩니다.

풀/풀의 범위를 규정하는 ippool(8) 프로그램도 컴파일해 넣어야합니다.

psd.patch

Status: Experimental

포트 스캔 탐지(PSD:port scan detection) 옵션을 추가합니다. TCP/UDP 포트 스캔을 탐지합니다. 이 매치는 Solar Designer의 scanlogd로부터 파생되었습니다.

지원되는 옵션은:

표 B-10. psd options:

optiondesc
--psd-weight-threshold <threshold> 최근 TCP/UDP 패킷에 모든 비중을 둡니다.
--psd-delay-threshold <delay> 100초 단위로 지연시간을 둡니다.
--psd-lo-ports-weight <weight> 1024이하 포트(privileged destination port)에 비중을 둡니다.
--psd-hi-ports-weight <weight> 1024보다 큰 포트에 비중을 둡니다.

quota.patch

Status: worksforme

패킷마다 바이트 카운터를 줄여가는 방법으로 사용량을 할당합니다.

옵션은:

--quota <bytes> 바이트 단위로

random.patch

Status: Works For Me.

주어진 확률에 따라 되는 대로 패킷에 규칙을 적용합니다.

옵션은:

[--average] percent 확률, 기본값은 50%

realm.patch

Status: Experimental

realm match: 패킷 분류하는 realm 키를 이용해 라우팅을 결정할 수 있습니다.

/** 패킷 분류 문서에서 발췌 */

Y를 선택하면 realm 키에 따라 나가는 패킷들을 분류해서 정해진 규칙에 따라 라우팅합니다. 잘 모르겠으면 Y

/** 끝 **/

# Example
# 라우트 추가
/sbin/ip route add 194.29.194.0/24 via 194.29.192.1 realm 10
# source realm is in realm with mask 0xFFFF0000,
# destination is in realm with mask 0x0000FFFF
# match destination realm
/usr/local/sbin/iptables -A OUTPUT -m realm --realm 10 -j LOG
# match realm of source, this is also determinated by routing,
/usr/local/sbin/iptables -A INPUT -m realm --realm 655360 -j LOG

CONFIG_NET_CLS_ROUTE가 꼭 필요합니다.

route6.patch.ipv6

Status: It works 4 me!

IPv6 패킷에서 라우팅 헤더의 필드를 기반으로 패킷을 선택하는 확장된 짝짓기('rt')를 지원합니다.

표 B-11. RT options:

optiondesc
--rt-type [!] type match the type
--rt-segsleft [!] num[:num] match the Segments Left field (range)
--rt-len [!] length total length of this header
--rt-0-res check the reserved filed, too (type 0)
--rt-0-addrs ADDR[,ADDR...] Type=0 addresses (list, max: 16)
--rt-0-not-strict List of Type=0 addresses not a strict list

time.patch

Status: It Works For Me.

패킷이 도착하거나 출발한 시간을 따져서 필터링합니다. (넷필터가 돌고 있는 동안 머신에 도착한 시간과 패킷이 로컬에서 생성된 시간)

옵션은:

표 B-12. Time options:

optiondesc
--timestart HH:MM 매칭 시작점
--timestop HH:MM 멈추는 시간
--days Tue,Mon... 빈 칸 없이 요일을 쓰며, 쉼표로 구분합니다. (Sun,Mon,Tue,Wed,Thu,Fri,Sat)

Example:

-A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri

월요일부터 금요일 사이에, 8:00->18:00 안에 도탁한 패킷들에 규칙을 적용

-A OUTPUT -m time --timestart 8:00 --timestop 18:00 --Days Mon

월요일 8:00->18:00 사이에 로컬에서 생성된 패킷들에 규칙을 적용

CONNMARK.patch

Status: working

커넥션마다 표시를 달아 CONNMARK 타깃에서 이용합니다.

Usage:

표 B-13. CONNMARK options:

optiondesc
connmark 커넥션과 연관된 netfilter mark 필드를 이용합니다 (아래에서 설명하는 CONNMARK 타깃을 이용할 수 있도록)
--mark value[/mask] 부호 없는 마크 값을 이용해 커넥션들 안에서 패킷을 찾아냅니다 (매스크가 지정되었다면 논리연산 AND를 먼저 적용합니다)
CONNMARK mark 값을 지정하는데 이용합니다.
--set-mark mark 커넥션 마크를 답니다
--save-mark Set connection mark to the same as the one on the packet
--restore-mark 커넥션과 관련된 패킷에 넷필터 Set the netfilter packet mark value to the one associated with the connection. This is only valid in the mangle table.

ROUTE.patch

Status: In Development/Works for me

이 옵션은 받은 패킷을 특정한 인터페이스로 직접 재발송(resend)하는 'ROUTE' 타깃을 추가합니다. 패킷 IP 주소가 라우터 자신이 가진 것들 가운데 하나이더라도 패킷을 지정한 인터페이스를 통해 재발송합니다. 그런 패킷들은 로컬에서 받은 다음 일반적인 라우팅 메커니즘을 통해서는 다른 컴퓨터에 전달(forward)할 수 없는 것들입니다.

표 B-14. ROUTE options:

optiondesc
--iface name 지정한 이름을 가진 인터페이스로 패킷을 직접 보냅니다
--ifindex index 인터페이스 인덱스를 통해 패킷을 직접 보냅니다

Example : 여러분 네트워크 안쪽에 ssh 서버를 설치하고 라우터에 둔 것처럼 보이기를 원한다면 라우터와 같은 IP에 목적지 포트 22를 향하는 패킷들을 단순히 reroute 합니다.

# iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 22 -j ROUTE --iface tunl1
# iptables -A PREROUTING -t nat -i tunl1 --j ROUTE --iface eth0

eggdrop-conntrack.patch

Status: Development

eggdrop 보트를 추적합니다.

h323-conntrack-nat.patch

Status: Alpha

NAT 안에서도 H.323/netmeeting을 지원합니다. H.323은 다음 데이터 스트림을 사용합니다:

표 B-15. H.323 data streams:

portdesc
389 Internet Locator Server (TCP)
522 User Location Server (TCP)
1503 T.120 Protocol (TCP)
1720 H.323 (H.225 call setup, TCP)
1731 Audio call control (TCP)
Dynamic H.245 call control (TCP)
Dynamic RTCP/RTP streaming (UDP)

H.323 conntrack/NAT 모듈은 다이나믹 포트를 찾는 데이터 스트림을 추적해서 연결합니다. 헬퍼는 2.2 커널 시리즈의 ip_masq_h323.c 모듈에서 검색/치환 부분을 해크했습니다.

최소한 H.323/netmeeting (video/audio)는 1720 포트를 통해 통제되며 H.323 모듈을 불러들입니다. At the very minimum,

H.323 conntrack/NAT 모듈은 H.245 tunnelling, H.225 RAS (gatekeepers)는 지원하지 않습니다.

nfnetlink-ctnetlink-0.11.patch

Status: Under development, but stabilizing now.

..

pptp-conntrack-nat.patch

Status: Beta

NAT 안에서 PPTP 연결을 추적합니다.

PNS로부터 PAC로 향하는 연결만 NAT할 수 있으며, 한 세션 안에서 다중 호출은 지원하지 않습니다.

recent.patch

Status: Tested locally, no problems so far.

최근에 보았던 IP 주소에 대해 하나, 혹은 그 이상 목록을 만들고 그 목록을 이용해 매칭합니다.

표 B-16. recent options:

optiondesc
--name 명령에서 사용할 리스트를 지정합니다. 아무 이름도 없으면 'DEFAULT'가 쓰입니다
--set '!'를 사용할 수 있습니다. 리스트에 패킷의 출발지 주소를 추가합니다. 출발지 주소가 이미 있다면, 그 값을 새로 고칩니다. 따라서 항상 성공값을 리턴합니다
--rcheck '!'를 사용할 수 있습니다. 패킷의 출발지 주소가 현재 리스트에 들어 있다면 true 값을 리턴하고, 아니라면 false 값을 리턴합니다.
--update '!'를 사용할 수 있습니다. 패킷의 소스 주소가 현재 리스트에 들어 있는지 체크합니다. 리스트에 들어 있다면 업데이트하고 true 값을 리턴합니다. 출발지 주소가 리스트에 없다면 false 값을 리턴합니다.
--remove '!'를 사용할 수 있습니다. 패킷의 소스 주소가 현재 리스트에 들어 있는지 체크합니다. 리스트에 들어 있다면 지워버립니다.
--seconds '!'를 사용할 수 있습니다. 'rcheck'나 'update' 와 조합하여 사용해야 합니다. 리스트에 그 주소가 들어 있고 마지막으로 주어진 초(seconds)가 경과하지 않을 때에만 짝짓습니다.
--hitcount '!'를 사용할 수 있습니다. 'rcheck'나 'update' 와 조합하여 사용해야 합니다. 그 주소가 리스트에 들어 있고, 받은 패킷이 주어진 값보다 크거나 같을 때에만 짝짓습니다. 이 옵션은 'seconds'과 조합하여 정해진 시간 안에 정확하게 필요한 히트 값만큼만 짝지어서, 더욱 정밀하게 적용할 수 있습니다.
--rttl '!'를 사용할 수 있습니다. 'rcheck'나 'update' 와 조합하여 사용해야 합니다. 그 주소가 리스트에 들어 있고, 현재 패킷의 TTL 값이 --set 룰에서 지정한 패킷과 일치할 때에만 짝짓습니다. 만약 여러분의 머신을 통해 다른 누군가를 DoS 공격할 목적으로 자신의 출발지 주소를 속여서 엉터리 패킷을 보내는 이들이 있다면 이 모듈로 보내버립시다.
--rsource recent 리스트 페이블에 있는 패킷마다 소스 주소를 저장합니다.
--rdest recent 리스트 페이블에 있는 패킷마다 목적지 주소를 저장합니다. /proc/net/ipt_recent는 현재 활성화된 리스트를 담고 있는 디렉토리입니다. /proc/net/ipt_recent/* 현재 주소와 각 리스트의 엔트리에 대한 정보 목록입니다. /proc/net/ipt_recent/ 안에 있는 각 파일들은 현재 리스트를 보기위해 읽거나 목록을 고치기 위해 다음 두 명령을 사용해 쓸 수 있습니다: 'echo xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT'나 'echo +xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT' 는 DEFAULT 리스트에 추가하는 명령입니다. 'echo -xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT'은 DEFAULT 리스트로부터 제거하는 명령, 'echo clear > /proc/net/ipt_recent/DEFAULT'는 DEFAULT 리스트를 비워내는 명령입니다.

recent 모듈은 스스로 두 가지 패러미터를 허용합니다:
   ip_list_tot=100
   ip_pkt_list_tot=10
   ip_list_hash_size=0
   debug=0
   

위 값들은 디폴트 값입니다. ip_list_tot는 기억할 최대 주소 수인데, 크기를 적절히 조절해야 합니다. 리스트는 짝지으려 할 때마다 차례로 검색됩니다. 이 값을 지나치게 늘이면 리스트 뒤지는데 많은 시간을 허비하므로 좋지 않습니다.

ip_pkt_list_tot는 각 주소가 기억될 패킷의 수입니다. 이 리스트는 '--hitcount'에서만 사용되므로 굳이 이 값을 늘이지 않더라도 기본값으로 충분할 것입니다.

ip_list_hash_size는 해시 테이블 크기입니다(테이블 위치, 바이트가 아님).

debug는 디버깅 메시지를 보여주기 위한 설정입니다. 아직 여러 레블로 세분되지 않았으며, 0은 전혀 없음, 1은 모두 다를 뜻합니다. 상용 머신에서는 1을 사용하지 마세요. 곧 로그로 꽉 차버립니다.

Example #1:

# iptables -A FORWARD -m recent --rcheck --seconds 60 -j DROP
# iptables -A FORWARD -i eth0 -d 127.0.0.0/8 -m recent --set -j DROP

eth0 인터페이스 127.0.0.0/8로 데이터를 보내려하는 (정상적인 경우 절대 일어날 수 없는 일이지요) 어떤 '나쁜 녀석'을 몰아내는 룰입니다. 첫 패킷이 첫번째 룰에서 수상쩍은 놈으로 체크되고 두번째 룰에서 붙들려서 그 주소는 recent 리스트에 들어간 다음 패킷이 드랍됩니다.

그 주소로부터 다음 60초 동안 뒤이은 패킷들은 목적지 주소나 포트, 기타 무엇과도 상관없이 모두 버려집니다.

Example #2:

# iptables -A FORWARD -m recent --update --seconds 60 -j DROP
# iptables -A FORWARD -i eth0 -d 127.0.0.0/8 -m recent --set -j DROP

(글쓴이가 가장 좋아하는 룰..)

이 룰은 모든 이 소스 주소로부터 받은 후속 패킷들의 'last seen' 상태값이 테이블에서 업데이트되는 것을 제외하고는 예제 #1과 같습니다. 그러므로 이 주소로부터 오는 패킷들은 아무리 중요한 것들이라 하더라도 60초가 지나기 전에는 '침묵'할 것입니다.

글쓴이의 의도는 모든 'DROP'룰을:

'-m recent --set -j DROP'

그리고:

'-m recent --update --seconds 60 -j DROP'

룰로 바꾸는 것입니다. 그 이전에 다음: rule be added very early on in the rule set, though following any:

'--match state --state ! NEW,INVALID -j ACCEPT'

룰 등이 있다 하더라도. '--update'룰이 ! NEW,INVALID 체크에 앞서면 ESTABLISHED 커넥션이나 그런 ESTABLISHED와 짝인 프로세스들이 자신의 소스 주소를 조작할 수 있는 악당들에 의해 어지럽혀질 수 있습니다.

rsh.patch

Status: request for inclusion

RSH 커넥션을 추적합니다. 주의: 2.4.18, 2.4.19 커널에서 RSH 패치를 포함하면 컴파일할 때 오류가 발생할 수 있습니다.

RSH 커넥션 트래커는 일반적인 RSH 세션에서 "Server to Client" 커넥션 동적 표준 에러가 발생하였을 때 필요합니다. 전형적인 수순은 다음과 같습니다;

   Client 0:1023 --> Server 514    (stream 1 - stdin/stdout)
   Client 0:1023 <-- Server 0:1023 (stream 2 - stderr)
   

이 커넥션 트래커는 새 RSH 세션을 인지하고, 나가는 세션을 상세하게 추출해서, "관련" 세션을 처리중인 넷필터에게 알립니다.

Usage:

다음 룰셋은 이 모듈 사용법을 설명하기 위한 것입니다;

# New session from client to server (stream 1)
-A PREROUTING -t nat -m state -i eth0 -p tcp -s ${client} --sport 0:1023 -d ${server} --dport 514 --state NEW,ESTABLISHED -j ACCEPT
# Continued session from server to client (stream 1)
-A PREROUTING -t nat -m state -i eth1 -p tcp -s ${server} --sport 514 -d ${client} --dport 0:1023 ! --syn --state ESTABLISHED -j ACCEPT
# New session from server to client (stream 2)
-A PREROUTING -t nat -m state -i eth1 -p tcp -s ${server} --sport 0:1023 -d ${client} --dport 0:1023 --state RELATED,ESTABLISHED -j ACCEPT
# Continued session from client to server (stream 2)
-A PREROUTING -t nat -m state -i eth0 -p tcp -s ${client} --sport 0:1023 -d ${server} --dport 0:1023 ! --syn --state ESTABLISHED -j ACCEPT

Warning:

이 모듈은 위험할 수 있습니다.

string.patch

Status: Working, not with kernel 2.4.9

전체 패킷에서 문자열을 검색합니다.

예문:

${IPTABLES} -A INPUT -p tcp --tcp-flags ACK ACK --dport 80 -m string --string "/default.ida?" -j REJECT --reject-with tcp-reset

cod red 웜을 걸러내는 룰입니다.

커널 2.4.9에서는 동작하지 않습니다 !!!

talk-conntrack-nat.patch

Status: Alpha

NAT 안에서 talk를 지원합니다.

기본값으로 talk (UDP port 517)와 ntalk/ntalk2 (UDP port 518)를 둘 다 지원합니다. talk/ntalk/ntalk2는 ip_conntrack_talk과 ip_nat_talk 모듈의 패러미터를 조정해서 선택적으로 지원할 수 있습니다:

talk=0|1, ntalk=0|1, ntalk2=0|1

'0'은 '지원하지 않음', '1'은 '지원함'

tcp-window-tracking.patch

Status: proven to be quite stable, but still experimental Status: ported to newnat, needs testing.

Guido van Rooij [1]가 쓴 'Real Stateful TCP Packet Filtering in IP Filter' 기사에 따른 TCP 연결 추적을 위한 패치입니다. 이 패치에는 이미 연결이 확립된 커넥션을 다루기 위한 새로운 TCP 연결 추적 코드를 포함하고 있습니다. TCP 윈도우 크기 조정도 지원합니다.

넷필터에 들어 있는 vanilla TCP 연결 추적과 비교해서 다른 점들은:

- CLOSE_WAIT 상태를 위한 타임아웃 기본값이 3일로 늘어났습니다.

- /proc/sys/net/ipv4/netfilter/ 아래 많은 패러미터들로 엔진을 세세하게 조율할 수 있습니다:

표 B-17. tcp-window-tracking options:

optiondesc
ip_conntrack_*_timeout*초단위로 지정하는 conntrack 타임아웃
ip_conntrack_max최대 conntrack 엔트리 수
ip_conntrack_tcp_be_liberal활성화되면 윈도우 리셋 (RST) 세그먼트를 벗어난 패킷에만 INVALID 표시를 답니다; 기본값은 disable인데, 윈도우 크기를 벗어난 모든 패킷에 INVALID 표시를 답니다.
ip_conntrack_tcp_log_invalid_scale무효한 윈도우 스케일링 값을 가진 패킷을 기록합니다(기본값 enable)
ip_conntrack_tcp_log_out_of_window윈도우 크기를 벗어난 패킷을 기록합니다((기본값 enable)
ip_conntrack_tcp_loose이 값이 0이면(기본값은 3) 이미 연결된 커넥션을 픽업할 수 없습니다.
ip_conntrack_max_retrans목적지로부터 ACK 패킷을 받지 못한 패킷들을 재전송하는 횟수를 정합니다. 재전송 횟수가 여기서 지정한 값에 다다르면(기본값은 3)
ip_conntrack_timeout_max_retrans재전송 타임아웃입니다. 기본값은 5분

- 주의!!! /proc/sys/net/ipv4/ip_conntrack_max는 /proc/sys/net/ipv4/netfilter/ip_conntrack_max로 바뀌었습니다. 여러분 스크립트를 이 패러미터에 맞추어 손보세요!!!

[1] http://www.iae.nl/users/guido/papers/tcp_filtering.ps.gz

tftp-conntrack-nat.patch

The extra/tftp-conntrack-nat patch:

TFTP는 NAT 안에서 연결할 수 없는데 이 모듈을 쓰면 가능합니다.

modprobe ip_conntrack_tftp ports=69,70 명령은 tftp 커넥션에 포트 69와 70을 사용한다는 뜻입니다. 패러미터가 없으면 기본값은 69입니다.

If you have trouble please drop me a mail and I will help you.

모든 설정을 마치면 Rusty가 환영 메시지와 여러분 시스템에 패치된 리스트를 모두 출력합니다. 이제 엔터키만 누르면 길고 지루했던 Patch-o-matic 패치가 끝납니다.

Welcome to Rusty's Patch-o-matic!

Each patch is a new feature: many have minimal impact, some do not. Almost every one has bugs, so I don't recommend applying them all!
Already applied: submitted/2.4.18
                 submitted/DSCP
                 submitted/ECN
                 submitted/REJECT-dont_fragment
                 submitted/REJECT_mark
                 submitted/TOS-oops-fix
                 submitted/ahesp-static
                 submitted/arptables
                 submitted/config-cleanup
                 submitted/conntrack+nat-helper-unregister
                 submitted/conntrack
                 submitted/dscp
                 submitted/ecn
                 submitted/helper
                 submitted/ip6tables-export-symbols
                 submitted/ip_conntrack_protocol_destroy
                 submitted/ip_conntrack_protocol_unregister
                 submitted/ip_nat_irc-srcaddr-fix
                 submitted/ipt_MIRROR-ttl
                 submitted/ipt_REJECT-checkentry
                 submitted/ipt_unclean-ecn
                 submitted/irc-dcc-mask
                 submitted/local-nat
                 submitted/macro-trailing-semicolon-fix
                 submitted/mangle5hooks
                 submitted/nat-export_symbols
                 submitted/nat-memoryleak-fix
                 submitted/netfilter-arp
                 submitted/ownercmd
                 submitted/pkttype
                 submitted/skb_clone_copy
                 submitted/ulog-module-unload
                 submitted/z-newnat16
                 base/IPV4OPTSSTRIP
                 base/NETLINK
                 base/NETMAP
                 base/SAME
                 base/TTL
                 base/iplimit
                 base/ipt_unclean-ubit
                 base/ipv4options
                 base/mport
                 base/nth
                 base/pool
                 base/psd
                 base/quota
                 base/random
                 base/realm
                 base/time
                 extra/ROUTE
                 extra/h323-conntrack-nat
                 extra/pptp-conntrack-nat
                 extra/recent
                 extra/rsh
                 extra/string
                 extra/talk-conntrack-nat
                 extra/tcp-window-tracking
                 extra/tftp-conntrack-nat
No more patches to apply! Q to Quit or ? for options [Q/a/r/b/?] 
Script done on Mon Sep  9 15:58:32 2002

패치를 마친 다음에는 커널을 새로 컴파일하고, iptables 소스 디렉토리에서 make && make install 명령으로 iptables 도구들을 설치합니다.