如何在RB450中做vlan trunk

RB450是MikroTik公司出品的基于RouterOS的三层路由器,提供了丰富的功能:动态路由协议(OSPF、BGP)、802.1q、QoS(单IP限速)、netflow exporter、NTP、OpenVPN、PPPoE、radius等。今天我主要用它来创建36个vlan,每个vlan都分配一个网关IP,接着通过一个以太口与一台二层交换机的vlan trunk相连,实现了这36个vlan的互访。

以下是相关配置:

/interface vlan
add arp=enabled comment="" disabled=no interface=ether1 l2mtu=1522 mtu=1500 \
    name=vlan5 use-service-tag=no vlan-id=5
add arp=enabled comment="" disabled=no interface=ether1 l2mtu=1522 mtu=1500 \
    name=vlan2 use-service-tag=no vlan-id=2
add arp=enabled comment="" disabled=no interface=ether1 l2mtu=1522 mtu=1500 \
    name=vlan41 use-service-tag=no vlan-id=41
...
/ip address
add address=172.16.60.254/24 broadcast=172.16.60.255 comment="" disabled=no \
    interface=vlan41 network=172.16.60.0
add address=192.168.100.254/24 broadcast=192.168.100.255 comment="" disabled=\
    no interface=vlan100 network=192.168.100.0
add address=172.16.59.254/24 broadcast=172.16.59.255 comment="" disabled=no \
    interface=vlan2 network=172.16.59.0
add address=172.16.58.254/24 broadcast=172.16.58.255 comment="" disabled=no \
    interface=vlan5 network=172.16.58.0
…

这就实现了vlan trunk的功能,非常简单,但是RouterOS毕竟是linux,所以它与实际的交换机还是有一些区别的,譬如不能在一个vlan trunk中支持untag的vlan,亦即native vlan,不知道换了交换芯片atheros8316的RB450G功能会不会更强大一些,详见:http://wiki.mikrotik.com/wiki/Switch_Chip_Features

RouterOS中的防火墙功能

routeros(ros)源于Linux,因此ros中的firewall拥有netfilter的影子,譬如ros的firewall含有INPUT、OUTPUT、FORWARD链,还有nat、mangle表,但是又有区别,特别是以下两点值得注意:

  1. ros的firewall似乎不支持状态检测;
  2. 默认情况下,ros的firewall允许所有数据包通过。

这两点我实在无法理解。

关于第一点,在一般的状态防火墙中,假如欲允许内网用户访问外网的web应用,只需要定义一条从内到外的访问规则即可,状态防火墙会自动识别从外至内的“相关(establised/related)”包,但是ros的firewall还需要额外再定义这两条(establised/related)从外至内的规则。

关于第二点,一般的防火墙的默认规则是drop,这是符合大多数管理员的思维的:凡是未经许可的连接均应丢弃,这种思路有两个好处:一是安全性高,不至于因为管理员的疏忽导致整个网络开放给外网,一是容易扩展,因为管理员永远都无法掌握或预知所有的威胁,因此仅定义允许的数据流才是正确的防火墙策略管理思路。

需求:

  1. 允许10.10.10.0/29访问192.168.100.0/24
  2. 允许10.10.10.8/29访问172.16.100.0/24
  3. 允许所有(方向)ping
  4. 允许ROS访问所有区域

脚本:

# apr/17/2011 13:16:32 by RouterOS 4.16
#
/ip firewall filter
#### INPUT chain ####
## 定义返回的"已连接/相关"数据包
add action=accept chain=input comment="Allow Established connections" \
    connection-state=established disabled=no
add action=accept chain=input comment="Allow Related connections" \
    connection-state=related disabled=no
## 在所有端口上允许ping ros
add action=accept chain=input comment="Allow ICMP" disabled=no protocol=icmp
## 在所有端口上允许通过SSH访问ros
add action=accept chain=input comment=SSH disabled=no dst-port=22 protocol=\
    tcp
## 在所有端口上允许通过winbox访问ros
add action=accept chain=input comment=winbox disabled=no dst-port=8291 \
    protocol=tcp
add action=accept chain=input comment=DHCP disabled=no dst-port=67-68 \
    protocol=tcp
## 在所有端口上允许访问ros的DNS服务
add action=accept chain=input comment="DNS - TCP" disabled=no dst-port=53 \
    protocol=tcp
add action=accept chain=input comment="DNS - UDP" disabled=no dst-port=53 \
    protocol=udp
### 若INPUT的数据包未符合上述定义则全部丢弃
add action=drop chain=input comment="### DROP EVERYTHING ELSE - INPUT ###" \
    disabled=no src-address-list=""
####FORWARD
##允许返回的"已连接/相关"数据包通过
add action=accept chain=forward comment=\
    "Allow established connections - FORWARD" connection-state=established \
    disabled=no
add action=accept chain=forward comment="Allow related connections - FORWARD" \
    connection-state=related disabled=no
add action=drop chain=forward comment="Drop invalid connections - FORWARD" \
    connection-state=invalid disabled=no
##凡是属于tcp的数据包将跳转至tcp chain进行处理(用户自定义)
add action=jump chain=forward comment="" disabled=no jump-target=tcp \
    protocol=tcp
##凡是属于udp的数据包将跳转至udp chain进行处理(用户自定义)
add action=jump chain=forward comment="" disabled=no jump-target=udp \
    protocol=udp
##允许内网用户ping外网主机
add action=accept chain=forward comment="Allow ICMP" disabled=no protocol=\
    icmp
### tcp chain
## 在netfilter防火墙中,数据包会流经所有规则,由最后一条符合的规则处理该数据包。
## 为了提高效率,我们将数据包按协议划分成tcp、udp和icmp三类,每一类数据包均由各自的用户自
## 定义链处理,从而减少数据包检查的次数。这里将利用jump target和用户自定义链来实现。
add action=accept chain=tcp disabled=no src-address=10.10.10.0/29 dst-address=192.168.100.0/24
add action=accept chain=tcp disabled=no src-address=10.10.10.8/29 dst-address=172.16.100.0/24
### udp chain
add action=accept chain=udp disabled=no src-address=10.10.10.0/29 dst-address=192.168.100.0/24
add action=accept chain=udp disabled=no src-address=10.10.10.8/29 dst-address=172.16.100.0/24
### 若FORWARD的数据包未符合上述定义则全部丢弃
add action=drop chain=forward comment=\
    "### DROP EVERYTHING ELSE - FORWARD ###" disabled=no

这里没有涉及到OUTPUT链,因为根据需求,不需要额外对OUTPUT进行限制。

如何实现Windows AD的统一认证 - 网络设备部分

在企业内实现统一认证是所有系统管理员梦寐以求的事情,先不说情况多变的普通用户,单就网络设备的管理就是一件很麻烦的事情。假设一个企业拥有的网络设备多达100台,它们全部采用传统的本地登录认证方式。那么任何一个系统管理员离职或调动,就需要对所有网络设备的账号进行变更,理想情况下需重复操作100次。实现统一认证之后,只需要在后台的用户数据库操作1次即可,这就是统一认证的魅力。

如何实现Windows AD的统一认证 - linux部分

现代企业的业务需求多种多样,因此在生产环境中经常会出现多种操作系统互相协作的现象。微软的Windows操作系统在桌面应用方面拥有绝对的领先优势,因此很多企业部署了Windows活动目录来实现单点登录(SSO);Linux在服务器和网络应用方面有自己的独门利器,因此很多企业的服务器操作系统和网络设备的嵌入式操作系统用的大部分是Linux。这对系统管理员来说就存在这么一个令人饶头的问题:如何实现统一登录认证?

FTP服务

FTP全称是File Transfer Protocol(文件传输协议),顾名思义,它的作用是在网络中传送文件。这是Internet上一个比较古老的协议,早在1971年就已经诞生,那个年代的网络条件奇差,带宽小,掉线频繁,FTP应运而生,它的断点续传功能拯救了许许多多网民宝贵的时间,时至今日,它仍然在许多重要的应用环境中发挥着不可或缺的作用。

NTP服务

一、什么是NTP,干什么用的?

NTP的全称是network time protocol(网络时间协议),它的作用是用来同步电脑系统时间的。

h3c oid

前些日子在一个项目中用到H3C的防火墙和交换机,日常维护需要监控这些设备的CPU和内存的占用情况,然而项目中却未采购H3C的网管系统,于是想到了cacti和nagios,这两个网管软件都没有H3C的私有MIB库,只好自己去找相应设备的oid了。 我使用的工具是net-snmp,先是在H3C的设备中dis cpudis mem获得当前的CPU和内存的占用情况,记下来作为基准值,接着立刻用snmpwalk去获取全部的oid,然后与基准值进行比对,最终可以获知CPU和内存的oid。

下面是我找到的一些常用oid:

S3600

1.3.6.1.4.1.2011.10.2.6.1.1.1.1.6.7   cpu使用率
1.3.6.1.4.1.2011.10.2.6.1.1.1.1.8.7   内存使用率
1.3.6.1.4.1.2011.10.2.6.1.1.1.1.12.1  温度
1.3.6.1.4.1.2011.10.2.6.1.1.1.1.13.1  上限温度
1.3.6.1.4.1.2011.10.2.6.1.1.1.1.10.7  内存总容量

F100-E

1.3.6.1.4.1.2011.10.2.6.1.1.1.1.6.18  cpu使用率
1.3.6.1.4.1.2011.10.2.6.1.1.1.1.8.18  内存使用率

细心的读者可能会看到5500和3600在内存利用率上有区别,5500直接提供了内存利用率的oid,3600却比较隐晦,提供的是内存剩余容量,还需要用户自行计算利用率。好在cacti所使用的rrdtool提供了CDEF计算方法,只需要得知3600的总容量,就可以算出利用率了,总容量则可以通过dis mem来获得。CDEF的计算方式详见rrdtool的帮助文档。

p2p VPN的今生前世

UPDATE(2012.04.18):我对之前的武断表示歉意,原以为n2n会有良好的发展前景,然而前两天再去查看n2n的SVN时发现,最后一次更新是2010年,看来这些小众的开源项目,终究是逃脱不掉成为孤儿的命运。
{: class=“update” }

企业发展到一定规模的时候大都在全国乃至全球设置分支机构,它们的地理位置分散,在VPN没有出现之前,这些分支机构之间的网络互联只能通过租用专线实现,然而租用专线的费用高昂,一般企业无法承受。

如何在debian中安装无线网卡

记得2003年的时候,Wi-Fi设备用的是WEP加密协议,由于安全性问题而未能获得广泛应用。过去几年802.11获得长足的进步,WPA1/2,EAP-TLS等多种加密技术的实现大大促进了WiFi的传播,AP和无线网卡产品异常丰富,然而兼容Linux的还是屈指可数,能在Linux成功安装无线网卡的不仅仅靠技术和忍者神龟般的耐性,更多时候还要看人品!

在安装无线网卡之前有必要先了解一下WiFi的工作方式:

AP

AP是access point的简称,它将多个无线设备连接,无线设备通过它进行互联,也通过它联系外界,譬如互联网。

WPA

WPA全称是Wi-Fi Protected Access,是一种基于预协商key的加密方式,WPA之前802.11采用了WEP,后来证明是一种失败的加密方式,在安全性方面给Wi-Fi带来了很差的声誉,影响Wi-Fi的普及,WPA的出现扭转了乾坤。个人用户用得最多的是PSK,Pre shared key。
WPA的加密过程

安装无线网卡

在Linux中安装无线网卡驱动有两种方式,一种是通过ndiswrapper使用windows的驱动,另一种使用linux的原生驱动。

在第一种方式中,ndiswrapper是Linux内核中的一个模块,用于加载和运行windows内核的API和NDIS API驱动,换句话来说就是ndiswrapper将linux伪装成windows,使得无线网卡的 windows驱动可以跑在linux之上。Linux fans从心理上是抵触这种方式的,感觉要低windows users一等,其次在实际应用中也存在一些恼人的问题,因此是备选方案。

第二种方式是安装原生的linux的驱动,这种方式是最正宗的,直接由内核驱动硬件,效率也更高些,因此尽可能采用这种方式。可是目前linux针对无线网卡的驱动不多,因此在购买无线网卡之前需要确认一下是否兼容linux,下面是兼容linux的无线网卡列表:http://linux-wless.passys.nl/

b43-phy0 debug: Adding Interface type 2
  b43-phy0 ERROR: Firmware file “b43/ucode5.fw” not found or load failed.
  b43-phy0 ERROR: You must go to http://linuxwireless.org/en/users/Drivers/bcm43xx#devicefirmware and download the correct firmware (version 4).

  1. 查看自己的无线网卡的芯片
alfie:~# lspci -vnn | less
...
02:00.0 Network controller [0280]: Broadcom Corporation BCM4306 802.11b/g Wireless LAN Controller [14e4:4320] (rev 03)
        Subsystem: Linksys WPC54G [1737:4320]
        Flags: bus master, fast devsel, latency 64, IRQ 11
        Memory at 24000000 (32-bit, non-prefetchable) [size=8K]
        Capabilities: [40] Power Management version 2
        Kernel driver in use: b43-pci-bridge
        Kernel modules: ssb
...

可以看到Linux内核已经识别到了Linksys WPC54G了,它使用的芯片是Broadcom的BCM4320(我自己也说不清是4306还是4320,在http://lin...中说是以[14e4:4320]里面的数字为准)。

针对Broadcom的芯片,linux社区专门提供了b43驱动,在2.6.17-rc2时,内核引入了bcm43xx这个驱动,从2.6.24开始引入了b43legacy和b43,并废掉bcm43xx,其中b43legacy负责Broadcom4306 ver2以前或者仅有802.11b功能的Broadcom芯片,而b43负责剩下的所有型号芯片。

上面的兼容列表比较含糊,Linksys WPC54G v1.2似乎被b43支持,又似乎被b43legacy支持,也顾不了那么多了,我决定先试一下b43。

识别了网卡之后还不能马上使用,因为Broadcom的芯片工作原理有些特殊,还需要给芯片加载专有的firmware才能正常工作,因为firmware是专有的,所以debian官方源里面不直接提供,需要用户自行下载。

  1. 安装b43-fwcutter

    aptitude install b43-fwcutter

安装b43-fwcutter之后会提示是否自动去http://downloads.openwrt.org/sources下载相应的firmware并解压,此时应该选择否,因为openwrt.org的链接已经失效,需要手工下载。

正确的地址应该是http://mirror2.openwrt.org/sources,我选择了最新的firmware:wl 4.160xxx

wget /home/software http://mirror2.openwrt.org/sources/xxx
cd /home/software && b43-fwcutter -w /lib/firmware xxx

/lib/firmware是b43内核模块默认去寻找Broadcom firmware的地方。

需要说明的是,

  1. 安装wireless-tools

这个软件包提供了几个针对无线网卡的程序,iwconfig,iwlist

4、安装wpasupplicant

debian lenny中对wpasupplicant的介绍
WPA and WPA2 are methods for securing wireless networks, the former using IEEE 802.1X, and the latter using IEEE 802.11i. This software provides key negotiation with the WPA Authenticator, and controls association with IEEE 802.11i networks.

在ubuntu中安装wpa-supplicant
https://help.ubuntu.com/community/WifiDocs/Driver/bcm43xx/Feisty

安装wpasupplicat和wpagui
aptitude install wpasupplicant wpagui
其中wpasupplicant中包含了wpa_cli

安装b43-fwcutter和wireless-tools
其中,boardcom公司为很多无线网卡厂商提供芯片,下面就是linksys wpc54G所使用的芯片
lspci -vnn
由于boardcom是一家商业公司,所以他提供的芯片驱动程序也具有商业性质,因此在debian的源中没有。我们需要通过openwrt.org这个源来下载,openwrt.org是说来话长,暂且按下不表。
b43-fwcutter安装完毕之后,将自动去downloads.openwrt.org/sources/wl_….下载firmware,然而这个链接已经失效,所以需要手工去下载。
wget http://mirror2.openwrt.org/sources/broadcom-wl-4.80.53.0.tar.bz2

然后通过b43-fwcutter -w /lib/firmware broadcom-wl-4.80.53.0.tar.bz2

接着modprobe b43

即可完成

这个时候通过iwlist wlan0 scan来测试驱动是否能够正常使用

alfie:/home/chenr# iwlist wlan0 scan
wlan0     Scan completed :
          Cell 01 - Address: 00:14:BF:F2:05:B7
                    ESSID:"dd-wrt"
                    Mode:Master
                    Channel:6
                    Frequency:2.437 GHz (Channel 6)
                    Quality=73/100  Signal level=-56 dBm  Noise level=-69 dBm
                    Encryption key:on
                    IE: WPA Version 1
                        Group Cipher : TKIP
                        Pairwise Ciphers (1) : TKIP
                        Authentication Suites (1) : PSK
                    Bit Rates:1 Mb/s; 2 Mb/s; 5.5 Mb/s; 11 Mb/s; 18 Mb/s
                              24 Mb/s; 36 Mb/s; 54 Mb/s; 6 Mb/s; 9 Mb/s
                              12 Mb/s; 48 Mb/s
                    Extra:tsf=000000295b4c72c0

说明驱动已经可以正常使用了。

接下来需要配置wpa,这又是另外一个话题,先安装wpasupplicant

iwlistiwconfig是wireless-tools中的小程序,其中

iwlist可以通过某长无限网卡扫描到ssid

iwlist wlan0 scanning

iwconfig类似ifconfig,主要为无限网卡提供设置服务。

配置/etc/network/interface

~~~
allow-hotplug wlan0
iface wlan0 inet manual
wpa-ssid dd-wrt
wpa-psk hainanyidong

由于psk的密码明文显示在interface这个文件中,所以需要限制仅root可以对改文件进行修改

chmod 0600 /etc/network/interface

最后启动wlan0,invoke-rc.d networking restart
这句的好处是不需要重启机器。如果使用ifdown wlan0和ifup wlan0会显示尚未定义。

下面两行是用于??

    wpa-driver wext
    wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

如何在debian etch中修改网卡ID

在使用VMware的时候,往往需要创建多个虚拟机,为此,VMware提供了一个便利的功能:clone(克隆)。用户只需要装好一台虚拟机,然后使用clone功能就可以复制出多个虚拟机了,省时省事。

然而VMware为了避免目标和源这两台虚拟机之间的网卡冲突,在复制的过程中,自动修改了目标虚拟机网卡的MAC地址。于是当目标虚拟机启动的时候,系统就会赋予这些网卡新的id,譬如源虚拟机装了3张网卡,那么目标虚拟机的网卡id就是eth3、eth4和eth5,这是因为udev这个服务进程检测到有新的网卡(新的mac地址),于是重新加载驱动,赋予该网卡新的id(因为旧网卡id尚未删除)。假如在目标虚拟机上再重新clone,网卡id还会继续增长,这样的网卡id看起来很碍眼,解决办法是修改/etc/udev/rules.d/zNN_persistent-net.rules文件。

  • 修改前的zNN_persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, probably run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.
# MAC addresses must be written in lowercase.

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:a8:e8:91", NAME="eth0"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:a8:e8:9b", NAME="eth1"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:a8:e8:a5", NAME="eth2"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:2e:e1:61", NAME="eth4"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:2e:e1:6b", NAME="eth3"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:2e:e1:57", NAME="eth5"

配置文件中有6张网卡,实际在用的只有三张,其mac地址末尾分别是61,6b和57,eth0、eth1和eth2已经失效,我们只需将e旧的th0、eth1、eth2注释掉,然后再将这几个网卡id赋予新的网卡即可。

  • 修改后的zNN_persistent-net.rules
# This file was automatically generated by the /lib/udev/write_net_rules
# program, probably run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single line.
# MAC addresses must be written in lowercase.

# PCI device 0x1022:0x2000 (pcnet32)
# SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:a8:e8:91", NAME="eth0"

# PCI device 0x1022:0x2000 (pcnet32)
# SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:a8:e8:9b", NAME="eth1"

# PCI device 0x1022:0x2000 (pcnet32)
# SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:a8:e8:a5", NAME="eth2"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:2e:e1:61", NAME="eth1"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:2e:e1:6b", NAME="eth2"

# PCI device 0x1022:0x2000 (pcnet32)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0c:29:2e:e1:57", NAME="eth0"

重启虚拟机后,网卡id就变会eth0/eth1/eth2了。