跨机房部署

跨机房的服务部署分两个小问题。第一个是系统(RAID、BIOS、OS) 的部署,另外一个则是 OS 上面的服务的部署。

系统
曾经想通过 dhcp over openvpn 来解决机房的"互联互通"问题,目前暂时仅仅解决了通过 openvpn 进行 lan to lan 的连接,而 over openvpn 的 dhcp(dhcrelay) 到目前为止还不清楚为什么获取不到 IP。

后来看 cobbler 的文档的时候发现可以通过 replicating 实现,这个需要在对端的 IDC 部署一台 cobbler server,由这台机器完成 tftp, dhcp 的功能,而由 central cobbler 实现统一的 system, repo 等配置。
部署起来也很简单。在对端部署一台跟 central cobbler 一样的 cobbler,默认不需要添加任何的 distro 等。该端所有的配置均从 central 拉取,因此需要足够的硬盘空间,尤其要同步 repo:
# cobbler replicate cobbler replicate –master=cobbler.example.org [–distros=pattern] [–profiles=pattern] [–systems=pattern] [–repos-pattern] [–images=pattern] [–prune] [–omit-data]

接下来该建立 RAID 的建立 RAID,该安装系统就安装系统。另外,官方推荐通过 trigger 机制来自动的同步 central 上的数据,这个我后来调研的时候发现并不是很好,如果有多个机房的话,会造成 system 的混乱。因此,暂时还是手动的在对端的 cobbler 上手动的执行一遍 replicating,每次机器上架的时候的才会用到,工作量并不大。

服务
这个相对就比较简单了,如果是通过 tunnel 形成的一个三层结构,那么通过 puppet master 或者类似的 saltstack 就能很轻松的完成,前提是注意 ntp 以及 dns(hosts) 的统一正确。

通过 OpenVPN 隧道广播 DHCP

lan-to-lan(AB 两个 IDC) 的 OpenVPN(tun) 网络,A 端的 lan 里面部署有一台 DHCP,想通过隧道广播到 B 端内网里面,这个明显是不可能的,中间需要跨越多个网络。因此可以通过 relay 实现。
在 B 端的 GWb 上部署一台 dhcrelay,将其指向 A lan 的 DHCP,按理来说 B lan 里面的机器这下可以获取到从 A 过来的 relay 了,可是试了几次都没有成功。调试过程中用到了如下的两个工具。

一个是 dhcpdump。还有一个是 dhcping,这个用的比较多,可以模拟做 request:
# dhcping -h 00:12:3f:20:11:49 -s 10.1.200.200 -c 10.1.200.1 -V

或者
# dhcping -s 255.255.255.255 -r -V
在 g 上搜 "dhcp over vpn" 一搜一大把,应该是有不少成功的案例的,我这里为什么获取不到 IP,到目前为止还不清楚,就当抛砖引玉了。

使用 DHCP relay 解决跨网段广播

先来温习下 DHCP 的基础概念。

RHEL 上使用的 DHCP 版本叫 ISC DHCP server,通过 yum 安装 dhcp。sample 配置可以在 /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample 里面找到,参照这个文件修改是个比较快捷有效的方式:
# yum install dhcp
# cp /usr/share/doc/dhcp-4.1.1/dhcpd.conf.sample /etc/dhcp/dhcpd.conf

每修改一次 dhcpd.conf 文件,如果要是其生效,需要 restart dhcpd;或者通过 omshell 使其在 on the fly 的过程中生效。dhcpd.conf 中的配置是 case-insensitive 的。下面几个是参考配置。

下面的 option 只对 subnet 192.168.1.0/24 的网段生效:
subnet 192.168.1.0 netmask 255.255.255.0 {
        option routers                          192.168.1.254;
        option subnet-mask                 255.255.255.0;
        option domain-search              "example.com";
        option domain-name-servers   192.168.1.1;
        option time-offset                      -18000;   
        range                                        192.168.1.10 192.168.1.100;
}

下面的 option 对全局生效:
default-lease-time                  600;
max-lease-time                      7200;
option subnet-mask                255.255.255.0;
option broadcast-address      192.168.1.255;
option routers                         192.168.1.254;
option domain-name-servers 192.168.1.1, 192.168.1.2;
option domain-search             "example.com";
subnet 192.168.1.0 netmask 255.255.255.0 {
   range 192.168.1.10 192.168.1.100;
}

指定特定的 host 分配特定的 IP:
host apex {
   option host-name "apex.example.com";
   hardware ethernet 00:A0:78:8E:9E:AA;
   fixed-address        192.168.1.4;
}

如果一台机器有多块网卡,分了多个网段,可以使用 "shared-network" 声明:
shared-network name {
    option domain-search                "test.redhat.com";
    option domain-name-servers      ns1.redhat.com, ns2.redhat.com;
    option routers                             192.168.0.254;
    more parameters for EXAMPLE shared-network
    subnet 192.168.1.0 netmask 255.255.252.0 {
        parameters for subnet
        range 192.168.1.1 192.168.1.254;
    }
    subnet 192.168.2.0 netmask 255.255.252.0 {
        parameters for subnet
        range 192.168.2.1 192.168.2.254;
    }
}

通过 "group" 将某一类给划分起来:
group {
   option routers                              192.168.1.254;
   option subnet-mask                     255.255.255.0;
   option domain-search                  "example.com";
   option domain-name-servers       192.168.1.1;
   option time-offset                         -18000;
   host apex {
      option host-name "apex.example.com";
      hardware ethernet 00:A0:78:8E:9E:AA;
      fixed-address        192.168.1.4;
   }
   host raleigh {
      option host-name "raleigh.example.com";
      hardware ethernet 00:A1:DD:74:C3:F2;
      fixed-address        192.168.1.6;
   }
}

详细的可以 man dhcp-options。

对于 DHCP server 来说,/var/lib/dhcpd/dhcpd.leases 存储着 client 的 lease 信息,该文件由系统自动生成,无需手动修改。像下面这样:
# cat /var/lib/dhcpd/dhcpd.leases
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.1.1-P1

lease 192.168.10.93 {
  starts 4 2013/01/31 09:34:57;
  ends 4 2013/01/31 15:29:19;
  tstp 4 2013/01/31 15:29:19;
  cltt 4 2013/01/31 09:34:57;
  binding state free;
  hardware ethernet 80:b3:1c:32:6e:a5;
  set vendorclass = "PXEClient:Arch:00000:UNDI:002001";
}

需要注意的是,该文件所有跟时间相关的都是使用的 UTC,而非本地时间。

当 dhcpd 第一次启动时,如果没有 dhcpd.leases 文件,手动的 touch 一个 /var/lib/dhcpd/dhcpd.leases 文件,否则会启动失败:
# /sbin/service dhcpd start/stop

如果有多块接口,可以通过下面这个指定特定的接口监听 dhcpd:
# cat /etc/sysconfig/dhcpd
DHCPDARGS=eth0

其余可以在 /etc/sysconfig/dhcpd 里面指定的参数:
-p: 该参数指定了 dhcpd 监听的 UDP port,默认是情况是 server 在 67 port 监听请求,68 port 回复客户端。
-f: dhcpd daemon 默认时 backgroud,该参数使得 dhcpd 跑在 foreground,主要用来 debugging。
-d: 默认 log 发送至 /var/log/messages,该参数使得 log 发送到 stderr。
-q: 启动 daemon 的时候,不打印 copyright 的信息。
-cf: 指定配置文件的位置,默认在 /etc/dhcp/dhcpd.conf。
-lf: 指定 lease db 文件的位置,默认在 /var/lib/dhcpd/dhcpd.leases。

DHCP 的客户端的配置,主要在下面这个文件:
/etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
还有个 PEERDNS 选项,yes 表示使用 DHCP server 的 push 过来的 DNS,no 表示不修改 /etc/resolv.conf。详细的可以 man dhclient 以及 dhclient.conf。

对于 Multihomed 的 DHCP server 来说,需要指定监听的端口:
DHCPDARGS="eth0 eth1";

另外,需要指定多个 subnet,这些 subnet 要匹配上面指定的端口:
default-lease-time 600;
max-lease-time 7200;
subnet 10.0.0.0 netmask 255.255.255.0 {
    option subnet-mask  255.255.255.0;
    option routers           10.0.0.1;
    range                        10.0.0.5 10.0.0.15;
}
subnet 172.16.0.0 netmask 255.255.255.0 {
    option subnet-mask 255.255.255.0;
    option routers          172.16.0.1;
    range                       172.16.0.5 172.16.0.15;
}
host example0 {
    hardware ethernet 00:1A:6B:6A:2E:0B;
    fixed-address        10.0.0.20;
}
host example1 {
    hardware ethernet 00:1A:6B:6A:2E:0B;
    fixed-address        172.16.0.20;
}

注意:
1. DHCP 不支持 alias 接口(eth0:x)。
2. fixed-address 后面跟的地址要在 range 分配的 IP pool 之外。
3. *nix DHCP server 对 IP 的分配是从高到低的,而 Windows 的则相反。
对于第二点,官方的说法是 fixed-address 的 IP 不能在 range 的范围内,但是我通过 cobbler 指定的地址来看,这个说法实践中却是可以的,也就是说 fixed-address 是可以在 range 范围内的。

下面开始本篇博客的正题,DHCP Relay agent。
DHCP Relay agent(dhcrelay)可以让没有 dhcpd 的网段获取到 dhcp。
下面根据我们的实际情况来实践一下。首先 DHCP server(192.168.1.1) 的机器在 192.168.1.0/24 网段,除此之外,我们还有 192.168.2.0/24, 192.168.3.0/24 等网段,各个网段通过路由连接。最简单的方式是在每一个网段下面部署一个 DHCP server,但是后果就是维护量比较大,并且资源的利用率比较低下。为此,我们可以通过 DHCP relay 的方式来提高资源的利用率,降低维护的成本,这样,我们只需要一个 DHCP server,最多两个(failover),剩下的在每一个网段部署一台 DHCP relay 就好了,由这台 relay 将 client 的广播包 relay 到那台 server 就好了。
Continue reading