跨机房部署

跨机房的服务部署分两个小问题。第一个是系统(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) 的统一正确。

Posted in Uncategorized | 1 Reply

通过 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,到目前为止还不清楚,就当抛砖引玉了。

Posted in Uncategorized | 1 Reply

使用 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