IPNAT(5)

명칭
ipnat, ipnat.conf - IP NAT 파일의 형식

해설
ipnat 가 받아들이는 파일의 형식은, 이하의 문법으로 기술되는 것입니다.

ipmap :: = mapblock | redir | map .
map ::= mapit ifname ipmask "->" dstipmask [ mapport ] .
map ::= mapit ifname fromto "->" dstipmask [ mapport ] .
mapblock ::= "map-block" ifname ipmask "->" ipmask [ ports ] .
redir ::= "rdr" ifname ipmask dport "->" ip [ "," ip ] rdrport options .
dport ::= "port" portnum [ "-" portnum ] .
ports ::= "ports" numports | "auto" .
rdrport ::= "port" portnum .
mapit ::= "map" | "bimap" .
fromto ::= "from" object "to" object .
ipmask ::= ip "/" bits | ip "/" mask | ip "netmask" mask .
dstipmask ::= ipmask | "range" ip "-" ip .
mapport ::= "portmap" tcpudp portnumber ":" portnumber .
options ::= [ tcpudp ] [ rr ] .
object  = addr [ port-comp | port-range ] .
addr    = "any" | nummask | host-name [ "mask" ipaddr | "mask" hexnumber ] .
port-comp = "port" compare port-num .
port-range = "port" port-num range port-num .
rr ::= "round-robin" .
tcpudp ::= "tcp" | "udp" | "tcp/udp" .
portnumber ::= number { numbers } | "auto" .
ifname ::= 'A' - 'Z' { 'A' - 'Z' } numbers .
numbers ::= '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' .

이것에 가세해# 는 코멘트의 개시로서 사용되어 NAT 룰과 함께 줄 끝에 등장하는 (전술)인가, 그 만큼의 행에 등장합니다. 공행은 무시됩니다.

표준적인 NAT 기능에서는, 하나의 룰은 map 로 시작되어, 그 후에 인터페이스의 지정이 계속됩니다. 그 인터페이스로부터 패킷이 나갈 때에 소스 주소를 고쳐 쓸 수 있습니다.

고쳐 쓸 수 있는 패킷의 선택은, 원래의 소스 주소와의 조합만으로 행해집니다. IP 주소의 지정에는 넷 마스크를 지정할 필요가 있습니다.

원래의 주소와 옮겨놓을 수 있는 주소는, IP번호/넷 마스크의 조로부터 선택됩니다. 모두 1 의 넷 마스크는, 호스트명이 올바른 일을 나타냅니다. 1 이 31 개로부터 되는 넷 마스크 (255.255. 255.254)는, 브로드캐스트 주소와 네트워크 주소를 취한 후에 호스트 IP 번호를 할당한다 여유가 없기 때문에, 올바르지 않다고 보여집니다.

TCP 패킷과 UDP 패킷의 재MAP 시에는, 소스 포트 번호의 변경 도 가능합니다. TCP, UDP 패킷 다 같이, 각각의 규칙으로 선택이 가능합니다. 이것들은, 규칙의 뒤에 재MAP처의 포트 번호의 범위를, port-number:port-number 의 형식에서 지정합니다.

명령
IP 필터의 NAT 코드가 인식하는 명령이 4 개 있습니다:

map 주소 혹은 네트워크 하나를, 통제 없음의 라운드로빈법으로 다른 주소에 사상할 경우에 이용합니다.

rdr 어느 IP 주소와 포트의 조로부터 다른 조에, 패킷을 리디렉트 한다 때에 이용합니다.

bimap
    외부 IP 주소와 내부 IP 주소와의 사이에 쌍방향 NAT 를 설정할 경우에 이용합니다.

map-block
    IP 주소에 근거하는 정적인 변환을 설정합니다. 주소를 좁혀, 목적의 범위에 들어가도록(듯이) 변환하는 알고리즘에 근거하는 것입니다.

조합 처리

기본적인 NAT 기능과 패킷의 리디렉트에 대해서는, 프로토콜과 함께 변경 가능성이 있는 주소를 이용해, 어느 패킷을 변경하지 않으면 안 되는가 제발을 체크합니다. 각각의 규칙의 것 "->" 의 좌변은, 그 규칙의 패킷조합 처리 부분입니다.

패킷의 조합 처리는, 보다 복잡한 비교가 가능한 것 같게 확장되었습니다. 변환되는 주소 부분에 있어서는, IP 주소와 포트 번호의 비교는, ipf 로 사용 가능한 식을 사용 가능합니다. 단순한 NAT 룰은 다음과 같이 기술 가능합니다:

map de0 10.1. 0.0/16 -> 201.2. 3.4/32

또는

map de0 from 10.1. 0.0/16 to any -> 201.2. 3.4/32

IP 주소와 포트 번호만, 비교 대상으로 할 수 있습니다. 이것은, 모든 NAT 룰로 사용 가능합니다.

변환 처리

"->" 의 우변은, 그 이전의 제약 조건과의 조합이 이미 성공하고 있는 경우에, 그 패킷에 기입해지는 주소와 포트를 지정하는 부분입니다. 리디렉트의 경우 (rdr)가 가장 단순합니다. 새로운 목적지 주소를 그 중에 지정합니다. map 규칙에 대해서는, 목적지 주소는, 새로운 주소 의 조 (소스와 목적지)가 일의적이다라고 알려져 있는 주소 (이)가 됩니다. 패킷이 TCP 나 UDP 패킷의 경우, 목적지 포트와 소스 포토도 이 등식에 포함합니다. 주소의 조가 이미 존재하는 경우, IP 필터는, 우선 portmap 로 지정한 유효 범위내에서 포트 번호를 1 개 늘립니다. 그렇게 해서도 일의적인 주소의 조를 얻을 수 없는 경우, 지정된 넷 마스크의 범위내에서 소스 주소를 1 개 늘립니다. 일의적인 주소의 조를 결코 얻을 수 없다 경우, 패킷은 변환되지 않습니다. map-block 에서는, 신규 주소의 조, 프리인 주소의 조, 일의적인 주소의 조를 검색하는 사용 방법이 보다 한정 됩니다. 여기에서는, 포트의 유효 범위에 가세해, 새로운 소스 주소를 무엇으로 할까를 결정하는 알고리즘을 사용합니다. IP 주소는 결코 변경되지않고, 포트 번호도 할당할 수 있었던 범위를 넘는 것은 변경되지 않습니다.

커널 프록시

IP 필터에는, 커널에 로드 되는 코드안에 짜넣어진 단순한 프록시가 몇개인가 붙어 옵니다. 이것에 의해, 패킷을 유저 프로그램을 통하게 한 하지않고서 2 번째의 채널을 열어 두는 것이 가능해집니다.

투과형 프록시

진정한 투과형 프록시 처리 (transparent proxying)는, 실제의 발신기지와 connection의 주소를 결정하기 (위해)때문에, /dev/ipnat 경유로 검색을 행하는 프록시 프로그램을 이용해, localhost (127.0. 0.1)의 포트에 대응 붙이는 리디렉트 (rdr) 규칙을 이용해 행할 필요가 있습니다.

load sharing

rdr 와 조합해 2 개의 옵션을 사용 가능합니다. 이것에 의해, 원시적인라운드로빈베이스의 load sharing를 서포트합니다. 최초의 옵션은, rdr 용으로 2 번째의 종점을, 다음과 같이 지정합니다:

rdr le0 203.1. 2.3/32 port 80 -> 203.1. 2.3, 203.1. 2.4 port 80 tcp

이것에 의해, 203.1. 2.3 으로 203.1. 2.4 에 교대로 접속을 보냅니다. 보다 많은 서버에 부하를 분산하고 싶은 경우에는, 다음과 같이 합니다:

rdr le0 203.1. 2.3/32 port 80 -> 203.1. 2.3, 203.1. 2.4 port 80 tcp round-robin
rdr le0 203.1. 2.3/32 port 80 -> 203.1. 2.5 port 80 tcp round-robin

이 경우, 접속은 203.1. 2.3 에 우선 향할 수 있어 다음에 203.1. 2.4 로 향해져 그리고 203.1. 2.5 로 향해져 마지막에 203.1. 2.3 으로 돌아옵니다. 이것을 실현할 때, 필요에 따라서 자동적으로, 룰이 리스트의 선두로부터 제거되어 마지막에 추가됩니다. 이것은,"ipnat -l" 를 사용한 룰 표시에는 영향을 주지 않고, 내부적인 적용 순서에게만 영향을 줍니다.

사용예

본섹션에서는, map 명령와 그 변형을 취급합니다.

ppp0 인터페이스 경유로, 내부에서 사용하는 IP 번호가 네트워크 10 의 패킷을, ISP (인터넷 서비스 프로바이더)가 제공해 주었다 209.1. 2.0 (8 비트 서스네트워크)으로 변경하는 경우, 이하의 규칙을 사용합니다.

map ppp0 10.0. 0.0/8 -> 209.1. 2.0/24

여기서, 16,000,000 개 이상의 IP 주소를 254 개에 좁히려고 하는 것 하지만 문제인 것은 분명하겠지요. 스코프를 펼치기 위해서(때문에), TCP 와 UDP 에 대해서는 포트재MAP를 사용할 수도 있습니다.

map ppp0 10.0. 0.0/8 -> 209.1. 2.0/24 portmap tcp/udp 1025:65000

이것으로, 네트워크 10 으로 이용 가능한 공간 가운데, 부족분은 ``주소'' 527,566 개분만으로 됩니다. 이러한 규칙을 결합시킨다고 하면(자), 이하의 것 인 지정이 필요합니다.

map ppp0 10.0. 0.0/8 -> 209.1. 2.0/24 portmap tcp/udp 1025:65000
map ppp0 10.0. 0.0/8 -> 209.1. 2.0/24

이것으로, TCP/UDP 패킷의 모든 것은 포트 MAP가 행해져 IP 주소 만이 변경되는 것은 ICMP 등 다른 프로토콜만됩니다.

관련 파일
/dev/ipnat
/etc/services
/etc/hosts

관련 항목
ipnat(4), hosts(5), ipf(5), services(5), ipf(8), ipnat(8)