用OpenBSD 4.7做网关/路由器(gateway/router)

在OpenBSD环境下搭建各种服务器的相关讨论。

版主: lionuxchenjun天地乾坤

回复
头像
whoami
铁 Fe
帖子: 76
注册时间: 2010-06-03 13:23

用OpenBSD 4.7做网关/路由器(gateway/router)

帖子 whoami » 2010-07-01 13:00

环境:
在老机dell GX150上安装OpenBSD 4.7作为网关。
有两个网络接口,xl0连接外部网络、re1连接内部网络,xl0自动获取IP地址,re1设置IP地址为192.168.8.1,创建文件 /etc/hostname.xl0和 /etc/hostname.re1:

代码: 全选

# echo dhcp > /etc/hostname.xl0
# echo inet 192.168.8.1 255.255.255.0 NONE > /etc/hostname.re1

首先修改 /etc/sysctl.conf文件,将下面这行前面的注释去掉。

代码: 全选

net.inet.ip.forwarding=1    # 1=Permit forwarding (routing) of IPv4 packets

修改 /etc/dhcpd.conf文件:

代码: 全选

#    $OpenBSD: dhcpd.conf,v 1.2 2008/10/03 11:41:21 sthen Exp $
#
# DHCP server options.
# See dhcpd.conf(5) and dhcpd(8) for more information.
#
 
# Network:        192.168.1.0/255.255.255.0
# Domain name:        gobsd.org
# Name servers:        192.168.1.3 and 192.168.1.5
# Default router:    192.168.1.1
# Addresses:        192.168.1.32 - 192.168.1.127
#
option  domain-name "gobsd.org";
option  domain-name-servers 192.168.1.254, 68.94.156.1, 68.94.157.1;
 
subnet 192.168.8.0 netmask 255.255.255.0 {
    option routers 192.168.8.1;
 
    range 192.168.8.8 192.168.8.127;
 
    host static-client {
        hardware ethernet 22:33:44:55:66:77;
        fixed-address 192.168.8.200;
    }
 
    host pxe-client {
        hardware ethernet 02:03:04:05:06:07;
        filename "pxeboot";
        next-server 192.168.8.1;
    }
}

上面的几个步骤设置完成后,内网的主机可以获得IP地址(例如我测试时内网仅有一台主机,自动获取的IP地址为192.168.8.8),说明DHCP服务器工作正常,但是内网主机并不能访问Internet,从内网主机ssh到网关上并运行lynx,发现作为网关的主机可以正常访问internet,问题在哪里呢?这里要说明一下,PF的NAT规则修改后到目前为止,OpenBSD的FAQ上并未对用OpenBSD 4.7做网关的部分进行修正,实际上这里必须依赖PF的NAT功能才能使内网正常访问Inetrnet,因为每个读者的实际情况的要求不同,我们这里仅就怎样设置简单的网关进行讨论,不涉及数据包过滤规则,如果你的网关兼做防火墙(数据包过滤),请您自行调整自己的规则 —— 实际上也很简单,和原来差不多,英文好的直接上OpenBSD主页,懒得费劲的可以自行参考中文版的PF指南。

为了今后的升级便利,我们自己再建立一个PF的配置文件gobsd.org——(纯属广告一下):

代码: 全选

# cp /etc/pf.conf /etc/gobsd.org

修改默认的PF配置文件名称:
编辑 /etc/rc.conf.local文件,加上如下内容, 以便重新启动后生效:

代码: 全选

pf_rules=/etc/gobsd.org
dhcpd_flags="re1"


我们只需在原来的PF默认规则上添加上一条NAT规则, 因为这台主机就两个网络接口,我管理的网络也不多,就不设置宏了,直接用网络接口的名称,如果你自己要出教材,请自行修改规则,以便你的读者养成良好的习惯,我在这里就偷懒了:D:

在gobsd.org这个文件最后添加如下内容:

代码: 全选

pass out on xl0 from re1:network to any nat-to (xl0)
(有时候系统会声称这条规则有语法错误,如果你确认你的规则没有输错,请检查一下,上面的第一步,也就是re1接口的IP地址设置了没有?因为这也会导致系统的错误判断。)

这里的xl0是连接外网的网络接口,re1是连接内网的网络接口,这里展开说明一下这个规则的含义,将所有来自内网re1:network的通讯路由到连接外网的xl0接口上, 并允许这些通讯出站,因为自OpenBSD 4.1版本后,PF规则中内嵌了keep state功能,所以所有出站的通讯全记录内存中的状态表内,这样所有出站数据包的返回信息就可以没有阻碍地直接进站,因为PF查询状态表后确认这是由内网的某台主机发起的连接,就不会根据规则来过滤这些数据包,而是直接放行。最后解释一下:为什么最后这里的xl0加上了一个括号呢?如果你不加括号,开始没有问题,但是一旦连接外网接口的IP地址发生变化,PF则不会理会这个变化,直接向原IP地址NAT数据,这里加上括号即使外网卡分配的IP地址变化了,数据仍然会NAT连接外网的接口上。

好了,现在你可以重新启动计算机。如果你的配置没有错误,现在内网的主机应该可以直接访问Internet了。

如果你此时不想重新启动计算机,则需要手动做很多的步骤: 需要加载转发功能、重新启动网络接口、查看dc0网路接口是否获取了外网IP地址、以及手动启动dhcpd服务、重新加载pf规则.....:

代码: 全选

# sysctl net.inet.ip.forwarding=1
# sh /etc/netstart
# touch /var/db/dhcpd.leases
# dhcpd re1
# pfctl -f /etc/gobsd.org

此外,你也无须单独设置用PF作为ftp代理了,尽管随意连接外网的FTP。

whoami@gobsd.org
转载请注明作者名及原文出处
未完待续、请勿转载、欢迎纠错、多谢!;)
[email]WHOAMi@点点儿[/email]

zdslua
钛 Ti
帖子: 23
注册时间: 2010-01-27 8:53

帖子 zdslua » 2010-07-02 16:40

为广泛流传,我给转载一下,望楼见谅。支持一下
OpenBSD 很小巧,我很喜欢,我的博客:http://hi.baidu.com/zdslua/

回复

在线用户

正浏览此版面之用户: 没有注册用户 和 33 访客