攻略:把FON刷dd-wrt让路由器支持pptp Pass-through

我今天解决了一个问题:FON路由器不支持PPTP的VPN,我把FON路由器刷成DD-WRT的操作系统,这样就能让我的IPod Touch和笔记本电脑能经过FON无线路由器用PPTP的VPN登录国外网站了。这篇冗长的文章就是要记录这个过程,希望能帮助到遇到同类问题的人。

起因:

  1. 我买了一个苹果的iPod touch ,安装了一些软件,如twitter客户端和facebook客户端,但这些网站在中国被屏蔽,我需要在touch上启用PPTP的VPN才能正常使用这些软件。
  2. 正好见到 @chinavpn 在twitter上叫卖VPN服务,才100元一年,我用paypal向他支付了15美元,他给了我一个PPTP方式登录的VPN
  3. 但是,我无法从iPod touch里登录VPN,也无法在电脑上登录,但我经过测试,用联通3G的网卡上网时,PPTP的VPN能够登录成功,怀疑是中国电信的ADSL屏蔽了PPTP
  4. 有推友@rse43 提醒我:“有必要确认一下是不是电信屏蔽PPTP,很多时候是你的路由设备不支持 PPTP Passthrough造成的问题。” 我觉得 @rse43 不是故意在说废话,我于是查了PPTP Passthrough是什么,找到一个知识点:“VPN Pass-through 所指的应该是设备能够识别由内网工作站发起的,到外网VPN SERVER的VPN类型的数据。由于VPN数据是经过加密和处理的,不同于普通的网络访问数据。设备若不具备识别此类型数据的能力,有可能将VPN数据作为损坏的数据丢弃,导致VPN建立失败。
  5. 我于是可FON的相关资料,没有任何中文或英文资料提到FON是否支持 PPTP Passthrough,我查到DD-WRT的开源的路由器是肯定支持PPTP Passthrough的,于是我有了想把FON路由器刷BIOS为DD-WRT操作系统的想法。

知识背景:

  1. FON路由器是一个免费获取到的路由器,07年的网志年会和08年的网志年会上都得到FON的赞助,07年提供的是:La Fonera 型号是FON2100D,图片在 http://wiki.fon.com/wiki/La_Fonera , 08年提供的是升级版本 La Fonera+ 型号是FON2201,图片在 http://wiki.fon.com/wiki/La_Fonera+ FON LaFonera 2100 的 chipset是 Atheros AR531X,RAM是16MB,Flash是 8MB.
  2. FON是一个路由器社区,这个社区里有三种用户:Linus, Bills 和 Aliens,拿到FON路由器的人可以是Linus或Bills ,前者会像LINUS一样免费分享网络给别人用,后者会像BILL GATES一样挣到钱,当Aliens(外星人)找到一个不免费的FON节点时会付费上网,bills会分到50%的钱。当然,bills和Linus在全世界漫游时,遇到FON节点都是不需要付费的。这就是FON的商业模式,具体介绍在这里。FON的用户可以在查找节点的时候发现中国湖南省长沙地区宁乡县煤炭镇有一个FON节点,我以后去国外旅行也找到FON节点也不需要额外付费了。不过,我去香港没能成功进入FON网络,虽然他们用了FON的名字。谁知道原因?
  3. 网上有很多hack FON路由器的资料,似乎都是针对FON2100的,需要先按reset键將fon的firmware还原到0.7.1 r1,而FON2200的firmware都1.1.2了,看来无法刷firmware为DD-WRT。我查了FON的WIKI才知道,La Fonera(fon2100)按reset键需要在15秒到20秒内松手,而La Fonera+ (fon2200)是30秒到60秒内松手,我开始按30秒总没还原成功,浪费我不少时间。

我的工作流程:

  1. 我没有WINDOWS操作系统,用的是MAC OS X操作系统,内置了终端,可用SSH 代理PUTTY.EXE
  2. http://coolfire.fetag.org/?p=491 提供了做这个实验所需要的所有文件 http://download.fetag.net/Others/FON-DD-WRT-24.zip
  3. 通过开启“系统偏好设置”=》“Internet 与无线”=》“共享”=》“WEB共享”来代替WINDOWS下的HFS,
  4. Mac OS X下的tftpd的配置和启动非常麻烦,直接用这个 http://ww2.unime.it/flr/tftpserver/TftpServer.dmg 代替了tftpd ,把linux.bin 复制到 /private/tftpboot 再启动 Tftpserver.dmg里的程序就OK
  5. 到这里 http://www.dd-wrt.com/site/support/router-database 搜索fon就可以找到Fon LaFonera 2100的固件,然后找到fonera-firmware.bin 这个 Webflash image,用于通过web界面更新firmware.

原文打不开,在网页快照里找到了,我就是用上面的替代产品一步一步按提示完成下面的实验,真的是实验,一个字都不差:)

接著就來說說改 dd-wrt 韌體的方法吧,基本上網路上有一堆教學,不論是國外的論壇、或是國內的網友自己的心得,多到我實在是不知道怎麼去刷成 dd-wrt。後來剛好看到一個網站 http:/la-fon.blogspot.com 上面的一篇說明(英文),便照著說明一步一步做下來,耶~竟然成功了呢~

所以我就來紀錄一下我的步驟囉:

  1. 先下載兩個檔案:
    1. openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma
    2. out.hex
    3. DD-WRT 的 Image 檔案:linux.bin
      (可以上 dd-wrt 找看看有沒有更新的版本,連結裡的是我使用的版本)
  2. 再來要準備的工具如下:
    • PuTTY(或是 PieTTY):用來做 ssh 連線用的工具。
    • telnet:用來做 telnet 連線用的工具,可用 windows 內建的 telnet 指令,或是直接用 putty/pietty 也可以。
    • tftpd:用來做 tftp 服務的 server
      (第一步驟的第三個檔案請跟 tftpd 的目錄放在一塊)
    • HFS: 作為檔案傳輸時的 server
      (第一步驟的第一、第二個檔案請在 HFS 第一次執行後,在檔案上按右鍵選擇 Add to HFS)
  3. 要改機前,得先把 fon 的 ssh port 給打開,我的機器 fon 韌體版本為 0.7.1 r1,所以簡單的以兩個檔案來將 ssh port 打開即可:
    1. 先將本機電腦的區域網路設定為 ip=169.254.255.2 / mask=255.255.0.0,其餘不用設定。
    2. 將下列內容複製起來,存為 open-ssh-step1.html

      <html>

      <head><title>Open SSH – Step 1</title></head>

      <body>

      <form method=”post” action=”http://169.254.255.1/cgi-bin/webif/connection.sh” enctype=”multipart/form-data”>

      <input name=”username” value=”$(/usr/sbin/iptables -I INPUT 1 -p tcp –dport 22 -j ACCEPT)” size=”68″ >

      <input type=”submit” name=”submit” value=”Submit” onClick=”{this.form.wifimode.value='”;’ + this.form.wifimode.value +’;”‘}” />

      </form>

      </body>

      </html>

    3. 再將下列內容複製起來,存成 open-ssh-step2.html

      <html>

      <head><title>Open SSH – Step 2</title></head>

      <body>

      <form method=”post” action=”http://169.254.255.1/cgi-bin/webif/connection.sh” enctype=”multipart/form-data”>

      <input name=”username” value=”$(/etc/init.d/dropbear)” size=”68″ >

      <input type=”submit” name=”submit” value=”Submit” onClick=”{this.form.wifimode.value='”;’ + this.form.wifimode.value +’;”‘}” />

      </form>

      </body>

      </html>

    4. 在本機電腦上執行 open-ssh-step1.html,按下 submit 按鈕後,會跳出視窗要輸入帳號密碼,請輸入帳號 admin 以及密碼 admin。
    5. 接著執行 open-ssh-step2.html,也是一樣按下 submit 按鈕後,等到瀏覽器出現 fon 的管理視窗即可。
    6. 執行 PuTTY/PieTTY,連線到 169.254.255.1,輸入帳號 root 以及密碼  admin。
    7. 將 /etc/firewall.user 的第 22、23 行註解拿掉
      # vi /etc/firewall.user
    8. 把 fon 的 sshd 設定為開機即啟動
      # cd /etc/init.d
      # mv dropbear S50dropbear
    9. 重新設定密碼以及同步一下
      # passwd
      # sync
    10. 將 fon 重開後就再也不會自動去升級韌體了。
  4. 確認你的電腦的區域網路的 ip=169.254.255.2 / mask=255.255.0.0 / gateway=169.254.255.1(這個不設定也沒關係)
  5. 啟動 HFS(預設 port 為 8080),並記得將 openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma 以及 out.hex 加入 HFS 中。
  6. 如果你還連在 ssh console 中,那就接著做下列的步驟:
    > cd /tmp
    > wget http://169.254.255.2:8080/openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma
    > mtd -e vmlinux.bin.l7 write openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma vmlinux.bin.l7
    > reboot
  7. 等待 fon 重新開機後,大約一、兩分鐘,再以 putty/pietty 連入 169.254.255.1 並執行下列指令:
    > cd /tmp
    > wget http://169.254.255.2:8080/out.hex
    > mtd -e “RedBoot config” write out.hex “RedBoot config”
    > reboot
  8. 等待 fon 重新開機後,將您的電腦區域網路的 ip 改為 192.168.1.166(或是任何一個皆可,不要是 192.168.1.254 就行了),遮罩為 255.255.255.0
  9. 啟動 tftpd,並請記得將 linux.bin 與 tftpd 執行程式放在同一個目錄中。
  10. 以 telnet command 或是 putty/pietty 連入 192.168.1.254,port=9000。
    C:\>telnet 192.168.1.254 9000
  11. 按下 Enter 會出現提示符號
    RedBoot>
  12. 接著請依照黃底粗體黑字來輸入:
    RedBoot> ip_address -l 192.168.1.254/24 -h 192.168.1.166
    IP: 192.168.1.254/255.255.255.0, Gateway: 0.0.0.0
    Default server: 192.168.1.166
    RedBoot> fis init
    About to initialize [format] FLASH image system – continue (y/n)? y
    *** Initialize FLASH Image System
    … Erase from 0xa87e0000-0xa87f0000: .
    … Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
    RedBoot> load -r -b 0x80041000 linux.bin
    Using default protocol (TFTP)
    Raw file loaded 0x80041000-0x806a0fff, assumed entry at 0x80041000
    RedBoot> fis create linux
  13. 接下來會等個十多分鐘,可能更久。
    如果在 load -r -b 0x80041000 linux.bin 之後等了很久,那可能是你忘了啟動 tftpd,如果是這樣,那得退出 telnet 視窗,重新來過。
  14. 十幾分鐘後會看到如下畫面:
    … Erase from 0xa8030000-0xa8690000: …………………………………………………………………………………………
    … Program from 0x80041000-0x806a1000 at 0xa8030000: …………………………………………………………………………………………
    … Erase from 0xa87e0000-0xa87f0000: .
    … Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
    RedBoot> fconfig
    Run script at boot: true
    Boot script:
    .. fis load -l vmlinux.bin.l7
    .. exec
    Enter script, terminate with empty line
    >> fis load -l linux
    >> exec
    >>
    Boot script timeout (1000ms resolution): 10
    Use BOOTP for network configuration: false
    Gateway IP address:
    Local IP address: 192.168.1.254
    Local IP address mask: 255.255.255.0
    Default server IP address:
    Console baud rate: 9600
    GDB connection port: 9000
    Force console for special debug messages: false
    Network debug at boot time: false
    Update RedBoot non-volatile configuration – continue (y/n)? y
    … Erase from 0xa87e0000-0xa87f0000: .
    … Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
    RedBoot> reset
  15. 完成上述露露等的步驟後,就可以從區域網路透過有線連到 http://169.254.255.1 進入 dd-wrt 介面管理囉,請記得先修改登入的帳號以及密碼唷。
  16. 別忘了順便更改一下無線基地台的設定,預設 SSID 名稱是 dd-wrt 並且是沒有設定安全性的。

完成了這一些設定,就可以好好的享受 fon + dd-wrt 所帶來的強大無線基地台的功能囉~~~雖然這有違當初 fon 創辦人的精神 >_<

我的操作记录,黄背景的文字为输入

zolamatoMacBook-Air:~ zola$ ssh [email protected]
[email protected]’s password:
BusyBox v1.1.3 (2006.11.21-19:49+0000) Built-in shell (ash)
Enter ‘help’ for a list of built-in commands.
_______  _______  _______
|   ____||       ||   _   |
|   ____||   –   ||  | |  |
|   |    |_______||__| |__|
|___|
Fonera Firmware (Version 0.7.1 rev 1) ————-
*
* Based on OpenWrt – http://openwrt.org
* Powered by FON – http://www.fon.com
—————————————————
root@OpenWrt:~# vi /etc/firewall.user
iptables -F forwarding_rule
iptables -t nat -F prerouting_rule
iptables -t nat -F postrouting_rule

### BIG FAT DISCLAIMER
## The “-i $WAN” is used to match packets that come in via the $WAN interface.
## it WILL NOT MATCH packets sent from the $WAN ip address — you won’t be able
## to see the effects from within the LAN.

### Open port to WAN
## — This allows port 22 to be answered by (dropbear on) the router
iptables -t nat -A prerouting_rule -i $WAN -p tcp –dport 22 -j ACCEPT
iptables        -A input_rule      -i $WAN -p tcp –dport 22 -j ACCEPT

### Port forwarding
## — This forwards port 8080 on the WAN to port 80 on 192.168.1.2
# iptables -t nat -A prerouting_rule -i $WAN -p tcp –dport 8080 -j DNAT –to 19
# iptables        -A forwarding_rule -i $WAN -p tcp –dport 80 -d 192.168.1.2 -j

### DMZ
## — Connections to ports not handled above will be forwarded to 192.168.1.2
# iptables -t nat -A prerouting_rule -i $WAN -j DNAT –to 192.168.1.2
# iptables        -A forwarding_rule -i $WAN -d 192.168.1.2 -j ACCEPT
– /etc/firewall.user [modified] 23/33 69%
iptables -F forwarding_rule
iptables -t nat -F prerouting_rule
iptables -t nat -F postrouting_rule

### BIG FAT DISCLAIMER
## The “-i $WAN” is used to match packets that come in via the $WAN interface.
## it WILL NOT MATCH packets sent from the $WAN ip address — you won’t be able
## to see the effects from within the LAN.

### Open port to WAN
## — This allows port 22 to be answered by (dropbear on) the router
iptables -t nat -A prerouting_rule -i $WAN -p tcp –dport 22 -j ACCEPT
iptables        -A input_rule      -i $WAN -p tcp –dport 22 -j ACCEPT

### Port forwarding
## — This forwards port 8080 on the WAN to port 80 on 192.168.1.2
# iptables -t nat -A prerouting_rule -i $WAN -p tcp –dport 8080 -j DNAT –to 19
# iptables        -A forwarding_rule -i $WAN -p tcp –dport 80 -d 192.168.1.2 -j

### DMZ
## — Connections to ports not handled above will be forwarded to 192.168.1.2
# iptables -t nat -A prerouting_rule -i $WAN -j DNAT –to 192.168.1.2
# iptables        -A forwarding_rule -i $WAN -d 192.168.1.2 -j ACCEPT
– /etc/firewall.user [modified] 23/33 69%
iptables -F forwarding_rule
iptables -t nat -F prerouting_rule
iptables -t nat -F postrouting_rule

### BIG FAT DISCLAIMER
## The “-i $WAN” is used to match packets that come in via the $WAN interface.
## it WILL NOT MATCH packets sent from the $WAN ip address — you won’t be able
## to see the effects from within the LAN.

### Open port to WAN
## — This allows port 22 to be answered by (dropbear on) the router
iptables -t nat -A prerouting_rule -i $WAN -p tcp –dport 22 -j ACCEPT
iptables        -A input_rule      -i $WAN -p tcp –dport 22 -j ACCEPT

### Port forwarding
## — This forwards port 8080 on the WAN to port 80 on 192.168.1.2
# iptables -t nat -A prerouting_rule -i $WAN -p tcp –dport 8080 -j DNAT –to 19
# iptables        -A forwarding_rule -i $WAN -p tcp –dport 80 -d 192.168.1.2 -j

### DMZ
## — Connections to ports not handled above will be forwarded to 192.168.1.2
# iptables -t nat -A prerouting_rule -i $WAN -j DNAT –to 192.168.1.2
# iptables        -A forwarding_rule -i $WAN -d 192.168.1.2 -j ACCEPT
root@OpenWrt:~# cd /etc/init.d
root@OpenWrt:/etc/init.d# ls
N10conncheck   S20madwifi     S50qos         S65watchdog
N40thinclient  S40network     S50telnet      boot
N45ntpclient   S45firewall    S60cron        dropbear
N50chillispot  S50httpd       S60redirect    rcS
root@OpenWrt:/etc/init.d# mv dropbear S50dropbear
root@OpenWrt:/etc/init.d# ls
N10conncheck   S20madwifi     S50httpd       S60redirect
N40thinclient  S40network     S50qos         S65watchdog
N45ntpclient   S45firewall    S50telnet      boot
N50chillispot  S50dropbear    S60cron        rcS
root@OpenWrt:/etc/init.d# passwd
Changing password for root
Enter the new password (minimum of 5 characters)
Please use a combination of upper and lower case letters and numbers.
Enter new password:
Re-enter new password:
Password changed.
root@OpenWrt:/etc/init.d# sync
root@OpenWrt:/etc/init.d# exit
Connection to 169.254.255.1 closed.
zolamatoMacBook-Air:~ zola$ ssh [email protected]
[email protected]’s password:
BusyBox v1.1.3 (2006.11.21-19:49+0000) Built-in shell (ash)
Enter ‘help’ for a list of built-in commands.
_______  _______  _______
|   ____||       ||   _   |
|   ____||   –   ||  | |  |
|   |    |_______||__| |__|
|___|
Fonera Firmware (Version 0.7.1 rev 1) ————-
*
* Based on OpenWrt – http://openwrt.org
* Powered by FON – http://www.fon.com
—————————————————
root@OpenWrt:~# cd /tmp
root@OpenWrt:~# ls
dhcp.leases     log             resolv.conf     spool
hostapd.conf    network-config  run
root@OpenWrt:~# wget http://169.254.95.148/~zola/openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma
Connecting to 169.254.95.148[169.254.95.148]:80
openwrt-ar531x-2.4-v 100% |*****************************|   512 KB    00:00 ETA
root@OpenWrt:~# mtd -e vmlinux.bin.l7 write openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma vmlinux.bin.l7
Unlocking vmlinux.bin.l7 …
Erasing vmlinux.bin.l7 …
Writing from openwrt-ar531x-2.4-vmlinux-CAMICIA.lzma to vmlinux.bin.l7 …  [w]
root@OpenWrt:~# reboot
root@OpenWrt:~# Connection to 169.254.255.1 closed by remote host.
Connection to 169.254.255.1 closed.
zolamatoMacBook-Air:~ zola$ ssh [email protected]
[email protected]’s password:
BusyBox v1.1.3 (2006.11.21-19:49+0000) Built-in shell (ash)
Enter ‘help’ for a list of built-in commands.
_______  _______  _______
|   ____||       ||   _   |
|   ____||   –   ||  | |  |
|   |    |_______||__| |__|
|___|
Fonera Firmware (Version 0.7.1 rev 1) ————-
*
* Based on OpenWrt – http://openwrt.org
* Powered by FON – http://www.fon.com
—————————————————
root@OpenWrt:~# cd /tmp
root@OpenWrt:~# wget http://169.254.95.148/~zola/out.hex
Connecting to 169.254.95.148[169.254.95.148]:80
out.hex              100% |*****************************|  4096       00:00 ETA
root@OpenWrt:~# mtd -e “RedBoot config” write out.hex “RedBoot config”
Unlocking RedBoot config …
Erasing RedBoot config …
Writing from out.hex to RedBoot config …  [w]
root@OpenWrt:~# reboot
root@OpenWrt:~# Connection to 169.254.255.1 closed by remote host.
Connection to 169.254.255.1 closed.
zolamatoMacBook-Air:~ zola$ telnet 192.168.1.254 9000
Trying 192.168.1.254…
Connected to 192.168.1.254.
Escape character is ‘^]’.
RedBoot> ip_address -l 192.168.1.254/24 -h 192.168.1.166
IP: 192.168.1.254/255.255.255.0, Gateway: 0.0.0.0
Default server: 192.168.1.166
RedBoot> fis init
About to initialize [format] FLASH image system – continue (y/n)? y
*** Initialize FLASH Image System
… Erase from 0xa87e0000-0xa87f0000: .
… Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot> load -r -b 0x80041000 linux.bin
Using default protocol (TFTP)
Raw file loaded 0x80041000-0x80662fff, assumed entry at 0x80041000
RedBoot> fis create linux
… Erase from 0xa8030000-0xa8652000:………………………………………………………………………………………
… Program from 0x80041000-0x80663000 at0xa8030000:………………………………………………………………………………………
… Erase from 0xa87e0000-0xa87f0000: .
… Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot> fconfig
Run script at boot: true
Boot script:
.. fis load -l vmlinux.bin.l7
.. exec
Enter script, terminate with empty line
>> fis load -l linux
>> exec
>>
Boot script timeout (1000ms resolution): 10
Use BOOTP for network configuration: false
Gateway IP address:
Local IP address: 192.168.1.254
Local IP address mask: 255.255.255.0
Default server IP address:
Console baud rate: 9600
GDB connection port: 9000
Force console for special debug messages: false
Network debug at boot time: false
Update RedBoot non-volatile configuration – continue (y/n)? y
… Erase from 0xa87e0000-0xa87f0000: .
… Program from 0x80ff0000-0x81000000 at 0xa87e0000: .
RedBoot> reset

做完上面的实验,把路由器换上,登录WEB控制界面,发现DD-WRT的控制界面有允许PPTP、L2PP的pass through选项,把ADSL密码写入,保存。然后在苹果电脑上测试PPTP的VPN,连接成功,十多个小时的努力没有白费,问题解决。然后在iPod touch上测试,也通过,成功的看到了VPN字样,也登录上facebook了,欣喜之余,再花两小时写篇日志记录一下。

6 thoughts on “攻略:把FON刷dd-wrt让路由器支持pptp Pass-through”

  1. Pingback: Fonero
  2. Pingback: Fonero
  3. Pingback: 喧哗的边际

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据