Special:Communication & Concept/FreeBSD 12.X 에서 NullFS 마운트를 사용하는 얇은 jails.(Thin jails using NullFS mounts on FreeBSD 12.X .)

Jump to: navigation, search
#196 [ Ssam ] hit: 69(#baffba) 1

들어가기

  1. multiple jails 는 업그레이드 될 때마다 처음부터 다시 작성해야하므로 여러 jails 의 관리가 문제가 될 수 있다고 한다.
  2. 많은 jails 이 만들어지고 수동으로 업데이트되는 경우 시간이 오래 걸리고 지루할 수 있다고 한다.
  3. 이 섹션에서는 읽기 전용 mount_nullfs 마운트를 사용하여 jails 사이에 가능한 한 안전하게 공유하여 이 문제를 해결하는 한 가지 방법을 보여 주므로 업데이트가 더 간단해 진다고 한다.
  4. jail 을 추가, 제거 및 업그레이드하는 간단한 방법을 제공 한다.
  5. ezjail 과 같은 더 간단한 솔루션이 존재하는데, FreeBSD jails 를 보다 쉽게 ​​관리 할 수있는 방법을 제공하지만 유용성이 떨어진다고 한다.


jail network 설정

  1. 에디터 vi /etc/rc.conf 파일을 열어 lo1 interface(루프백 인터페이스) 설정.
  2. jail 에서 사용할 가상 ip 를 10.0.0.1 ~ 10.0.0.5 까지 설정.
  • 편집기 vi /etc/rc.conf 파일을 열어 수정.
파일 내용
hostname="zbm.kr"
# ifconfig_vmx0="DHCP"
ifconfig_vmx0="inet 192.168.0.30 netmask 0xffffff00"
defaultrouter="192.168.0.1"

cloned_interfaces="lo1"
ipv4_addrs_lo1="10.0.0.1-5/24"

ifconfig_vmx0_ipv6="inet6 accept_rtadv"
sshd_enable="YES"
ntpd_enable="YES"
# Set dumpdev to "AUTO" to enable crash dumps, "NO" to disable
dumpdev="AUTO"

tcsd_enable="YES"
tcsd_mode="emulator"
tpmd_enable="YES"

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"


lo1 interface 생성

# service netif cloneup
출력 메세지
Created clone interfaces: lo1.
  • lo1 interface 아이피 확인
# ifconfig
출력 메세지
vmx0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	options=60039b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,TSO4,TSO6,RXCSUM_IPV6,TXCSUM_IPV6>
	ether 00:0c:29:8b:43:91
	inet 192.168.0.30 netmask 0xffffff00 broadcast 192.168.0.255 
	inet6 fe80::20c:29ff:fe8b:4391%vmx0 prefixlen 64 scopeid 0x1 
	media: Ethernet autoselect
	status: active
	nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
	options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	inet6 ::1 prefixlen 128 
	inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2 
	inet 127.0.0.1 netmask 0xff000000 
	groups: lo 
	nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
lo1: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
	options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
	inet 10.0.0.1 netmask 0xffffff00 
	inet 10.0.0.2 netmask 0xffffffff 
	inet 10.0.0.3 netmask 0xffffffff 
	inet 10.0.0.4 netmask 0xffffffff 
	inet 10.0.0.5 netmask 0xffffffff 
	groups: lo 
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>


pf(packet filter) 방화벽 설정

  1. FreeBSD는 방화벽은 이미 여러개 설치되어 있어 설정하여 사용하면 된다.
  2. 참고 FreeBSD 웹사이트 Firewalls 를 참고.
  3. pf.conf파일의의 위치가 /etc/pf.conf 이 위치가 아닌 경우 추가 한다.
  • 편집기 vi /etc/rc.conf 파일을 열어 추가 한다.
gateway_enable="YES"
ipv6_gateway_enable="YES"
pf_enable="YES"
# pf_rules="/etc/pf.conf" 
pflog_enable="YES"
# pflog_logfile="/var/log/pflog"
ftpproxy_enable="NO"
  • 방화벽(pf) 와 방화벽 로그(pflog) 서비스 시작
# service pf start
# service pflog start


pf 방화벽 규칙 설정

  1. EXT_IF 는 외부와 연결된 인터페이스.
  2. INT_IF 는 내부 루프백 인터페이스
  3. 포트 80 및 443의 트래픽을 INT_WEB_IP jail 으로 리다이렉션 한다.
  4. 포트 25, 465, 995, 587, 993의 트래픽을 INT_MAIL_IP jail 으로 리다이렉션 한다.
  • 편집기 vi /etc/pf.conf 파일을 열어 보면 아무 것도 없음, 편집 한다.
# Define the interfaces
EXT_IF = "vmx0"
INT_IF = "lo1"
JAIL_NET = $INT_IF:network

# Define jail's web server IP and port. 
INT_WEB_IP = "10.0.0.2"
WEB_PORTS = "{ 80, 443 }"

# Define jail's mail server IP and port.
INT_MAIL_IP = "10.0.0.3"
MAIL_PORTS = "{ 25, 465, 995, 587, 993 }"

 
# Packet normalization
scrub in all

# Define the NAT for the jails
nat on $EXT_IF from $JAIL_NET to any -> ($EXT_IF)
 
# Redirect traffic on ports 80 and 443 to the INT_WEB_IP jail
rdr pass on $EXT_IF inet proto tcp to port $WEB_PORTS -> $INT_WEB_IP

# Redirect traffic on ports MAIL_PORTS to the INT_MAIL_IP jail
rdr pass on $EXT_IF inet proto tcp to port $MAIL_PORTS -> $INT_MAIL_IP


  • 참고로 n 이 포함되면 규칙이 해석만 되고 로드되지 않는다.
  • 아무 메세지가 뜨지 안으면 성공 에러가 없다는 뜻 임.
# pfctl -nf /etc/pf.conf
  • 참고로 규칙 세트를 편집 할 때마다 새 규칙을 로드하여 사용해야한다.
# pfctl -f /etc/pf.conf


템플릿 만들기

  • 32비트 호환은 제외 시켰음.
# mkdir -p /usr/local/jails/releases/12.0-RELEASE
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/12.0-RELEASE/base.txz -o /tmp/base.txz
# tar -xvf /tmp/base.txz -C /usr/local/jails/releases/12.0-RELEASE
# fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/amd64/amd64/12.0-RELEASE/ports.txz -o /tmp/ports.txz
# tar -xvf /tmp/ports.txz -C /usr/local/jails/releases/12.0-RELEASE


  • jail 에 올바른 시간대와 DNS 서버관련 파일 복사.
# cp /etc/resolv.conf /usr/local/jails/releases/12.0-RELEASE/etc/resolv.conf
# cp /etc/localtime /usr/local/jails/releases/12.0-RELEASE/etc/localtime


FreeBSD 템플릿 업데이트

# env UNAME_r=12.0-RELEASE freebsd-update -b /usr/local/jails/releases/12.0-RELEASE fetch install
end 가 보이면 나가기 ctrl + z


FreeBSD 템플릿 업데이트 설치 확인

# env UNAME_r=12.0-RELEASE freebsd-update -b /usr/local/jails/releases/12.0-RELEASE IDS


템플릿 복사

  • 시간이 좀 많이 걸린다.
# mkdir -p /usr/local/jails/templates/base-12.0-RELEASE
# cp -R /usr/local/jails/releases/12.0-RELEASE/* /usr/local/jails/templates/base-12.0-RELEASE


스켈레톤 템플릿 생성(create a skeleton template)

  • 스켈레톤 데이타 셋 디렉토리 만들기
# mkdir -p /usr/local/jails/templates/skeleton-12.0-RELEASE/usr/ports/distfiles 
# mkdir -p /usr/local/jails/templates/skeleton-12.0-RELEASE/home 
# mkdir -p /usr/local/jails/templates/skeleton-12.0-RELEASE/portsbuild
  • 기본 jail 레이어에서 골격 jail 레이어로 폴더를 이동합니다.
# mv /usr/local/jails/templates/base-12.0-RELEASE/etc /usr/local/jails/templates/skeleton-12.0-RELEASE/etc
# mv /usr/local/jails/templates/base-12.0-RELEASE/usr/local /usr/local/jails/templates/skeleton-12.0-RELEASE/usr/local
# mv /usr/local/jails/templates/base-12.0-RELEASE/tmp /usr/local/jails/templates/skeleton-12.0-RELEASE/tmp
# mv /usr/local/jails/templates/base-12.0-RELEASE/var /usr/local/jails/templates/skeleton-12.0-RELEASE/var
# mv /usr/local/jails/templates/base-12.0-RELEASE/root /usr/local/jails/templates/skeleton-12.0-RELEASE/root
  • 심볼링크 만들기(create symlink)
# cd /usr/local/jails/templates/base-12.0-RELEASE
# mkdir skeleton
# ln -s skeleton/etc etc
# ln -s skeleton/home home
# ln -s skeleton/root root
# ln -s ../skeleton/usr/local usr/local
# ln -s ../../skeleton/usr/ports/distfiles usr/ports/distfiles
# ln -s skeleton/tmp tmp
# ln -s skeleton/var var
  • 포트 작업 디렉토리가 기본 디렉토리 안에 있도록 make.conf를 편집.
# echo "WRKDIRPREFIX?=  /skeleton/portbuild" >> /usr/local/jails/templates/skeleton-12.0-RELEASE/etc/make.conf


jail 뼈대를 복사

  • 요기 만 반복적으로 메일 서버도.......
# mkdir /usr/local/jails/thinjails
# cp -R /usr/local/jails/templates/skeleton-12.0-RELEASE /usr/local/jails/thinjails/www
추가 서버
# cp -R /usr/local/jails/templates/skeleton-12.0-RELEASE /usr/local/jails/thinjails/mail


  • jails rc.conf에 호스트 이름을 추가
# echo hostname=\"www\" > /usr/local/jails/thinjails/www/etc/rc.conf
추가 서버
# echo hostname=\"mail\" > /usr/local/jails/thinjails/mail/etc/rc.conf


  • 기본 템플릿과 스켈레톤 폴더가 마운트 될 jail 디렉토리를 만들기.
# mkdir -p /usr/local/jails/www
추가 서버
# mkdir -p /usr/local/jails/mail


  • jail 항목을 작성, 편집기 vi /etc/jail.conf 파일 작성.
## Global settings applied to all jails.
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;

## The jail definition for www
www {
   host.hostname = "www.domain.local";
   path = "/usr/local/jails/www";
   interface = "lo1";
   ip4.addr = 10.0.0.2;
   mount.fstab = "/usr/local/jails/www.fstab";
}

## The jail definition for mail
mail {
   host.hostname = "mail.domain.local";
   path = "/usr/local/jails/mail";
   interface = "lo1";
   ip4.addr = 10.0.0.3;
   mount.fstab = "/usr/local/jails/mail.fstab";
}


  • 에디터 vi /usr/local/jails/www.fstab 파일을 만들고 내용 추가.
/usr/local/jails/templates/base-12.0-RELEASE  /usr/local/jails/www/ nullfs   ro          0 0
/usr/local/jails/thinjails/www     /usr/local/jails/www/skeleton nullfs  rw  0 0
추가 서버
  • 에디터 vi /usr/local/jails/mail.fstab 파일을 만들고 내용 추가.
/usr/local/jails/templates/base-12.0-RELEASE  /usr/local/jails/mail/ nullfs   ro          0 0
/usr/local/jails/thinjails/mail     /usr/local/jails/mail/skeleton nullfs  rw  0 0


jail 만들고 시작

# jail -c www
메세지 출력
www: created
ELF ldconfig path: /lib /usr/lib /usr/lib/compat
32-bit compatibility ldconfig path: /usr/lib32
Setting hostname: thinjail1.
Generating host.conf.
Creating and/or trimming log files.
Starting syslogd.
Clearing /tmp (X related).
Updating motd:.
Starting sendmail_submit.
Starting sendmail_msp_queue.
can not chdir(/var/spool/clientmqueue/): Permission denied
Program mode requires special privileges, e.g., root or TrustedUser.
/etc/rc: WARNING: failed to start sendmail_msp_queue
Starting cron.


추가 서버
# jail -c mail
메세지 출력
mail: created
ELF ldconfig path: /lib /usr/lib /usr/lib/compat
32-bit compatibility ldconfig path: /usr/lib32
Setting hostname: mail.
[............]
Starting cron.


  • 편집기 vi /etc/rc.conf 파일에 jail_enable="YES" 추가, vi로 열어서 추가해도 되고, 아래 명령으로도 추가 된다.
# sysrc jail_enable=YES


jail 목록 출력

# jls
메세지 출력
   JID  IP Address      Hostname                      Path
     1  10.0.0.2        www                           /usr/local/jails/www
     2  10.0.0.3        mail                          /usr/local/jails/mail


jail 콘솔 접속

# jexec www tcsh
메세지 출력
root@www:/ # 


모든 jails 의 업데이트

  • 아래 명령으로 모든 jail 이 업데이트 된다.
# env UNAME_r=12.0-RELEASE freebsd-update -b /usr/local/jails/templates/base-12.0-RELEASE fetch install
# portsnap -p /usr/local/jails/templates/base-12.0-RELEASE/usr/ports auto


apache24 설치

  • 설치 전 검색
root@www:/ # pkg search apache24
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:12:amd64/quarterly, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
[www] Installing pkg-1.12.0...
[www] Extracting pkg-1.12.0: 100%
pkg: Repository FreeBSD missing. 'pkg update' required
apache24-2.4.41                Version 2.4.x of Apache web server
  • 설치
root@www:/ # pkg install apache24
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
Updating database digests format: 100%
The following 12 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
	apache24: 2.4.41
	libnghttp2: 1.39.2
	libxml2: 2.9.9
	expat: 2.2.8
	perl5: 5.30.0
	pcre: 8.43_2
	apr: 1.7.0.1.6.1
	gdbm: 1.18.1_1
	indexinfo: 0.3.1
	readline: 8.0.0
	gettext-runtime: 0.20.1
	db5: 5.3.28_7

Number of packages to be installed: 12

The process will require 153 MiB more space.
35 MiB to be downloaded.

Proceed with this action? [y/N]: y

[www] [11/12] Extracting apr-1.7.0.1.6.1: 100%
[www] [12/12] Installing apache24-2.4.41...
[..................]
Please compare the existing httpd.conf with httpd.conf.sample
and merge missing modules/instructions into httpd.conf!


root@www:/ # sysrc apache24_enable=YES
  • 시작
root@www:/ # service apache24 start
  • 웹브라우저 주소 줄에 아이피 주소 http://192.168.0.30 넣으면 이런 메세지가 보이면 정상이다.
It works!
  • 웹 루트는 /usr/local/jails/thinjails/www/apache24/data 디렉토리 이다.



Logo

Edit Reply#198[ Ssam ]