2008-11-17-新寮瀑布
[生活] [電腦] [文章] [留言]

2007.03.28

有關 m0n0wall 隨便記

解開 m0n0wall 磁碟

一直沒有好好的去把 m0n0wall 網站上的資料研究一番,玩過一陣子 FreeBSD source 中的 PicoBSD ,直覺地猜 m0n0wall 應該也是把核心、程式打包好再放到 FreeBSD 的分割區中,當把它 mout 起來一看,果然沒錯。

假設 m0n0wall 是放在第二顆硬碟中,透過以下的步驟可以一探究竟,甚或自行修改 m0n0wall:

  • 將 m0n0wall 接在跑 FreeBSD 系統的第二顆硬碟的位置 (ad1)。
  • mount /dev/ad1a /mnt
  • ls -la /mnt 應該可以看到底下的內容:
    • boot
    • conf
    • kernel.gz
    • mfsroot.gz
  • conf 目錄中有一個檔案,那就是我們設定 m0n0wall 後儲存設定值的檔案,要備份的也是該檔案。而 kernel.gz 則是壓縮過的 FreeBSD 系統核心。mfsroot.gz 就是整個 m0n0wall 的靈魂,這個檔案其實是一個精簡過的 FreeBSD ISO 檔(去掉 boot 和 kernel 了),所以我們將它解壓縮以後,可以利用 mdconfig 來產生一個 vnode ,再將該虛擬的磁碟 mout 起來看內容。

  • 將 mfsroot.tgz 複製到 /home 中,執行
    • cp /mnt/mfsroot.tgz /home
    • cd /home
    • gunzip mfsroot.gz
    • mdconfig -a -t vnode -u 0 -f mfsroot
    • mkdir m0n0
    • mount /dev/md0 /home/m0n0
  • 經過前述的操作,/home/m0n0 中的內容就是 m0n0wall 啟動後,根目錄中會瞧見的樣子。那些我們在 Web 界面上看到的那些用 PHP 寫的管理程式都好好的躺在 /home/m0n0/user/local/www 中等著我們去研究。
  • 如果要將檔案再重新打包,就執行底下的指令
    • cd /home
    • umount /home/m0n0
    • mdconfig -d -u 0
    • gzip mfsroot
  • 最後再將 mfsroot.gz 覆蓋掉 /mnt 中的那個,並 umount /mnt 即可測試修改的結果。
    • cp /home/mfsroot.gz /mnt/
    • umount /mnt

在 m0n0wall WebGUI 設定開放外面連內部主機

我以開放 172.17.1.4 的 telnet (TCP port 23) 來說明,方法應該可以套用在任何服務的 ports

要開放外面的機器可以連到內部電腦的某個 port ,要處理兩部份:

  • NAT : 將 m0n0 上的某個(些) ports 對應(map) 到內部主機的 ports
  • Firewall : 設定完 NAT 的對應關係後,如果沒有開放也是枉然,所以要在防火牆規則上設定開放前述的 ports

假設我內部的電腦

  • IP 為 172.17.1.4
  • 要開放連線的 port 為 TCP 23

NAT 對應設定

  • 進入防火牆管理的 "NAT 轉址"
  • 點選 "Inbound" (也就是針對內部網卡的)
  • 按 (+) 來新增規則
  • 然後依下面的設定來讓防火牆上的 TCP port 23 對應到 172.17.1.4 的 TCP port 23
    • Interface : WAN
    • External address : Interface address
    • Protocol : TCP (依自己需要設定)
    • External port range : from 23 (依自己需要設定)
    • NAT IP : 172.17.1.4 (依自己需要設定)
    • Local port : 23 (開放 172.17.1.4 的 port 23)
    • Description : 說明,可輸可不輸,例如:防火牆 TCP 23 → 172.17.1.4 TCP 23
  • 勾選 "Auto-add a firewall rule to permit traffic through this NAT rule",這個選項如果勾選了,m0n0 會自動幫我們在防火牆規則中新一條放行的規則並套用,如果在儲存時沒選,只好自己按後面 2 的部份來手動新增囉!

都設定好了就按 "Save" 鈕儲存規則

回到規則清單後,按 "Apply changes" 就可以套用剛剛設好的規則

Firewall 規則設定

  • 進入防火牆管理的 "規則設定"
  • 點選 "WAN"
  • 按 (+) 來新增規則
  • 然後依下面的設定來開放 172.17.1.4 TCP port 23
    • Action : Pass
    • Disabled : 不選
    • Interface : WAN
    • Protocol : TCP (如果要開放的是 UDP ,記得要換)
    • ICMP type : 不選
    • Source : Any
    • Source port range : 不輸入 (代表 any 的意思)
    • ------以上都是預設值,下面的是重頭戲
    • Destination :
      • Type 選 "Single host or alias"
      • Address 輸入要開放連線的 IP 172.17.1.4
    • Destination port range : from 輸入 23 (依自己需求設定,如果只開放單一 port ,to 就保持空白)
    • Fragments : 不選
    • Log : 不選
    • Description : 說明,可自行輸入或不輸入,例如:開放大雄 FreeBSD 的 Telnet

都設定好了就按 "Save" 鈕儲存規則

回到規則清單後,按 "Apply changes" 就可以套用剛剛設好的規則

 

雜記

下面是一些東西先記下:

  • m0n0wall 的管理程式是用 PHP 寫的,它是以 CGI 的方式呼叫的,所以,必須在檔案的開頭第一行放下面這行
    • #!/usr/local/bin/php
    • 另外,為了讓 PHP 程式可以跑,檔案的權限必須是 755 (讓它具有 x 的權限才可以執行),不然,會發生 500 的錯誤訊息。
  • 管理程式的一些檔案
    • fbegin.inc : 管理程式網頁的檔頭及選單的輸出。如果將管理程式中文化(Big5),這個檔案中的 charset 就要記得改為 big5 ,才不會讓使用者一直要自己更改網頁瀏覽器的編碼方式。
    • fend.inc : 網頁的檔尾
  • m0n0wall 中有個 exec.php 的程式可以執行指令,並輸出指令執行的結果在畫面上,它也提供下載和上傳檔案的功能,在測試階段可以用這種方式來立即測試修改的結果。不過,因為這此修改過的東西並不真正的儲存在磁碟機中,而是存在記憶體裡,所以重新開機後就會消失而需重來,真的要永久儲存就要參考前面解開 mfsroot.gz 的方法。另外,exec.php 執行時的路徑是 /usr/local/www ,不相信,執行 ls 和 ls -la / 看各是什麼結果 。如果使用 Upload 的功能,檔會上傳後會暫存在 /tmp 中,放到 /usr/local/www 中才可以用 web URL 來存取並執行。

雄的家》.很高興能與您在網路上結緣,歡迎批評指教。