本文基本上是最后的版本了,过些日子我会把所有的配置文件理出来,不过哪会是单独发布或是比较晚的事了。因为现在我的机器上的配置文件太多了。主要是当初想写一个太大的文章了。版主可以将本文放入精华,上次的跟贴太多,以后的更新我基本上会回本贴了。 1. 前言 2 2. 安装mpd 2 3. PPPoE 3 3.1. 使用ppp 3 3.1.1. 设置一个使用PPPOE的PPP呼出 3 3.1.2. 设置启动时自动进行连接 4 3.1.3. 手动连接 4 3.2. 使用mpd 4 3.2.1. 配置你的新kernel 4 3.2.2. 配置mpd配置文件 4 3.2.3. 设置启动时自动进行连接 5 3.2.4. 手动连接 5 4. 设置NAT服务 6 4.1. 启动PPP的NAT支持 6 4.1.1. 系统启动时自动启动 6 4.1.2. 手动启动 6 4.2. 使用IPFW的NATD 6 4.2.1. 系统配置 6 4.2.2. 为ppp设置natd 7 4.2.3. 为mpd设置natd 7 4.3. 使用ipfilter的ipnat 8 4.3.1. 系统配置 8 4.3.2. 为ppp设置ipnat 9 4.3.3. 为mpd设置ipnat 9 5. 配置文件总结 9 5.1. ppp手工拨出 9 5.1.1. /etc/rc.conf 9 5.1.2. /etc/ppp/ppp.conf 10 5.2. ppp自动拨出 10 5.3. mpd手工拨出 11 5.3.1. kernel配置文件 11 5.4. mpd自动拨出 11 5.5. ppp的nat手工拨出 11 5.6. ppp的nat自动拨出 11 5.7. 使用natd的ppp手工拨出 11 5.8. 使用natd的ppp自动拨出 11 5.9. 使用natd的mpd手工拨出 11 5.10. 使用natd的mpd自动拨出 12 5.11. 使用ipnat的ppp手工拨出 12 5.12. 使用ipnat的ppp自动拨出 12 5.13. 使用ipnat的mpd手工拨出 12 5.14. 使用ipnat的mpd自动拨出 12 1. 前言 本文原名叫做FreeBSD 5.0 ADSL安装指南,由于越做越大所以改名叫做网关安装指南。泛指有关网关的一系列应用的安装。这个名字还希望大家能出出主意。希望大家能把自己的一些意见和建议告诉我,我的联系方法是:hdcola@bj1860.net。同时也可以去http://www.huangdong.com/bbs/中的BSD版与大家一起讨论。 本文主要的目的是说明如何使用FreeBSD来建立一个网关,它涉及的有ADSL(PPPoE)、VPN(PPTP)、NAT、Firewall。我不想写成一个大全样的文章,主要针对的目标是现在宽带中大家会慢慢多用起来的PPPoE和VPN。 本文不会涉及到传统的电话拨号的部分,主要的原因一是有太多的文章讲它了。而Firewall的深入的讨论本文也不会提及,因为讲它本身就会是一个与本文一样的篇幅了,相信对于IPFW、IPFilter会有人写一个更为专业的文章的。 为了让大家明白PPPoE与PPTP的不同,以免产生我之前的混淆,先告诉大家它们的用处。现在我们使用PPPoE主要是ADSL,我们可以视ADSL Modem只是一个拨号器,它不带网络功能,就像使用本机设备一样的去使用它。而PPTP则是在网络上具有一个IP地址的服务器,我所知通常在校园网、公司网中会大量使用这样的拨号服务器以进行记费或是安全保障。 本文使用的PPPoE和PPTP的工具主要是FreeBSD自带的ppp和使用Netgraph的mpd。可以使用ppp来达到PPPoE拨号的功能,使用mpd则可实现PPPoE和PPTP的功能。由于mpd的强大,在使用PPTP时我更推荐大家使用mpd。 感觉quakelee在推荐给了我mpd这样一个好的工具,同时对mpd的所做的普及化的工作。以及oneflower及时的指出了巧妙的使用ipfw配置文件的方法。同时还要感谢绝对灌水不断的催促才使这个文章能这么快的再出一个新的版本。更要感觉我家的大宝宝和小宝宝,他们允许我使用家中的ADSL设备来测试本文中的所有设置。 2. 安装mpd 由于ppp是FreeBSD自带的一个功能,mpd则是一个FreeBSD的附加软件。你可以使用FreeBSD的Ports Collection来编译它。mpd最新的版本为3.13,使用ports的编译方法为: cd /usr/ports/net/mpd make install make clean 如果你没有安装Ports Collection,哪么也可以到http://www.huangdong.com/bbs/中的BSD版的精华区中找到mpd3.13的package安装包。使用package安装包的安装方法为: pkg_add mpd-3.13.tbz 你还可以到http://www.dellroad.org/mpd/来下载mpd的源代码包自己手工编译,具体方法阅读源代码包中的README文件。 3. PPPoE 3.1. 使用ppp 3.1.1. 设置一个使用PPPOE的PPP呼出 将/etc/ppp中的ppp.conf进行备份,以下是新的ppp.conf中的内容: default: set log Phase Chat LCP IPCP CCP tun command nat enable yes nat same_ports yes nat use_sockets yes set redial 15 28800 set reconnect 15 28800 pppoe: #加入在kernel中配置的会连接ADSL设备的网卡的名称,我的是fxp0 set device PPPoE:fxp0: set mru 1492 set mtu 1492 set speed sync enable lqr set lqrperiod 5 set cd 5 set dial set login set timeout 0 set authname Your UserName used to login set authkey Your Password used to login set ifaddr 10.0.0.1/0 10.0.0.2/0 255.255.255.0 0.0.0.0 add default HISADDR# Add a (sticky) default route enable dns #注意:只有三处需要进行更改的地方,它们是PPPoE:fxp0: 以及用户名和密码。 如果你不知道自已网卡的设备名哪么可以通过ifconfig –a命令来得到,我的计算机的结果如下: fxp0: flags=8843 mtu 1500 inet 192.168.10.50 netmask 0xffffff00 broadcast 192.168.10.255 ether 00:d0:59:0d:08:03 media: Ethernet autoselect (10baseT/UTP) status: active lo0: flags=8049 mtu 16384 inet 127.0.0.1 netmask 0xff000000 3.1.2. 设置启动时自动进行连接 在/etc/rc.conf中加入以下参数(ppp_mode设置断线重拨的功能): ppp_enable="YES" #ppp_mode="ddial" ppp_mode="background" ppp_profile="pppoe" 这里的ppp_profile对应的是/etc/ppp中的ppp.conf里的一个条目。 3.1.3. 手动连接 如果你想手动的发起一个连接,只需要在命令行上输入: ppp –ddial pppoe 最后一个参数就是你在/etc/ppp中设置的ppp.conf中的一个条目。 3.2. 使用mpd 3.2.1. 配置你的新kernel 为ADSL的PPPOE协议在kernel配置文件中加入以下内容: # ADSL PPPOE Sup options NETGRAPH options NETGRAPH_ETHER options NETGRAPH_SOCKET options NETGRAPH_PPPOE 在重新编译、安装并重启机器后,就可以使用netgraph了。也就是可以正常使用mpd了。 3.2.2. 配置mpd配置文件 mpd的配置文件都存储在/usr/local/etc/mpd中,在安装好mpd后它已经为我们产生了一系列的sample文件。我们使用PPPoE需要产生三个配置文件: 3.2.2.1. mpd.conf PPPoE: new -i ng0 PPPoE PPPoE set iface addrs 1.1.1.1 2.2.2.2 set iface route default set iface disable on-demand set iface idle 0 set bundle disable multilink set bundle authname username set link no acfcomp protocomp set link disable pap chap set link accept chap set link mtu 1460 set ipcp yes vjcomp set ipcp ranges 0.0.0.0/0 0.0.0.0/0 open iface 这里你需要使用你的PPPoE的用户名来替换set bundle authname后面的username。 3.2.2.2. mpd.links PPPoE: set link type pppoe set pppoe iface fxp0 set pppoe service "adsl" 这里需要使用你的网卡的设备名来替换fxp0。 3.2.2.3. mpd.secret username "password" 使用你的在mpd.conf中的username来替换这里的username,使用你的PPPoE服务器的认证密码来替换这里的password。 3.2.3. 设置启动时自动进行连接 在/usr/local/etc/rc.d目录中新建一个文件,名为000.mpd.sh,内容为: /usr/local/sbin/mpd -b PPPoE 需要注意的是,你需要让000.mpd.sh有可执行的能力。可以使用这条命令: chmod +x /usr/local/etc/rc.d/000.mpd.sh 3.2.4. 手动连接 其实就是000.mpd.sh中的哪句话了: /usr/local/sbin/mpd -b PPPoE 4. 设置NAT服务 4.1. 启动PPP的NAT支持 4.1.1. 系统启动时自动启动 同时还需要指定本台FreeBSD为一个网关服务器。在/etc/rc.conf中设置gateway选择以及ppp的拨号选项: gateway_enable=”YES” ppp_nat="YES" natd_enable="YES" natd_interface="tu0" gateway_enable="YES" 除了在/etc/rc.conf中设置外,也可以在/etc/ppp/ppp.conf中加入以下设置: nat enable yes 这样会打开ppp内置的NAT服务。如果在ppp.conf中加入了这个参数,哪么在rc.conf中是否加入ppp_nat=”YES”也就无所谓了。 对于使用ppp的NAT支持我们会发现它对于系统的kernel没有任何定制要求,所以对于轻型的应用和只是提供透明转发的网关使用ppp自带的NAT功能则是最好的选择。 4.1.2. 手动启动 如果已经改动了ppp.conf中的nat enable yes,哪么你还是可以使用ppp –ddial pppoe命令行来启动ppp。而且ppp也直接支持nat的功能。但是也可以能过: ppp –nat –ddial pppoe 命令来手工显示的启用ppp的NAT支持。 4.2. 使用IPFW的NATD IPFW/NATD是FreeBSD内置的防火墙软件。可以使用IPFW来进行进出包过滤,使用NATD来实现透明网关。 4.2.1. 系统配置 4.2.1.1. 在kernel中加入防火墙配置 在kernel配置文件中加入以下选项参数: options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=100 4.2.1.2. 设置系统启动时参数 在/etc/rc.conf中加入以下设置: ipfirewall_enable="YES" firewall_type="open" 4.2.2. 为ppp设置natd 为了使ppp具有portmapping这样的功能哪么使用natd则是必然的了。对于ppp,在启动ppp后使用ifconfig会发现ppp启动和tun0或是tunx这样的一个设备,它是使用kernel中的: device tun # Packet tunnel. 设备来形成一个独立的网络设备。所以在设备natd之前你需要确认你的ppp会使用到的设备号。通常如果只拨接一次,哪么设备名就应是tun0了。在/etc/rc.conf中加入以下natd的设置: natd_enable="YES" natd_interface="tun0" natd_flags="-m –s -f /etc/natd.conf" 同时别忘记在rc.conf中也需要gateway_enable="YES"这样的一个设置呀。由于我的portmapping项目比较多,所以我喜欢将所有的设置放入一个文件中,也就是/etc/natd.conf。以下是我的natd.conf的设置: dynamic yes redirect_port tcp 192.168.10.100:80 8080 redirect_port udp 192.168.10.100:3782 3782 redirect_port udp 192.168.10.100:3783 3783 redirect_port tcp 192.168.10.100:3782 3782 redirect_port tcp 192.168.10.100:3783 3783 由于是使用的ppp,它的ip地址是动态分配的,所以使用的dynamic yes这个参数。redirect_port的作用则是将本机的tcp或是udp的一个端口的连接传发至内网的一个IP地址的端口之上。 4.2.3. 为mpd设置natd 在上节中我们说明了natd需要使用一个网络接口来做外网的网卡界面,在mpd中它使用的是ng0或是ngx。可以参考你的mpd.conf的设置。在本文档中使用的是ng0,所以我们的/etc/rc.conf中需要加入以下设置: natd_enable="YES" natd_interface="ng0" natd_flags="-m –s -f /etc/natd.conf" 对于natd.conf中的设置见上节中的设置,其实在mpd和ppp下natd除了网卡接口不同外,其它都是一样的。 由于mpd不能通过/etc/rc.conf来启动,通过/usr/local/etc/rc.d中的shell脚本启动又会晚于natd启动的时间,所以为了在natd启动前来启动mpd,可以使用以下方法: 在/etc/rc.firewall的 ############ # Flush out the list before we begin. # ${fwcmd} -f flush 后面加入 /usr/local/sbin/mpd -b PPPoE sleep 10 这样就可以让natd启动时,mpd已经启动,并已经为ng0网卡动态得到了IP地址。需要注意的是,不要忘记把/usr/local/etc/rc.d中的mpd.sh删除哟。 4.3. 使用ipfilter的ipnat 在FreeBSD下最为流行的就是IPFW/NATD及ipfilter/ipnat两个安全组合了。对于FreeBSD的core team来说,他们更推荐使用IPFW/NATD,而ipfilter/ipnat则是可以运行于多种操作系统之上的一个安全方案。包括Solaris、HPUX、IBM AIX及各种BSD。之所以在这里加入了ipfilter/ipnat的说明是因为我个人更喜欢ipfilter的实时监控功能和ipnat的方便更新配置的功能。 4.3.1. 系统配置 4.3.1.1. 在kernel中加入ipfilter的支持 在kernel的配置文件中需要加入以下参数: options IPFILTER options IPFILTER_LOG options RANDOM_IP_ID 需要注意的是,ipfilter与IPFW不能共存,所以请检查是否也有IPFW的配置参数,如果有将它们注释或删除。 4.3.1.2. 设置启动时参数 在/etc/rc.conf中加入以下参数: ipfilter_enable="YES" ipnat_enable="YES" ipfilter的配置文件默认使用/etc/ipf.rules,而ipnat的配置文件默认使用ipnat.rules。需要注意的是,和上节一样,你需要将rc.conf中所有firewall开头的行注释或删除。 4.3.1.3. 设置ipfilter参数 在/etc/ipf.rules中加入以下参数: pass in all pass out all 不要骂我为什么把防火墙全开着,如果你需要对防火墙做设置时,请参考ipfilter的设置罢。 4.3.2. 为ppp设置ipnat 在/etc/rc.conf中设置 ipfilter_enable="YES" ipnat_enable="YES" 同时设置/etc/ipnat.rules: map tun0 192.168.10.0/24 - 0/32 portmap tcp/udp 10000:65535 map tun0 192.168.10.0/24 - 0/32 rdr tun0 0/0 port 8080 - 192.168.10.100 port 80 tcp 前两行是做透明网关的设置,最后一行的设置说明了将tun0上的8080端口的tcp访问转发至192.168.10.100。 4.3.3. 为mpd设置ipnat 在/etc/rc.conf中设置 ipfilter_enable="YES" ipnat_enable="YES" 同时设置/etc/ipnat.rules: map ng0 192.168.10.0/24 - 0/32 portmap tcp/udp 10000:65535 map ng0 192.168.10.0/24 - 0/32 rdr ng0 0/0 port 8080 - 192.168.10.100 port 80 tcp 前两行是做透明网关的设置,最后一行的设置说明了将ng0上的8080端口的tcp访问转发至192.168.10.100。