LIBALIAS(3)

명칭
libalias - 스카레이드 및 네트워크 어드레스 변환용 패킷 앨리어싱(aliasing) 프로그램 라이브러리

서식
<sys/types.h> <netinet/in.h> <alias.h>

함수의 prototype는, 이 텍스트의 본문으로 소개합니다.

해설
libalias 프로그램 라이브러리는, IP 패킷의 앨리어스(alias) 및 앨리어스(alias) 해제용의 함수군이며, 가면 및 네트워크 어드레스 변환 (NAT)을 목적으로 하고 있습니다.

이 프로그램 라이브러리는, IP 의 로컬 네트워크 주소의 변환 및 변환 처리 서포트용으로 디자인된 함수입니다. 로컬 네트워크의 미등록의 IP 주소로부터 발신하는 패킷은, 액세스 가능한 IP 주소로부터 왔는지와 같이 가장할 수가 있습니다. 밖으로부터 들어 오는 패킷에 대해서는, 로컬 네트워크상의 올바른 머신에 보내지는 듯 앨리어스(alias) 해제됩니다.

패킷 앨리어싱(aliasing) 엔진에는, 어느 정도의 유연성이 짜넣어지고 있습니다. 무엇보다 간단한 조작에서는, 로컬 네트워크 주소와 패킷 앨리어스(alias) 호스트와의 사이에 다대 1 대응부가 행해집니다. 이것은 가장 IP 로서 알려져 있는 것입니다. 더욱, 로컬 주소와 확성 장치의 사이에서의 1 대 1 대응부도 실장하는 것이 가능해, 정적 NAT 로서 알려져 있습니다. 이러한 사이에는, 다른 개인 주소의 그룹을 각각 다른 확성 장치에 링크 시킬 수가 있어 그 중에는 뚜렷한 다대 1 대응이나 몇개인가 볼 수 있습니다. 더욱, 확성 장치 및 포트는 고정적으로 개인 주소 및 포트에 리디렉트 시킬 수가 있습니다.

패킷 앨리어싱(aliasing) 엔진은, 커널 외부의 유저 공간에서 작용하도록(듯이) 설계되고 있어 그 때문에 사적인 커널 데이터 구조에의 액세스는 불필요합니다. 다만, 원시 코드는 커널 환경에 짜넣을 수가 있습니다.

초기화와 제어
2 개(살)의 특수한 함수, PacketAliasInit() 및 PacketAliasSetAddress() (은)는, 패킷 조작이 완료하기 전에 부를 필요가 있습니다. 또, 패킷 앨리어싱(aliasing) 엔진의 조작 모드에 대해 PacketAliasSetMode() 호출에 의해 커스터마이즈 할 수 있습니다.

void PacketAliasInit(void)

이 함수에는 인수가 없고, 또 반환값도 없습니다. 내부 데이터 구조의 초기화에 사용됩니다. 이하에 나타내는 모드 비트는 PacketAliasInit() 의 호출 후, 반드시 세트 됩니다. 이러한 모드 비트의 의미에 대해서는, 후술의 PacketAliasSetMode() (을)를 참조해 주세요.
PKT_ALIAS_SAME_PORTS
PKT_ALIAS_USE_SOCKETS
PKT_ALIAS_RESET_ON_ADDR_CHANGE

이 함수는 패킷 앨리어스(alias) 엔진에 대해, 상시 동일한 초기 상태를 돌려줍니다. PacketAliasSetAddress() 호출은, 이것에 이어 행합니다. 또, 전술한 디폴트 모드 비트를 변경하는 경우는 PacketAliasSetMode() (을)를 호출합니다.

이 함수 호출은, 패킷 조작 전에 프로그램 개시 단계에서 실행할 필요가 있습니다.

void PacketAliasUninit(void)

이 함수에는 인수도 반환값도 없고, 내부 데이터 구조로 설정된 값을 클리어 하는 경우에 사용됩니다.

이 함수는 프로그램으로 앨리어스(alias) 엔진의 사용을 정지시키는 경우에 호출할 필요가 있습니다. 그것에 의해, 파이어 월(fire wall)에 빈 틈새를 막게 됩니다. 이전과의 호환성이나 특별한 보안를 갖추기 위해서(때문에), 본함수를 PacketAliasInit() 하지만 atexit(3) 체인에 부가하고 있습니다. 몇번 호출해도 문제는 없습니다.

void PacketAliasSetAddress(struct in_addr addr)

이 함수는, 로컬 area의 네트워크외에 패킷이 발신하는 앞의 소스 주소를 세트 합니다. PacketAliasRedirectAddr() 에 의해 생성되었다 정적 주소 대응에 의해 덧쓰기되지 않는 이상 발신 패킷은 모두 이 주소에 재대응 붙이고 됩니다.

PKT_ALIAS_RESET_ON_ADDR_CHANGE 모드 비트 (디폴트 조작 모드)(이)가 설정되어 있는 경우, 내부적인 앨리어스(alias) 링크 테이블은, 앨리어스(alias) 주소가 변경될 때, 리셋트 됩니다. 이것은 일련의 다이얼 업 조작 중(안)에서 IP 주소 상태에 관련되지 않고, ppp(8) (와)과 같은 인터페이스에 편리합니다.

PKT_ALIAS_RESET_ON_ADDR_CHANGE 모드 비트가 0 에 세트 되고 있었을 경우, 이 함수는, 패킷간의 앨리어스(alias)의 동적 변경에 사용할 수 있습니다 (오버헤드의 적은 호출입니다).

패킷 조작 전에 이 함수를 호출할 필요가 있습니다.

unsigned int PacketAliasSetMode(unsigned int flags, unsigned int mask)

이 함수는, flags 값에 따라 모드 비트의 설정을 클리어를 행합니다. mask 에 의해 나타난 비트만이 대상이 됩니다. 이하에 나타내는 모드 비트는 <alias.h> 그리고 정의되고 있습니다.

PKT_ALIAS_LOG
    /var/log/alias.log 파일에의 로깅을 가능하게 합니다. 로그 파일에는, 앨리어스(alias)·링크의 작성, 삭제마다 icmp, tcp, udp 에의 링크 회수가 기록됩니다. 로그 파일이 tail(1) 에 의해 계속적으로 볼 수가 있으면, 주로 디버그용으로서 유효합니다.

PKT_ALIAS_DENY_INCOMING
    이 모드 비트가 설정되어 있으면(자), TCP 접속이나 UDP 트랜잭션(transaction)에 관련한다 외부로부터 착신하는 모든 패킷은, 호출 프로그램으로 무시 ( PacketAliasIn() 이면 PKT_ALIAS_IGNORED (을)를 돌려준다) 하기 위한 표를 붙일 수 있습니다. 패킷의 앨리어스(alias) 호스트나 로컬 네트워크로부터 발생한 접속이나 트랜잭션(transaction)에 대한 리스폰스에 대한 영향은 없습니다. 이 모드 비트는 다른 한쪽향의 파이어 월(fire wall)를 실장할 때에 유효합니다.

PKT_ALIAS_SAME_PORTS
    이 모드 비트가 설정되어 있으면(자), 패킷 앨리어스(alias) 엔진은 실제의 로컬 포트 번호를 그대로 앨리어스(alias) 포트 번호로 하려고 합니다. 이것은 (proto, alias addr, alias port, remote addr, remote port)의 5 개의 파라미터의 페어가 일의이면 가능합니다. 경합이 일어나는 경우는, 이 비트가 설정되어 있어도 앨리어스(alias) 포트 번호에는 다른 번호가 선택됩니다.

PKT_ALIAS_USE_SOCKETS
    이 비트는, 앨리어스(alias) 호스트가 패킷 이송시와 같이 네트워크상에 트래픽을 발생시키는 경우 반드시 설정합니다. 패킷 앨리어스(alias) 호스트가 불명한 호스트 주소나 불명의 포트 번호 (예를 들면, FTP 데이터 접속시) (으)로부터의 접속을 기다리고 있을 때는, 이 모드 비트는, 포트의 경합이 일어나지 않게 플레이스홀더로서 소켓의 할당을 정의합니다. 접속이 확립되면(자), 통상은 1 분 정도로 소켓은 닫혀집니다.

PKT_ALIAS_UNREGISTERED_ONLY
    이 비트가 설정되어 있으면(자), 미등록의 address 공간으로부터 생긴 이외의 로컬 네트워크상의 트래픽이 무시됩니다. 표준 클래스 A, B 및 C 의 미등록 주소는 다음과 같습니다.

        10.0. 0.0     -> 10.255. 255.255   (Class A subnet)
        172.16. 0.0   -> 172.31. 255.255   (Class B subnets)
        192.168. 0.0  -> 192.168. 255.255  (Class C subnets)

    이 옵션은, 패킷 앨리어스(alias) 호스트가 다른 인터페이스에 등록이 끝난 상태 및 미등록 서스네트워크가 있는 경우에 유효합니다. 등록이 끝난 서스네트워크는 완전하게 외부와 접속하고 있으므로, 패킷 앨리어스(alias) 엔진에 의해 패킷을 배웅할 필요는 없습니다.

PKT_ALIAS_RESET_ON_ADDR_CHANGE
    이 모드 비트가 설정되어 있어 PacketAliasSetAddress() 하지만 앨리어스(alias) 주소 변경을 위해서(때문에) 불리는 케이스에서는, 패킷 앨리어스(alias) 엔진의 내부 링크 테이블 내용이 클리어 됩니다. 이 조작 모드는, 다이얼 업간에서의 인터페이스 주소를 변경하거나 변경하지 않고 둔다 ppp(8) 링크의 경우에 유효합니다. 이 모드 비트가 설정되어 있지 않은 경우, 링크 테이블은 주소가 변경되어도 리셋트 되지 않습니다.

PKT_ALIAS_PUNCH_FW
    이 옵션에 의해, libalias (은)는, FTP/IRC DCC 접속에 대한다 ipfirewall(4) 베이스의 파이어 월(fire wall)의 `틈새'를 만들게 됩니다. 열린 틈새는 IP 주소나 포트와 결부되고 있어 다른 접속에 사용할 수 없습니다. 틈새는 그것을 사용하고 있는 접속이 소멸하면 제거됩니다. libalias (을)를 사용하고 있는 프로그램을 강제적으로 종료시킨다 (예를 들면 kill -9) 구조는, 플래그 상태에 의해, 틈새에 할당할 수 있었던 전파이아오르 area를 클리어 하는 것으로 실현되고 있습니다. 이것은 또 PacketAliasSetFWBase() 에 대한다 초기 호출에서도 일어납니다. 이 호출은 플래그의 설정 전에 행할 필요가 있습니다.

PKT_ALIAS_REVERSE
    본옵션은, 프로그램 라이브러리가 내향 패킷과 밖으로 향한 패킷을 취급하는 방법을 반전시킵니다. 이것에 의해, 외부 인터페이스대신에 내부 인터페이스를 통과한다 패킷을 먹일 수 있을 수가 있습니다.

PKT_ALIAS_PROXY_ONLY
    본옵션은, 프로그램 라이브러리가 투과 프록시 룰에만 따르도록 지시합니다. 통상의 패킷 앨리어스(alias)는 실행되지 않습니다. 자세한 것은 후술의 PacketAliasProxyRule() (을)를 참조해 주세요.

void PacketAliasSetFWBase(unsigned int base, unsigned int num)

파이어 월(fire wall)에 ( PKT_ALIAS_PUNCH_FW 플래그에 의해) 파이어 월(fire wall)의 틈새에 대한 area를 할당합니다. area는 전초기화 룰에 따라 클리어 됩니다.

패킷 조작
패킷 처리 함수는, 착신 (리모트 -> 로컬) 및 발신 (로컬 -> 리모트) 패킷의 수정에 사용됩니다. 네트워크 인터페이스 경유에서의 패킷의 송수신은, 호출측 프로그램이 행합니다.

PacketAliasInit() 및 PacketAliasSetAddress() (와)과 함께, PacketAliasIn() (와)과 PacketAliasOut() 의 2 개의 패킷 처리 routine가 기본적인, 외관의 IP 실장에 필요한 최소 기능으로서 준비되어 있습니다.

int PacketAliasIn(char *buffer, int maxpacketsize)

리모트의 머신으로부터 로컬 네트워크에의 착신 패킷은 이 함수에 의해 앨리어스(alias) 해제됩니다. IP 패킷은 인수 buffer 그리고 지정됩니다. maxpacketsize (은)는 패킷을 포함한 데이터 구조의 길이를 나타내고 있어 실제의 패킷장보다 크게 취할 필요가 있습니다.

귀가 코드 :

PKT_ALIAS_OK
    패킷 앨리어싱(aliasing) 처리는 성공했습니다.

PKT_ALIAS_IGNORED
    패킷은 무시되어 앨리어스(alias)는 해제되지 않았습니다. 이것은, 프로토콜이 인식되지 않을 때, ICMP 의 메세지 타입은 처리되어 있지 않은지, 혹은 새로운 접속에 대한 입력 패킷이 무시되었을 때에 발생합니다 ( PacketAliasSetMode() 하지만 PKT_ALIAS_DENY_INCOMING (을)를 설정했을 경우).

PKT_ALIAS_UNRESOLVED_FRAGMENT
    헤더 fragment가 미송신을 위해 fragment가 해소되지 않을 때에 이 코드가 돌려주어져 옵니다. 이 경우, fragment는 헤더 fragment가 발견될 때까지 PacketAliasSaveFragment() 에 의해 보존해 둘 필요가 있습니다.

PKT_ALIAS_FOUND_HEADER_FRAGMENT
    패킷 앨리어싱(aliasing) 처리는 성공해, 헤더 fragment도 발견되었습니다. 이것은 해소되어 있지 않은 fragment를, PacketAliasGetFragment() 에 의해 찾아, PacketAliasFragmentIn() (을)를 사용해 앨리어스(alias) 해제할 때의 시그널이 됩니다.

PKT_ALIAS_ERROR
    패킷 앨리어싱(aliasing) 엔진내에서 발생한 내부 에러.

int PacketAliasOut(char *buffer, int maxpacketsize)

로컬 네트워크로부터 리모트의 머신에 발신하는 패킷은, 이 함수에 의해 앨리어스(alias) 됩니다. IP 패킷은 인수 buffer 그리고 지정되어 maxpacketsize (은)는 패킷이 취할 수 있는 최대장을 나타냅니다. IP 표현 형식 프로토콜은, 주소와 수정되어 또 패킷장의 변경에 얽히는 일련의 데이터내의 포트 정보를 설정합니다. 프로토콜이 좋게 알려진 사례로서는, FTP 와 IRC DDC 가 있습니다. Pp 귀가 코드 :

PKT_ALIAS_OK
    패킷 앨리어싱(aliasing) 처리는 성공했습니다.

PKT_ALIAS_IGNORED
    패킷은 무시되어 앨리어스(alias) 해제는 되지 않았습니다. 이것은 프로토콜이 인식되지 않을 때인가, 혹은 ICMP 메세지 타입이 처리되지 않을 때에 발생합니다.

PKT_ALIAS_ERROR
    패킷 앨리어싱(aliasing)내에서 발생한 내부 에러.

포트와 주소의 리디렉션
이 섹션으로 해설하고 있는 함수는, 로컬 네트워크상의 머신에 대해, 외부 네트워크로부터 새로운 착신에 대한 액세스를 어느 정도 가능하게 합니다. 개개의 포트는, 재대응부나 고정적인 네트워크 주소의 변환을 정의할 수가 있습니다.

struct alias_link * PacketAliasRedirectPort(struct in_addr local_addr, u_short local_port, struct in_addr remote_addr, u_short remote_port, struct in_addr alias_addr, u_short alias_port, u_char proto)

이 함수는, 소정의 리모트 주소나 포트로부터 앨리어스(alias) 주소나 포트에의 트래픽을, 지정된 로컬 주소나 포트에의 리디렉트를 정의합니다. 파라미터 proto 하 IPPROTO_TCP 인가 IPPROTO_UDP 의 어딘가에 해당해, <netinet/in.h> 그리고 정의됩니다.

local_addr 혹은 alias_addr 하지만 0 이라면, 패킷 앨리어싱(aliasing) 주소는 PacketAliasSetAddress() 그리고 설정된 것을 사용합니다. PacketAliasRedirectPort() 하지만 PacketAliasSetAddress() 호출어에 주소 변경을 위해서(때문에) 불려 가도, 0 레퍼런스가 이 변경을 기록합니다.

부하 공유용으로 링크가 더욱 설정되면(자), local_addr (와)과 local_port (은)는 무시되어 서버 풀로부터 동적으로 선택됩니다. 이것은 PacketAliasAddServer() 그리고 후술 되고 있습니다.

remote_addr 하지만 0 의 경우, 패킷을 리모트 주소로부터 리디렉트 합니다. 같이 remote_port 하지만 0 의 경우, 리모트의 포트 번호로부터 발생했다 패킷을 리디렉트 합니다. 통상, 리모트 포트 정의는 0 입니다만, 파이어 월(fire wall)에 대해서는 0 이 아니다 리모트 주소가 유효한 경우가 있습니다. PacketAliasRedirectPort() 호출에 의해, 주소와 포트 정의가 중복 했을 경우, 최신의 호출이 우선됩니다.

이 함수는 그 다음에 PacketAliasRedirectDelete() 그리고 사용하는 포인터를 돌려줍니다. NULL 하지만 돌려주어졌을 경우, 함수 호출은 정상적으로 종료하고 있지 않습니다.

모든 포트 주소는, 네트워크 주소의 바이트 오더 표기에 따르고 있습니다. 이러한 파라미터는 htons(3) (을)를 사용해, 내부적인 수치 형식으로부터 네트워크 바이트 오더 표기에 변환할 필요가 있습니다. 주소도 또와 같이 네트워크 바이트 오더 형식이며, struct in_addr 데이터형으로 암묵에 정의됩니다.

struct alias_link * PacketAliasRedirectAddr(struct in_addr local_addr, struct in_addr alias_addr)

이 함수는, alias_addr 에의 전착신 트래픽을 local_addr 에 리디렉트 합니다. 같이 local_addr (으)로부터의 전발신 트래픽은 alias_addr 에 앨리어스(alias) 됩니다.

local_addr 또는 alias_addr 하지만 0 의 경우, PacketAliasSetAddress() 에 의해 설정되었다 패킷 앨리어싱(aliasing) 주소가 사용됩니다. PacketAliasSetAddress() 하지만 PacketAliasRedirectAddr() 의 호출 후에 주소 변경을 위해서(때문에) 불려 가도, 0 레퍼런스가 이 변경을 기록합니다.

부하 공유용으로 링크가 더욱 설정되면(자), local_addr (은)는 무시되어 서버 풀로부터 동적으로 선택됩니다. 이것은 PacketAliasAddServer() 그리고 후술 되고 있습니다.

PacketAliasRedirectAddr() 에 대한 일련의 호출이 동일한 앨리어싱(aliasing) 주소를 사용하고 있는 경우, 이 앨리어싱(aliasing) 주소에의 새로운 전착신 트래픽은, 마지막 함수 호출로 만들어진 로컬 주소에 리디렉트 됩니다. 몇개의 함수 호출로 지정된 로컬 머신으로부터의 새로운 전트래픽은, 동일한 주소에 리디렉트 됩니다.

    PacketAliasRedirectAddr(inet_aton("192.168. 0.2"),
                            inet_aton("141.221. 254.101"));
    PacketAliasRedirectAddr(inet_aton("192.168. 0.3"),
                            inet_aton("141.221. 254.101"));
    PacketAliasRedirectAddr(inet_aton("192.168. 0.4"),
                            inet_aton("141.221. 254.101"));

192.168. 0.2, 192.168. 0.3 및 192.168. 0.4 로부터, telnet(1) (이)나 ftp(1) 등으로의 발신 접속은 141.221. 254.101 으로부터 나왔는지와 같이 보입니다. 141.221. 254.101 에의 착신 접속은 192.168. 0.4 에 리디렉트 됩니다.

PacketAliasRedirectPort() 에 대한 호출보다 PacketAliasRedirectAddr() 그리고 지정된 주소 대응이 반드시 우선됩니다.

이 함수는, PacketAliasRedirectDelete() 하지만 사용하는 포인터를 돌려줍니다. NULL 하지만 돌려주어지는 경우, 함수 호출은 정상적으로 종료하고 있지 않습니다.

int PacketAliasAddServer(struct alias_link *link, struct in_addr addr, u_short port)

본함수는, link (을)를, IP Network Address Translation (RFC 2391, LSNAT)를 사용했다 부하 공유용으로 설정합니다. LSNAT 는 다음과 같이 동작합니다. 클라이언트가, 서버 가상 주소를 사용해 서버에 액세스를 시도합니다. LSNAT 라우터가, 서버 풀안의 1 개의 호스트에 대해, 요구를 투과적으로 리디렉트 합니다. 호스트 선택에는, 실시간 부하 공유 알고리즘을 사용합니다. 복수의 세션이 동일한 클라이언트로부터 개시될지도 모릅니다. 각 세션은, 그때그때의 서버 풀 호스트간의 부하 밸런스에 의해, 다른 호스트로 향해질 가능성이 있습니다. 몇 개의 고유의 서비스에 대해서 부하 공유가 바람직하는 경우, LSNAT 의 설정에 의해, 바람직하는 서비스에게만 부하 공유를 한정 가능합니다.

현재로서는, 가장 단순한 선택 알고리즘만이 실장되고 있습니다. 이 방법은, 라운드로빈에 의한 선택뿐이어, 호스트의 부하를 고려하지 않는 것입니다.

우선, link 하지만 PacketAliasRedirectPort() 또는 PacketAliasRedirectAddr() 에 의해 작성됩니다. 다음에 PacketAliasAddServer() 하지만 여러 차례 불려 link 의 서버 풀에 엔트리가 추가됩니다.

PacketAliasRedirectAddr() 그리고 작성된 링크에 대해, port 인수는 무시되고 어떠한 값, 예를 들면 htons(~0)를 가질 수 있습니다.

본함수는, 성공시에는 0 을 돌려주어, 실패시에는 -1 을 돌려줍니다.

void PacketAliasRedirectDelete(struct alias_link *ptr)

이 함수는, PacketAliasRedirectPort() 혹은 PacketAliasRedirectAddr() 하지만 설정했다 특정의 정적 리디렉트 룰을 삭제합니다. 파라미터 ptr (은)는, 몇개의 리디렉션 함수로부터 돌려주어져 오는 포인터입니다. 올바르지 않은 포인터가 PacketAliasRedirectDelete() 에게 건네지면(자), 프로그램은 크래쉬 하는지, 예기치 못한 동작 결과가 됩니다. 그 때문에(위해) 이 함수의 사용에 즈음해서는 주의가 필요합니다.

int PacketAliasProxyRule(const char *cmd)

건네받았다 cmd 캐릭터 라인은, 1 개 이상의, 말의 조로부터 됩니다. 각 조의 최초의 말은 토큰이며, 다음의 말은 그 토큰에 적용되는 값입니다. 토큰과 인수의 형태는 다음과 같습니다:

type encode_ip_hdr | encode_tcp_stream | no_encode
    투과 프록시의 서포트를 위해서(때문에), 신규 종점 서버에 원래의 주소와 포트의 정보를 하등의 방법으로 건네줄 필요가 있습니다. encode_ip_hdr 하지만 지정되었을 경우, 추가의 IP 옵션으로서 원래의 주소와 포트가 건네받습니다. encode_tcp_stream 하지만 지정되었을 경우, TCP 스트림중의 최초의 데이터편안에 “DEST IP port” 그렇다고 하는 서식에서, 원의 주소와 포트가 건네받습니다.

port portnum
    종점 포트가 portnum 의 패킷만이 프록시의 대상이 됩니다.

server host
    [:portnum] 데이터의 전송처의 host (와)과 portnum (을)를 지정합니다. host (은)는, DNS 호스트명은 아니고 IP 주소인 것이 필요합니다. portnum 하지만 지정되지 않으면 종점 포트 번호는 변경되지 않습니다.

    server 의 지정은, delete 명령이 사용되지 않는 이상 필수입니다.

rule index
    통상, 각 PacketAliasProxyRule() 호출은, 룰의 선형리스트의 선두에 다음의 룰을 삽입합니다. index 하지만 지정되었을 경우, 낮은 인덱스의 전룰이 체크된 후에, 신규 룰이 체크됩니다. 룰을 지정하지 않는다 PacketAliasProxyRule() 호출은, 룰에 룰 0 을 할당합니다.

delete index
    본토큰과 인수는, 다른 토큰과 조합해 사용해 되지 않습니다. 본토큰을 사용하면(자), 지정했다 index 의 기존의 룰이 삭제됩니다.

proto tcp|udp
    지정하면(자), 지정한 프로토콜 타입의 패킷만이 매치 합니다.

src IP
    [/bits] 지정하면(자), 지정했다 IP 에 시점 주소가 매치 하는 패킷만이 성냥 합니다. bits 도 지정하면(자), IP 주소의 최초의 bits 비트만이 네트워크 지정으로서 사용되어 그 네트워크로부터의 전 IP 주소가 매치 합니다.

dst IP
    [/bits] 지정하면(자), 지정했다 IP 에 종점 주소가 매치 하는 패킷만이 성냥 합니다. bits 도 지정하면(자), IP 주소의 최초의 bits 비트만이 네트워크 지정으로서 사용되어 그 네트워크로부터의 전 IP 주소가 매치 합니다.

본함수는, 통상, 어느 주의 인터넷 액세스를 금지되고 있다 내부 머신에 대해, 밖으로 향한 접속을 리디렉트 하는지, 또는 어떤 종류의 외부 머신에의 액세스를 제한합니다.

struct alias_link * PacketAliasRedirectProto(struct in_addr local_addr, struct in_addr remote_addr, struct in_addr alias_addr, u_char proto)

본함수는, 지정한 리모트 주소로부터 앨리어스(alias) 주소에의 프로토콜 번호 proto 의 전패킷이, 지정한 로컬 주소에 리디렉트 하는 것을 지정합니다.

local_addr 또는 alias_addr 하지만 0 의 경우, 그리고 확립한 패킷 앨리어스(alias) 주소가 사용되는 것을 지정합니다. PacketAliasSetAddress() 하지만 PacketAliasRedirectProto() 의 호출 후에 주소 변경을 위해서(때문에) 불려 가도, 0 레퍼런스가 이 변경을 기록합니다.

remote_addr 하지만 0 의 경우, 전리모트 호스트로부터의 패킷을 리디렉트 하는 것을 지정합니다. 비 0 의 리모트 주소는, 파이어 월(fire wall) 용도에 유용한 경우가 있습니다.

2 개의 PacketAliasRedirectProto() 호출이, 주소 지정에 대해 겹치는 경우, 최신의 호출이 우선합니다.

본함수는, 후에 PacketAliasRedirectDelete() 에 사용 가능한 포인터를 돌려줍니다. NULL 하지만 돌려주어지는 경우, 함수 호출은 정상적으로 종료하고 있지 않습니다.

fragment 조작
이 섹션의 함수는 착신 fragment 조작으로 사용됩니다.

발신 fragment는, PacketAliasRedirectAddr() 그리고 설정했다 적용 가능한 대응부에 의한 주소 변경에 의해, 또는 PacketAliasSetAddress() 그리고 설정했다 앨리어싱(aliasing) 주소의 생략시 치에 의해, PacketAlaisOut() 안에서 처리됩니다.

착신 fragment는 2 방법의 방법으로 처리됩니다. fragment화 되었다 IP 패킷의 헤더를 이미 알고 있는 경우는, 일련의 fragment는 헷다후랏그먼트와 같은 방식에서 재대응 붙이고 됩니다. fragment는 헤더가 도착하기 전에 보존되어 헤더 fragment가 소멸한 단계에서 꺼내집니다.

int PacketAliasSaveFragment(char *ptr)

PacketAliasIn() (으)로부터 PKT_ALIAS_UNRESOLVED_FRAGMENT 돌려주어져 오면(자), 이 함수가, 남아 있는 fragment의 포인터를 보존하기 위해서 사용할 수 있습니다.

인수 ptr 하 malloc(3) 그리고 할당할 수 있었던 메모리브록크를 가리키는 것이 암묵중에 가정되고 있습니다. fragment가 해결되지 않는 경우, 패킷 앨리어싱(aliasing) 엔진은 타임 아웃 시간 경과후, 자동적으로 메모리를 해방합니다 [실질적으로는, 이 함수는, 메모리 해방의 콜백 함수가 인수로서 건네받도록(듯이) 수정해 둘 필요가 있습니다].

이 함수는, 정상 실행의 경우 PKT_ALIAS_OK (을)를 돌려주어, 에러의 경우 PKT_ALIAS_ERROR (을)를 돌려줍니다.

char * PacketAliasGetFragment(char *buffer)

이 함수는, PacketAliasSaveFragment() 그리고 보관되었다 fragment 포인터의 재취득이 생깁니다. buffer 그리고 가리키는 IP 헤더 fragment는, PacketAliasIn() 하지만 (을)를 돌려주었을 때에 지정된다 헤더 fragment입니다. fragment의 포인터가 재꺼내 되면(자), 호출 프로그램에 의해 fragment에 동적으로 할당할 수 있고 있던 메모리가 해방됩니다.

fragment가 없어지는 것으로 PacketAliasGetFragment() (을)를 계속해 부를 수가 있습니다. 처리하는 fragment가 없어지면(자) NULL 하지만 돌려주어져 옵니다.

void PacketAliasFragmentIn(char *header, char *fragment)

PacketAliasGetFragment() 에 의해 fragment의 재취득을 행할 때, PacketAliasFragmentIn() 호출을 실행해 fragment의 앨리어스(alias)를 해제할 수 있습니다. 인수 header (은)는, 템플릿으로서 사용되고 있는 헤더 fragment의 포인터입니다. 인수 fragment (은)는 앨리어스(alias) 해제하는 패킷의 포인터입니다.

그 외의 함수
void PacketAliasSetTarget(struct in_addr addr)

기존의 앨리어스(alias) 링크와 관련이 없다 밖으로부터의 착신 패킷이 호스트 머신에 도착하면(자), 그것은 PacketAliasSetTarget() 호출에 의해 지정되는 주소에 보내집니다.

이 함수가 INADDR_NONE 주소를 인수로서 불렸을 경우, 밖으로부터의 모든 신규 착신 패킷은 PacketAliasSetAddress() 그리고 설정되는 주소에 갑니다.

이 함수가 INADDR_ANY 주소를 인수로서 불렸을 경우, 밖으로부터의 모든 신규 착신 패킷은 패킷중에서 지정되는 주소에 갑니다. 외부의 머신이 내부의 머신에 직접 루팅 가능한 경우, 외부의 머신이 직접 내부의 머신이라고 이야기하는 것을 가능으로 합니다.

int PacketAliasCheckNewLink(void)

신규의 앨리어싱(aliasing) 링크가 생성되면(자), 이 함수는 0 이외의 값을 돌려줍니다. 밖으로부터의 착신 트래픽이 차례차례 다른 서버에 보내진다고 하는 상황하로, 이 함수를 PacketAliasSetTarget() 호출을 디폴트의 목적 주소를 변경을 위해 실행할 때의 방아쇠로 할 수 있습니다.

u_short PacketAliasInternetChecksum(u_short *buffer, int nbytes)

이것은 남에서는 사용하는 일이 없습니다만, 편리한 유틸리티 함수입니다. 인터넷 체크 섬을 계산합니다. 체크 섬은, IP 및 프로토콜 (TCP, UDP, ICMP) 고유의 헤더의 어디라도 사용되고 있습니다.

인수 buffer (은)는 체크 섬을 취하는 데이터 블록을 가리키고 있습니다. 또 nbytes (은)는 바이트수를 줍니다. 16 비트의 체크 섬 필드는 체크 섬 계산 전에 0 클리어 됩니다.

체크 섬은 체크 섬 자신을 포함했다 데이터 블록의 조작에 의해 검증할 수가 있습니다. 체크 섬이 올바르면, PacketAliasInternetChecksum()는 0 을 돌려줍니다.

int PacketUnaliasOut(char *buffer, int maxpacketsize)

앨리어스(alias) 처리필의 밖으로 향한 패킷은, 개인 주소/포트의 정보를 본함수에 의해 restore되고 있습니다. buffer 그리고 가리켜지는 IP 패킷과 maxpacketsize 하지만, 에러 체크를 위해서(때문에) 제공되고 있습니다. 본함수는, 앨리어스(alias) 처리필 패킷의 원래의 IP 헤더가 필요한 한층 더 처리 (예를 들면 로깅)에 사용 가능합니다.

버그
PPTP 앨리어스(alias)는, 복수의 내부 클라이언트가 동일한 외부 서버에 동시에 접속하면(자) 동작하지 않습니다. 왜냐하면, PPTP 는 2 개의 IP 주소간에 단일의 TCP 제어 접속을 필요로 하기 때문입니다.

저자
Charles Mott <cm@linktel.net>, versions 1.0 - 1.8, 2.0 - 2.4. Eivind Eklund <eivind@freebsd.org>, versions 1.8b, 1.9 및 2.5. 아키텍쳐에 있어서의 수많은 개선에 의한 공헌 외에, IRC DCC 에 관한 서포트를 행했습니다. 및 FTP/IRC DCC 의 파이어 월(fire wall)의 우회도로입니다. Erik Salander <erik@whistle.com> 하지만 PPTP 와 RTSP 의 서포트를 추가했습니다. Junichi Satoh <junichi@junichi.org> 하지만 RTSP/PNA 의 서포트를 추가했습니다.

사례
이하, 개략 시대순서에 나타내는 것은, 유익한 코멘트나 디버그의 도움을 제공해 준 사람들의 이름입니다.

-split Gary Roberts Tom Torrance Reto Burkhalter Martin Renters Brian Somers Paul Traina Ari Suutari Dave Remien J. Fortes Andrzej Bialecki Gordon Burditt

개념적인 배경
이 부록은, 원시 코드의 수정을 검토하고 있는 사람이나, 패킷 앨리어싱(aliasing) 함수를 사용해 약간 난해한 어플리케이션을 작성하는 사람을 대상으로 하고 있습니다.

여기에는 패킷 앨리어싱(aliasing) 엔진의 개념적인 체제가 기술되고 있습니다. 논의의 중심은, 로컬 머신과 앨리어스(alias) 된 식별자 및 리모트 머신간의 지정되었다 패킷 트랜잭션(transaction)의 관계를 정의하고 있다 "앨리어싱(aliasing) 링크" 에 생각에 대해입니다. 이러한 링크가 어떻게 발생해 또 소멸할까에 임해서 검토되고 있습니다.

  앨리어싱(aliasing) 링크
앨리어싱(aliasing) 링크 (은)는, 7 개의 요소로 기술할 수 있다고 하는 생각이 있습니다:

    (로컬 주소, 로컬 포트 번호,
    앨리어스(alias) 주소, 앨리어스(alias) 포트 번호,
    리모트 주소, 리모트 포트, 프로토콜)

밖에 발신하는 패킷은, 로컬 주소와 로컬 포트 번호가, 앨리어스(alias) 주소와 앨리어스(alias) 포트 번호로 옮겨놓을 수 있습니다. 밖으로부터 착신하는 패킷은, 역의 프로세스로 처리됩니다. 패킷 앨리어싱(aliasing) 엔진은, 앨리어싱(aliasing) 링크의 내부 테이블에 대해서 패킷을 대응시켜, 지정 IP 패킷의 수식 방법을 결정하려고 합니다. IP 헤더 및 프로토콜에 의존하는 헤더의 어느쪽이나 필요에 따라서 수정됩니다. 앨리어싱(aliasing) 링크는, 네트워크의 트래픽에 의해, 필요에 따라서 생성, 소멸이 행해집니다.

프로토콜은, 어느 상황에서는 TCP 나 UDP 이며, 또는 ICMP 이며 괜찮습니다 (ICMP 가 있는 종의 패킷 타입에는, 개개의 패킷의 처리 방식을 결정하는 포트 번호와 같은 기능을 하는, 일련의 id 번호에 앨리어스(alias) 할 수가 있는 것이 있습니다).

각각의 앨리어스(alias) 링크는 다음의 5 개의 수치의 편성을 가지고 있지 않으면 안됩니다. 즉, 앨리어스(alias) 주소 / 포트, 리모트 주소 / 포트, 및 프로토콜입니다. 이것에 의해 로컬 네트워크상의 몇개의 머신은 같은 앨리어스(alias) IP 주소를 공유하는 것이 가능해집니다. 경합이 일어나는 케이스에서는, 앨리어싱(aliasing) 포트가, 일의성을 유지할 수 있도록 선택됩니다.

  정적 및 동적 링크
앨리어싱(aliasing) 링크에는 정적 및 동적인 것이 있습니다. 정적 링크는 무기한으로 존속해, IP 패킷의 변환에 관해서는 고정된 규칙을 보관 유지하고 있습니다. 동적 링크는 개별의 TCP 접속이나 UDP 트랜잭션(transaction)의 에코 순차 순서에 대해서 생성됩니다. TCP 의 경우는, 관련하는 앨리어싱(aliasing) 링크를 몇시 삭제해야할 것인가를 알기 위해서(때문에), 접속을 감시할 수 있습니다. UDP 트랜잭션(transaction) ( 및 ICMP 에코와 타임 스탬프 요구)는 단순한 타임 아웃 규칙으로 움직이고 있습니다. 일정한 시간, 동적 링크하는 액티버티가 없을 때는, 자동적으로 삭제됩니다. 타임 아웃 규칙은 적절한 오픈 / 클로우즈를 행하지 않는다 TCP 접속에도 적용됩니다.

  앨리어싱(aliasing) 링크의 부분 정의
앨리어싱(aliasing) 링크는 부분적인 정의가 가능합니다. 이것은 리모트 주소 및 (또는) 리모트 포트가 불명한 경우에 행합니다. 이 경우, 불완전한 정의의 패킷이 발견되면(자), 완전 사양의 동적 링크가 생성됩니다. 원래의 부분 정의의 링크가 동적인 것인 경우, 완전 사양의 링크가 생성된 후 그것은 삭제되어 그렇지 않은 경우 무기한으로 남게 됩니다.

예를 들어, 부분 정의 링크는 다음과 같습니다.

    (192.168. 0.4, 23, 204.228. 203.215, 8066, 0, 0, tcp)

0 의 값은 리모트 주소 및 포트의 미정도리 부분을 나타내고 있습니다. 링크가 정적인 것이면, 밖으로부터 착신해 오는 전트래픽을 주소 204.228. 203.215 의 포트 8066 으로부터, 로컬 네트워크상의 192.168. 0.4 의 주소를 가지는 머신의 포트 23 (telnet)에 리디렉트 하게 됩니다.

  A. 4 동적 링크의 생성
앨리어싱(aliasing) 링크에 가세해 패킷 앨리어싱(aliasing) 기구를 가진다 내부 데이터 테이블에 격납할 수 있는 주소 대응표가 있습니다.

    (로컬 주소, 앨리어스(alias) 주소)

주소 대응표는 동적 링크 생성시에 필요하게 됩니다.

로컬 네트워크로부터 밖에 발신하는 모든 패킷은, 기존의 완전 정의된 링크와 일치하고 있지 않으면, 동적 링크를 자동적으로 생성합니다. 이것은 발신하는 패킷에 관계되어, 주소 대응이 있으면 사용되는 앨리어스(alias) 주소를 결정합니다. 대응이 없으면, 디폴트 주소가 통상 앨리어싱(aliasing) 호스트의 주소입니다만, 사용됩니다. 필요하면, 디폴트 주소는 개개의 패킷이 도착할 때마다 변경할 수 있습니다.

앨리어싱(aliasing) 포트 번호는, 새로운 동적 링크가 기존의 링크와 경합 하지 않게 결정할 수 있습니다. 디폴트 조작 모드에서는, 패킷 앨리어싱(aliasing) 엔진은 로컬 포트 번호와 같은 번호를 앨리어싱(aliasing) 포트로서 설정하려고 합니다. 그 결과 경합 하면, 포트 번호는 일의인 앨리어싱(aliasing) 링크가 될 때까지 무작위로 선택이 행해집니다. 예비의 조작 모드에서는, 앨리어싱(aliasing) 포트의 최초의 선택은 무작위로, 또 로컬 포트 번호와 무관계하게 행해집니다.