여기에서 보다시피 경로명의 시작을 "//?/"로 하면, 즉 "\\?\D:\" 처럼 써주면 win32 api level에서는 32,000자까지 받아 들인다고 한다(중간의 shell이 잘라먹지 않는이상).
출처 : http://reply.tistory.com
/proc 파일시스템은 리눅스의 탁월한 특징 중 하나이다. 이를 통해 머신을 끄고 재부팅 하지 않고 OS의 상세한 부분들을 관리할 수 있다.
상업적으로 매우 중요한 시스템을 관리해 본 사람이라면 업타임(uptime)의 가치를 안다. 역으로 말하면 다운타임(downtime)으로 인해 사용자들로부터 듣게될 원성으로 인한 두통을 알 것이다. 기업이 유닉스 서버를 실행하는 이유 중 하나는 유닉스의 신뢰성과 안정성 때문이다. 주의 깊게 관리된다면 한 동안 재부팅 할 필요 없이 지내게 된다. 게다가 서버를 실행상태로 유지하면서 커널 레벨에서 관리 작업도 수행할 수 있다. 하드웨어를 업그레이드하기 위해 시스템을 재시작 해야 하거나 누군가가 전원 코드를 실수로 뺄 수 있다면 서비스에 피해를 주지 않고 관리작업을 수행하는 것을 알아두는 것이 좋다.
이 글에서는 재부팅 없이 다양한 관리 작업을 수행하고 시스템을 변경할 수 있는 방법이 소개되어 있다. 리눅스는 시스템을 실행 상태로 유지 시킨 채 리눅스 기저의 값과 설정을 변경하는 다양한 방법을 제공한다.
Note: 본 자료는 2.4 레벨 커널 기준이다. 일부 옵션과 기능은 다른 커널 버전과 다를 수 있다.
리눅스는 시스템이 실행중인 동안 커널/시스템을 재부팅 할 필요 없이 관리자들이 커널을 변경할 수 있는 깔끔한
방법을 제공한다. 이는 /proc
이라고 하는 가상 파일시스템으로 수행된다. Linux
Gazette는 /proc
에 관한한 가장 간단하고 쉬운 레퍼런스를 제공한다. (참고자료)
기본적으로 /proc
파일시스템은 실행 커널을 볼 수 있는 시각을 제공한다. 이는
퍼포먼스를 감시하고 시스템 정보를 발견하며 시스템이 어떻게 설정되었는지를 파악하고 그 설정을 변경할 때
유용하다. 이러한 파일시스템을 가상 파일시스템(virtual filesystem)이라고 한다.
실제 파일시스템이 아니기 때문이다. 이것은 일반적인 파일시스템 구조에 어태치된 커널에 의해 제공되어 이에
액세스 할 수 있게 한다.
시스템이 실행중일 때 실행중인 커널 매개변수를 변경하는 몇 가지 방법이 있다는 사실은 커널 설정 변경에
상당한 힘과 유연성을 시스템 관리자들에게 제공해준다고 볼 수 있다. 이러한 유형의 구현은 일부의 리눅스
커널 개발자들에게 영감을 주는 생각이었다. 하지만 힘도 너무 크면 오히려 나쁠 수도 될 수 있지 않은가?
가끔 그렇다. /proc
파일시스템에 있는 무엇인가를 변경한다면 변경하려는 것이
무엇이고 시스템에 미칠 영향에 대해 반드시 알아야한다. 이들은 실제로 유용한 기술이지만 잘못된 행동은 원치
않는 결과를 가져다 줄 수 있다. 이런 작업이 처음이거나 변경으로 인한 결과를 확신하지 못한다면 중요하지
않는 머신에 연습을 먼저 하기 바란다.
우선 커널에 변경을 가하지 않는 방법을 생각해보자. /proc
파일시스템으로
곧바로 뛰어들어 텍스트 에디터에 있는 파일을 열고 변경을 수행하고 파일을 저장하면 안될 두 가지 중요한
이유가 있다:
따라서 이러한 파일들을 변경할 때의 답은 에디터를 사용하지 않는 것이다. /proc
파일시스템에 있는 모든 것을 변경할 때 echo
명령어를 사용하고 명령행에서 온
아웃풋을 /proc
밑의 선택된 파일에 리다이렉트 해야한다:
echo "Your-New-Kernel-Value" > /proc/your/file
이와 비슷하게 /proc
에서 정보를 보고싶다면 그 목적에 맞게 설계된 명령어를
사용하거나 cat
명령어를 사용한다.
/proc
을 잘 사용하기 위해 커널 해커가 될 필요가 없다. 이 파일시스템의 구조에
대한 기본적인 이해만으로도 충분히 도움이 된다.
/proc
에 있는 각각의 파일들은 매우 특별한 파일 권한들을 할당받았고 특별한
사용자 아이디에 의해 소유된다. 이는 매우 신중하게 수행되어 정확한 기능이 관리자와 사용자들에게 보일 수
있도록 한다. 특별한 권한이 개별 파일에 어떤 일을 수행하는지를 다음과 같이 요약했다:
/proc
에서 쓰기가 가능하다면, 루트(root)
사용자만 쓸 수 있음.
/proc
에 대한 매우 광범위한 일반화는 /proc/sys
디렉토리를 제외하고 대부분 읽기 전용이라는 것을 알게 될 것이다. 이 디렉토리는 대부분의 커널 매개변수를
갖고 있으며 시스템이 실행되는 동안 변경되도록 설계되었다.
/proc
의 각 파일에 대한 정확한 정보와 사용법을 이 글에서는 다루지 않겠다.
이 글에서 다루어지지 않은 /proc 파일에 대한 자세한 정보의 경우, 최상의 소스는 리눅스 커널 소스 그 자체일
것이다. 매우 훌륭한 문서까지 포함되어 있다. /proc
에 있는 다음 파일들은 시스템
관리자들에게 유용하다.
시스템 관리자로서 배워두면 가장 유용할 것 중 하나이다. 사용가능한 핫스왑(hot-swap) 드라이브가 있을 때 시스템을 재부팅하지 않고 더 많은 디스크 공간을 추가하는 방법이다. /proc을 사용하지 않고, 드라이브를 삽입할 수 있으나 시스템이 새로운 디스크를 인식하도록 하려면 재부팅해야 한다. 다음과 같은 명령어로 새로운 드라이브를 시스템이 인식하도록 할 수 있다:
echo "scsi add-single-device w x y z" > /proc/scsi/scsi
이 명령어가 올바르게 작동하도록 하려면 매개변수 값인 w, x, y, z를 정확히 해야한다:
디스크가 시스템에 추가되면 이전에 포맷된 파일시스템들을 마운트하거나 포맷을 시작할 수 있다. 디스크가
어떤 디바이스가 도리지 불확실하거나 기존에 존재하는 파티션을 점검하고 싶다면 fdisk -l
같은 명령어를 사용하면 된다.
바꿔 말하면 재부팅 필요 없이 시스템에서 디바이스를 제거하는 명령어는 다음과 같다:
echo "scsi remove-single-device w x y z" > /proc/scsi/scsi
이 명령어를 입력하고 시스템에서 핫스왑 SCSI 디스크를 제거하기 전에 디스크에서 파일시스템을 먼저 언마운트한다.
/proc/sys/fs/file-max
이것은 할당받을 수 있는 최대 파일 핸들 수를 지정한다. 열린 파일의 최대 수가 다 되었기 때문에 더 이상의
파일을 열 수 없다는 에러 메시지를 사용자가 받는다면 이 값을 늘려야한다. 수는 제한 없이 설정될 수 있고
파일에 새로운 숫자 값을 작성하여 변경할 수 있다.
기본 설정: 4096
/proc/sys/fs/file-nr
이 파일은 file-max와 관련이 있고 세 개의 값을 보유하고 있다:
/proc/sys/fs/inode-*
"inode"라는 이름으로 시작하는 모든 파일은 "file"로 시작하는 파일과 같은 작동을 수행하지만,
파일 핸들 대신 inode와 관련된 작동을 수행한다.
/proc/sys/fs/overflowuid
& /proc/sys/fs/overflowgid
이것은 16 비트 사용자와 그룹 ID를 지원하는 모든 파일시스템용 User ID (UID)와 Group
ID (GID)를 갖고있다. 이 값들은 변경될 수 있지만 원하면 그룹과 패스워드 파일 엔트리를 변경하는
것이 더 쉽다.
기본 설정: 65534
/proc/sys/fs/super-max
이것은 수퍼 블록 핸들러의 최대 수를 지정한다. 마운트 한 모든 파일시스템은 수퍼 블록을 사용하여 많은
파일시스템들을 마운트하더라도 실행 될 수 있도록 할 수 있다.
기본 설정: 256
/proc/sys/fs/super-nr
현재 할당된 수퍼 블록의 수 이다. 이 파일은 읽기 전용이며 정보 전달만을 목적으로 한다.
/proc/sys/kernel/acct
프로세스 어카운딩이 로그를 포함하고 있는 파일시스템 상의 빈 공간의 양을 기반을 해서 발생할 경우를 제어하는
세 개의 설정 가능한 값을 갖고있다:
기본 설정: 2 4 30
이 값들은 로그를 포함하고 있는 파일시스템의 빈 공간이 2% 미만이라면 어카운팅을 멈춘다. 그리고 빈 공간이 4% 이상 이라면 다시 시작한다. 검사는 30초 마다 이루어진다.
/proc/sys/kernel/ctrl-alt-del
이 파일은 시스템이 ctrl+alt+delete 키 조합을 받을 때 어떻게 반응하는지를 제어하는 바이너리
값을 갖고 있다. 두 개의 값은 다음과 같은 것을 나타낸다:
기본 설정: 0
/proc/sys/kernel/domainname
이를 사용하여 네트워크 도메인 이름을 설정할 수 있다. 기본 값이 없으며 이미 설정되었을 수도 아닐 수도
있다.
/proc/sys/kernel/hostname
기본 값이 없으며 이미 설정되었을 수도 아닐 수도 있다. 네트워크 호스트 이름을 설정할 수 있다.
/proc/sys/kernel/msgmax
이것은 하나의 프로세스에서 다른 프로세스로 보내질 수 있는 최대 메시지 사이즈를 지정한다.
기본 설정: 8192
/proc/sys/kernel/msgmnb
하나의 메시지 큐에서의 최대 바이트 수를 지정한다.
기본 설정: 16384
/proc/sys/kernel/msgmni
최대 메시지 큐 식별자의 수를 지정한다.
기본 설정: 16
/proc/sys/kernel/panic
"커널 패닉"으로 인해 재부팅 되기 전에 커널이 기다려야 할 시간을 나타낸다. 0초 설정은
커널 패닉 시 재부팅 할 수 없다.
기본 설정: 0
/proc/sys/kernel/printk
중요성을 기준으로 해서 로깅 메시지가 전송될 곳을 지정하는 숫자 값을 갖고 있다:
기본 설정: 6 4 1 7
/proc/sys/kernel/shmall
주어진 지점의 시스템에서 사용될 수 있는 총 공유 메모리 (바이트) 양.
기본 설정: 2097152
/proc/sys/kernel/shmax
커널에 허용된 최대 공유 메모리 세그먼트 사이즈 (바이트)를 지정한다.
기본 설정: 33554432
/proc/sys/kernel/shmmni
전체 시스템을 위한 최대 공유 메모리 세그먼트의 수.
기본 설정: 4096
/proc/sys/kernel/sysrq
0이 아닐 때 System Request Key를 활성화한다.
기본 설정: 0
/proc/sys/kernel/threads-max
커널에서 사용할 수 있는 최대 쓰레드의 수.
기본 설정: 2048
/proc/sys/net/core/message_burst
새로운 경고 메시지를 작성하는데 필요한 시간 (1/10 초); 이 시간동안 받은 다른 경고 메시지들은 누락된다.
시스템을 메시지로 넘쳐나게 하려는 사람들의 "Denial of Service" 공격을 방지하는데 사용된다.
기본 설정: 50 (5초)
/proc/sys/net/core/message_cost
모든 경고 메시지와 관련된 비용의 값을 보유하고 있다. 값이 높을 수록 경고 메시지가 더욱 무시된다.
기본 설정: 5
/proc/sys/net/core/netdev_max_backlog
인터페이스가 커널이 처리할 수 있는 것보다 빠른 패킷을 받았을 때 큐에 허용된 최대 패킷 수를 제공한다.
기본 설정: 300
/proc/sys/net/core/optmem_max
소켓 당 할당된 최대 버퍼 사이즈를 지정한다.
/proc/sys/net/core/rmem_default
수신 소켓 버퍼의 기본 사이즈(바이트) 이다.
/proc/sys/net/core/rmem_max
수신 소켓 버퍼의 최대 사이즈(바이트) 이다.
/proc/sys/net/core/wmem_default
송신 소켓 버퍼의 기본 사이즈(바이트) 이다.
/proc/sys/net/core/wmem_max
송신 소켓 버퍼의 최대 사이즈(바이트) 이다.
/proc/sys/net/ipv4
모든 IPv4와 IPv6 매개변수는 커널 소스 문서에 모두 문서화되었다. /usr/src/linux/Documentation/networking/ip-sysctl.txt
파일을 참조하기 바란다.
/proc/sys/net/ipv6
IPv4와 같다.
/proc/sys/vm/buffermem
버퍼 메모리에 사용될 총 시스템 메모리(퍼센트) 양을 제어한다. 파일에 공간 분리 리스트를 작성하여 설정될
수 있는 세 개의 값을 갖고 있다:
기본 설정: 2 10 60
/proc/sys/vm/freepages
시스템이 다른 레벨의 빈 메모리에 어떻게 반응할 것인지를 제어한다. 공간 분리 리스트를 파일에 작성하여
설정할 수 있는 세 개의 값이 있다:
기본 설정: 512 768 1024
/proc/sys/vm/kswapd
커널이 메모리를 스와핑하도록 어떻게 허용할 지를 제어한다. 공간 분리 리스트를 파일에 작성하여 설정할 수
있는 세 개의 값이 있다:
기본 설정: 512 32 8
/proc/sys/vm/pagecache
/proc/sys/vm/buffermem
과 같은 작업을 수행하지만 메모리 매핑과
일반적인 파일 캐싱을 위해 작동한다.
![]() |
![]()
|
/proc/sys
디렉토리에는 어떤 커널 매개변수라도 변경할 수 있도록 편리한 유틸리티가
있다. 이를 사용하여 실행 커널을 변경할 수 있지만 시스템 부트에서 실행되는 설정 파일 또한 있다. 이것은
실행 커널을 변경하고 그들을 설정 파일에 추가시켜 시스템 재부팅 후에도 어떤 변경이라도 남아있게 된다.
이 유틸리티는 sysctl
이라고 하며 sysctl(8)의 맨페이지에 모두 문서화
되어 있다. sysctl
용 설정 파일은 /etc/sysctl.conf
이며
편집 될 수 있다. sysctl.conf(8)에 문서화되어 있다. Sysctl
은
/proc/sys
밑에 있는 파일들을 변경될 수 있는 개별 변수들로 취급한다. 따라서,
예를 들어, 시스템에 허용된 최대 파일 핸들의 수를 나타내는 /proc/sys
밑의
파일인 /proc/sys/fs/file-max
는 fs.file-max
로
나타난다.
이 예제는 sysctl
표기에서 몇 가지 이상한 점을 드러낸다. sysctl
은
can only change variables under the /proc/sys
디렉토리 밑에 있는 변수들을 변경할 수 있기 때문에 변수 이름의 일부는 이 디렉토리 밑에 있는 것으로 가정되는
변수로서 무시된다. 디렉토리 분리자(슬래시, /)는 마침표(.)로 변경되었다.
/proc/sys
에 있는 파일들과 sysctl
의 변수들
간 변환에 적용되는 두 개의 간단한 규칙이 있다:
/proc/sys
를 누락한다.이 두 개의 규칙으로 /proc/sys
에 있는 모든 파일 이름을 sysctl
의
모든 변수 이름으로 바꿀 수 있다. 변수 변환에 대한 일반적인 파일은 다음과 같다:
/proc/sys/dir/file --> dir.file
dir1.dir2.file --> /proc/sys/dir1/dir2/file
변경될 수 있는 모든 변수들을 볼수 있고 이에 더하여 sysctl -a
명령어를
사용하여 그들의 현재 설정을 볼 수 있다.
sysctl
를 사용하여 변수들이 변경될 수 있는데 이는 위에 사용된 echo 메소드와
같은 작업을 수행한다:
sysctl -w dir.file="value"
file-max 예제를 다시 사용하여, 다음과 같이 두 개의 메소드 중 하나를 사용하여 이 값을 16384로 변경할 수 있다:
sysctl -w fs.file-max="16384"
또는:
echo "16384" > /proc/sys/fs/file-max
sysctl
은 설정 파일을 변경하지 않음을 기억하라. 수동으로 하도록 남겨두었다.
재부팅 후에도 변경을 영속성있게 유지하려면 이 파일을 유지하라.
Note:
모든 배포판이 sysctl
을 지원하는 것은 아니다. 이는 특정 시스템의 경우이며,
시스템 부팅 시 실행되도록 하려면 위에 설명된 에코와 리다이렉트 메소드를 사용하여 시작 스크립트에 이 명령어를
추가한다.
![]() |
![]()
|
시스템이 실행되는 동안 다른 비커널 시스템 매개변수를 변경하고 또한 재부팅 필요 없이 설정을 발효시킬 수
있다. 이들은 주로 서비스, 데몬, 서버로 분류되며 /etc/init.d
디렉토리에
있다. 이 디렉토리에 리스팅될 수 있는 스크립트가 점점 광범위해지기 때문에 여기에서 모든 다양한 설정을
다루기엔 불가능하다. 아래 몇 가지의 예제는 /etc/init.d
스크립트가 다양한
리눅스 배포판에서 어떻게 조작될 수 있는지를 설명하고 있다. 재부팅 필요 없이 설정 데몬과 리로드를 변경하는
것은 유용한 예제이다:
우선, 시스템 서비스를 조직하는 일반적인 방법은 직접 /etc/init.d
에 있는
스크립트를 통해서이다. 이 스크립트들은 매개변수를 취하여 그들이 제어할 서비스를 조작한다. 유효한 작동이
무엇인지 보기위해 매개변수 없이 스크립트 이름을 입력할 수 있다. 일반적인 매개변수들은 다음과 같다:
예를 들어 다음의 명령어는 연결된 사용자 세션을 종료하지 않고 xinetd 설정을 리로드 한다:
/etc/init.d/xinetd reload
Red Hat은 service
명령어를 제공하는데 이는 서비스를 조작한다. service
명령어는 스크립트 이름을 타이핑할 때와 같은 기능을 제공한다. 신택스는 다음과 같다:
service script-name [parameter]
예를 들어:
service xinetd reload
SuSE 역시 rc
라는 명령어를 제공한다. 이는 서비스 명령어와 비슷하다. 하지만
명령어와 스크립트 이름 사이에 공간이 없다:
rc{script-name} parameter
예:
rcapache start
![]() |
![]()
|
![]() |
![]()
|
커 널 2.4에서 IP 공유(ip masquerade), 서버 부하분산(port forwarding), 투명 프락시(redirection)를 사용하려면 iptables 프로그램을 사용해야 한다. 물론 커널 쪽 세팅도 필요하다. 2.2에서는 ipchains와 ipmasqadm으로 분리되어 있었는데 이를 하나로 통합했을 뿐 아니라 사용법도 훨씬 쉬워졌다. 또한 확장성을 고려해서 설계되었다는 장점이 있다. iptables는 NAT 기능뿐 아니라 filtering 기능도 들어 있다. filtering은 패킷을 걸러 내는 즉 없애는(거부하는) 기능을 담당하므로 주로 방화벽을 구축하는데 사용한다. NAT는 패킷의 내용 즉 주소, 포트번호 등을 변경한다. 한 개의 IP 주소를 여러 대의 피시에서 공유하여 인터넷을 사용하는 데는 NAT 기능을 사용해야 한다.(2.2에서의 ip masquerade) 한 개의 도메인 네임에 대해 여러 대의 서버가 서비스를 제공하는 서버 부하분산에도 역시 NAT가 사용된다.(2.2에서의 port forwarding) 이 글에서는 커널 2.4에서 IP 공유와 서버 부하분산을 구현하는 방법을 설명한다. I. 참고자료 이 글을 쓰는데 아래 자료를 참고 하였다. iptables 프로그램 개발은 Netfilter Project의 일부이다. Netfilter Project 프로젝트의 홈페이지는 http://netfilter.kernelnotes.org 이다. 1) Linux 2.4 NAT HOWTO (http://netfilter.kernelnotes.org/unreliable-guides/index.html) II. 준비작업 커널 2.4에서 NAT를 구현하려면 커널에 해당 코드를 올리고(모듈로도 가능) 사용자 프로그램 (iptables)을 설치해야 한다. 아래의 모든 작업은 데비안 2.2(potato)에서 테스트하였다. 커널은 2.4.2를 사용했다. 1. iptables 프로그램 설치 1) 파일 다운로드 iptables의 최신버전은 1.2이다. Netfilter Project 사이트(http://netfilter.kernelnotes.org/ )에서 다운받아 설치한다. 위 사이트에서 아래 파일을 다운 받는다. -rwxr--r-- 1 bae root 151774 Feb 24 18:00 iptables-1.2.tar.bz2 2) 압축 해제 bunzip2 iptables-1.2.tar.bz2 iptables-1.2 디렉토리가 만들어지고 그 안에 소스가 위치한다. 3) cd iptables-1.2 4) 2.4 커널 소스를 /usr/src/linux에 설치한다. 5) make ·2.4 커널 소스가 다른 디렉토리에 있으면 아래 명령이 필요하다. 6) make install 실행파일은 /usr/local/sbin/iptables 이다. 라이브러리도 동시에 설치된다. 다른 곳에서 iptables 파일만 복사해서는 NAT를 사용할 수 없다. 라이브러리도 같이 설치해야 하므로 컴파일하거나 rpm으로 설치해야 한다. 2. 커널 코드 올리기 filtering이나 NAT를 사용하려면 필히 커널에 해당 코드가 올라가야 한다. 모듈로 올리는 방법과 컴파일해서 코드에 포함시키는 방법이 있다. 여기서는 커널을 컴파일해서 코드를 설치하는 경우의 make menuconfig(make config, make xconfig) 에서 필요한 선택사항을 설명한다.(커널 2.4.2) NAT와 직접 관련된 선택사항만 설명했다. 네트워크나 랜카드에 관련된 부분은 자신의 시스템에 맞게 선택해야 한다. 1) 메인 메뉴의 “Networking options “ 에서 아래 부분을 선택한다. [*]Network packet filtering IP: Netfilter Configuration ---> <*> Connection tracking (required for masq/NAT) 아래 항목 중에서 일반적인 IP 공유나 서버부하분산을 구현하려면 <*> 표시가 있는 항목을 선택한다. 나머지는 패킷 필터링을 사용하거나 특수한 NAT 기능 구현시만 필요하다. < > limit match support 2) 아래 메뉴를 선택하면 NAT 기능을 사용할 수 없다. "Networking options"에서 "Fast switching (read help!)" III. NAT에 대한 이해 iptables를 정확히 사용하려면 iptables에서 정의하는 NAT의 개념을 알아야 한다. 1. NAT 사용 예 아래 그림을 기준으로 설명한다. 아래 그림에서 리눅스C에는 두 개의 랜카드가 설치되어 있고 인터넷 쪽의 랜카드(eth0) 에는 공인 IP(고정) 가 부여되어 있다.(211.217.xxx.yyy) 두번째 랜카드에는 내부어드레스(192.168.1.1)가 부여되어 있고 내부 랜(192.168.1.0/24)에 연결되어 있다. <그림 1> 1) 여러 대의 피시에서 한 개의 IP를 공유하여 인터넷을 사용 adsl 이나 케이블모뎀으로 인터넷을 연결하는 경우 보통은 1개의 IP 주소를 받는다. (여러 개를 받을 수 있는 서비스가 있으나 비용이 많이 든다.) 이때 한 개의 IP주소를 여러 대의 피시에서 공유하여 인터넷을 사용하려 할 경우 NAT가 사용된다. 우리가 IP Masquerade라 불러왔다. 그림 1] 에서 윈도우A, 윈도우B 두 대의 피시에서 리눅스C의 공인 IP(211.217.xxx.yyy)를 공유해서 인터넷을 사용하게 설정하는 경우이다. 2) 한 개의 IP 주소(도메인네임)에 여러 대의 서버를 연결하는 경우 부하분산을 위해 한 개의 도메인네임(FQDN)에 대해 여러 대의 서버를 운영하는 경우도 NAT를 사용한다. 즉 www.linuxlab.co.kr 도메인 한 개에 웹서버, 메일서버, FTP 서버를 따로 운영하는 경우이다. 부하평준화(load balance) 기능도 구현이 가능하다. 즉 www.linuxlab.co.kr 도메인에 대한 웹서비스를 여러 대의 서버가 담당하게 하는 경우이다. 2.2에서는 port forwarding이라 불리웠다. (커널 2.2에서 port forwarding 사용법은 리눅스 월드 2000년 3월호에 있다.) 그림 1] 에서 윈도우C에서 bae@www.linuxlab.co.kr로 메일을 보내면 메일은 192.168.1.10 서버로 전달되고 웹을 검색하면(http://www.linuxlab.co.kr) 192.168.1.11 서버가 응답하게 설정하는 것이다. 3) 투명 프락시 학원에서 인터넷 강의를 하는 경우는 동일 네트워크에 연결된 여러 대의 피시에서 동시에 같은 사이트를 연결한다. 이 경우 프락시 서버를 설치하면 모든 피시는 우선 프락시 서버에서 방문하려는 사이트의 페이지가 있는지를 확인하고 여기에 없을 경우는 프락시서버에서 해당 사이트를 연결해 페이지를 가져다 피시에게 준다. 프락시 서버를 사용하려면 피시의 웹브라우저에 프락시서버를 지정해 주어야 한다. 그런데 투명프락시의 경우는 클라이언트 피시의 웹브라우저에 프락시서버를 지정할 필요가 없다. 리눅스에 투명프락시를 설정하면 리눅스를 통과하는 패킷은 자동으로 리눅스에 설치된 프락시서버 프로그램(예: squid)으로 연결된다.(리눅스를 각 피시의 디폴트게이트로 지정하면 모든 패킷은 리눅스를 통과한다.) 예전에는 리다이렉션이라고 불리웠다. 그림 1]에서 윈도우A에서 www.debian.org의 페이지를 검색하면 리눅스C에 설치된 프락시서버프로그램(squid)이 www.debian.org를 연결해 대신 데이터를 가져다 윈도우A에 넘겨주는 설정이다. 이 글에서는 투명프락시 설정은 설명하지 않는다. Transparent Proxy with Squid mini-HOWTO를 참고 하라. 2. iptables에서 NAT 의 분류 iptables에서는 크게 두 부류의 NAT로 분류한다. 위의 1) 의 경우를 SNAT(Source NAT) 위의 2) , 3)의 경우는 DNAT(Destination NAT) 라 분류한다. SNAT는 패킷의 소스 어드레스를 변경한다는 의미이다. 즉 내부 어드레스인 192.168.1.100 윈도우A 에서 www.debian.org 리눅스서버를 연결하면 debian 서버에서 볼 때 패킷의 소스가 192.168.1.100이 아닌 211.217.xxx.yyy로 나타나기 때문이다. SNAT는 라우팅(경로) 결정 이후에 이루어진다.(post-routing) 패킷의 목적지 주소는 이미 정해져 있으므로(www.debian.org) 라우팅 경로는 결정되어 있고 패킷의 소스 주소가 리눅스를 떠나기 직전에 변경된다.(192.168.1.100 -> 211.217.xxx.yyy) DNAT는 이와는 반대다. 리눅스C에서 패킷의 목적지 주소를 변경한다. 윈도우C에서 bae@www.linuxlab.co.kr 주소로 메일을 보내면 리눅스C에 도착한 패킷의 목적지가 리눅스 B의 주소로 변경된다. 즉 패킷의 목적지 주소가 먼저 변경되고(211.217.xxx.yyy -> 192.168.1.10) 그 변경된 주소에 의거하여 새로운 라우팅 경로가 찾아진다. 즉 DNAT는 라우팅 이전 단계에서 작용한다.(pre-routing) post-routing와 pre-routing 은 무척 혼동된다. 즉 내가 왼쪽이라 하면 상대에서 나를 볼 때는 오른쪽이다. 결국 NAT 가 routing 보다 전에 작용하느냐 후냐의 구분으로 보면 된다. (iptables 파라메터 지정에서 이 둘을 혼동하면 에러가 난다.) IV. IPTABLES 설정 1. Source NAT 는 아래와 같이 지정한다.(기존의 IP Masquerade를 말함.) iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4 iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6 -t -A 는 위의 글(2)을 읽으면 이해가 되리라고 본다. -o 는 패킷을 보내는 인터페이스
장치이다. SNAT 에서는 패킷을 내 보내는 장치(랜카드)를 지정할 수 있다. --to 는 나가는 패킷에 부여할 소스
주소이다. IP 공유라면 --to 는 인터넷 쪽의 공인 IP 를 지정하면 된다.(지정 않아도 상관없다.)
1.1 실제 사용 예 1) 한국통신 ADSL을 리눅스에 연결해 인터넷을 공유(IP MASQUERADING)하는 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 2) 그림1] 에서 리눅스C의 eth0에 부여된 IP(고정)를 윈도우 A,B에서 공유하여 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to * -s 192.168.1.0/24는 지정 않아도 된다. 3) 그림 1] 에서 리눅스 C의 eth0가 케이블모뎀에 연결되어 있다면 아래처럼 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 1.2 확인 - iptables 설정 내용을 확인하려면 아래 명령을 준다. iptables -t nat -L - 192.168.1.0 네트워크에서 211.217.xxx.yyy 공인 IP를 공유하도록 설정한 경우
2. DNAT DNAT 는 부하분산이나 평준화에만 사용하는게 아니다. 간단한 방화벽으로도 꽤 유용하다. 즉 위의 리눅스C에 DNAT를 설정하여 웹서버와 메일서버를 내부 주소인 리눅스 A와 B에서 서비스 하도록 지정하고 인터넷에서 다른 연결은 리눅스C로 지정하면 리눅스 C가 간단한 방화벽 구실을 담당한다. 2.1 사용 예 - 그림1]에서 처럼 윈도우C에서 www.linuxlab.co.kr 의 홈페이지를 검색하려 할 때 이를 iptables -A PREROUTING -t nat -p tcp -d 211.217.xxx.yyy --dport 80 \ 1) -A PREROUTING : DNAT 는 먼저 목적지 주소를 변경하고(211.217.xxx.yyy를 2) -t nat : 부하분산도 nat 기능이다. 3) -p tcp : 웹(www)은 tcp 를 사용한다. 4) -d 211.217.xxx.yyy --dport 80 : 들어오는 패킷의 목적지 주소가 5) -j DNAT : destination Nat 6) --to 192.168.1.11:80 : 패킷의 목적지 주소를 192.168.1.11 포트번호를 80번으로 - 메일서버를 리눅스B (192.168.1.10)로 설정하려면 아래처럼 지정한다. iptables -A PREROUTING -t nat -p tcp -d 211.217.xxx.yyy --dport 25 \ - DNS 서버를 192.168.1.10으로 변경하려면 아래처럼 지정한다. iptables -A PREROUTING -t nat -p udp -d 211.217.xxx.yyy --dport 53 \ 주의] DNS 는 udp 를 사용한다. 2.2 DNAT 설정 확인 웹을 192.168.1.11 로 DNAT 설정을 하면 아래처럼 나온다.(리눅스C에서 아래 명령을 준다.) churlsu:~# iptables -t nat -L 3. iptables 설정 해제 - 기존에 설정돼 있는 모든 nat 설정을 지우려면 아래 명령을 준다. iptables -t nat -F - iptables 의 모든 설정이 해제된 경우는 아래와 같다. churlsu:~# iptables -t nat -L Chain POSTROUTING (policy ACCEPT) Chain OUTPUT (policy ACCEPT) V. iptables 옵션 아래는 nat 에서 사용하는 중요한 옵션만 설명했다. 나머지는 man 페이지를 참고 하라. 1) -t : --table table 을 선택한다. filter, nat, mangle 세가지 선택이 있다. 커널에 해당 테이블을 지원하는 코드가 들어 있어야 한다. 모듈 자동적재를 사용한다면 해당 테이블을 선택하면 그와 관련된 커널 모듈이 적재된다. 디폴트는 filter 이므로 nat를 사용하려면 필히 nat 를 지정해야 한다. 2) -A : --append 규칙을 추가한다. INPUT, FORWARD : -t가 filter인 경우 사용 가능 3) -i : --in-interface 패킷이 들어오는(incoming) 인터페이스(장치)를 지정한다. (-t 가 nat 이면 PREROUTING에서만 지정 가능하다.) 인터페이스명 앞에 “!” 을 추가하면 그 장치는 제외한다는 의미가 된다. 뒤에 “+”를 추가하면 그 이름으로 시작하는 모든 장치를 의미한다. 디폴트는 +이다. 4) -o : --out-interface outgoing 인터페이스 즉 패킷이 나가는 네트워크 장치를 지정한다. (-t가 nat이면 POSTROUTING 에서만 지정 가능하다) “!” 과 “+” 은 -i 와 동일한다. 5) -s : --source 소스 어드레스/netmask 를 지정한다. SNAT에서 밖으로 나가는 패킷의 소스어드레스에 따라 규칙을 적용하려 할 때 지정한다. 주소는 호스트네임, 네트워크네임, IP 주소 등을 사용할 수 있다. 아래 형식이 가능하다. 앞에 “!”을 넣으면 반대의 개념이 된다. - 192.168.1.100 6) -d : --destination 목적지 주소/netmask 를 지정한다. DNAT 에서 들어오는 패킷의 목적지 주소에 따라 규칙을 적용하려 할 때 지정한다. 위의 -s 와 사용법이 같다. 7) -p : --protocol tcp 나 udp 를 지정한다. 8) --to : --to-source, --to-destination, --to 는 SNAT 에서는 --to-source의 의미이다. 즉 내보내는 패킷에 새로 부여할 소스 IP 주소를 지정한다. 보통은 인터넷 쪽에 연결된 랜카드의 주소이다. DNAT 에서는 --to-destination 의 의미이다. 즉 패킷의 새로운 목적지 주소이다. Port forwarding 에서 는 내부 랜에 설치된 서버의 주소이다. 9) --dport : -p 와 같이 사용된다. DNAT에서 들어오는 패킷의 목적지 포트에 따라 규칙을 적용하려 할 때 지정한다. 출처 : http://www.schkorea.zc.bz/bbs/view.php?id=programming_unix&no=42 |
출처 http://usr.gentoo.or.kr/forum/read.php?table=tip&no=4722&page=1&PHPSESSID=bc42fb4b2f635b2d67b2ef901efbeebb <<<-
...에 제가 진행 중 주의할 부분을 추가했습니다.
삽질에 삽질을 거듭하게 되어 .... 젠투에 usb로 물린 canon laser shot
lbp-1210을
윈도우에서 사용할수있도록 하게 되어서 이렇게 글을 남깁니다...
http://software.canon-europe.com/
일단 위의 곳에서 자신에게 맞는 프린터드라이버를 받습니다.
그럼 필요한 패키지들을 열거 하자면...
cups
samba
ghostscript
그리고 위에서 받은 프린터 드라이버
rpm
문제가 많았던 곳이....cups로 캐논 프린터를 사용하는 부분이 여튼 복잡합니
다.
그리고 cups에서 잡은 프린터를 삼바에 export 시키는 부분도 까다롭습니
다.
삼바설정과 cups설정, 그리고 커널설정은 생략합니다.
http://www.gentoo.org/doc/en/printing-howto.xml
http://www.gentoo.org/doc/en/quick-samba-howto.xml
위의 링크를 참고하시어 설정하기 바랍니다.
canon capt printer driver를 받아 압축을 풀면
cndrvcups-common-1.3x-x.i386.rpm
cndrvcups-capt-1.3x-x.i386.rpm
두가지 파일이 생깁니다. rpm -ivh --nodeps로 common모듈부터 차례로
설치 합니다.
설치가 되었으면 /etc/init.d/cupsd restart 혹은 start로 cups데몬을 시작
합니다.
필요하다면 rc-update add cupsd default로 등록해주시구요...
그리고 ppd파일을 등록합니다.
# /usr/sbin/lpadmin -p [printer name] -m [PPD file name] -v
ccp:/var/ccpd/fifo0 -E
예로 LBP-1210프린터를 사용할경우인데요..
/usr/sbin/lpadmin -p LBP-1210 -m CNCUPSLBP1210CAPTK.ppd -v
ccp:/var/ccpd/fifo0 -E
ppd파일은 /usr/share/cups/model 디렉토리에있으니 확인바랍니다.
다음 ccpd데몬파일에 프린터를 등록합니다.
# /usr/sbin/ccpdadmin -p [Printer Name] -o [Printer Device Path]
예로 LBP-1210프린터는
/usr/sbin/ccpdadmin -p LBP-1210 -o /dev/usb/lp0
그리고...
/etc/ccpd.conf파일을 손봐줍니다.
------------------------------------------------------------------
# Canon Printer Daemon for CUPS Configuration Data
<Path>
# CUPS configuration file path.
# Default /etc/cups/
CUPS_ConfigPath /etc/cups/
# Log directory path.
LogDirectoryPath /var/log/CCPD/
</Path>
# Printer entries.
# Mapping each "Printer Name" to each "Printer Device Port".
# The "Printer Name" has to be identical to the CUPS printer
queue name.
#
# For example, if you prepare a printer named "LBP3200" as a
CUPS printer
# queue name, and the printer is connected to the USB
port "/dev/usb/lp0",
# you can use the following three lines example just by
removing the
# comment symbol "#" of each line.
#<Printer LBP3200>
#DevicePath /dev/usb/lp0
#</Printer>
# 요부분부터 ......LBP-1210일경우입니다.
<Printer LBP-1210>
DevicePath /dev/usb/lp0
</Printer>
<Ports>
# Status monitoring socket port.
# Default 39787
UI_Port 39787
</Ports>
---------------------------------------------------------------------------
그리고 ...데몬파일을 손봐줍니다.
이파일은 이곳게시판(팁)에 어떤분이 미리 만들어 두신걸 보고 베꼈습니다.
/etc/init.d/ccpd
---------------------------------------------------------------------------
#!/sbin/runscript
# startup script for Canon Printer Daemon for CUPS (ccpd)
depend() {
after logger
after cupsd
}
LOCKFILE=/var/lock/subsys/ccpd
start()
{
ebegin "Starting ccpd"
start-stop-daemon --start --quiet --exec /usr/sbin/ccpd
eend $?
[ "$?" = "0" ] && touch ${LOCKFILE}
}
stop()
{
ebegin "Stopping ccpd"
start-stop-daemon --stop --quiet --exec /usr/sbin/ccpd
eend $?
[ "$?" = "0" ] && rm -f ${LOCKFILE}
}
status()
{
ebegin "ccpd:" `pidof ccpd`
}
-----------------------------------------------------------------
다음 /etc/init.d/ccpd start 로 데몬을 실행합니다.
필요하다면 rc-update add ccpd default로 등록해주시구요....
다음 ... 잘 연결되어있는 캐논프린터의 전원을 꺼줍니다.
그리고 전원을 다시 켜줍니다. 어쨋거나 중요한 부분입니다.-0-
cups설정이 잘 되었다면...
cups가 설치된 자리에서라면 웹브라우저를 열고
http://localhost:631/admin
접속하여 .... 프린터 메뉴에서 보시면 프린터가 잡혀있을겁니다.
테스트 페이지를 출력하여봅니다.
만약 프린터에서 아무런 반응이 없다면 컴퓨터를 리부팅하고
다시 프린터 전원을 껏다가 켭니다.
dmesg로 프린터 드라이버가 잘 로딩 되었는지도 확인해보시구요...
다음은 윈도우용 cups드라이버를 설치할 차례입니다.
이 드라이버가 있어야 윈도우에 프린터를 설치하고 프린트 할 수 있게 됩니다.
이 드라이버도 몇가지가 있지만 cups ps드라이버를 사용하도록 하겠습니다.
http://www.cups.org/windows/articles.php
이곳에서 최신드라이버를 받습니다.
압축을 풀게되면
cups6.inf
cups6.ini
cups6.ppd
cupsps6.dll
cupsui6.dll
파일이 생깁니다. 이중 cups6.inf를 제외하고 /usr/share/cups/drivers로
옮깁니다.
그리고 .... 윈도우에서 몇가지 파일을 찾아야하는데....
%windows%\system32\spool\drivers\w32x86\3 폴더에서
ps5ui.dll
pscript.hlp
pscript.ntf
pscript5.dll
파일을 찾아 위처럼 /usr/shar/cups/drivers로 옮깁니다.
윈도우 2000이상입니다.
다음 /etc/samba/smb.conf의 설정에서....
------------------------------------------------------
[global]
load printers = yes
printing = cups
printcap name = cups
[printers]
comment = All Printers
path = /var/spool/samba
browseable = no
public = yes
guest ok = yes
writable = no
printable = yes
printer admin = root
[print$]
comment = Printer Drivers
path = /etc/samba/drivers
browseable = yes
guest ok = no
read only = yes
write list = root
---------------------------------------------------------
특히 [global]에서 security = share 부분이 있다거나 한다면
주석처리를 하십시요. security = user로 하라는 말이 많았지만.
아예 주석처리를 해서 디폴트로 설정하였습니다.
그리고 guest ok = yes이옵션도 역시 주석처리 하십시요.
다음 중요한 cupsaddsmb를 사용하여 cups를 samba에 export합니다.
삼바서버를 잘 설정하셨다면....
smbpasswd -a root로 사용자를 추가하셧으리라 생각합니다.
사용자가 또 있다면
smbpasswd -a 사용자로 추가하십시요...
cupsaddsmb 의 맨페이지는 좋은 설명을 보여줄것같습니다.
cupsaddsmb -H 삼바서버 -U root -h cups프린트서버 -v 프린터이름
예로...위의 설정대로 서버가 apple이고 프린터가 LBP-1210이라면
# cupsaddsmb -H apple -U root -h apple -v LBP-1210
이라고 쳐주면 장황한 메시지를 뿌리며 설정을 마치게 됩니다.
# ls /etc/samba/printers
/usr/share/cups/drivers에 복사하였던 파일과 ppd파일, 그리고 3이라는
디렉토리에 같은 파일들이 보일겁니다.
다음 원하는데로 /etc/samba/smb.conf파일을 수정합니다.
제경우 security = share로 다시 고치고 ....
그리고!!!! [print$] 섹션에서 guest ok = no 부분을 yes로
변경합니다. 윈도우에서 프린터 설치시 다운받지 못하는 현상이
발생해서 입니다.
변경시에는 /etc/init.d/samba restart로 재실행을 해주시고...
자 이제 윈도우로 와서...
프린터추가를 합니다. 네트워크 프린터를 선택하면 자연스럽게
설치가 될겁니다.
한가지 더!!!!!!!! 주의할점은 ...
설치된 프린터의 속성> 인쇄 기본 설정> 고급 창에서
문서옵션> 포스트스크립트옵션> 포스트스크립트출력옵션을
인캡슐화된 포스트스크립트(EPS)를 선택하여야 합니다.
자 이제 마음껏 윈도우에서 젠투에 연결된 프린터를 사용하시기
바랍니다.
잘못된부분 보충할부분 지적바랍니다.
참고자료
http://forums.gentoo.org/viewtopic-t-110931-postdays-0-
postorder-asc-start-200.html
http://forums.gentoo.org/viewtopic-t-456501-highlight-
cups+samba+printer+share.html
http://forums.gentoo.org/viewtopic-t-110931-postdays-0-
postorder-asc-highlight-samba+cups+window-start-0.html
http://gentoo-
wiki.com/Talk:HOWTO_Native_Windows_Printing_with_CUPS/Sam
ba#Cups_Windows_Driver_.26_Samba
http://www.cups.org/doc-1.2/man-cupsaddsmb.html
http://www.gentoo.org/doc/en/printing-howto.xml
http://www.gentoo.org/doc/en/quick-samba-howto.xml
추가참고
http://kr.blog.yahoo.com/bihxx/2
http://search.luky.org/vine-users.7/msg07177.html
https://help.ubuntu.com/community/HardwareSupportComponentsPrinters/CanonPrinters/Canon_LBP_2900
http://linuxforum.ru/index.php?s=d4053bd2851e9fa4f192462586b4c4b8&showtopic=57079&st=0&p=565698&#entry565698
http://forum.pardus-linux.org/viewtopic.php?f=3&t=10063&view=next
[root@truefeel root]# ntpdate -b time.kriss.re.kr 17 Mar 21:03:25 ntpdate[8244]: no server suitable for synchronization found |
[root@truefeel root]# date 월 3월 17 21:40:35 KST 2003 [root@truefeel root]# date 03172150 <- 강제로 시간을 3.17일 21:50 으로 변경함 월 3월 17 21:50:00 KST 2003 [root@truefeel root]# [root@truefeel root]# ntpdate -u time.nuri.net <- 시간을 동기화 함 17 Mar 21:40:44 ntpdate[8835]: step time server 203.255.112.96 offset -557.336058 sec [root@truefeel root]# [root@truefeel root]# date 월 3월 17 21:40:46 KST 2003 <- 시간이 동기화 됨 |
[root@truefeel root]# ntpdate time.nuri.net 14 Mar 01:09:31 ntpdate[3127]: step time server 203.255.112.96 offset 82.763348 sec [root@truefeel root]# ntpdate time.nuri.net 14 Mar 01:22:30 ntpdate[3182]: adjust time server 203.255.112.96 offset -0.064531 sec |
[root@truefeel root]# ntpdate -d time.nuri.net 18 Mar 17:33:23 ntpdate[2169]: ntpdate 4.1.1a@1.791 Sat Aug 31 18:27:31 EDT 2002 (1) transmit(203.255.112.96) receive(203.255.112.96) transmit(203.255.112.96) receive(203.255.112.96) transmit(203.255.112.96) receive(203.255.112.96) transmit(203.255.112.96) receive(203.255.112.96) transmit(203.255.112.96) server 203.255.112.96, port 123 stratum 2, precision -18, leap 00, trust 000 refid [192.6.38.127], delay 0.04927, dispersion 0.00092 transmitted 4, in filter 4 reference time: c2215828.4ea9e000 Tue, Mar 18 2003 17:32:40.307 originate timestamp: c2215853.6ad1b000 Tue, Mar 18 2003 17:33:23.417 transmit timestamp: c2215853.a19695d9 Tue, Mar 18 2003 17:33:23.631 filter delay: 0.05023 0.05008 0.04927 0.06329 0.00000 0.00000 0.00000 0.00000 filter offset: -0.22637 -0.22621 -0.22640 -0.23302 0.000000 0.000000 0.000000 0.000000 delay 0.04927, dispersion 0.00092 offset -0.226409 18 Mar 17:33:23 ntpdate[2169]: adjust time server 203.255.112.96 offset -0.226409 sec |