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

OpenBSD的安装、升级、更新等日常问题。

版主: chenjun天地乾坤

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

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

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

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

代码: 全选

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

首先修改 /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.32 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.32),说明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


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

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

代码: 全选

pass out on dc0 from xl0:network to any nat-to (dc0)

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

好了,现在你可以重新启动计算机,或者简单地重新加载PF配置文件:

代码: 全选

# pfctl -f /etc/gobsd.org

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

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

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

回复

在线用户

正浏览此版面之用户: Ahrefs [Bot] 和 8 访客