补天网 - UNIX软件技术精华   
分页显示
返回《UNIX软件技术精华》 快速返回
作 者  主题:freebsd下利用jail+PF做的虚拟机(穷人如何打造自己的服务器文章的补全)
xiao2


=入木三分=
职务:版主
积分:1076
贴数:568
 日期:2005-1-17 0:45:48

 
 --------------------------------------------------------------------------------------------
  1,基本系统的安装
  --------------------------------------------------------------------------------------------
  freebsd5.3 mini安装
 
  完成以后,安装src和ports
 
  重新启动
 
  需要安装的软件
 
  为了节省时间我使用pkg_add 命令安装了一下软件
 
  ccache-2.4_1,
 
  cvsup-without-gui-16.1h,
 
  perl-5.8.5,
 
  pftop-0.4_1,
 
  portaudit-0.5.9,
 
  portupgrade-20040701_3
 
  strace-4.5.1
 
  有一点要注意,我用pkg_add安装ccache-2.4.1时发现会去缺少一个libc.so.4这个文件,所以后来我用ports安装的。
 
  cvsup src port
 
  src ports在开始的时候已经从光盘安装了,这里更新到最新的源码和软件包
 
  # cp /usr/share/examples/cvsup/ports-supfile /root/cvsup/
 
  # cp /usr/share/examples/cvsup/standard-supfile /root/cvsup/
 
  # chmod 755 /root/cvsup/ports-supfile
 
  # chmod 755 /root/cvsup/standard-supfile
 
  修改ports-supfile,stable-supfile文件中的服务器地址,可以用比较快的地址替换,完成后
 
  # cvsup /root/cvsup/ports-supfile
 
  # cvsup /root/cvsup/standard-supfile
 
 
  --------------------------------------------------------------------------------------------
  2,对系统进行简单优化并重新make world
  --------------------------------------------------------------------------------------------
 
 cvsup到新的源码和port后安装ccache
 
  CCACHE是为程序编译提供缓存,通过减少重复代码编译次数,加快编译时间的软件。
 
 不过它对于一次性的编译没有什么帮助作用。cache是为多次重复编译加快速度的。
 
 
 
  #cd /usr/ports/devel/ccache/
 
  #make install clean
 
  #cd /usr/
 
  #mkdir ccache
 
  #cd /usr/sbin
 
  #ln -s /usr/local/bin/ccache gcc
 
  #ln -s /usr/local/bin/ccache cc
 
  #ln -s /usr/local/bin/ccache c++
 
  #ln -s /usr/local/bin/ccache g++
 
  #ln -s /usr/local/bin/ccache cpp
 
  #echo "setenv CCACHE_DIR /usr/ccache" >> /root/.cshrc
 
  #rehash
 
  #exit
 
 
 
  完成后,复制一份内核配制文件,不要把内核文件放到/usr/src下
 
  可以考虑将内核配置文件放到别的地方, 然后在 i386 目录中建立一个符号连接指向它。
 
 
 
  # cd /usr/src/sys/i386/conf
 
  # mkdir /root/kernels
 
  # cp GENERIC /root/kernels/MYKERNEL
 
  # ln -s /root/kernels/MYKERNEL
 
 
 
  定制内核的配制文件,也就是刚才拷贝到/root/kernels/的MYkernel文件
 
  精简内核并且加入pf选项
 
 
  options NULLFS
  device pf
  device pflog
  device pfsync
  options ALTQ
  options ALTQ_CBQ
 
 
  检查make.conf
 
  5.3的/etc/make.conf可以参考下面的配制:
 
 
 
  NO_ACPI= true
 
  NO_BOOT= true
 
  NO_BIND= true
 
  NO_BLUETOOTH= true
 
  NO_FORTRAN= true
 
  NO_I4B= true
 
  NO_IPFILTER= true
 
  NO_PF= true
 
  NO_AUTHPF= true
 
  NO_KERBEROS= true
 
  NO_LPR= true
 
  NO_MODULES= true
 
  NO_SHAREDOCS= true
 
  NO_USB= true
 
  NOATM= true
 
  NOGAMES= true
 
  NOINET6= true
 
  NOLIBC_R= true
 
  NOPROFILE= true
 
  CXXFLAGS+= -fmemoize-lookups -fsave-memoized //如果编译失败,请去掉此行
 
  SUP_UPDATE= yes
 
  SUP= /usr/local/bin/cvsup
 
  SUPFLAGS= -g -L 2
 
  SUPHOST= cvsup2.freebsdchina.org
 
  SUPFILE= /root/cvsup/standard-supfile
 
  PORTSSUPFILE= /root/cvsup/ports-supfile
 
  DOCSUPFILE= /usr/share/examples/cvsup/doc-supfile
 
  MASTER_SITE_BACKUP?= \
 
  ftp://ftp2.tsinghua.edu.cn/mirror/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \
  ftp://ftp.freebsd.org.cn/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \
  ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/
  MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP}
 
 
 
  这时就可以makeworld了
 
  make world时使用-j4选项,会同时启动4个进程来make world
 
 
 
  进入/usr/src
 
  make -j4 buildworld
 
  给 make 指定 -j 选项了,这样会使用产生出几个并发的进程来。 这在多处理器机器里最有用。但是,
 
 
  由于大部分的编译过程是 IO 限制远胜 CPU 限制,它在单处理器的机器里也是有用的。
 
  这时候make 会有至多 4 个进程在同一时刻执行。贴到邮件列表里的实验证据显示这样会收到最好的效果
 
  如果您有一台多 CPU 机器,那您就使用 SMP 配置内核,试试 6 到 10 之间的值,看这些值提速如何。
 
  同时使用4个进程,加上ccache的加速,make world的速度会有所提高
 
  至于提高多少,还要看本身的机器性能了
 
  makeworld是一个漫长的过程,我在p3 800的笔记本里运行vmware用了4个多小时
 
 
  完成以后就可以编译和安装新内核
 
 
 
  # cd /usr/src
 
  # make installworld
 
  # make buildkernel KERNCONF=MYkernel
 
  # make installkernel KERNCONF=MYkernel
 
 
 
  重新启动
  ====================
 
  到目前为止,一个全新的系统就完成了
 
  接着我们对系统进行简单的设置:
 
 
  修改/etc/rc.conf 加入:
 
 
 
  background_dhclient="YES"
 
  sendmail_enable="NONE"
 
  sendmail_submit_enable="NO"
 
  sendmail_outbound_enable="NO"
 
  sendmail_msp_queue_enable="NO"
 
  clear_tmp_enable="YES"
 
  tcp_extensions="YES"
 
  pf_enable="YES" //启用pf防火墙
 
  pflog_enable="YES"
 
  ifconfig_lnc0="inet 10.0.64.253 netmask 255.255.248.0" //外网地址
 
  ifconfig_lnc1="inet 172.16.0.1 netmask 255.255.255.0" //内网地址
 
  ifconfig_lnc1_alias0="inet 172.16.0.2 netmask 255.255.255.255" //虚拟主机地址
 
  ifconfig_lnc1_alias1="inet 172.16.0.3 netmask 255.255.255.255" //虚拟主机地址
 
 
 
  在/boot/loader.conf中加入:
 
  autoboot_delay="2" //把默认的启动时间设置为2秒,原10秒
 
  net.inet.tcp.tcbhashsize="2048" // 增大TCP控制块数量
 
  beastie_disable="YES" // 关闭小恶魔图像启动菜单
 
  console="comconsole" //如果需要把开机信息也在串口终端显示的话,否则注释掉此行
 
 
 
 
 
 修改/etc/ttys文件
 
  #ee /etc/ttys
 
 
 
  ttyd0 "/usr/libexec/getty std.9600" vt100 on secure
 
 
 
 这样设置后就可以通过com1口进入服务器了
 
 
  shell环境设定
 
 
 
  /root/.cshrc加入:
 
  alias ls ls -FGw //ls彩色
 
  setenv EDITOR ee // 默认编辑器为ee
 
  setenv PAGER less
 
 
  if ($?prompt) then中加入:
 
  set nobeep
 
  set prompt = ‘%n@%/%# ‘
 
  set filec
 
  set autolist
 
 
 
 
  打开 NAT 的 IP Forwarding
 
  #ee /etc/sysctl.conf
 
 
 
  net.inet.ip.forwarding=1
 
 
 
  设定pf的规则
 
  #ee /etc/pf.conf
 
  # Macros 定义网络接口
 
  ext_if="lnc0" #外部
 
  int_if="lnc1" #内部
 
  vhost1="172.16.0.2" #定义内部服务器vhost1的地址
 
  vhost2="172.16.0.3" #定义内部服务器vhost2的地址 如果还有虚拟机的同样的道理
 
  # ALTQ 定义带宽的进出
 
  # Outgoing bandwidth limit
 
  altq on $ext_if cbq bandwidth 512Kb queue { std_out }
 
  queue std_out bandwidth 256Kb cbq (default)
 
  # Incoming bandwidth limit
 
  altq on $int_if cbq bandwidth 2Mb queue { std_in }
 
  queue std_in bandwidth 768Kb cbq (default borrow)
 
  # NAT 启动nat
 
  nat on $ext_if from $int_if:network to any -> ($ext_if) #地址转换
 
  rdr on $ext_if proto tcp from any to 10.0.64.253 port 221 -> $vhost1 port 22 #端口映射
 
  rdr on $ext_if proto tcp from any to 10.0.64.253 port 222 -> $vhost2 port 22 #端口映射
 
 
  # Filter Rules 规则设置
 
  pass in all
 
  pass out all
 
  # Bandwidth Control
 
  pass out on $ext_if proto tcp from any to any queue std_out
 
  pass in on $int_if proto tcp from any to any queue std_in
 
 
 
 #这里防火墙得规则只是做了简单得设置,pf功能非常强大,,带宽控制我就没有列出来,如果想详细得设置规则,可以参考pf得文档
 
 http://www.patching.net/bbs/viewdoc.asp?id=41412&bordid=4
 
 
 pf的使用:
 
 
  # pfctl -f /etc/pf.conf 载入pf.conf配置文件
  # pfctl -nf /etc/pf.conf 解析pf.conf文件, 但不载入。
  # pfctl -Nf /etc/pf.conf 只从文件中载入NAT规则链。
  # pfctl -Rf /etc/pf.conf 只从文件中载入过滤规则链。
  # pfctl -sn 显示当前的NAT规则链
  # pfctl -sr 显示当前的过滤规则链
  # pfctl -ss 显示当前的状态
  # pfctl -si 显示过滤状态和计数
  # pfctl -sa 显示所有能显示的东西
 
 
  另外,我们在前面还安装了个pftop这个软件,可以查看pf防火墙的状态
 
 
  --------------------------------------------------------------------------------------------
  3,建立jail虚拟机
  --------------------------------------------------------------------------------------------
  安装虚拟机上运行的网络服务程序
 
 
  建立一个虚拟机
 
 需要先为vhost准备一个目录:
 
 
 
 # mkdir -p /home/jail/
 
 
 
  因为先前我们已经make world过了,所以现在建立虚拟机就比较简单了
 
 
 这里我给出一个脚本来自动建立虚拟机
 
 
 
 
 #!/bin/sh
 echo ‘Enter vhost vhost name:‘
 read path
 if [ "$path" = "" ]; then
 echo ‘Must input host name!‘
 exit
 fi
 dir=/home/jail //定义所有虚拟机的根路径
 cd /usr/src
 mkdir -p $dir/$path
 make installworld DESTDIR=$dir/$path
 cd etc
 make distribution DESTDIR=$dir/$path -DNO_MAKEDEV_RUN
 #cd $dir/$path/dev
 #sh MAKEDEV jail
 cd $dir/$path
 ln -sf dev/null kernel
 mount_devfs devfs $dir/$path/dev
 mkdir $dir/$path/usr/ports
 mount_nullfs /usr/ports $dir/$path/usr/ports
 mkdir $dir/$path/stand
 cp /stand/sysinstall $dir/$path/stand/
 cp /etc/resolv.conf $dir/$path/etc
 touch $dir/$path/etc/fstab
 cp /etc/make.conf $dir/$path/etc/
 
 
 
 把它存为jail.sh,并且
 
 
 
 #chmod 777 jail.sh
 
 
 
 然后直接./jail.sh就可以了
 
 它会询问要建立的虚拟机的名字
 
 例如,我们输入vhost1
 
 接着它会自动安装系统
 
 
  准备vhost使用的地址
 
  在前面,我们已经在
 
  /etc/rc.conf中加入了:
 
 ifconfig_lnc1_alias0="inet 172.16.0.2 netmask 255.255.255.255"
  ifconfig_lnc1_alias1="inet 172.16.0.3 netmask 255.255.255.255"
 
 
 
  进入vhost1:
 
 
  jail /home/jail/vhost1 vhost1.xiao2.org 172.16.0.2 /bin/sh
 
 
 
  配置vhost1
 
 
 
  进入vhost1的后,执行sysinstall工具:
 
  /stand/sysinstall
 
 
 
  Console中将Repeat设置为fast
 
  更改root的密码
 
  User Management中加入系统中的用户(记得要加一个wheel能su成root的用户哟)
 
  Time Zone中设置正确的时区
 
  Networking中设置inetd为no、Mail为None、并选中sshd(inetd和sshd为必须)
 
  Startup中关了quotas
 
  配置完成后输入:
 
  exit
 
  退出
 
  启动vhost1
 
 
 
  jail /home/jail/vhost1 vhost1.xiao2.org 172.16.0.2 /bin/sh /etc/rc
 
 
 
  执行后会看到一些启动信息,然后就返回了shell
 
  这时就可以使用ssh连接到虚拟机起了
 
  至此,一个完成的新的虚拟服务器就装好了
 
 #ee /etc/ttys
 
 修改ttyd0这行为:
 
 
 
 ttyd0 "/usr/libexec/getty std.9600" vt100 on secure
 
 
 
 这样就可以通过com1口进入服务器了
 
 如果需要把开机信息也显示出来的话,可以修改/boot/loader.conf 文件,加入
 
 console="comconsole"
 
 
 
 删除虚拟机的方法:
 
 先转到你虚拟机的根目录
 
 然后执行
 
 
 chflags -R noschg *
 
 
 这样就可以删除你的虚拟机了
 
 
  至此,虚拟机就装好了,我们可以让虚拟机在系统开机时执行
 
 在主系统的 /usr/local/etc/rc.d下建立一个文件vhost.sh,内容如下:
 
 
 mount_devfs devfs /home/jail/vhost1/dev
 mount_nullfs /usr/ports /home/jail/vhost1/usr/ports
 jail /home/jail/vhost1 vhost1.xiao2.org 172.16.0.2 /bin/sh /etc/rc
 mount_devfs devfs /home/jail/vhost2/dev
 mount_nullfs /usr/ports /home/jail/vhost2/usr/ports
 jail /home/jail/vhost2 vhost1.xiao2.org 172.16.0.3 /bin/sh /etc/rc
 
 
 退出后更改可执行权限
 
 chmod 777 vhost.sh
 
 
 然后重新启动
 
 这时我们ssh 主机的221端口,实际上连接到了vhost1的ssh端口上了
 
 222端口就是vhost2的ssh
 
 你可以在虚拟机里使用ports来安装软件
 
 如果虚拟机在使用过程中提示缺少什么文件可以从主操作系统里复制
 ------------------------------------------------------------------------
 附DB9口的接线图
 
 CN1(DB9s) CN2(DB9s)
 pin 1 -------- pin 4
 pin 2 -------- pin 3
 pin 3 -------- pin 2
 pin 4 -------- pin 6
 pin 5 -------- pin 5
 pin 6 -------- pin 4
 pin 7 -------- pin 8
 pin 8 -------- pin 9
 将 pin1 与 pin6 短路
 注:DB9s = DB9母头、DB9p = DB9公头 针脚名称
 [、code]
 说明:
 Pin1....DCD Pin2....RxD Pin3....TxD Pin4....DTR Pin5....SG
 Pin6....DSR Pin7....RTS Pin8....CTS Pin9.....RI
阿刚
=八面玲珑=
积分:2674
贴数:288
日期: 2005-1-17 9:21:54  
好文,鼓励原创,我加精了,呵呵
 
test_1


=一知半解=
积分:102
贴数:89
日期: 2005-1-17 12:41:38  
既然是穷人就要使用民用ADSL接入
 
 http://www.3322.org动态DNS支持
 
 /usr/local/etc/rc.d下生成一个ipnat.sh脚本
 这个脚本的作用是获取ADSL的IP,及生成ipnat所需要的配置文件(/etc/ipnat.rules)
 但ASDL断线以后,IP就变化了
 使用/etc/ppp/ppp.linkup
 内容如下
 adsl:
 iface clear
 !bg /usr/local/bin/ez-ipupdate -i tun0 -h XXXX.3322.org -S qdns -u username:password
 !bg /usr/local/etc/rc.d/ipnat.sh
 这样就解决了,全自动
 ps:把ipnat.sh放/usr/local/etc/rc.d显的有点多于,但为了一个清晰的文件存放结构.对实际使用无影响
 
 /usr/local/etc/rc.d/ipnat.sh
 
 #!/bin/sh
 sleep 3
 ADSLIP=`ifconfig tun0 |grep inet | cut -d ‘ ‘ -f 2`
 echo ‘map tun0 192.168.1.0/24 -> ‘$ADSLIP‘/32 proxy port ftp ftp/tcp‘ > /etc/ipnat.rul
 es
 echo ‘map tun0 192.168.1.0/24 -> ‘$ADSLIP‘/32 portmap tcp/udp auto‘ >> /etc/ipnat.rule
 s
 echo ‘map rl0 192.168.1.0/24 -> ‘$ADSLIP‘/32‘ >> /etc/ipnat.rules
 echo ‘rdr tun0 ‘$ADSLIP‘/32 port 554 -> 192.168.1.55 port 554‘ >> /etc/ipnat.rules
 echo ‘rdr rl0 ‘$ADSLIP‘/32 port 554 -> 192.168.1.55 port 554‘ >> /etc/ipnat.rules
 echo ‘rdr tun0 ‘$ADSLIP‘/32 port 80 -> 192.168.1.55 port 80‘ >> /etc/ipnat.rules
 echo ‘rdr rl0 ‘$ADSLIP‘/32 port 80 -> 192.168.1.55 port 80‘ >> /etc/ipnat.rules
 echo ‘rdr tun0 ‘$ADSLIP‘/32 port 443 -> 192.168.1.55 port 443‘ >> /etc/ipnat.rules
 echo ‘rdr rl0 ‘$ADSLIP‘/32 port 443 -> 192.168.1.55 port 443‘ >> /etc/ipnat.rules
 echo ‘rdr tun0 ‘$ADSLIP‘/32 port 21 -> 192.168.1.55 port 21‘ >> /etc/ipnat.rules
 echo ‘rdr rl0 ‘$ADSLIP‘/32 port 21 -> 192.168.1.55 port 21‘ >> /etc/ipnat.rules
 /sbin/ipnat -CF
 /sbin/ipnat -f /etc/ipnat.rules
 
 机器为单网卡
 接入是
 internet-------adsl---------交 换 机
  | |
  | |
  freebsb网关 客户机
 最后是使用顶级域名
 去买一个60-100RMB
 这里有sell
 然后用URL影藏转发过来&_&
 
 jail环境,不需要提供root shell的话
 最好里面没多余的东西
 就需要一服务本身所需要的东西
 库文件,配置文件。越少越好。但调试非常花时间
返回《UNIX软件技术精华》 快速返回

IE不断爆出漏洞,使用FireFox浏览器,会更安全一些:

如果您想发帖,请先注册或登录!


Copyright © 2006 Patching.net All rights reserved.