[url]http://www.chinaunix.net[/url] 作者:xdkui 发表于:2007-04-12 16:04:23 【发表评论 】 【查看原文 】 【×××讨论区 】【关闭】
FreeBSD 下用Open××× 架设虚拟局域网 1 环境及需求 4 个房间,分别通过4 个802.1X 帐号连接到学校校园网。4 个房间属于一个课题组,需要共享资料,4 个房间内计算机需要相互访问文件共享,能访问一台用于提供软件及个人备份文件共享服务器,一台Web 服务器,以及打印机。 4 个802.1X 帐号中有一个是可以上国外网的帐号,另外3 个可以上国内网,希望4 个房间的计算机上国内网络时通过本房间的帐号出去,上国外网时都通过1 个固定的国外帐号出去。 2 解决方案 方案:使用Open××× 连接4 个房间的网络组成虚拟专用网。4 个房间都有专用的电脑做该房间的网关,使用FreeBSD 系统(个人喜好,用别的操作系统配置差不多)。网关通过802.1X 拨号连接到校园网,各个房间的网络通过网关NAT 共享上网。 A,B,C,D 房间内部分别是192.168.10.0/24,192.168.11.0/24,192.168.12.0/24, 192.168.13.0/24 网段,192.168.10.1,192.168.11.1,192.168.12.1,192.168.13.1 分 别是4 个房间的网关,172.16.37.83 等地址为4 个机器的校园网地址。192.168.10.1 用作*** server,B,C,D 房间的网关分别为*** client1,*** client2,*** client3(下文client 为这3 个*** 客户端的总称)。网络 结构图见图1。 [attach]161237[/attach] [align=center]图1 网络结构[/align] *** 客户端内部网络上国外网络的数据通过*** server 的NAT 出去,上国内网络的数据通过自身NAT 出去。 *** client2 和*** client3 上网数据的路由同*** client1,图里没有画出。本文主要讲Open××× 的配置。 Open××× 有路由××× 和以太网桥接××× 两种模式,桥接××× 相当于用网桥把多个网络连接,多个网络可以使用同一个网段。本文使用路由模 式,可配置性强,功能也更强。参考信息见Open××× Install.htm,Open××× 2_0 HOWTO.htm和 Open××× 2_0_x Man Page.htm 3 安装Open××× 4 台用于×××的机器都需要安装。Open×××依赖OpenSSL库,加密用;LZO库,数据压缩用,不使用该库也没有关系。 FreeBSD 6.0 默认安装带了OpenSSL库,就不说了。没有安装的去[url]http://www.openssl.org/[/url]下载安装即可。或者用 FreeBSD的ports安装。 LZO去[url]http://www.oberhumer.com/opensource/lzo/[/url]下载源代码包。 或者用ports 安装: cd /usr/ports/archivers/lzo && make install 即可。 源代码安装: ./configure && make && make install 比较简单,就不说了。 我用源代码安装Open×××,从[url]http://www.open***.net[/url]下载open***-2.0.7.tar.tar ./configure --with-lzo-headers=/usr/local/include --with-lzo-lib=/usr/local/lib && make && make install 如果不使用LZO 库则 ./configure --disable-lzo && make && make install 4 生成证书和密钥 cd /home/xdkui/open***-2.0.7/easy-rsa/ vi vars 根据自己的情况设置KEY_COUNTRY, KEY_PROVINCE, KEY_CITY, KEY_ORG, KEY_EMAIL,比如我的 export KEY_COUNTRY=CN export KEY_PROVINCE=Beijing export KEY_CITY=Beijing export KEY_ORG=BUAA export KEY_EMAIL="[email]xdkui@163.com[/email]" 然后保存 . ./vars //注意两个点中间有空格 ./clean-all ./build-ca build-ca 命令使用openssl 命令生成certificate authority (CA) certificate 和密钥: ./build-ca Generating a 1024 bit RSA private key ....++++++ .......++++++ writing new private key to 'ca.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CN]: State or Province Name (full name) [Beijing]: Locality Name (eg, city) [Beijing]: Organization Name (eg, company) [BUAA]: Organizational Unit Name (eg, section) []: Common Name (eg, your name or your server's hostname) []:xdkui-ca //这里随便输入即可 Email Address [[email]xdkui@163.com[/email]]: 4.1 为*** server 产生证书和私钥 ./build-key-server server Common Name 处填server,其他默认,为上面编辑vars 文件时设置的值。"Sign the certificate? [y/n]" 和"1 out of 1 certificate requests certified, commit? [y/n]"两处选y。 4.2 为*** clients 产生证书和密钥 ./build-key client1 ./build-key client2 ./build-key client3 Common Name 处分别填client1 client2 client3,别的同*** server 设置。 4.3 生成Diffie Hellman 参数 ./build-dh 现在生成了所需的文件。目录keys 下生成的文件中,ca.crt 是所有*** 机器都需要的。*** server 需要 ca.crt ca.key dh1024.pem server.crt server.key,拷贝到*** server 的 /etc/open***目录。*** client1 需要ca.crt client1.crt client1.key,拷贝到 *** client1 的/etc/open*** 目录。client2,client3 和client1 同,只是client1.crt 和 client1.key 分别用client2 和client3 的对应文件。*** client2 和*** client3 也把对应的密钥文件 拷贝到各自的/etc/open*** 目录。各个文件的用途可以参看下表(来自HOWTO): [attach]161239[/attach] 5 配置*** server 和client server.conf 使用代码包目录sample-config-files 里的server.conf 修改即可。配置文件里的 选项含义可以参考Open××× 2.0.x Man Page,比如keepalive, ifconfig-push 选项等。如下: ################################################# # Sample Open××× 2.0 config file for # # multi-client server. # # Comments are preceded with '#' or ';' # ################################################# ;local a.b.c.d 绑定的IP 地址,可以不填 port 1194 绑定的端口 proto udp 选择udp 协议,也可用tcp # "dev tun" will create a routed IP tunnel, # "dev tap" will create an ethernet tunnel. ;dev tap #使用tun 设备,路由IP 通道。FreeBSD 默认支持TUN/TAP 驱动。 dev tun #下面4 处填上面为*** server 生成的证书和密钥 ca ca.crt cert server.crt key server.key # This file should be kept secret dh dh1024.pem #配置*** 虚拟网段,会在*** server 建立一条10.0.0.1 >10.0.0.2 的点对点虚拟链路。 server 10.0.0.0 255.255.255.0 #记录client 对应得虚拟地址,默认600 秒更新一次 ifconfig-pool-persist ipp.txt #等价于ping 10 和ping-restart 120,对于*** 机器有可能断开外网联线或者重起的, #或者*** client 先于*** server 运行的情况下很重要。Client 会重新连接。 keepalive 10 120 #开启压缩支持。如果编译的时候没有使用LZO 库则注释本行 comp-lzo #初始化完成后改变Open××× 进程的用户ID 为nobody user nobody #同上,改变进程的组ID 为nobody。如果是Windows 系统,注释掉这两行 group nobody persist-key persist-tun #默认每分钟更新状态文件,可以看到client 的真实IP 虚拟IP 等信息。 status open***-status.log verb 3 client1.conf 使用源代码包目录sample-config-files 里的client.conf 修改即可。如下: ############################################## # Sample client-side Open××× 2.0 config file # # for connecting to multi-client server. # # On Windows, you might want to rename this # # file so it has a .o*** extension # ############################################## client dev tun proto udp #和server.conf 一致即可 remote 172.16.37.83 1194 #指定*** server 的IP 地址和端口 resolv-retry infinite #如果解析*** server 失败则无限次重试 nobind user nobody group nobody persist-key persist-tun ca ca.crt cert client1.crt #这2 行填给client1 生成的密钥文件。client2 client3 相应更改。 key client1.key comp-lzo keepalive 10 120 *** client2 和*** client3 的客户端配置文件client2.conf 和client3.conf 同上,只是改cert和key 选项为对应的密钥文件。 对于*** server,运行open*** 后会建立一条本地ip 为10.0.0.1,对端ip 为10.0.0.2 的点对点虚 拟链路,这样所有server.conf 里的route 选项都会路由到10.0.0.2,即open*** 里面,然后由open*** 处理。 对于client,则会选在一对ip 作为客户端的点对点虚拟链路,比如本地10.0.0.10,对端10.0.0.9。并把第一次分 配给client 的ip 记录在ipp.txt(server.conf 里ifconfig-pool-persist 指定)里,下次对应的 client 连接的时候可以分配先前被指定的地址,但man 手册说不保证每次会指定同一个ip。 我需要给每个client 指定固定的*** 地址,用ifconfig-push 指令即可。Windows 下,由于TAP- Win32 驱动的限制,虚拟IP 对只能在/30 子网选择,最后2 个2 进制位,除去全0的网络地址和全1 的广播地址,虚拟IP 只能选择01 和10,故虚拟IP 对只能是[1, 2] [5, 6] [9, 10]等(详见HOWTO)。Unix 客户端则没有这个限制,可以随便设置IP,比 如client 分别设置成本地IP 为10.0.0.2, 10.0.3, 10.0.4 对端IP 都为10.0.0.1。考虑到以后client 可能会用Windows,故本文中遵循这个限制。给*** client1, *** client2, *** client3 分配的虚拟客户端和服 务器端IP 对分别为[10.0.0.5 10.0.0.6],[10.0.0.9 10.0.0.10], [10.0.0.13 10.0.0.14]。见图2。 [attach]161238[/attach] [align=center]图2 指定××× 的虚拟IP 地址对[/align] 给server.confi 添加如下行: client-config-dir ccd 并在*** server 的/etc/open*** 目录建立ccd 子目录,并在ccd 目录下建立文件client1, client2,client3(这里的文件名对应”为*** clients 产生证书和密钥”步骤里的Common Name),当对应得 client 连接时,*** server 会读去对应文件里的配置信息。文件client1 里输入: ifconfig-push 10.0.0.5 10.0.0.6 ,即给*** client1 指定10.0.0.5,对端10.0.0.6 的虚拟链路。 client2 内容:ifconfig-push 10.0.0.9 10.0.0.10 client3 内容:ifconfig-push 10.0.0.13 10.0.0.14 分别拷贝server.conf,client1.conf,client2.conf,client3.conf 到*** server 和对应的client。分别在各个*** 计算机启动*** server 和*** client open*** --config /etc/open***/server.conf --cd /etc/open***/ open*** --config /etc/open***/client1.conf --cd /etc/open***/等 如果是Windows,改.conf 为.o***,然后右键选择Start Open××× on this config file 即可 启动。 如果都出现“Initialization Sequence Completed”表示××× 建立成功,否则检查 *** server的防火墙是否屏蔽了UDP 1194 端口。如果客户端是Windows,检查DHCP Client 服务是否启动。到这一步, ××× 客户端和服务端可以相互通讯了。10.0.0.1 应该可以ping 通10.0.0.5,10.0.0.9,10.0.0.13。 10.0.0.5,10.0.0.9,10.0.0.13 也可以ping 通10.0.0.1。但10.0.0.5,10.0.0.9, 10.0.0.13 还不能相互ping 通,即*** 客户端之间还不能相通。 5.1 *** client 访问*** server 所在192.168.10.0/24 网段内计算机 第一种方法,添加如下行到server.conf push "route 192.168.10.0 255.255.255.0" push 选项是把选项内容给连接的*** 客户端执行,也就是在*** 客户端执行 “route 192.168.10.0 255.255.255.0”,即当client 连接时,添加路由到client 的路由表里。对于 *** client1,该选项相当于在*** client1 的路由表里添加到网络192.168.10.0/24,下一跳为10.0.0.6的路 由,这里10.0.0.6 为给*** client1 分配的虚拟IP 对的服务器端IP,相当于路由到*** server。 第二种方法,如果不改变server.conf,在*** client1 里 route add –net 192.168.10.0 10.0.0.6 255.255.255.0 效果一样,也可 route add –net 192.168.10.0 10.0.0.1 255.255.255.0 直接路由到*** server 的本端 IP 也可,但这样需要在所有的*** 客户端改变路由表。 这样在*** 客户端可以ping 通192.168.10.0/24 网段内部计算机了。到此,B,C,D 房间的 网关可以访问A 房间的所有计算机了。 5.2 *** server 访问*** client 网段内计算机 以*** client1 为例,是*** server 能访问192.168.11.0/24 网段内计算机。同样有2 种方法,一是改server.conf 让open*** 程序添加路由,另一种是手动添加路由。 第一种方法,添加如下行到server.conf route 192.168.11.0 255.255.255.0 从Open××× 的man 手册可知,route 选项用于改变路由表。这里在*** server 添加到网络 192.168.11.0/24,下一跳为10.0.0.2 的路由,即把192.168.11.0/24 路由到open*** 内部。然后添加如下行 到/etc/open***/ccd/client1 iroute 192.168.11.0 255.255.255.0 告诉open*** 192.168.11.0/24 的网段路由到*** client1。route 选项用于修改从操作系统内核到 Open××× 服务端的路由,iroute 用于控制Open××× 服务端到Open××× 客户端的路由。现在从*** server 或者其内部 192.168.10.0/24 内机器都能ping 通192.168.11.0/24 内部的机器了。 第二种方法,手动修改*** server 路由表,route add -net 192.168.63.0 10.0.0.2 255.255.255.0 或者route add -net 192.168.63.0 10.0.0.5 255.255.255.0然后 添加iroute 192.168.11.0 255.255.255.0 到/etc/open***/ccd/client1(注意:两种方法都必须 有这一步)。 可以明显看到修改Open××× 配置文件的方法要简便些,不用顾及××× 计算机分配的虚拟IP,对于多个××× 客户端,只需要修 改server.conf 即可,而且路由条目都是建立×××时动态添加,××× 断开时自动删除。本文选择这第一种方法配置×××。提到两种方法是想说 明Open××× 里的选项对于操作系统路由的影响,用于对比,更能理解Open××× 的选项。 *** client2 和*** client3 的修改类似*** client1。总结所有修改如下: 添加如下行到server.conf route 192.168.11.0 255.255.255.0 #使*** server 能访问B 房间计算机 route 192.168.12.0 255.255.255.0 #使*** server 能访问C 房间计算机 route 192.168.13.0 255.255.255.0 #使*** server 能访问D 房间计算机 添加如下行到*** server 里/etc/open***/ccd/client1 iroute 192.168.11.0 255.255.255.0 #B 房间计算机路由到client1 添加如下行到*** server 里/etc/open***/ccd/client2 iroute 192.168.12.0 255.255.255.0 #C 房间计算机路由到client2 添加如下行到*** server 里/etc/open***/ccd/client3 iroute 192.168.13.0 255.255.255.0 #D 房间计算机路由到client3 到这一步,A 房间的计算机能访问B,C,D 房间的所有计算机了,B,C,D 房间的计算机 也能访问A 房间的计算机了。 5.3 各个*** client 之间的网段相互访问 下面配置B,C,D 房间的计算机相互访问。 添加如下行到server.conf: client-to-client 这样B,C,D 房间的网关(即10.0.0.5,10.0.0.9,10.0.0.13)可以相互ping 通了。现在B, C,D 房间的网关还没有到相互内部网段的路由。类似上面push *** 服务端的内部网段到*** 客户端,添加如下行到server.conf push "route 192.168.11.0 255.255.255.0" push "route 192.168.12.0 255.255.255.0" push "route 192.168.13.0 255.255.255.0" 分别在*** client1, *** client2,*** client3 添加3 条路由,对于*** client1,192.168.11.0/24是其内部网段, *** client1 上的open*** 程序不会执行"route 192.168.11.0 255.255.255.0"选项,可以从 open*** 启动的信息看出。同上面一样,也可以手动修改3 个××× 客户端的路由表,这里就不说了。到这一步,A,B,C,D4 个房间的计算机 都可以相互访问了。 6 配置出国和非出国数据的路由 (只是理论想法,由于所在校园网还没通,没有测试) A房间网关,即*** server,使用可以上国外网的802.1X 帐号,3 个*** client3 使用只能上国内网的帐号。 在server.conf 中利用push 选项在*** 客户端添加路由,把国外IP 地址路由到*** server,并通过*** server 的NAT 出去,不需要修改*** 客户端设置。这样,***客户端所在的B,C,D 房间的计算机上国内网直接通过他们的网关出去,上国外网则路由到 A 房间网关再出去。A 房间的上网数据都通过A 房间网关出去。当然,也可以不修改server.conf,直接在3 个*** 客户端手动添加路由。 添加如下行到server.conf: #下面是国外网络的网段 push "route xxx.xxx.xxx.xxx 255.255.255.0" …….. 7 总结 在*** server 的/etc/rc.local 文件添加如下行: open*** --config /etc/open***/server.conf --cd /etc/open***/ & 在*** client1 的/etc/rc.local 文件添加如下行: open*** --config /etc/open***/client1.conf --cd /etc/open***/ & *** client2 和*** client3 类似*** client1。使open*** 程序在系统启动时自动运行。 修改*** server 的防火墙配置,我使用ipfw 防火墙。添加如下规则允许通过*** server 的侦听端口。 pass in quick on rl0 proto udp from any to any port = 1194 keep state 在*** server安装Apache+phpBB为内部论坛,4 个房间所有计算机浏览[url]http://10.0.0.1[/url]即可 访问。在*** client1 安装Samba做文件共享服务器,浏览\\10.0.0.5即可访问到共享。打印机 安装在A房间的内部Windwos计算机上,通过共享安装网络打印机即可。 这样完成了所有的配置。下面总结如下: *** server 的目录/etc/open*** 下有文件ca.crt,ca.key,dh1024.pem, server.crt,server.key和server.conf 以及子目录ccd。/etc/open***/ccd 目录下有文件 client1,client2 和client3。 /etc/open***/server.conf 内容如下: ;local a.b.c.d port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key # This file should be kept secret dh dh1024.pem server 10.0.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun status open***-status.log verb 3 client-config-dir ccd #使*** clients 能访问*** server 内部网段计算机 push "route 192.168.10.0 255.255.255.0" route 192.168.11.0 255.255.255.0 #使*** server 能访问B 房间计算机 route 192.168.12.0 255.255.255.0 #使*** server 能访问C 房间计算机 route 192.168.13.0 255.255.255.0 #使*** server 能访问D 房间计算机 client-to-client #使*** clients 相互之间可以访问 push "route 192.168.11.0 255.255.255.0" push "route 192.168.12.0 255.255.255.0" push "route 192.168.13.0 255.255.255.0" /etc/open***/ccd/client1 内容如下: ifconfig-push 10.0.0.5 10.0.0.6 iroute 192.168.11.0 255.255.255.0 /etc/open***/ccd/client2 内容如下: ifconfig-push 10.0.0.9 10.0.0.10 iroute 192.168.12.0 255.255.255.0 /etc/open***/ccd/client3 内容如下: ifconfig-push 10.0.0.13 10.0.0.14 iroute 192.168.13.0 255.255.255.0 *** client1 的目录/etc/open*** 下有文件ca.crt,client1.crt,client1.key 和client1.conf。 /etc/open***/client1.conf 内容如下: ############################################## # Sample client-side Open××× 2.0 config file # # for connecting to multi-client server. # ############################################## client dev tun proto udp remote 172.16.37.83 1194 resolv-retry infinite nobind user nobody group nobody persist-key persist-tun ca ca.crt cert client1.crt key client1.key comp-lzo verb 3 keepalive 10 120 *** client2 和*** client3 类似*** client1。这里就不说了。 附件包括pdf版文档,参考资料及各个配置文件。 [ 本帖最后由 xdkui 于 2006-11-28 14:51 编辑 ]
转载于:https://blog.51cto.com/doffo/41383