FreeBSD下配置ADSL共享上网

利用FreeBSD用户级的PPP做FreeBSD下的ADSL共享上网,可以使用较低的设备配置,实现局域网的稳定的网络链路共享。同时还可以增加Squid做上网的代理,进一步增加局域网上网的速度。

FreeBSD可以对PPP提供两种不同方式的支持,一种是内核级PPP,它将PPP协议代码编译进内核,并运行一个PPP守护进程pppd,提供对PPP的支持,这是比较传统的方法,但配置比较困难。另一种为用户级PPP,使用一个应用程序PPP,通过通用tunnel设备传递PPP数据,配置较为容易。一般情况下可以使用用户级的PPP来建立拨号方式的Internet连接。

准备

安装基本的FreeBSD环境。然后确认在/etc/ppp目录中是否存在ppp.conf 或者ppp.conf.sample文件。

安装设置

要让整个局域网上的用户都可以访问 Internet ,您的机器必须有两张网卡,一张连接ADSL设备,一张连接局域网的HUB或者交换机。此外,重新编译一次内核是必须的,因为我们需要在内核中加入对IP转发的支持,客户机将IP数据包发到FreeBSD,然后FreeBSD作为网关,将这些数据包转发到指定的地址,这就是整个局域网上网的基本原理。

实例

视ADSL Modem只是一个拨号器,它不带任何附加功能(如路由)。使用FreeBSD自带的ppp来达到PPPoE拨号功能,实现最基本的目的:供内部网络中所有客户机通过FreeBSD网关用nat方式(透明网关)连接到Internet,这种方式最大的好处是内部网络的客户机不需特殊配置就能连接到外部网络。

一、服务器IP设定:

第一块网卡
IP:192.168.1.1
子网掩码:255.255.255.0
网关:NONE

第二块网卡
IP:192.168.2.1
子网掩码:255.255.255.0
网关:NONE

二、设置一个使用PPPoE的ppp呼出

将/etc/ppp/ppp.conf进行备份,以下是修改后的ppp.conf内容(除标签名为,以下每行前面都必须空一格):

default:
set device PPPoE:eth0 #eth01为连接ADSL Modem的网卡名称,应替换成你使用的设备名
enable dns #自动获取DNS
adsl: #标签名,可任意命名
set mru 1492
set mtu 1492
set authname myadslusername #ADSL用户名
set authkey myadslpassword #ADSL密码
set dial
set login
add default HISADDR

以上只有三处需要进行修改,即连接ADSL Modem的网卡名称、上网用户名上密码。如果你不知道自己的网卡名称,可以通过ifconfig -a命令得到。

三、设置启动时自动连接

将下面这些行加到/etc/rc.conf文件中:

getway_enable=”YES”

ppp_enable=”YES”
ppp_mode=”ddial” #断线重拨
ppp_profile=”adsl” #这里的adsl对应的是/etc/ppp/ppp.conf中的标签名
ppp_nat=”YES”

如果你想手动连接,则可以通过以下命令实现:

ppp -nat -ddial adsl

这样,FreeBSD网关服务器端已经设置完成,设置客户端的网关为192.168.1.1即可上网,如果需要自动分配IP地址,可另行安装dhcpd,如果需要进行网络的加速,可另行安装squid。

Cisco Switch Portfast

我早就发现了局域网自动分配地址的速度很慢,只是问题不够明显。虽然问题不明显,但我一直在思考这个问题,经过我英明的分析和搜索,原来这个问题是早有案例的……

Using PortFast and Other Commands to Fix Workstation Startup Connectivity Delays
http://www.cisco.com/en/US/products/hw/switches/ps700/products_tech_note09186a00800b1500.shtml#cnf2k

—高科技分隔线—
Introduction
This document addresses initial connectivity delays that occur when workstations that are connected to switches have one of these two issues:
*Unable to log in to a network domain, either Microsoft Windows NT or Novell
*Unable to obtain a DHCP address
The steps in this document are easy to implement and address the most common causes of workstation connectivity delays that you encounter during the workstation initialization/startup phase.
—高科技分隔线—

Spanning Tree
If you have recently migrated from a hub environment to a switch environment, startup connectivity delays can appear because a switch works much differently than a hub. A switch provides connectivity at the data link layer, not at the physical layer. The switch uses a bridging algorithm in order to decide if packets that are received on a port need to be transmitted out other ports. The bridging algorithm is susceptible to physical loops in the network topology. Because of this susceptibility to loops, switches run the protocol STP that causes loops to be eliminated in the topology. When you run STP, all ports that are included in the spanning tree process become active much slower than they otherwise become active as STP detects and blocks loops. A bridged network that has physical loops, without STP, breaks. Despite the time that the process involves, STP is beneficial. STP that runs on Catalyst switches is an industry-standard specification (IEEE 802.1D).

After a port on the switch has linked and joined the bridge group, STP runs on that port. A port that runs STP can be in one of five states:

*blocking
*listening
*learning
*forwarding
*disabled

STP dictates that the port starts out blocking, and then immediately moves through the listening and learning phases. By default, the port spends approximately 15 seconds listening and 15 seconds learning. During the listening state, the switch tries to determine where the port fits in the spanning tree topology. The switch especially wants to know whether this port is part of a physical loop. If the port is part of a loop, the port can be chosen to go into blocking mode. The blocking mode means that the port does not send or receive user data in order to eliminate loops. If the port is not part of a loop, the port proceeds to the learning state, in which the port learns which MAC addresses live off this port. This entire STP initialization process takes about 30 seconds.

If you connect a workstation or a server with a single NIC card or an IP phone to a switch port, the connection cannot create a physical loop. These connections are considered leaf nodes. There is no reason to make the workstation wait 30 seconds while the switch checks for loops if the workstation cannot cause a loop. Cisco added the PortFast or fast-start feature. With this feature, the STP for this port assumes that the port is not part of a loop and immediately moves to the forwarding state and does not go through the blocking, listening, or learning states. This command does not turn STP off. This command makes STP skip a few initial steps (unnecessary steps, in this circumstance) on the selected port.
—高科技分隔线—

用中文来说,上面这一段话可以解读为:处于OSI二层的STP协议定义了一个交换机的端口的五种状态,你看上面有blocking,listening,learning,forwarding,disabled这么些状态,显然只有forwarding状态才是工作状态,而一个交换机端口从加电开始,先要经过listening,learning,forwarding这么个顺序来启动,主要是为了检测端口上有木有环路,以免造成网络风暴而致堵塞,看看需不需要blocking。

遗憾的是,这每个过程至少需要十五秒的时间,于是就造成了dhcp超时,以致于电脑获取不到IP地址,而电脑重启之后问题就解决了,是因为这个端口已经进入了forwarding状态,那莫这个问题应该怎么来解决呢?

这篇文档中说到,Cisco added the PortFast or fast-start feature,思科添加了一个portfast功能,跳过listening,learning,直接进入forwarding状态。

那莫,如何开启portfast呢?这就太简单了,如图所示:

conf t
interface fastEthernet 0/1
spanning-tree portfast

那莫,为什么原有的STP协议中没有把这么方便的一个功能加进去呢?看上面那么大一段Warning就知道了~啊,原来是loops的后果很坏很严重……开启了portfast的端口只能接一个网络设备,也就是说,在开启了portfast得端口上,如果出现了环路,哇,居然可以network cannot recover,不过对于我们这种小型办公网络而言,最多也就是个网速超慢……总之呢,就是开启了portfast的端口,是不能接交换机,路由器,集线器等等设备的,也就是说,只能有一个NIC,一个MAC地址(当然是同时)。

—还是高科技分隔线—
Caution: Never use the PortFast feature on switch ports that connect to other switches, hubs, or routers. These connections can cause physical loops, and spanning tree must go through the full initialization procedure in these situations. A spanning tree loop can bring your network down. If you turn on PortFast for a port that is part of a physical loop, there can be a window of time when packets are continuously forwarded (and can even multiply) in such a way that the network cannot recover.
—还是高科技分隔线—

这篇文档居然还无聊地对端口up时间做了个benchmark(请参考原文中Timing Tests on the Catalyst 2900XL段落),结果是可以把三十秒的时间缩短为一秒……效果还是很明显的,等于是把网线插入电脑就可以上网了,零等待~

于是我把办公室那个交换机的portfast功能也打开了,明天上班看下效果……当然,连服务器和无线AP以及上行防火墙的端口显然是不能打开的……

 

syslogd config

在比较大规模的网络应用或者对安全有一定要求的应用中,通常需要对系统的日志进行记录分类并审核,默认情况下,每个系统会在本地硬盘上记录自己的日志,这样虽然也能有日志记录,但是有很多缺点:首先是管理不便,当服务器数量比较多的时候,登陆每台服务器去管理分析日志会十分不便,其次是安全问题,一旦有入侵者登陆系统,他可以轻松的删除所有日志,系统安全分析人员不能得到任何入侵信息。因此,在网络中安排一台专用的日志服务器来记录系统日志是一个比较理想的方案。下面我们以FreeBSD下的syslog为例介绍如何利用syslogd记录来自Unix和windows的logs。

A:记录类Unix主机的log:

首先需要对Freebsd的syslog进行配置,使它允许接收来自其他服务器的log信息。
在/etc/rc.conf中加入:
syslogd_flags=”-4 -a 0/0:*”

配置说明:freebsd的syslogd参数设置放在/etc/rc.conf文件的syslogd_flags变量中,Freebsd对syslogd的默认设置参数是syslogd_flags=”-s”,(可以在默认配置/etc/defaults/rc.conf中看到),默认的参数-s表示打开UDP 514端口监听,但是只监听本机的UDP 514端口,拒绝接收来自其他主机的log信息。如果是两个ss,即-ss,表示不打开任何端口,只在本机/dev/log设备记录。

参数说明:
-4 只监听IPv4端口,如果你的网络是IPv6协议,可以换成-6。

-a 0/0:* 接受来自所有网段所有端口发送过来的log信息。

-a 192.168.1.0/24:514或者-a 192.168.1.0/24表示仅接收来自局域网该网段514端口的log信息,这也是freebsd的syslogd进程默认设置,也就是说freebsd 在接收来自其他主机的log信息的时候会判断对方发送信息的端口,如果对方不是用514端口发送的信息,那么freebsd的syslogd会拒绝接收信息。在默认情况下必须:远程IP的UDP 514端口发送到本地IP的UDP 514端口。

在参数中加入*,表示允许接收来自任何端口的log信息。这点,在记录类Unix主机信息的时候感觉不到加不加有什么区别,因为类Unix主机都是用 514端口发送和接收syslog信息的。但是在接收windows信息的时候就非常重要了。因为windows的syslog软件不用514端口发送信息,这会让默认配置的syslogd拒绝接收信息。

修改好syslogd参数后,我们需要修改一下/etc/syslog.conf文件,指定log信息的存放路径,
比如你要记录其他系统的远程登陆登出信息并指定日志存放路径,则需要修改以下行:

authpriv.* /var/log/otherslog
这表示把系统的登入登出日志(包括本机系统登陆登出日志)存放到/var/log/otherslog文件中。
当然,这是最简陋的做法,因为这样会把所有服务器的登陆登出信息存放在一个文件中,察看的时候很不方便,通常的做法是用一个脚本,对接收到的信息进行简单的分拣,再发送到不同的文件。

如下设置:
authpriv.* |/var/log/filter_log.sh

在记录目标前面加上“|”表示把接收到的信息交给后面的程序处理,这个程序可以是一个专门的日志处理软件,也可以是一个自己编写的小的脚本,举例:

#!/bin/sh
stuff=/var/log/auth.log
read stuff
SERVER=`echo $stuff |awk’{print $4}’`
echo $stuff >> /usr/logs/login_log/$SERVER.log

这个简单的脚本以IP作为分类依据,先用read读取log信息,用awk取出第四字段(即IP地址或者主机名所在的字段),以该字段为文件名存放该主机的日志。
这样一来,来自192.168.1.1的log会记录到192.168.1.1.log文件中,来自192.168.1.2的log会被记录在 192.168.1.2.log文件中,分析和归类就比较方便了。当然这是一个最简单的例子,可以根据自己的需求写出更合适的脚本,可以按照日期每天,每周,每月分目录存储,甚至把log信息分类后插入数据库中,这样日志的管理和分析就更方便了。

重启一下syslogd服务,让配置生效:
/etc/rc.d/syslogd restart

OK,服务端的配置完成。现在配置一下客户端:
这里所说的客户端,就是发送自己的日志到远程日志服务器上的主机。

修改/etc/syslog.conf文件:

如果你只需要记录系统登入登出日志到远程日志服务器上,那么只需要修改以下一行:
authpriv.* @192.168.1.100
这里的192.168.1.100就是log服务器的IP,“@”符号表示发送到远程主机。

重启一下syslog服务:
/etc/rc.d/syslogd restart

用logger测试一下是否配置成功:
logger -p authpriv.notice “Hello,this is a test”

到log服务器上去看看,“Hello,this is a test”应该已经被记录下了。最后在客户机上登陆登出几次,看看真实的authpriv信息是否也被成功的记录下。

B: Windows日志的记录

对于类Unix主机之间记录日志,由于协议、软件和日志信息格式等都大同小异,因此实现起来比较简单,但是windows的系统日志格式不同,日志记录软件,方式等都不同。因此,我们需要第三方的软件来将windows的日志转换成syslog类型的日志后,转发给syslog服务器。
一个第三方软件evtsys (全称是evntlog to syslog)
这是一个非常小巧而且免费的第三方日志记录软件:
https://engineering.purdue.edu/ECN/Resources/Documents/UNIX/evtsys/
文件才几十K大小,非常小巧,解压后是两个文件evtsys.dll和evtsys.exe
把这两个文件拷贝到 c:\windows\system32目录下。

打开CMD
C:\>evtsys –i –h 192.168.1.100
-i 表示安装成系统服务
-h 指定log服务器的IP地址
如果要卸载evtsys,则:
net stop evtsys
evtsys -u

启动该服务:
C:\>net start evtsys

打开windows组策略编辑器 (开始->运行 输入 gpedit.msc)

在windows 设置-> 安全设置 -> 本地策略->审核策略中,打开你需要记录的windows日志。evtsys会实时的判断是否有新的windows日志产生,然后把新产生的日志转换成syslogd可识别的格式,通过UDP 3072端口发送给syslogd服务器。

OK,所有的配置windows端配置完成,现在配置一下syslogd的配置文件.
参数的配置和上面相同,
所不同的是evtsys是以daemon设备的方式发送给 syslogd log信息的。
因此,需要在/etc/syslog.conf中加入:
daemon.notice |/var/log/filter_log.sh
关于syslog 记录设备和记录等级方面的知识可以参考syslog文档。

C:网络设备日志的记录

各种不同的中高档路由器都有日志记录的选项,且多使用嵌入式Linux上的syslogd,只需要在路由器GUI或CLI中设置即可,将NAT信息,防火墙信息,以及DHCP等等信息发送到日志服务器备查,这个机器型号太多了,不作赘述。

OK,所有配置设置完成。这下所有服务器上的系统日志都可以统一记录到一台日志服务器上轻松管理了。