用ssh打通反向隧道,内网也可对外提供服务

一般正规一点的网络环境,大多是这样的:防火墙后分为内网和中立区(DMZ),并且内网和DMZ虽然都能访问外网,互相却是无法直接访问的。内网和DMZ的区别就是,来自外网的访问,都通过防火墙上的规则映射到DMZ里的服务器上,而内网一般是不允许这样的。

现在需要解决的问题就是,在防火墙只能给DMZ开端口,内网和外网不可直接互访的情况下,如果让内网的机器对外提供服务。

ssh是很神奇的,使用它创建的隧道,可以起到代理的作用,数据流的方向是:

本机 -> 隧道 -> 外网

应用到我们的问题中,如果把隧道反过来,就是:

外网 -> DMZ -> 隧道 -> 内网

这就需要用到ssh的反向隧道,它在服务器上打开一个监听端口,这个端口的访问会被隧道传输到本地,结果再通过隧道传到服务器上,从监听端口返回给客户。这样,在我们的应用中,内网机器通过外网访问DMZ服务器,创建ssh反向隧道,就能够对外提供服务了。当然,防火墙上要将相应端口映射到DMZ的服务器上。

比如,在内网登录DMZ服务器:

ssh -R 8082:localhost:82 fwolf@svr5.tld -o ControlPath=/tmp/ssh_svr5_reverse_tunnel

这样,访问DMZ服务器svr5的8082端口,就是在访问本机的82端口。之所以带上-o ControlPath,是为了和其它访问svr5的进程使用不同的master模式(如果不是第一次创建这个master,而是使用了原来的连接的sockts,肯定就不会创建隧道了)。

有几个问题还需要注意一下:

  • 如果DMZ上监听端口小于1000的话,就必须用root用户登录DMZ服务器,比如root@svr5.tld
  • DMZ服务器上的sshd必须开启GatewayPorts选项,在文件/etc/ssh/sshd_config中加入GatewayPorts yes
  • 记得不要idle,参考中有在服务端设置的方法。
  • 如果放在其它脚本,比如/etc/rc.local中执行的话,除了配置自动登录,还可以带上-fN参数,放到后台去。

参考

Update @ 2008-07-25

注意,由于使用了反向隧道,所以ssh隧道实际作用相当于一个代理,访问的来源也自然就都成了127.0.0.1,如果同时还启用了denyhosts,千万记得要把本机地址127.0.0.1放入白名单/etc/hosts.allow,不然就会成为其他登录失败的牺牲品(失败的登录,其来源也成了loopback的地址):

ssh_exchange_identification: Connection closed by remote host
Fatal error: Lost connection with the server

没办法,为了网络通道的畅通,只能牺牲一部分安全性了。

选择Eclipse PHP Development Tools(PDT)作为PHP开发工具

vi虽然轻巧,但一来在图形界面下没有必要一定用纯cli的东东,二来在项目开发的环境中vi有些吃力。Zend Studio呢一直用着他的keygen也挺不好意思的,功能上我只能说是一般,再一般不过了,就是个图形化的编辑器,带代码提示什么的辅助功能,最有用印象最深的居然是选择多行然后用TAB整体缩进。

所以,尝试着把开发工具更换为PHP Development Tools(PDT),eclipse的大名早有耳闻,只是从来不用java,也就没有摸过。早在2004年底作项目的时候见同事用过,慢就一个字,强也是一个字。至于为何不选PHPEclipse,倒也不是听到网上一边倒的声音,而是我实在是有点不习惯它的复杂,相比之下刚出炉不久功能不全的PHP Development Tools(PDT)正和我意。

我是从官网下载的pdt-all-in-one-R20080103-linux-gtk.tar.gz,有点像懒人包,直接解压就能用了,功能基本上都配置好了。额外装了几个插件,都是用系统自带功能Help -> Software Updates -> Find and Instal安装的:

基本上就够我用了。这种安装方式实在是很方便,能够后台运行更方便。

配置Debug的时候麻烦一些,其实到后来我也没弄太明白,本来想用XDebug的,不过上官网一看基本上只有for windows的二进制包,linux下的多半还得自己编译(网上的例子也多半是基于windows的环境,很无奈),就转向Zend了。谁知Zend官网上这个Debugger的链接也不好找,产品列表里根本就没有,现在这个更新/安装地址已经忘记是从哪里搞来的了,不过能用。

Debug能用了,不过只限于PHP Script运行方式,如果要完整的web测试的话,还得去修改php.ini加Zend Debugger的扩展,懒得弄了,处理得当的话需要debug的时候不多,一般print_r/var_dump也基本够用了。

PHP Development Tools(PDT)的编辑区比Zend Studio要“小”一些,因为界面的边框太“厚”了,Tab也有点大,可以在界面设置中取消圆角,能省点地方。编辑区小的问题不要紧,Ctrl-M能放到最大,加上其它窗口可以缩起来,用的时候调出来,用完自己还会缩回去,所以总体界面上还是要比Zend Studio要好用。

功能上,最喜欢的就是Eclipse无时无刻不在的语法检查,可以迫使我们摒弃掉一些坏毛病。不过这个功能和Smarty模板合不来,像我原来smarty模板文件都是.html扩展名的,这下可遭殃了,一大堆无法处理的错误信息。中间试过PHPEclipse,它支持Smarty模板,不过是另外分配了一个编辑器,同样也只能认.tpl扩展名,模板编辑功能几乎没有,就剩下一个模板语法高亮显示,居然还不像其它编辑窗口一样能够调整背景(我习惯把编辑区背景设置为#CCE8CF,节省眼力),索性不用了。费点功夫把所有模板都改成.tpl扩展名的,然后当一般纯文本处理,也没有什么不爽的,js和css基本上都是在单独的文件中,有相应的编辑器,手工写点html code也无妨。

不过还是推荐一个PHP Development Tools(PDT)中的for Smarty的插件smartypdt,主意虽好,但程序非常不成熟,在PHP Development Tools(PDT)的eclipse 3.3上基本上没法用,先关注一下,期待以后能成熟起来吧。

最后,总体感觉Eclipse虽然速度依然不快,尤其是启动速度,尤其是我调用远程主机上的项目文件,但其强大的功能足以掩盖这些缺点,还是那句话,谁用谁知道~~这几乎是我用过的可操作性最强的Java软件了。

参考

Update @ 2008-05-03

eclipse的配置都保存在workspace目录下,比如设置了php的文件模板,就保存在$workspace/.metadata/.plugins/org.eclipse.core.runtime/.settings/目录下的org.eclipse.php.ui.prefs文件中。

快捷键的设置保存在org.eclipse.ui.workbench.prefs中。

隐藏得好深,找了半天。

Update @ 2008-05-04

字体方面,建议选择英文等宽字体Bitstream Vera Sans Mono或者DejaVu Sans Mono,这样英文配合中文的显示效果比较好,粗体效果也不错,不影响代码的对齐,看着更舒服。

Update @ 2008-05-24

PDT拷贝到另外一台旧机器上,能运行,但PHP相关的内容死活就是不出来,鼓捣了将近4个小时,终于发现,这玩意儿需要jre 1.5以上,安装java 1.6以后,一切正常。唉,望各位引以为戒哪。

就是这篇文章提醒了我:eclipse 最新安装 配置

Ubuntu和手机通过蓝牙互传文件

Ubuntu 7.10 Gutsy,手机Nokia 6120c,蓝牙适配器是让朋友帮买的,朋友不懂Linux,卖这个的也不懂,随便买了一个叫什么艾思凯(issk)蓝牙博士(BLUETOOTH DOCTOR)的,还行,一插机器上就认出来了,就是不知道各种参数如何,初步使用感觉传输距离或者说穿透力不强:

$ lsusb
Bus 001 Device 002: ID 1131:1001 Integrated System Solution Corp. KY-BT100 Bluetooth Adapter

首先安装一些必要的东东:

sudo aptitude install gnome-bluetooth gnome-phone-manager

然后配置/etc/bluetooth/hcid.conf

# Security Manager mode
# 安全设置模式,改成auto
security auto; 
...
# Default PIN code for incoming connections
# 匹配码/通行码,为安全起见,建议自己设一个。
passkey "1234"; 
...
# Local device name
#   %d - device id
#   %h - host name
# 电脑在蓝牙设备中显示的名称,改不改无所谓,自己认识就行。
name "%h-%d"; 

重启服务/etc/init.d/bluetooth,从手机上查找匹配设备,找到电脑以后,输入刚才设定的匹配码;匹配成功之后,提示“授权设备自动连接”选“是”。

配置/etc/bluetooth/rfcomm.conf

rfcomm0 {
    # 启动时自动绑定地址(什么意思?)
    bind yes;
    # 蓝牙设备地址(用$ hcitool scan查找,用$ sdptool browse [地址]查看频道)
    device 00:1C:D6:AC:7D:88;
    # 通迅频道
    channel 11;
    # 说明,自己随便写
    comment "Fwolf Nokia 6120c";
}

然后就可以用rfcomm connect 0连接手机了(测试一下):

$ rfcomm connect 0
Connected /dev/rfcomm0 to 00:1C:D6:AC:7D:88 on channel 1
Press CTRL-C for hangup
Disconnected

现在就可以传文件了:从电脑向手机发送文件用gnome-obex-send 文件名,按照提示选择蓝牙设备后,成功完成文件传输;从手机向电脑发送文件,电脑上要先运行gnome-obex-server,收到文件发送信号之后,会提示是否接收,接收完成后还会弹出一个如何处理的提示框,同时传多个文件的时候会比较烦人。传过来的文件都保存在$HOME/Desktop下,重名文件会自动更名。不过两个方向的传送方式传中文文件名都会乱码,文件内容没事(用usb数据线传没这问题)。

但gnome-phone-manager能发现手机但就是连不上,不知道是不是channel设置的问题,又好像是软件本身的问题,不知道回头升级到Hardy能好些不。

下面是一些网上搜到可能有用的东东:

电脑上寻找蓝牙设备:
$ hcitool scan
Scanning ...
        00:1C:D6:AC:7D:88       Fwolf Nokia 6120c
电脑上查询蓝牙手机(有时候只在适配器刚插上的时候能查询出数据,后来再用就连接超时):
$ sdptool browse 00:1C:D6:AC:7D:88
Service Name: AVRCP Target
Service Description: Audio Video Remote Control
Service Provider: Symbian Software Ltd.
Service RecHandle: 0x10000
Service Class ID List:
  "AV Remote Target" (0x110c)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 23
  "AVCTP" (0x0017)
    uint16: 0x100
Profile Descriptor List:
  "AV Remote" (0x110e)
    Version: 0x0100

Service Name: Hands-Free Audio Gateway
Service RecHandle: 0x10004
Service Class ID List:
  "Handfree Audio Gateway" (0x111f)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 1
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Handsfree" (0x111e)
    Version: 0x0105

Service Name: Headset Audio Gateway
Service RecHandle: 0x10005
Service Class ID List:
  "Headset Audio Gateway" (0x1112)
  "Generic Audio" (0x1203)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 2
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Headset" (0x1108)
    Version: 0x0100

Service Name: Audio Source
Service RecHandle: 0x10011
Service Class ID List:
  "Audio Source" (0x110a)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 25
  "AVDTP" (0x0019)
    uint16: 0x100
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Advanced Audio" (0x110d)
    Version: 0x0100

Service Name: AVRCP Controller
Service Description: Audio Video Remote Control
Service Provider: Symbian Software Ltd.
Service RecHandle: 0x10012
Service Class ID List:
  "AV Remote" (0x110e)
Protocol Descriptor List:
  "L2CAP" (0x0100)
    PSM: 23
  "AVCTP" (0x0017)
    uint16: 0x100
Profile Descriptor List:
  "AV Remote" (0x110e)
    Version: 0x0100

Service Name: SyncMLClient
Service RecHandle: 0x10013
Service Class ID List:
  UUID 128: 00000002-0000-1000-8000-0002ee000002
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 10
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "" (0x00000002-0000-1000-8000-0002ee000002)
    Version: 0x0100

Service Name: OBEX File Transfer
Service RecHandle: 0x10014
Service Class ID List:
  "OBEX File Transfer" (0x1106)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 11
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "OBEX File Transfer" (0x1106)
    Version: 0x0100

Service Name: Nokia OBEX PC Suite Services
Service RecHandle: 0x10015
Service Class ID List:
  UUID 128: 00005005-0000-1000-8000-0002ee000001
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 12
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "" (0x00005005-0000-1000-8000-0002ee000001)
    Version: 0x0100

Service Name: Nokia SyncML Server
Service RecHandle: 0x10016
Service Class ID List:
  UUID 128: 00005601-0000-1000-8000-0002ee000001
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 13
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "" (0x00005601-0000-1000-8000-0002ee000001)
    Version: 0x0100

Service RecHandle: 0x10017
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 3

Service Name: OBEX Object Push
Service RecHandle: 0x10018
Service Class ID List:
  "OBEX Object Push" (0x1105)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 9
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "OBEX Object Push" (0x1105)
    Version: 0x0100

Service Name: Dial-Up Networking
Service RecHandle: 0x10019
Service Class ID List:
  "Dialup Networking" (0x1103)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 4
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Dialup Networking" (0x1103)
    Version: 0x0100

Service Name: Imaging
Service RecHandle: 0x1001a
Service Class ID List:
  "Imaging Responder" (0x111b)
Protocol Descriptor List:
  "L2CAP" (0x0100)
  "RFCOMM" (0x0003)
    Channel: 15
  "OBEX" (0x0008)
Language Base Attr List:
  code_ISO639: 0x454e
  encoding:    0x6a
  base_offset: 0x100
Profile Descriptor List:
  "Imaging" (0x111a)
    Version: 0x0100

这个可以用来查channel号码,不同手机的号码可能会不同,大概是要选择OBEX File Transfer所在的channel(我的手机是11),也有人说是用OBEX Object Push的频道(我的手机是9),再好像有时候瞎设一个或者干脆用1也能进行文件传输,总之有点深奥没弄明白,期待明白人发言。

在手机上查看蓝牙设备地址:*#2820
备注:gnome-obex-send找不到手机的解决办法(未测试)
sudo hciconfig hci0 inqmode 0

参考

Update @ 2008-07-04

升级到Ubuntu 8.04 hardy后,可以用bluetooth-sendto从电脑向手机发送文件,但从手机向电脑发总是不成功,可能和适配器有关系,也有人遇到了同样的问题还有很多,怀疑是和无线局域网的信号有干扰,但关闭无线网之后仍不行;最后,终于发现是bluz-utils的问题,按照其中有一个留言的提示,把intrepid里的bluez-utils包下载下来装上,就ok啦。

virtualbox连接usb设备

环境:Ubuntu 7.10 Gutsy, VirtualBox 1.5.6

网上虽然已经有很多介绍的文章了,但我还是遇到了一点小问题,别人好像没有说到。

首先就是得使用virtualbox的闭源版本,也就是非ose版本,如果你细心上virtualbox的开源、闭源版本区别页面去看看的话,可以清楚的看到ose版本是没有包含usb设备支持的,怪不得我的vb窗口右下角没有usb图标呢。

其次就是不用加什么usbfs组,只要在/etc/fstab中添加一句:

none /proc/bus/usb usbfs devgid=1002,devmode=664 0 0

其中1002用你机器上真实的vboxusers组的id替换,然后sudo mount -a就可以正常使用了。

参考

顺便再多说一句,virtualbox支持网络要想设置成桥接(结果是client就像局域网中正常的另外一台电脑一样)好像是麻烦了些,其实我觉得nat模式挺好挺够用的,虽然通讯上要麻烦一些,但client中的winxp就像是运行在一个“纯净”的网络环境当中一样,非常安全,杀毒软件什么的一概不用装,很好。

再补充

又遇波折,usb设备已经能够正常识别了,Nokia 6120c插上也能够被winxp识别出来,但pc套件就是找不到设备,到virtualbox的论坛上查了一下,发现很多人使用1.5以后的版本都是这样,降级(卸载再安装)到1.4就没事了。

降级之后默认1.5的虚拟机无法启动,根据错误提示删掉几行1.5添加的专用属性就可以了,比较简单:

Could not load the settings file '/home/fwolf/.VirtualBox/Machines/WinXP/WinXP.xml' (VERR_OPEN_FAILED).
FATAL ERROR: Unknown element 'Uart'
Location: '/home/fwolf/.VirtualBox/Machines/WinXP/WinXP.xml', line 45, column 15.

另外,还需要usb 2.0 ?? 找了一台usb 2.0接口的电脑试了还不行,没有办法了,关掉virtualbox,用vmware一连接就ok了,郁闷至极。

用obex连接Nokia 6120c

首先,把电话的控制权限赋予当前用户,通过dialout用户组,编辑/etc/udev/rules.d/40-permissions.rules文件,在最后添加上:

# NOKIA 6120
BUS=="usb", SYSFS{idVendor}=="0421", SYSFS{idProduct}=="002f", GROUP="dialout"

其中的0421和002f是手机设备的供应商和产品号,可以用lsusb看:

$ lsusb
Bus 005 Device 014: ID 0421:002f Nokia Mobile Phones 

然后将当前用户加入dialout组:

$ sudo adduser fwolf dialout

最后重启udev:

$ sudo /etc/init.d/udev restart

第二步,安装obex相关程序:

$ sudo aptitude install openobex-apps obexftp obextool

根据环境不同,可能还会要求装一些其他的包,比如bwidget, tablelist什么的。装好以后,启动obextool:

$ obextool --obexcmd "obexftp -t /dev/ttyACM0 -u 1"

等待一会儿,会提示错误:

It seems, that your device does not support the memory status feature.
Memory status will be disabled

/etc/obextools/obextool.cfg中找到下列内容:

###
### Enable memory status display - only works with Siemens :-(
###
set ObexConfig(config,memstatus) 1
# set ObexConfig(config,memstatus) 0

###
### Enable file move command - only works with Siemens :-(
###
set ObexConfig(config,filemove) 1
# set ObexConfig(config,filemove) 0

看到没有,这两项只对西门子有效,所以要把设置值改为0。上传文件的时候还有错误提示:

FIle '/path/to/upload/file' could not be uploaded to '/'!
Please check your file permissions.

还是在/etc/obextools/obextool.cfg中,有如下内容:

### Nokia 6670 requires the trailing slash on all directory names
# set ObexConfig(config,dir_slash) 1
set ObexConfig(config,dir_slash) 0

如果是Nokia手机,还是设置为0,但是。。。但是始终无法连接上手机,很不情愿的放弃了。参考:

闲话

又搜寻了很久,目前没有软件能在Linux下实现Nokia pc suite的全部功能,大部分都只解决了文件传送问题,二我所想要的却是电话本、短信、日历同步功能。

恼啊,Nokia的pc suite巨慢还不说,连Linux版也没有。又从网上找了很多参考以后,我决定搞一种自助、土点儿的通讯录同步方法(这个是最重要的,短信、日历没准儿也可以照葫芦画瓢一样搞定):

  1. 备份通讯录:打开名片夹->选项->全部标记->复制->至存储卡。
  2. 准备数据:用php写一个小程序,同步abook数据和存储卡中的vcf文件,usb数据通讯模式还是很好用的,同步的处理得智能一些,让手机和abook里的更新都有效。
  3. 恢复通讯录:打开名片夹->选项->复制->从存储卡。

短信输出使用MsgExport_v1.00汉化版,感觉还不错,剩下的就是需要正则表达式发威了。

为了Linux,BT可别没喽

看标题,Linux怎么能和BT扯上关系呢?并非因为这两个都是开源东东,而是,对日常拿linux作为桌面系统的使用者来说,BT真是越来越重要了。。。为什么捏?

现在用Linux免不了上网,上网就免不了下载东西,传统的下载无外呼http或者ftp方式,这两种方式基本上用wget都能搞定,除非文件比较大,而比较大的文件提供的更多下载方式是BT,包括我们喜爱的各种电影,应该说现在下载电影的主要方式就是BT了。所幸,Linux下的BT软件还是非常丰富的,那我们还担心什么呢?

说实话,我担心的是迅雷、脱兔之类的软件,今天在神话论坛下载电影的时候就发现,下载的链接是这样的:

下载 || 迅雷下载:【www.btmyth.com】先婚后友◎BT神话论坛◎神话.torrent (42.62 KB)

只有前面两个字“下载”点击是BT的种子,后面包括名称的一长串链接都是迅雷的下载链接,作为BT用户有一种“失落”感。还有很多软件下载站,提供的http或ftp下载链接根本不能用,然后再给一个迅雷的下载链接,简直就是逼良为娼,好在我很少上这种下载站。

迅雷、脱兔在国内占有很大市场,很多人也都喜欢用,在这里我不评论他们的好歹,但我知道他们都没有linux版,所以作为linux桌面用户,下载我还是只能用BT。至于emule/amule,一般下载站很少提供这样的链接,不讨论了,和BT性质类似,反正用mldonkey也都支持。

对了,现在还有个新出的什么scm烂格式,别说不兼容linux了,在windows下也不稳定,还没法转码,比avchd还难搞定。

假如没有了BT,大家都只提供迅雷或脱兔的下载链接,电影都是scm格式,Linux用户怎么办?像qq一样放弃么?

Linux下使用华为h3c Aolynk WuB320G无线网卡

我搜到的国内唯一的两篇参考文章(之所以说是唯一,是因为内容基本一致,大概是同一个人写的):

不过这位老大写得比较模糊,具体操作的时候还是费了不少周折。加上本本上的迅驰无线捣乱,由于本本比较老了,自带无线网卡是Intel PRO/Wireless 2100,只支持802.11b,好像还不支持WPA(WPA是2004年提出的,比本本的岁数小),所以在它身上也浪费了不少时间。

华为3com的Aolynk WUB320g usb无线网卡芯片组应该是Ralink(它的台湾分站)的RT73,虽然Ubuntu Gutsy自带了驱动,并且识别出了网卡,但注意,这个自带的驱动不好用,或者说没法用,仍然需要自己到http://rt2x00.serialmonkey.com/下载开源的驱动,编译使用。(编译前后,用iwpriv wlan0看列出的可用参数就知道这两个驱动的区别了)

编译需要内核相应的头文件,比如linux-headers-2.6.22-14-generic,解压后按照README文件的内容:

$ tar xzf rt73-cvs-daily.tar.gz
$ cd rt73-cvs-YYYYMMDDHH/Moduls
$ make
$ make install

就算编译安装完成了,手工挂载:modprobe rt73 ifname=wlan0,在/etc/modules中添加一句rt73,每次启动就能够自动挂载了。还可以在/etc/modprobe.d/blacklist中增加一句:blacklist rt73usb,禁用系统自带的驱动。

如果要和采用WPA-PSK认证方式的AP连接,还要修改一下/etc/network/interfaces文件,比如:

auto wlan0
iface wlan0 inet static
    address 192.168.0.13
    netmask 255.255.255.0
    gateway 192.168.0.1

    pre-up ifconfig wlan0 up
    pre-up ifconfig wlan0 down
    pre-up ifconfig wlan0 up
    pre-up iwconfig wlan0 essid "my_essid"
    pre-up iwconfig wlan0 mode Managed
    pre-up iwpriv wlan0 set AuthMode=WPAPSK
    pre-up iwpriv wlan0 set EncrypType=TKIP
    pre-up iwpriv wlan0 set WPAPSK="my_wpa_passphrase"
    pre-up ifconfig wlan0 up

这个设置是从WifiDocs/Driver/RalinkRT73抓过来的,大体意思知道,但为什么写成这个格式不是非常明白,不过这样的确就可以使用了 :-)。

配置无线连接还可以使用其它工具,比如wifi-radar,或者专门为Ralink开源驱动设计的RutilT也不错。

试着用两块Wub320g配置Ad-Hoc对等网,但失败了,配置如下(两端的配置是一样的):

auto wlan0
iface wlan0 inet static
    address 192.168.0.13
    netmask 255.255.255.0
    gateway 192.168.0.1

    pre-up ifconfig wlan0 up
    pre-up ifconfig wlan0 down
    pre-up ifconfig wlan0 up
    pre-up iwconfig wlan0 mode Ad-Hoc
    pre-up iwconfig wlan0 channel 2
    pre-up iwconfig wlan0 essid "fwolf_home"
    pre-up iwconfig wlan0 key 1234567890
    #pre-up iwpriv wlan0 set NetworkType=Adhoc
    #pre-up iwpriv wlan0 set AuthMode=OPEN
    #pre-up iwpriv wlan0 set EncrypType=NONE
    #pre-up iwpriv wlan0 set SSID="fwolf_home"
    # Break 802.11i's 11m/s limit
    #pre-up iwpriv wlan0 set AdhocOfdm=1
    pre-up ifconfig wlan0 up

注释中是另外一种方式,两种方式下网卡都能够连通,从iwconfig或者其它工具中都能看到已连接的状态,ifconfig也能看到发送和接收的流量,但两块网卡之间就是ping不通(属于同一网段)。把两端的机器都重启,偶尔能从还连接着局域网的机器上ping通另外一台只连接了无线网的机器,而反过来ping不通,提示:

Destination Host Unreachable

有时候还会提示:

ping: sendmsg: No buffer space available

对等网计划只好暂时搁浅,先找个AP用着。

最后总结,在为linux操作系统选购硬件时,一定要先上网看看相应的功能好不好配置,优先选择应用比较广泛、驱动比较开放、配置容易的产品。

参考

Update @ 2008-07-17

升级到Ubuntu 8.04 hardy之后,无线网卡又不干活了,虽然有人说hardy的默认驱动工作得很好,但在我这里不行,能识别出来,但up的时候出现错误:

SIOCIFFLAGS: invalid argument

查了一下确认是驱动有问题(与2.6.24内核),不过早有好心人提供了补丁,所以,只需按照如下步骤,就能让无线网卡复活了:

安装相应的内核header包:

sudo aptitude install linux-headers-`uname -r`

这里下载最新的rt73驱动,解压,编译,安装。如果编译时出现模块文件太大的提示:

!!! WARNING: Module file much too big (>1MB)
!!! Check your kernel settings or use 'strip'

可以strip一下再安装:

sudo strip -S rt73.ko
sudo make install

这样处理过的rt73.ko之后250k左右。

现在就可以卸载旧模块了,当然还要把他们都放到禁用模块列表(/etc/modprobe.d/blacklist)中,然后加载新的模块:

sudo ifconfig wlan0 down
sudo modprobe -r rt73usb
sudo modprobe -r rt2570
sudo modprobe -r rt2500usb
sudo modprobe -r rt2x00lib
sudo modprobe rt73

然后就。。。可以用啦:

ifconfig -a
sudo ifconfig wlan0 up

wpa认证还是使用上面原先介绍的方法即可。

另外,我弄完之后,没有wlan0,却有wlan2,也能正常工作,怎么把网卡的名字改过来捏?参考这里,编辑文件/etc/udev/rules.d/70-persistent-net.rules

# USB device 0x1472:0x0009 (rt73usb)
#SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0f:e2:39:b6:f2", ATTRS{type}=="1", NAME="wlan0"

# USB device 0x1472:0x0009 (rt73usb)
#SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="00:0f:e2:39:c0:ff", ATTRS{type}=="1", NAME="wlan1"

# USB device 0x1472:0x0009 (rt73usb)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0f:e2:39:b6:f9", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"

看见没,所有用过的网卡这里都记着呢,把原来没有用了的wlan0, wlan1都注释掉,最后一句改为wlan0,下次再重新插无线网卡的时候,就会被认为是wlan0了。

参考