728x90

원문 : 

http://forum.falinux.com/zbxe/?_filter=search&mid=question&search_target=title&search_keyword=iptables&document_srl=533111



현재 1.4.9.1과 커널과 뭔지 모르지만 약간의 문제가 있는듯 합니다. 1.4.8버젼도 같은 증상이 나오네요.

일단 1.4.2버젼으로 해결하였습니다.

1. 먼저 커널을 다음과 같이 컴파일합니다.

[root@JiuHost linux]# make menuconfig

    Networking  --->

      Networking options  --->

         [*] Network packet filtering framework (Netfilter)  --->

             Core Netfilter Configuration  --->

                 <*> Netfilter connection tracking support 

           <*> Netfilter Xtables support (required for ip_tables)

             IP: Netfilter Configuration  --->

                 <*> IPv4 connection tracking support (required for NAT)

                 [*]   proc/sysctl compatibility with old connection tracking (NEW)

           <*> IP tables support (required for filtering/masq/NAT)

           <*>   Packet filtering

           <*>     REJECT target support

           <*>   Full NAT

           <*> MASQUERADE target support

 

2. iptables를 다음과 같이 컴파일합니다.

[root@JiuHost IPTU270]# wget http://ftp.netfilter.org/pub/iptables/iptables-1.4.2.tar.bz2

[root@JiuHost IPTU270]# tar -jxf iptables-1.4.2.tar.bz2 

[root@JiuHost IPTU270]# cd iptables-1.4.2

// 제 경우에는 크로스 컴파일러가 다음 경로에 설치되어 있어 경로설정을 했습니다.

// ./configure시에 크로스 컴파일러를 체크합니다. 반드시 그 이전에 패스를 등록해야 됩니다.

[root@JiuHost iptables-1.4.2]# export PATH=$PATH:/home/youster/Board/cross-compiler/arm-3.4.3/bin

[root@JiuHost iptables-1.4.2]# ./configure --enable-static --host=arm-linux --prefix=/usr/iptables

[root@JiuHost iptables-1.4.2]# make

[root@JiuHost iptables-1.4.2]# make install

// 설치될 경로를 --prefix=/usr/iptables로 하였습니다. 타켓보드에도 똑같은 폴더를 만들어서 그쪽으로 복사할 겁니다.

// 이 설치 경로가 틀리면 실행이 안됩니다.

[root@JiuHost iptables-1.4.2]# cd /usr/iptables/sbin

// 아무래도 스트립을 하는 것이 좋겠지요.

[root@JiuHost sbin]# arm-linux-strip iptables* 

[root@JiuHost sbin]# arm-linux-strip ip6tables*

[root@JiuHost sbin]# cd ..

// 필요없는 폴더를 지웁시다.

[root@JiuHost iptables]# rm -rf share

[root@JiuHost iptables]# rm -rf include

 

3. 이제 타겟보드의 램디스크 이미지에 /usr/iptables 폴더를 만들고

호스트에 있는 폴더를 그대로 복사해옵니다.

먼저 mnt에 마운트되어 있으면,

cd mnt/usr

cp -a /usr/iptables .

 

4. 저는 nat 를 하기 위해서 사용했습니다.

다음과 같이 사용하였는데 참고하실분 참고하세요.

- 발신지 NAT 설정

  패킷이 머신밖으로 나가기 직전(POSTROUTING chain)에 수행되며,

 내부네트워크 사설IP가 외부로 나가기전에 공인 IP로 변환되는 것을 의미한다.

 고정IP라면 SNAT를 이용하여 추가하지만 동적으로 IP주소를 할당받는 경우에는

 발신지 NAT의 특수한 케이스중 하나인 매스커레이딩을 사용한다.

# iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE

=> eth0를 wan으로 사용하고 eth1을 lan으로 사용한다.

- IP 패킷이 포워딩되도록 설정

# echo 1 > /proc/sys/net/ipv4/ip_forward

- 수신지 NAT설정

패킷이 머신안으로 들어온 직후(PREROUTING chain)에 수행되며 실제적으로 내부서버로 포트매핑을 수행한다.

나는 eth1에 물려 있는 192.168.129.10으로 7021번 포트를 포워딩했다.

먼저 모든 포트매핑을 지우자.

# iptables -F PREROUTING -t nat

매핑할 포트를 지정하자.

# iptables -A PREROUTING -t nat -p tcp --dport 7021 -i eth0 -j DNAT --to 192.168.129.10:7021

확인

# iptables -t nat -L

Chain PREROUTING (policy ACCEPT)

target     prot opt source               destination

DNAT       tcp  --  anywhere             anywhere            tcp dpt:7021 to:192.168.129.10:7021

Chain POSTROUTING (policy ACCEPT)

target     prot opt source               destination

MASQUERADE  all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)

target     prot opt source               destination



======================================================

1~3까지 test했을 때 정상적으로 동작 확인.

728x90
728x90

1. Alt+F2 : 실행창 띄운다

 

2. gconf-editor  실행

 

3. apps \ nautilus \ desktop 접근

 

 4. 휴지통 보이기 클릭

728x90
728x90

4. File advice (일반적인 파일입출력을 위한 advice)

posix_fadvise (커널 2.5.60부터 등장)

#include <fcntl.h>

int posix_fadvise(int fd, off_t offsert, off_t len, int advice);

advice 옵션 (POSIX_FADV_NOREUSE가 추가되며 나머지는 madvice와 같다; 커널이 하는 동작을 application에서 한다는 차이가 있다.)
 

POSIX_FADV_NOREUSE application이 당분간은 정해진 범위에 있는 자료에 단 한번만 접근하려고 한다.

advice 옵션 (2.6 커널에서의 동작)

POSIX_FADV_NORMAL 커널이 적절히 미리읽기를 수행(평상시와 동일)

POSIX_FADV_RANDOM 커널이 미리읽기를 비활성화, 매번 물리적 연산이 일어날 때마다 최소 자료만 읽음

POSIX_FADV_SEQUENTIAL 커널이 공격적인 미리읽기 수행, 미리읽기 범위 크기를 두배로 늘림

POSIX_FADV_WILLNEED 커널이 미리읽기 작업을 시작해서 페이지를 메모리로 읽음

POSIX_FADV_NOREUSE 현재는 POSIX_FADV_WILLNEED와 동일(향후 한번만 사용한다는 방식을 이용하여 추가적인 최적화를 추가할 가능성 있음)

POSIX_FADV_DONTNEED 커널이 페이지 캐시에서 해당 영역에 있는 자료를 비움(madvise()의 DONTNEED와 다르게 동작)
 

readahead(리눅스용 인터페이스)

posix_fadvise()의 POSIX_FADV_WILLNEED와 동일한 동작: kernel 2.6 이전에는 posix_fadvise()대신 readahead() 사용함.
 

#include <fcntl.h>

ssize_t readahead(int fd, off64_t offset, size_t count);
 

해당 영역에 페이지 캐시가 자리 잡도록 만든다.
 

* 파일의 일부를 읽기에 앞서 POSIX_FADV_WILLNEED로 페이지 캐시에 파일을 읽어 들이도록 지시하면 입출력은 비동기식 background로 수행된다. application이 최종적으로 파일에 점근할 때, 입출력 차단 없이 연산이 완료될 수 있다.
 

*연속적으로 비디오를 디스크에 스트리밍하는 경우(많은 자료를 읽고 쓴 다음), POSIX_FADV_DONTNEED로 페이지 캐시에서 파일 조각을 비우라고 지시. application이 다시 접근할 의도가 없다면 페이지 캐시를 다른 용도로 사용할 수 있게 비워서 효율을 높임.
 

*파일 전체를 읽을 때는 POSIX_FADV_SEQUENTIAL을 제공

728x90

'Programming > linux왕초보' 카테고리의 다른 글

find 명령어(linux)  (4) 2012.04.03
ALSA SoC Layer  (0) 2012.04.03
ubuntu 바탕화면에 휴지통 꺼내놓기  (0) 2012.03.30
ALSA  (0) 2012.03.26
5. Asynchronous I/O  (0) 2012.02.24
3. Memory mapped I/O  (0) 2012.02.17
2. epoll(), select(), poll()  (0) 2012.02.08
make[1]: warning: Clock skew detected. Your build may be incomplete.  (0) 2012.02.03
1. Scatter/gather I/O(vectored I/O)  (0) 2012.01.29
리눅스 파일 입출력 (Linux File I/O)  (0) 2012.01.29
728x90

3. Memory mapped I/O
 

#include <sys/mman.h>

void * mmap(void* addr,//힌트일 뿐이며 보통 NULL을 넘긴다.

size_t len,

int prot,//접근권한

int flags,//추가적인 동작 방식

int fd,//대상

off_t offset);//시작위치

prot 옵션

PROT_NONE 권한없음

PROT_READ 읽기 가능한 페이지

PROT_WRITE 쓰기 가능한 페이지

PROT_EXEC 실행 가능한 페이지

flags 옵션

MAP_FIXED addr을 요구사항으로 취급하다록 지시. 해당주소에 mapping하지 못하면 호출실패

프로세스 주소공간에 대한 상세한 지식을 요구, 호환성이 떨어짐.

MAP_PRIVATE mapping을 공유하지 않음. 파일은 write후 복사로 mapping되며 변경된 메모리 속성은 실제 파일이나 다른 프로세스의 map에는 반영되지 않는다.

MAP_SHARED 동일파일을 mapping한 모든 프로세스들이 mapping을 공유.

read시 다른 프로세스가 write한 내용도 반영

mapping은 page단위로 구성됨 -> addr과 offset은 반드시 page size의 정수배가 되어야 함

ex)

void *p;

p = mmap (0, len, PROT_READ, MAP_SHARED, fd, 0);

if(p == MAP_FAILED) //ERROR

#include <unistd.h>

long sysconf(int name); // page size를 얻기위한 표준 method(POSIX)

int getpagesize(void); // page size를 얻기위한 표준 method(linux)

<asm/page.h>

PAGE_SIZE //정의된 정적 매크로, 실행시점이 아니라 컴파일 시점에서

시스템 페이지 크기를 조회

#include <sys/mman.h>

int munmap (void *addr, size_t len);

mmap()으로 만들어진 mapping 제거

ex)

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcn시.h>

#include <unistd.h>

#include <sys/mman.h>

struct stat sb;

off_t len;

char *p;

int fd;

fd = open (filename, O_RDONLY);

if(fstat(fd, &sb) == -1) // ERROR

if(!S_ISREG (sb.st_mode)) //ERROR

p = mmap (0, sb.st_size, PROT_READ, MAP_SHARED, fd, 0);

if(p == MAP_FAILED) //ERROR

if(close (fd) == -1)//ERROR

for(len = 0; len < sb.st_size; len++)

putchar(p[len]);

if(munmap(p, sb.st_size) == -1) //ERROR



장점

- 사용이 편리(다른 작업없이 메모리에 접근하기만 하면 된다. 포인터로 접근)

- 메모리 절약(추가적인 버퍼 메모리가 필요 없다.)

- 속도가 빠르다. (파일이 클수록, OS영역에 캐싱되어 있을수록 속도차이가 난다.)

- 다중 프로세스가 동일 객체를 메모리에 mapping할 때, 모든 프로세스가 자료를 공유한다

단점

- memory와 I/O가 주소공간을 공유(사용 가능한 주소 공간이 제한됨)

- page size의 정수배만 가능하다.(여분의 공간이 낭비됨)

- 연속적인 공간이 있어야 하므로 크기가 다른 mapping이 많으면 단편화 때문에 적당한 공간을 찾지 못할 수도 있다.(32bit일때. 64bit 주소공간에서는 크게 문제되지 않는다)

추가

- 파일이 모두 메모리에 올라오는 것이 아니라 메모리 access시 메모리를 할당해주고 I/O가 발생
 

mmap size 조정 // 리눅스 전용

#define _GNU_SOURCE

#include <unistd.h>

#include <sys/mman.h>

void * mremap (void *addr, size_t old_size,

size_t new_size, unsigned long flags);

접근 권한 변경

#include <sys/mman.h>

int mprotect (const void *addr, size_t len, int prot);

성공하면 0을 return.

mapping으로 파일 동기화 // fsync()와 유사

#incldue <sys/mman.h>

int msync (void *addr, size_t len, int flags);

flags 설정(OR연산 가능)

MS_ASYNC 동기화가 비동기식으로 일어나야 함

MS_INVALIDATE 캐시된 복사본이 유효하지 않음을 명세, 향후 이 파일의 map에 접근할 경우 새롭게 동기화된 디스크 내용을 반영

MS_SYNC 동기화가 동기식으로 일어나야 함,

msync() 호출은 모든 페이지를 드스크에 다시 쓰기 전까지 결과를 반환하지 않음.


madvise

memorymap에 포함된 page와 관련된 동작방식을 조언. 리눅스 커널은 기본적으로 동적으로 동작방식을 조율하며 성능을 최적화하지만 madvise는 부하상황에서 바람직한 캐시와 미리읽기 동작방식을 보장한다.

#include <sys/mman.h>

int madvise (void *addr, size_t len, int advice);

advice 설정(POSIX에서 정의한 의미)

MADV_NORMAL 특별한 조언을 하지 않는다.

MADV_RANDOM page에 random 순서로 접근하려고 함

MADV_SEQUENTIAL 낮은 주소에서 높은 주소의 순서대로 페이지 접근

MADV_WILLNEED 당분간은 지정된 영역에 있는 페이지에 접근하려고 함

MADV_DONTNEED 당분간은 지정된 영역에 있는 페이지에 접근하지 않음

advice 옵션(linux 2.6 kernel에서의 동작)

MADV_NORMAL 커널이 적절히 미리읽기 작업을 수행(평상시와 동일)

MADV_RANDOM 커널이 미리읽기를 비활성화함, 매번 물리적인 연산이 일어날 때마다 최소 자료만 읽음

MADV_SEQUENTIAL 커널이 공격적인(적극적인) 미리읽기 작업을 수행

MADV_WILLNEED 커널이 미리읽기 작업을 시작해서 페이지를 메모리로 읽어 들인다.

MADV_DONTNEED 커널이 페이지와 관련된 자원을 해제하고, 변경되었지만 아직 동기화되지 않은 페이지는 버린다. 이후 mapping된 자료에 대한 접근이 있으면 파일에서 페이지를 읽어들인다.

728x90

+ Recent posts