서버 설정 · 3 min read · Jan 24, 2026

FreeBSD에서 VNC 서버로 감옥 만들기

FreeBSD에서 VNC 서버로 감옥 만들기

이 문서에서는 FreeBSD의 감옥 내에서 VNC 서버를 실행하는 방법을 설명합니다.

소스에서 감옥 만들기:

감옥이 저장될 디렉토리를 만듭니다:

# mkdir -p /home/jails

또는 /usr 디렉토리에서:

# mkdir -p /usr/jails
# mkdir /home/jails/testjail

/usr/src 디렉토리로 이동하여 FreeBSD 소스 코드가 있는지 확인합니다.

# cd /usr/src
# ls

다음과 같은 내용이 표시되어야 합니다:

COPYRIGHT               contrib                 release
LOCKS                   crypto                  rescue
MAINTAINERS             etc                     sbin
Makefile                games                   secure
Makefile.inc1           gnu                     share
ObsoleteFiles.inc       include                 sys
README                  kerberos5               tools
UPDATING                lib                     usr.bin
bin                     libexec                 usr.sbin

빈 디렉토리이거나 sys 디렉토리만 있는 경우 FreeBSD 소스 코드를 설치해야 합니다: sysinstall을 실행하거나 cvs에서 소스 코드를 다운로드할 수 있습니다.

# sysinstall

구성으로 이동한 다음 배포로 가서 “src”를 선택하고 확인을 누릅니다. 그 후 /usr/src/ 디렉토리에 모든 소스 코드가 있어야 합니다. 그런 다음 cvs에서 최신 버전으로 소스 코드를 업데이트해야 합니다. 홈 디렉토리 또는 다른 곳에 “stable-supfile”이라는 파일을 만들어야 합니다.

# vi ~/stable-supfile

그리고 다음과 같은 줄을 입력합니다:

# FreeBSD 소스 코드의 더 가까운 미러, 저에게는 폴란드에서
*default host=cvsup.pl.FreeBSD.org
*default base=/usr
*default prefix=/usr
# FreeBSD 7.2 버전의 경우 RELENG_7_2 7.1 - RELENG_7_1 7.0 - RELENG_7_0 6.4 RELENG_6_4를 입력합니다.
*default release=cvs tag=RELENG_7_2
*default delete use-rel-suffix
*default compress
src-all

파일을 저장한 후 csup로 FreeBSD 소스 코드를 업데이트할 수 있습니다:

# csup /root/stable-supfile

그 후 소스 코드에서 감옥을 컴파일할 수 있습니다:

# cd /usr/src
# make world DESTDIR=/home/jails/testjail
# make distribution DESTDIR=/home/jails/testjail

한 번 World를 컴파일하면 두 개의 명령으로 추가 감옥을 생성할 수 있으며, 다시 World를 컴파일할 필요가 없습니다:

# make installworld DESTDIR=/home/jails/otherjail
# make distribution DESTDIR=/home/jails/otherjail

감옥이 준비되면 일부 구성 파일에서 몇 가지 변경을 해야 합니다.

# vi /home/jails/testjail/etc/rc.conf

그리고 다음을 입력합니다:

sendmail_enable="NONE"
sshd_enable="YES"
# cp /etc/resolv.conf /home/jails/testjail/etc/
# touch /home/jails/testjail/etc/fstab

처음으로 감옥 실행하기:

감옥을 실행하려면 devfs를 감옥에 마운트해야 합니다:

# mount -t devfs devfs /home/jails/testjail/dev

그런 다음 네트워크 인터페이스에 대한 별칭을 구성해야 합니다. 제 FreeBSD에서는 bge0 인터페이스가 있으며, 다음과 같이 별칭을 만듭니다:

# ifconfig bge0 alias 192.168.2.2

감옥 실행:

# jail /home/jails/testjail shell 192.168.2.2 /bin/tcsh

감옥에 들어가면 루트 비밀번호를 설정할 수 있습니다:

# passwd

그런 다음 ssh를 통해 감옥에 접근할 수 있는 비루트 계정을 하나 추가해야 합니다.

# adduser

감옥을 나가려면 exit 명령을 사용해야 합니다.

# exit

감옥이 거의 준비되었습니다. /etc/rc.conf 파일에 몇 줄을 추가해야 하며, 그 후 서버가 시작될 때 감옥이 시작됩니다.

# 네트워크 인터페이스에 대한 별칭
ifconfig_bge0_alias0="192.168.2.2"
# FreeBSD에서 감옥을 활성화하는 줄
jail_enable="yes"
# 감옥 목록 예: "testjail otherjail httpjail sshjail"
jail_list="testjail"
jail_testjail_rootdir="/home/jails/testjail"
jail_testjail_hostname="testjail"
jail_testjail_ip="192.168.2.2"
jail_testjail_exec_start="/bin/sh /etc/rc"
jail_testjail_exec_stop="/bin/sh /etc/rc.shutdown"
jail_testjail_devfs_enable="YES"

감옥에서 포트 트리를 가지고 싶고 복제하고 싶지 않다면 /etc/fstab 파일에 한 줄로 /usr/ports/ 디렉토리를 감옥에 마운트할 수 있습니다. 다음과 같은 줄:

/usr/ports              /home/jails/testjail/usr/ports/         nullfs  rw,auto 0 0

시스템을 재부팅하지 않고 감옥을 시작하고 중지하기:

# /etc/rc.d/jail start testjail
# /etc/rc.d/jail stop testjail

감옥 목록을 얻으려면 다음 명령으로 얻을 수 있습니다:

# jls

패키지에서 감옥에 xorg 및 vnc 설치하기:

# pkg_add –r xorg
# pkg_add –r vnc

사용자 계정에서 vnc를 실행하려면 다음과 같이 입력합니다:

$ vncserver

처음 vncserver를 실행할 때 vnc 연결을 위한 비밀번호를 설정해야 합니다.

기본적으로 vnc에 연결하면 twm이 실행됩니다. ~/.vnc/xstartup 파일을 편집하여 이를 변경할 수 있습니다. 마지막 줄을 “twm &”에서 예를 들어 “wmaker &”로 변경해야 합니다.

vnc 감옥에 연결하려면 vncviewer에 jail_ip_address와 vnc 포트를 입력해야 합니다. 예: 192.168.2.2:1

감옥에서 vnc와 관련된 몇 가지 오류: 색상을 인식하지 못하는 메시지가 표시되면 /usr/local/bin/vncserwer 파일을 편집하고 다음 줄을 변경해야 합니다:

$cmd .= " -co /usr/X11R6/lib/X11/rgb";

“!!!!!!!!!!!!!!!!!!!!!!!!!!” 메시지가 표시되면 감옥 이름에 대해 사용 가능한 디스플레이가 없다는 의미입니다. /usr/local/bin/vncserver를 편집하고 CheckDisplayNumber 함수의 두 줄에서 pack 함수를 sockaddr_in으로 변경해야 합니다:

[…]
pack ---> sockaddr_in(6000 +$n, &INADDR_ANY))) {
[…]
pack ---> sockaddr_in(5900 +$n, &INADDR_ANY))) {
[…]

코드는 다음과 같아야 합니다:

sub CheckDisplayNumber
{
    local ($n) = @_;
    socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
    eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
    if (!bind(S, sockaddr_in(6000 + $n, &INADDR_ANY))) {
        close(S);
        return 0;
    }
    close(S);
    socket(S, $AF_INET, $SOCK_STREAM, 0) || die "$prog: socket failed: $!\n";
    eval 'setsockopt(S, &SOL_SOCKET, &SO_REUSEADDR, pack("l", 1))';
    if (!bind(S, sockaddr_in(5900 + $n, &INADDR_ANY))) {
        close(S);
        return 0;
    }
    close(S);
}

감옥을 위한 IPWF에서 포트 포워딩

감옥으로 일부 포트를 포워딩하려면 몇 가지 옵션이 활성화된 FreeBSD 커널을 컴파일해야 합니다:

options  IPFIREWALL
options  IPFIREWALL_DEFAULT_TO_ACCEPT
options  IPFIREWALL_VERBOSE
options  IPFIREWALL_FORWARD
options  IPDIVERT

포트 포워딩 규칙:

ipfw add fwd ip_adres_jail,port_jail tcp from any to adresip_local port_local
예:
ipfw add fwd 192.168.2.2,21 tcp from any to me 21
ipfw add fwd 192.168.2.2,21 tcp from any to 72.46.154.23 21
Share: X/Twitter LinkedIn

새 게시물을 받은 편지함에서 받기

스팸은 없습니다. 언제든지 구독 해지 가능합니다.