RSS

FreeBSD高可用NAT网关安装笔记

接上次实验,这次使用二台机器做到 NAT 网关的高可用,主要是借助Common Access Redundancy Protocol (CARP, 共用地址冗余协议).Common Access Redundancy Protocol, 或简称 CARP 能够使多台主机共享同一 IP 地址。 在某些配置中, 这样做可以提高可用性, 或实现负载均衡。

1.系统环境

网关虚拟机:
2 X   FreeBSD 5.4 i368 1G 内存 20G 硬盘 双网卡 (carp 在 FreeBSD5.4 后面的版本中才被加入进来)
客户端虚拟机: Windows 2003 单网卡

2.IP 地址规划:

node1:
外网网卡 IP 地址:202.114.216.78255.255.255.126 网关:202.114.216.126
内网网卡 IP 地址:192.168.100.1255.255.255.0
node2:
外网网卡 IP 地址:202.114.216.79255.255.255.126 网关:202.114.216.126
内网网卡 IP 地址:192.168.100.2255.255.255.0
node1 和 node2 共用地址:192.168.100.3
windows 2003:
内网网卡 IP 地址:192.168.100.10255.255.255.0 网关:192.168.100.3

3.安全策略:

作为网关,安全性非常重要,建议除了远程登录用的 SSH 外,尽可能多的停掉所有不相关服务。本安装文档只是最简单的配置,没有任何安全过滤规则,更多安全过滤规则需要根据实际情况补充。

4.具体步骤

以 node1 为例,注意二台机器 IP 设置等会有所不同
(1).安装操作系统
安装操作系统在之前的文档里已经详细叙述过了,可以参考上一篇文章FreeBSD 做 NAT 网关安装笔记,只要记得添加 src 和 ports 就成了,别的地方没特别注意的
(2).网络配置
em0 为外网网卡,em1 为内网网卡,确保机器可以正常访问外网
设置 em1 网卡地址

vi /etc/rc.conf

添加如下

ifconfig_em1="inet 192.168.100.1 netmask 255.255.255.0"

保存退出。
设置 ssh 允许 root 登陆

vi /etc/ssh/sshd_config

修改

PermitRootLogin yes

保存退出,并重启 ssh 服务

/etc/rc.d/sshd restart

重启服务器,重启后二台机器网络配置
node1

1

node2

0
(3).编译内核
重启后就可以 ssh 登陆到服务器,下面开始编译内核
进入内核配置目录

cd /usr/src/sys/i386/conf/

拷贝默认内核配置文件

cp GENERIC GATEWAY

编辑内核配置文件

vi GATEWAY

文件末尾添加如下

device          carp
options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         IPDIVERT

保存退出
与上次不同,这次多添加了一个 device carp
重新编译

/usr/sbin/config GATEWAY
cd ../compile/GATEWAY/
make depend
make
make install

大约需要 5 分钟,比较快,完成之后,直接重启机器,重新启动之后,可以看到已经加载新的内核,

2

说明内核编译成功,此时会发现 ssh 无法连接到服务器,那是因为防火墙默认拒绝所有连接,为了后续测试,安装下 iftop 工具

cd /usr/ports/net-mgmt/iftop/
make install clean
rehash

iftop 的一些参数
-n 不查询 hostname
-N 不解析端口对应的服务名
-i interface 网卡名称
-B 显示 bytes/sec 而不是 bits/sec
(4).后续设置
通过 ifconfig 命令来创建 CARP 设备

ifconfig carp0 create

添加配置

/etc/rc.conf

添加如下

cloned_interfaces="carp0"
ifconfig_carp0="inet 192.168.100.3 netmask 255.255.255.0  vhid 1 pass test123  advskew 100"
ifconfig carp0 up
linux_enable="YES"
sendmail_enable="YES"
sshd_enable="YES"
gateway_enable="YES"
natd_enable="YES"
natd_interface="em0"
firewall_enable="YES"
firewall_type="open"

添加后二台机器完整的/etc/rc.conf 文件
node1

3
node2

4
注意:1.两台服务器的 pass 的密码必须是一致的。2.我这里 advskew 都设置为 100,关于 advskew 的一些设置大家可以看carp 在 FreeBSD 的 man
(5).高可用测试
重启机器后执行 ifconfig 如下
node1

5
node2

6
可以看出 node1 的 carp0 为 master,node2 的 carp0 为 backup。说明此时数据是通过 node1 走的。
windows 客户端网络配置

7
我使用 esx 做的实验,esx 网络如下,LAN 为虚拟端口组

8
测试 1.客户端是否能够访问外网

9
测试通过
在 node1 上用 iftop -i em0 查看流量确实是重 node1 通过

10

用 ifconfig 查看 carp0 状态
node1

5

看到 node1 上 carp0 为 mater

node2

15

node2 的 carp 为 backup
测试 2.重启 node1,测试客户端网络是否正常,这里重启 node1 来模拟一个节点故障。
重启 node1,在 windows 客户端里

11

可以看到中间外网掉包 2 个,内网掉一个包后网络恢复正常,此时在 node2 上执行 iftop -i em0

12

可以看到流量走的 node2,在 node2 上查看 carp0 状态

13

node2 的 carp 状态为 master 了,等 node1 起来后,查看 node1 上 carp0 的状态

14

测试通过

node1 上 carp0 的状态为 backup 了。至此测试结束

5.后续

可以看到,利用 carp 已经实现了 NAT 网关的高可用,我这里没有添加防火墙规则,如果后续要添加规则记得同时在 2 台机器上执行,当然也可以利用 rsync 工具同步。至于具体的防火墙规则我这里就不写了,可以看FreeBSD Handbook有详细的操作指南。