Monday, February 15, 2010

让Android手机通过USB数据线共享电脑网络 (Linux版)

中国移不动的流量费向来是奇贵无比 (还有极大的地域差别, 浙江移动10元是200M, 而四川只有70M), Android手机更是用起流量来刷刷刷的, 要是一直保持网络连接, 一会儿就同步点联系人、Calendar、Gmail, 一会儿又检查下有没有软件更新, 我也曾经有过因此而超支到100多元的惨痛经历. 虽说现在每个月有100M的流量可以使用, 但还是有点不够用, 我觉得最理想的是能够借助电脑的网络上网. 也许有人会觉得这样有点多余, 既然有电脑, 干嘛还非得用手机上网, 其实这也因人而异, 有些时候确实会很有帮助. 试想你一边使用电脑, 再一边用手机听着豆瓣电台是怎样的感觉.

现在手机借助有线网络上网一般有以下几种方法:

  • 通过无线路由器+Wi-Fi上网, 这是最方便的一种方法, 但也是经济成本最高的一种.
  • 通过笔记本电脑的无线网卡建立ad hoc网络, 再使用Wi-Fi连接上网. 这种方法我曾经在Window$ XP里试过, 有点复杂, 且最终以失败告终... 不过据@coolwdp同学说在Win7下很方便.
  • 通过USB数据线将手机与电脑相连, 再分别在电脑和手机上虚拟出一个网络接口用于网络通信, 这很类似于VPN与虚拟机上网的原理. 今天将要介绍的就是这种方法, 好处是不论台式还是笔记本都适用, 只要有USB接口. 机锋网上有一篇针对Window$系统的介绍帖, 使用Window$的同学可以参考参考, 这里的介绍仅仅面向使用Linux的同学.

下面是详细步骤, 初看会有点复杂, 但只要理解了原理还是很简单的.

  1. 按照我以前的文章[在Ubuntu中配置可供Windows主机共享上网的VPN服务器]中介绍的方法设置电脑的IP转发及NAT.

  2. 用USB数据线连接手机与电脑, 上一篇文章介绍的CM ROM提供了"Internet tethering" (tethering是使电脑通过手机上网的意思, 和我们今天介绍的目的刚刚相反) 功能, 在"Settings->Wireless controls"中. 如果你的手机提供有"Internet tethering"功能, 将它开启. 为什么需要这么一步呢? 我们并不是想要借助手机网络来让电脑上网, 仅仅是为了利用它来建立虚拟的网络接口. 当开启"Internet tethering"后, 分别在电脑和手机上输入"ifconfig"与"busybox ifconfig", 你会发现两边都有一个叫做"usb0"的网络接口, 且IP地址都是一个网段, 如"192.168.77.X", 两边也可以互相ping通. 这就是"Internet tethering"虚拟出来的网络接口, 我们后面全部需要靠这个接口来与电脑通信.

  3. 虽然现在手机和电脑已经可以互相ping通, 但手机还无法访问外网, 这就需要设置一下手机上的路由表. 方法很简单, 只需要将默认路由的网关设置为电脑上"usb0"接口的IP地址就可以了, 比如这个IP地址为"192.168.77.100", 则在手机终端中输入以下命令:
    # busybox route add default gw 192.168.77.100 dev usb0
    
    现在再试试ping一下"g.cn"的IP地址: 203.208.39.104, 通了的话就证明已经可以访问外网.
  4. 光能通过IP地址访问外网还不够, 需要再将DNS设置好, 同样在手机终端中输入命令:
    # setprop net.dns1 8.8.8.8
    
    感谢万能的Google大神提供了这个万能地址, 现在应该可以直接ping通"g.cn"这个网址.
  5. 其实到现在为止, 基本的配置已经完成, 你已经能够享受电脑网络而丝毫不用考虑流量这回事了. 但当你关闭"Internet tetering"之后, 刚才所有的配置又会还原, 也就是说下次还需要输入以上两行命令, 这样就太麻烦了一点. 这里推荐使用GScript软件将以上命令保存为脚本文件, 当需要设置的时候就直接运行脚本, 脚本配置如下图:

    GScript

    这样每次的步骤就变成了开启"Internet tetering", 然后运行脚本. 可能是GScript本身软件的问题, 有时脚本需要多运行几次才行.

  6. 最后需要注意的一点就是某些Google服务 (如Google Talk) 必须在打开手机网络的情况下才能使用, 即使你已经可以通过电脑访问外网. 并不用担心打开手机网络会消耗流量, 那只是一个假象, 真正的网络通信全部都是通过电脑网络来实现的, 你可以仔细观察状态栏上的手机网络图标的箭头并不会闪动.

参考资料: 【更新】让G1通过usb共享电脑的网络,更新简单详细教程, [android-freerunner] Share internet connection through USB.

3 comments:

  1. 很好的方法, 可是兩邊IP都設同一群了還是 PING 不到, 奇怪了..
    我是用 ubuntu 10.10 + android 2.1

    ReplyDelete
  2. @Dannis Home
    有usb0了吧? 具体情况是什么呢?

    ReplyDelete
  3. 你好,我到了第四步,通过adb连接电脑后,在手机的shell里ping g.cn,能ping通,但是手机的浏览器上不了网,是怎么回事?

    ReplyDelete