顯示文章

這裡允許您檢視這個會員的所有文章。請注意, 您只能看見您有權限閱讀的文章。


主題 - kenduest

頁: [1]
2

版上似乎有幾篇有談到 ZFS 這個檔案系統,網路上介紹也不少。去年有活動就是談到 ZFS 部份,不過沒出席所以沒了解到 ZFS 的一些內容。上次 2009 群英會有個場次有提到 OpenSolaris 的一些新功能,裡面談到 VM 的技術部份剛好也提到 ZFS,所以感覺 ZFS 很神奇。剛好昨天花了一點時間檢測測試玩玩,當作簡單的心得報告。如有錯誤地方請還多指正。

不過這篇測試我是 Linux 下使用的,主要透過 Filesystem in userspace (FUSE) 下的 ZFS 的支援達成該功能,所以就算是目前 ZFS 授權模式不相容於 Linux Kernel 本身的 GPL 授權要求下還是可以拿來用。那... 要使用哪個 Linux 版本呢?我想手上本身挑自己的 Mandriva cooker 機器,用 Cooker 好處就是每次都可以用最新的程式套件,畢竟是一個發展用的版本所以測新的程式軟體就很方便...

先使用 urpmi 安裝上 zfs-fuse 套件後即可使用,該套件安裝好後使用 rpm -ql 檢視可以看到一些檔案清單:

代碼: [選擇]
/etc/bash_completion.d/zfs-fuse
/etc/rc.d/init.d/zfs-fuse
/usr/sbin/zdb
/usr/sbin/zfs
/usr/sbin/zfs-fuse
/usr/sbin/zpool
/usr/sbin/ztest
/usr/share/doc/zfs-fuse
/usr/share/doc/zfs-fuse/BUGS
/usr/share/doc/zfs-fuse/CHANGES
/usr/share/doc/zfs-fuse/HACKING
/usr/share/doc/zfs-fuse/INSTALL
/usr/share/doc/zfs-fuse/LICENSE
/usr/share/doc/zfs-fuse/README
/usr/share/doc/zfs-fuse/STATUS
/usr/share/doc/zfs-fuse/TESTING
/usr/share/doc/zfs-fuse/TODO
/usr/share/man/man1/zdb.1.lzma
/usr/share/man/man1/zfs.1.lzma
/usr/share/man/man1/zpool.1.lzma

先執行啟動 /etc/init.d/zfs-fuse 這個服務才可以開始使用 zfs 的相關支援。而該服務啟動後,可以看到系統一個名稱為 zfs-fuse 的 daemon 正在運作。然後跑一下 zfs 提供的兩個主要大命令,zpool 與 zfs 這兩個程式看一下輸出:

代碼: [選擇]
zpool
    missing command
    usage: zpool command args ...
    where 'command' is one of the following:

    create [-fn] [-o property=value] ...
    [-O file-system-property=value] ...
    [-m mountpoint] [-R root]
    ...
    destroy [-f]

    add [-fn]
    ...
    remove
    ...

    list [-H] [-o property[,...]] [pool] ...
    iostat [-v] [pool] ... [interval [count]]
    status [-vx] [pool] ...

    online
    ...
    offline [-t]
    ...
    clear
    [device]

    attach [-f]

    detach

    replace [-f]
    [new-device]

    scrub [-s]
    ...

    import [-d dir] [-D]
    import [-o mntopts] [-o property=value] ...
    [-d dir | -c cachefile] [-D] [-f] [-R root] -a [-v]
    import [-o mntopts] [-o property=value] ...
    [-d dir | -c cachefile] [-D] [-f] [-R root]
    [newpool]
    export [-f]
    ...
    upgrade
    upgrade -v
    upgrade [-V version] <-a | pool ...>

    history [-il] [
    ] ...
    get <"all" | property[,...]>
    ...
    set

下面這是 zfs 命令輸出:

代碼: [選擇]
# zfs
    missing command
    usage: zfs command args ...
    where 'command' is one of the following:

    create [-p] [-o property=value] ...
    create [-ps] [-b blocksize] [-o property=value] ... -V
    destroy [-rRf]

    snapshot [-r] [-o property=value] ...
    rollback [-rRf]
    clone [-p] [-o property=value] ...
    promote
    rename
    rename -p
    rename -r
    list [-rH][-d max] [-o property[,...]] [-t type[,...]] [-s property] ...
    [-S property] ... [filesystem|volume|snapshot] ...

    set
    ...
    get [-rHp] [-d max] [-o field[,...]] [-s source[,...]]
    <"all" | property[,...]> [filesystem|volume|snapshot] ...
    inherit [-r]
    ...
    upgrade [-v]
    upgrade [-r] [-V version] <-a | filesystem ...>
    userspace [-hniHp] [-o field[,...]] [-sS field] ... [-t type[,...]]

    groupspace [-hniHpU] [-o field[,...]] [-sS field] ... [-t type[,...]]

    mount
    mount [-vO] [-o opts] <-a | filesystem>
    unmount [-f] <-a | filesystem|mountpoint>
    share <-a | filesystem>
    unshare [-f] <-a | filesystem|mountpoint>

    send [-R] [-[iI] snapshot]
    receive [-vnF]
    receive [-vnF] -d

    allow
    allow [-ldug] <"everyone"|user|group>[,...]
    [,...]

    allow [-ld] -e
    [,...]
    allow -c
    [,...]
    allow -s @setname
    [,...]

    unallow [-rldug] <"everyone"|user|group>[,...]
    [
    [,...]]
    unallow [-rld] -e [
    [,...]]
    unallow [-r] -c [
    [,...]]
    unallow [-r] -s @setname [
    [,...]]

    Each dataset is of the form: pool/[dataset/]*dataset[@name]

    For the property list, run: zfs set|get

    For the delegated permission list, run: zfs allow|unallow


由於這台機器上沒有其他可用的硬碟分割區空間,所以只好使用 dd 建立幾個大檔案模擬實際上的可用區塊空間。

代碼: [選擇]
[root@info /]# mkdir /zfs
[root@info /]# dd if=/dev/zero of=/zfs/zfs-1.dat bs=1024k count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.594376 s, 176 MB/s
[root@info /]# dd if=/dev/zero of=/zfs/zfs-2.dat bs=1024k count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.671803 s, 156 MB/s

分別在建立 /zfs 目錄建立 zfs-1.dat 與 zfs-2.dat 檔案,每個檔案分別為 100MB 的大小。下面繼續使用 zpool 建立 pool 空間:

代碼: [選擇]
[root@info /]# zpool create test /zfs/zfs-1.dat /zfs/zfs-2.dat

然後使用 zpool list 看一下建立的結果:

代碼: [選擇]
[root@info /]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
test 191M 78K 191M 0% ONLINE -

目前的 pool 空間為 191MB。使用 zpool status 看一下詳細狀態:

代碼: [選擇]
[root@info /]# zpool status
pool: test
state: ONLINE
scrub: none requested
config:

NAME STATE READ WRITE CKSUM
test ONLINE 0 0 0
/zfs/zfs-1.dat ONLINE 0 0 0
/zfs/zfs-2.dat ONLINE 0 0 0

errors: No known data errors

目前初步 pool 已經建立完成,下面就可以使用 zfs 該命令建立實際可用的空間。

代碼: [選擇]
[root@info /]# zfs create test/n1
[root@info /]# zfs create test/n2
[root@info /]#
[root@info /]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
test 134K 159M 23K /test
test/n1 21K 159M 21K /test/n1
test/n2 21K 159M 21K /test/n2

前面建立的 pool 名稱為 test,所以使用 zfs create 時候需要繼續指定使用 test 這個 pool 名稱,然後依序建立 n1 與 n2 這兩個檔案系統項目。不過目前預設掛載點是在 /test 內的 n1 與 n2,實際使用上不一定都位於 /test 目錄內使用,所以調整一下掛載點的配置:

代碼: [選擇]
[root@info /]# zfs set mountpoint=/n1 test/n1
[root@info /]# zfs set mountpoint=/n2 test/n2
[root@info /]#
[root@info /]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
test 152K 159M 23K /test
test/n1 21K 159M 21K /n1
test/n2 21K 159M 21K /n2

所以目前指定到 /n1 與 /n2 這兩個掛載點的目錄位置上。使用 df -h 檢視也可以看到已經掛入的資訊:

代碼: [選擇]
[root@info /]# df -h | grep test
test 159M 21K 159M 1% /test
test/n1 159M 21K 159M 1% /n1
test/n2 159M 21K 159M 1% /n2

空間來看,其實 n1 與 n2 都是共用 159M 的 pool 空間,所以磁碟空間分配上會非常有效率,這就與 Linux 上面使用 LVM 的架構有所不同。
產生一些檔案佔用 n1 的檔案系統空間:

代碼: [選擇]
[root@info /]# for((i=1;i<100;i++)); do cat /etc/termcap >> /n1/file1.dat; done
[root@info /]#
[root@info /]# ls -lh /n1/
total 66M
-rw-r--r-- 1 root root 67M Jan 21 05:32 file1.dat
[root@info /]#

然後使用 zfs list 檢視結果:

代碼: [選擇]
[root@info /]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
test 66.9M 92.1M 24K /test
test/n1 66.6M 92.1M 66.6M /n1
test/n2 21K 92.1M 21K /n2
[root@info /]#

可以看出來 test/n1 的檔案系統空間已經被佔用了。

代碼: [選擇]
[root@info /]# df -h | grep test
test 93M 21K 93M 1% /test
test/n1 159M 67M 93M 42% /n1
test/n2 93M 21K 93M 1% /n2

下面測試 zfs 透通壓縮的支援功能:

代碼: [選擇]
[root@info /]# zfs set compression=on test/n2
[root@info /]#
[root@info /]# for((i=1;i<100;i++)); do cat /etc/termcap >> /n2/file1.dat; done
[root@info /]#
[root@info /]# ls -lh /n2/file1.dat
-rw-r--r-- 1 root root 67M Jan 21 05:37 /n2/file1.dat
[root@info /]#

目前只有針對 test/n2 設定壓縮功能,然後與前面一樣大小內容的檔案提供比較測試,然後再次 zfs list 查看結果:

代碼: [選擇]
[root@info /]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
test 110M 48.9M 21K /test
test/n1 66.6M 48.9M 66.6M /n1
test/n2 43.0M 48.9M 43.0M /n2
[root@info /]#

用 df 再次確認一下:

代碼: [選擇]
[root@info n1]# df -h | grep test
test 44M 21K 44M 1% /test
test/n1 111M 67M 44M 61% /n1
test/n2 92M 49M 44M 53% /n2
[root@info n1]#

所以可以發現到相同的檔案,但是產生佔用的空間相差至少 20MB 空間。不過為了確認兩個檔案都一樣的內容,使用 md5sum 確認一下更好。

代碼: [選擇]
[root@info /]# md5sum /n1/file1.dat /n2/file1.dat
30e4f82d620e3bdc3999ce96f5c93cde /n1/file1.dat
30e4f82d620e3bdc3999ce96f5c93cde /n2/file1.dat
[root@info /]#

下面來玩玩新增 pool 的空間作法,所以還是用 dd 建立大檔並使用 zpool 加入使用。

代碼: [選擇]
[root@info /]# dd if=/dev/zero of=/zfs/zfs-3.dat bs=1024k count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.534388 s, 196 MB/s
[root@info /]#
[root@info /]# zpool add test /zfs/zfs-3.dat
[root@info /]#
[root@info /]# zpool list
NAME SIZE USED AVAIL CAP HEALTH ALTROOT
test 286M 115M 171M 40% ONLINE -
[root@info /]#

目前可以看出 pool 的空間已經成長到達 286M,而之前為 159MB。那現在使用 zfs 命令檢視旗下檔案系統的狀態:

代碼: [選擇]
[root@info /]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
test 115M 139M 21K /test
test/n1 66.6M 139M 66.6M /n1
test/n2 48.2M 139M 48.2M /n2
[root@info /]#

所以 test 這個 pool 空間變大後,旗下的檔案系統可用空間也直接變大了。使用 df -h 檢視應該更清楚:

代碼: [選擇]
[root@info /]# df -h | grep test
test 140M 21K 140M 1% /test
test/n1 206M 67M 140M 33% /n1
test/n2 188M 49M 140M 26% /n2

來測試 clone 功能...

代碼: [選擇]
[root@info /]# zfs clone test/n1@20100121 test/n3
[root@info /]#
[root@info /]# zfs set mountpoint=/n3 test/n3
[root@info /]#
[root@info /]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
test 115M 139M 21K /test
test/n1 66.6M 139M 66.6M /n1
test/n2 48.2M 139M 48.2M /n2
test/n3 16K 139M 66.6M /n3

目前的 test1/n1 另外 clone 複製一份成為 test/n3 提供使用,所以 test3/n3 內容會與 test1/n2 完全一樣。其中使用 clone 命令,來源的檔案系統是 test/n1 沒錯,但是後面要多一個 @ 敘述,這邊就指定一個時間紀錄點應對比較好記。

代碼: [選擇]
[root@info /]# df -h | grep test
test 140M 21K 140M 1% /test
test/n1 206M 67M 140M 33% /n1
test/n2 188M 49M 140M 26% /n2
test/n3 206M 67M 140M 33% /n3

透過 df 的結果可以確認空間結果都相同,當然 /n3 內也會有原本的檔案項目。

不過呢... 詳細看一次剛剛內容,我驚訝的是上面那個 zfs list 輸出時候顯示 test/n3 佔用空間為 16K,竟然與 test/n1 佔用空間不一樣,莫非厲害到可以紀錄相同檔案的空間?那我修改一下 /n3 該目錄內的檔案,看看結果會如何變化...

代碼: [選擇]
[root@info ~]# ls -lh /n1/file1.dat
-rw-r--r-- 1 root root 67M Jan 21 05:46 /n1/file1.dat
[root@info ~]#
[root@info ~]# cat /n1/file1.dat >> /n3/file1.dat
[root@info ~]#

代碼: [選擇]
[root@info ~]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
test 174M 80.7M 21K /test
test/n1 66.6M 80.7M 66.6M /n1
test/n2 48.2M 80.7M 48.2M /n2
test/n3 66.6M 72.0M 133M /n3
[root@info ~]#

代碼: [選擇]
[root@info ~]# df -h | grep test
test 73M 21K 73M 1% /test
test/n1 139M 67M 73M 49% /n1
test/n2 121M 49M 73M 41% /n2
test/n3 206M 133M 73M 65% /n3
[root@info ~]#
[root@info ~]# ls -lh /n3/file1.dat
-rw-r--r-- 1 root root 133M Jan 21 06:31 /n3/file1.dat

這時候我發現神奇事情.... /n3/file1.dat 的確變成 133M 的大小,但是檢視 test/n3 本身 zfs 的佔用空間卻只有 66.6M,這表示 zfs 本身已經聰明到紀錄檔案本身實際上還共用哪些區塊空間,真是令人感覺驚豔..... 所以說往後透過 clone 的命令產生的新的檔案系統,其實速度上會非常的快,因為只是標注使用的區塊資訊而非真正去複製一份資料內容。

不過我剛剛是使用 >> 方式附加的,所以只有紀錄附加上資料的資訊,那現在我用 hexedit 命令直接開啟 /n3/file1.dat 檔案編修內容,然後看一下最終結果.....

代碼: [選擇]
[root@info n3]# zfs list
NAME USED AVAIL REFER MOUNTPOINT
test 183M 71.4M 21K /test
test/n1 66.6M 71.4M 66.6M /n1
test/n2 48.2M 71.4M 48.2M /n2
test/n3 67.2M 71.4M 133M /n3

可以觀察到 test/n3 本身實際佔用空間變大了,這再次證明 zfs 真的非常優秀.... 對於磁碟空間的分配管理機制有獨到的設計,更能夠充分發揮磁碟空間的使用。而繼續看一下 zfs 的 manpage 其實就已經有提到:

代碼: [選擇]
Clones

A clone is a writable volume or file system whose initial contents are the same as another dataset. As with snapshots, creating a clone is nearly instantaneous, and initially consumes no additional space.

原來這是可以讀寫版的 snapshot 功能... 而 snapshot 命令依據 manpage 說明,本身為唯讀的性質。

初探測試 (Part1) 先到這邊....

3
雜七雜八 / Vista主打功能「Ready Boost」
« 於: 2007-01-10 17:40 »
http://www.thg.com.tw/ShowContent.aspx?NBR=3F801803D

剛剛看到,標題為: Vista主打功能「Ready Boost」 可望拉升NAND Flash需求

看完後,感覺很熟悉的東西,這不就是 linux 的 mkswap/swapon/swapoff 使用?

---

4
=========================================
=========================================

常見 iptables 的 firewall 設定配置問題:

   作者: 小州 (kenduest)

   最近更新時間: 5/29/2013

=========================================
=========================================

標題列表項目:  (一般本機的 firewall 配置問題)

1. 如何查詢我目前 iptables 的配置組態設定 ?
2. 如何關閉 Linux Distro 本身的 firewall 配置並讓規則清空不啟用?
3. 關於 RedHat 9, Fedora 與 RHEL 的 firewall 配置問題
4. 如何使用手動方式清空與重置 iptables firewall rule?
5. iptables firewall 本身封包比對判斷流程圖為何?
6. iptables firewall 本身封包比對規則方式為何?
7. 使用 -P INPUT DROP 引起的主機本身對外連線不通問題?
8. 使用 -P INPUT DROP 導致本機存取自己服務也受到限制?
9. 使用 -P INPUT DROP 引起的網路存取正常,但是 ftp 連入卻失敗?
10. 使用 -P OUTPUT DROP 引起的網路不通問題?
11. 有無建議本機 firewall 服務只有開放對外項目,其餘禁止的配置方式?

標題列表項目:  (提供 NAT 服務配置問題)

1. 一般建議單純化的 NAT 服務配置語法為何?
2. 透過 NAT 上網的內部 ip 主機,ftp 連結存取錯誤?
3. 如何配置連線到 NAT 主機某個對外 Port 時,可以轉送到內部某主機?
4. 使用 -j MASQUERADE 與 -j SNAT 於 NAT 使用差異 ?

=========================================


一般本機的 firewall 配置問題

=====

1. 如何查詢我目前 iptables 的配置組態設定 ?


   iptables 本身提供了 iptables-save 這個程式檔案,執行後可以檢視目前的配置。

代碼: [選擇]
iptables-save
   若是使用 iptables 該主要的程式的話,可以搭配 -L 選項列出規則清單。不過由於 iptables 過濾本身是可以針對不同 table 來處理,傳入 -t 可以查閱指定的 table,不指定時預設表示使用 filter table 項目。一般使用方式:

代碼: [選擇]
iptables -L
iptables -t nat -L

   不過 iptables 對於規則內有 ip 位址項目時會進行反查解析出主機名稱,這個也常導致反查時需要時間導致列出規則時卡住無法運作下去,所以實際上一般會搭配傳入 -n 選項,表示不顯示反查後主機名稱結果。

代碼: [選擇]
iptables -L -n
iptables -t nat -L -n

當然,若是要查閱更詳細的資訊,可以再搭配 -v 選項。
   
代碼: [選擇]
iptables -L -n -v
iptables -t nat -L -n -v

=====


2. 如何關閉 Linux Distro 本身的 firewall 配置並讓規則清空不啟用?


各家發行版本都會提供各自的 firewall script 於開機時自動帶入設定規則,所以並沒有一個統一的做法。

 --

在 RHEL 與 Fedora Linux 內的開機 script 本身為 /etc/init.d/iptables,所以關閉方式手動可以執行:


代碼: [選擇]
/etc/init.d/iptables stop
  設定每次開啟不啟動該服務項目,可以使用 chkconfig 來關閉。

代碼: [選擇]
chkconfig iptables off
  --
  若是 SLES 的話,修改 /etc/sysconfig/network/config 配置,裡面可以找到:

代碼: [選擇]
# With this variable you can determine if the SuSEfirewall when enabled
# should get started when network interfaces are starte
FIREWALL="yes|no"
  這可以設定每次啟動網路時是否啟用 firewall 配置。


=====


3. 關於 RedHat 9, Fedora 與 RHEL 的 firewall 配置問題

系統本身提供配置 firewall 方式,文字模式是可以執行 setup 程式,   於 Firewall 項目進入後就可以選擇新增相關規則。最後所開放允許的組態都是儲存於 /etc/sysconfig/iptables 檔案內。

使用 /etc/init.d/iptables start 或者是 service iptables start 時,就會依據 /etc/sysconfig/iptables 設定的配置啟用 firewall 設定。

於 /etc/sysconfig/iptables 的格式結果,可以使用 iptables-restore 程式由標準輸入讀入後進行啟用。簡單說所謂開啟該服務,其實也就是:

代碼: [選擇]
iptables-restore < /etc/sysconfig/iptables
執行 /etc/init.d/iptables save 可以把目前系統正在運作執行配置的規則儲存至 /etc/sysconfig/iptables 檔案內,這底層其實也是呼叫   iptables-save 程式來達成該結果。簡單說也就是:

代碼: [選擇]
iptables-save > /etc/sysconfig/iptables
關於 /etc/sysconfig/iptables 本身只有包含給 firewall rule 的規則敘述,本身並沒有包含任何 iptables 相關 kernel module 載入配置,  若是需要載入額外的 module 的話可以修改 /etc/sysconfig/iptables-config。

/etc/sysconfig/iptables-config 本身或於 /etc/ini.d/iptables 該腳本檔案時讀入使用。依據該內容來看,提供相關變數定義可以指定載入必要的module 項目:

代碼: [選擇]
# Load additional iptables modules (nat helpers)
#   Default: -none-
# Space separated list of nat helpers (e.g. 'ip_nat_ftp ip_nat_irc'),
# which are loaded after the firewall rules are applied. Options for
# the helpers are stored in /etc/modprobe.conf.
IPTABLES_MODULES=""
=====

4. 如何使用手動方式清空與重置 iptables firewall rule?


若是純手動的方始清空所有規則設定,一般可以採用下列方式:

代碼: [選擇]
iptables -F # 若是沒有加上 -t 指定 table,預設是使用 -t filter
iptables -X

iptables -F -t nat
iptables -X -t nat

iptables -F -t mangle
iptables -X -t mangle

  其中 -F 表示清除指定 table 內所有 chain 項目內的規則清單設定。 -X 則是表示刪除使用者自訂的 chain 項目。

  除了清除外,建議需要把過濾預設的政策設定為 ACCEPT,也就是允許任何封包的傳輸不會被阻擋。

代碼: [選擇]
iptables -P INPUT ACCEPT # 沒加上 -t 指定 table,預設使用 -t filter
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

iptables -t nat -P OUTPUT ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT

iptables -t mangle -P PREROUTING ACCEPT
iptables -t mangle -P POSTROUTING ACCEPT
iptables -t mangle -P INPUT ACCEPT
iptables -t mangle -P OUTPUT ACCEPT
iptables -t mangle -P FORWARD ACCEPT

同時,後續若是手動打造 iptables firewall rule 的時候,該技巧也應該用上,也就是先清除之前規則外,包含把預設的政策都改成 ACCEPT,這樣配置 firewall 規則才不會混亂不堪。


=====


5. iptables firewall 本身封包比對判斷流程圖為何?

詳細部份可以參閱這張表格:

代碼: [選擇]
http://ebtables.sourceforge.net/br_fw_ia/bridge3b.png

=====


6. iptables firewall 本身封包比對規則方式為何?


這個要區分成為幾點來說明:

1) 一般說法就是,first match,也就是符合規則敘述後就不再往下走

      比方配置:

代碼: [選擇]
iptables -P INPUT ACCEPT
iptables -A INPUT -s 192.168.1.1 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j DROP

      這就是 192.168.1.0/24 中,只有允許 192.168.1.1 可以存取,其餘192.168.1.0/24 該網段 ip 都禁止存取。

      常見設定觀唸錯誤如下:

代碼: [選擇]
iptables -P INPUT ACCEPT
iptables -A INPUT -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j DROP

為何 1921.68.1.0/24 還是可以存取不被禁止?這就是比對的符合就不會繼續往下走。

不過這邊到是要先註明的是,-j LOG 與 -j MARK 這類規則倒是會繼續往下比對,這個與 -j ACCEPT 與 -j DROP 就不相同情況。

2) 當比對規則都跑完了都沒有任何符合的敘述時,最後結果要看預設政策設定

代碼: [選擇]
iptables -P INPUT ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -j DROP
......

上面規則來說,表示預設封包都允許連入存取的,只有禁止 192.168.1.0/24,也就是說比對流程規則跑完後都沒有任何符合敘述,最後就是允許存取。

代碼: [選擇]
iptables -P INPUT DROP
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
......

上面規則來說,表示預設封包都禁止連入存取的,只有允許 192.168.1.0/24,也就是說比對流程規則跑完後都沒有任何符合敘述,最後就是允許禁止。

把預設的政策調整為 DROP 基本上需要注意非常多流程,下面部份會談到這部份要注意事項。一般來說建議除非很清楚把預設存取設定為 DROP 帶來的結果,要不然請勿貿然配置使用。因為這樣設定的話,雖然是說只有開放 192.168.1.0/24 可以連入存取,但是卻會導致這台服務主機只可以連線到 192.168.1.0/24 網段的主機,其他的目的都被禁止了。


=====


7. 使用 -P INPUT DROP 引起的主機本身對外連線不通問題?

為了更嚴厲的防火牆存取限制,一般初學者會這樣配配置:

代碼: [選擇]
iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

也就是主機只有打算開放 ssh 服務對外提供存取。

這樣乍看之下好像非常正確,但是設定好後外面是可以連到該 port 22 服務,但是卻導致了一個後續的問題,也就是 "該主機若是要主動對外要建立連線卻被禁止"。比方這台服務主機無法使用 ssh 登入到遠端主機,也無法用瀏覽器看其他主機 port 80 的 http 服務的。

引起該問題的原因呢? TCP/IP 本身是雙向的,也就是有出必有進,有進必有出。這個規則沒考慮到這點問題。

當主機對外要建立連線時,對方勢必也要回應封包到原主機,所以回應的封包是要被允許的。不過該配置來看卻沒考慮到這點問題,所以導致回應的封包被丟棄,所以連線根本建立失敗。

所以設定 -P INPUT DROP 時,一般正確方式應該考慮加上允許主機本身對外連線時對方回應封包項目,也就是:

代碼: [選擇]
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

-m state --state ESTABLISHED 扮演很重要角色,那就是允許連線出去後對方主機回應進來的封包。


=====


8. 使用 -P INPUT DROP 導致本機存取自己服務也受到限制?

代碼: [選擇]
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

不過上面規則通常應該考慮的是,主機本身對外只有提供可以連結存取port 22 該 ssh 服務,但是若是自己主機有開 port 80 與 port 25 等  服務項目的話,這樣配置卻也導致自己存取自己的主機服務也被限制住了。

基於該問題,一般會建議加上由 loopback interface 該介面不受到該 firewall 組態限制而被阻擋,一般會建議改成:

代碼: [選擇]
iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT


=====


9. 使用 -P INPUT DROP 引起的網路存取正常,但是 ftp 連入卻失敗?

依據前面介紹方式,只有開放 ftp port 21 服務,其他都禁止的話,一般會配置使用:

代碼: [選擇]
iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

這樣的配置,確認 ftp 用戶端是可以連到 ftp 主機並且看到歡迎登入畫面,不過後續要瀏覽檔案目錄清單與檔案抓取時卻會發生錯誤...

ftp 協定本身於 data channnel 還可以區分使用 active mode 與 passive mode 這兩種傳輸模式,而就以 passive mode 來說,最後是協議讓 ftp client 連結到 ftp server 本身指定於大於 1024 port 的連接埠傳輸資料。
 
這樣配置在 ftp 傳輸使用 active 可能正常,但是使用 passive mode 卻發生錯誤,其中原因就是因為該主機firewall 規則配置不允許讓 ftp client 連結到 ftp server 指定的連結埠才引發這個問題。

要解決該問題方式,於 iptables 內個名稱為 ip_conntrack_ftp 的 helper (kernle 2.6 開始為 nf_conntrack_ftp),可以針對連入與連外目的 port 為 21 的 ftp 協定命令溝通進行攔截,提供給 iptables 設定 firwewall 規則的配置使用。開放做法為:

代碼: [選擇]

modprobe ip_conntrack_ftp   # 若是 kernel 2.6 開始請改成 modprobe nf_conntrack_ftp

iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT

其中 -m state 部分另外多了 RELATED 的項目,該項目也就是狀態為主動建立的封包,不過是因為與現有 ftp 這類連線架構會引發另外才產生的主動建立的項目。

不過若是主機 ftp 服務不在 port 21 的話,請使用下列方式進行調整:

代碼: [選擇]
modprobe ip_conntrack_ftp ports=21,30000   # kernel 2.6 開始改成 nf_conntrack_ftp

iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 30000 -j ACCEPT

也就是主機本身提供 ftp 服務分別在 port 21 與 30000 上,讓 ip_conntrack_ftp (nf_conntrack_ftp) 這個 ftp helper 能夠正常提供 ftp 用戶端使用 passive mode 存取而不會產生問題。


=====

 
10. 使用 -P OUTPUT DROP 引起的網路不通問題?

來看看這樣配置片段敘述:

代碼: [選擇]
iptables -P INPUT ACCEPT
iptables -P OUTPUT DROP

這樣配置來看,感覺上就是主機對外完全開放沒有任何限制連入,但是該主機對外本身限制預設不可以連外,但是結果卻是不管外面也根本連不進來。

該問題 如同上面提到使用 -P INPUT DROP 的配置問題一樣,這樣也是根本沒有考慮到 TCP/IP 本身是雙向溝通的問題。

考慮連入封包後續主機要回應的項目,也是需要搭配傳入 -m state 來提供允許回應封包的項目,所以整個來看片段敘述為:

代碼: [選擇]
iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

這樣設定好結果,就是該主機本身可以對自己主機服務連結存取,但是對外連結存取都會被禁止。

不過拉回來看,有必要配置 -P OUTPUT DROP 嗎?老實說個人倒是感覺通常都是多此一舉,因為實際應用部份通常不會限制自己主機對外連線的功能。

不過若是堅持要設定 -P OUTPUT DROP 的話,要考慮後續主動連外部份的開放描述可能可多了.... 比方這樣配置項目:

代碼: [選擇]
iptables -P OUTPUT DROP
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
PDP-IP: 10.128.18.116
APN: vibo

這樣是不是有點找自己麻煩?

所以結論就是除非定真的是不想讓自己主機有主動連外的需求,那才考慮把 OUTPUT chain 的預設政策設定為 DROP,否則不要使用這種配置。


=====


11. 有無建議本機 firewall 服務只有開放對外項目,其餘禁止的配置方式?


   依據前面談到流程,若是預設 INPUT 的存取是禁止的話,提供如下配置參考:

代碼: [選擇]
modprobe ip_conntrack_ftp   # kernel 2.6 開始要改成 nf_conntrack_ftp

iptables -P INPUT DROP
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

若是預設 INPUT 的存取是允許的話,提供如下配置參考:

代碼: [選擇]
modprobe ip_conntrack_ftp  # kernel 2.6 開始要改成 nf_conntrack_ftp

iptables -P INPUT ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state NEW,INVALID -j DROP

若是需要允許主機可以接受 ping 程式測試這台機器是否可以存取的話,可以搭配使用:

代碼: [選擇]
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
當然請注意,搭配先使用 -F 與 -X 先把預先存在的 rule 清空後,避免
rule 混雜在一起而互相影響。

=====


提供 NAT 服務配置問題


=====


1. 一般建議單純化的 NAT 服務配置語法為何?


這邊是假設對外的介面為 eth0,對內介面為 eth1,該對內網段的 ip 範圍是 192.168.1.0/24。

若是預設的 FORWARD chain 本身為 ACCEPT 的話,配置語法使用為:

代碼: [選擇]
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o eth0 -j MASQUERADE

echo 1 > /proc/sys/net/ipv4/ip_forward

若是預設的 FORWARD chain 本身為 DROP 的話,配置語法使用為:

代碼: [選擇]
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -o eth0 -j MASQUERADE
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

echo 1 > /proc/sys/net/ipv4/ip_forward

當然,請不要忘記前面談到的議題,也就是搭配先使用好 -F 與 -X 這類項目。還有預設 FORWARD chain 為 DROP 的話,考慮是否也開放允許 echo-request 這類 icmp 協定封包能夠允許由內部網段傳送出去。

=====


2. 透過 NAT 上網的內部 ip 主機,ftp 連結存取錯誤?

該問題點與前面談到 ftp 問題與搭配使用 -m state --state RELATED 配置有關係。由於目前要的是 NAT 下 ftp 連線的追蹤功能,所以需要搭配掛入ip_nat_ftp 該 module 才可以正確提供追蹤機制。

所以經過該修改配置,於預設的 FORWARD chain 本身為 ACCEPT 的話,配置語法使用為:

代碼: [選擇]
modprobe ip_nat_ftp  # kernel 2.6 開始改成 nf_nat_ftp

iptables -A POSTROUTING -t nat -o eth0 -s 192.168.1.0/24 -j MASQUERADE
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

echo 1 > /proc/sys/net/ipv4/ip_forward

 搭配 ip_nat_ftp (nf_conntrack_ftp) module 後,如此於 FORWARD chain 內使用的 RELATED 參數才會有效用。

=====


3. 如何配置連線到 NAT 主機某個對外 Port 時,可以轉送到內部某主機?


一般語法配置為:


代碼: [選擇]
iptables -A PREROUTING -t nat -d 210.1.1.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80
這邊是假設該 NAT 主機本身對外的 ip 為 210.1.1.1,設定外面連結存取到該 ip 的 port 80 時,將封包轉送到 192.168.1.1 的 port 80 上。

不過該配置常談到的問題就是,也許有人在 192.168.1.0/24 該內部網段連結 210.1.1.1 的 port 80 時,卻無法瀏覽實際 192.168.1.1:80 該服務項目。

該問題牽涉到 icmp 重導的問題,而且目前 netfilter iptables 發展已經不會有該問題。若是還有問題的話,可以考慮如下配置:

代碼: [選擇]
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.1 --dport 80 -s 192.168.1.0/24 -j SNAT --to 192.168.1.254
其中 192.168.1.254 也就是 NAT 主機對內的 ip,這樣可以讓該內部的192.168.1.1 看到的存取來源為 192.168.1.254,如此可以解決該問題。

=====


4. 使用 -j MASQUERADE 與 -j SNAT 於 NAT 使用差異 ?

   這邊是假設該 NAT 主機本身對外的介面為 eth0,奇 ip 為 210.1.1.1;對內介面為 eth1,該對內網段的 ip 範圍是 192.168.1.0/24。

一般選擇提供 NAT 服務,讓內部 privae ip 可以存取連上 internet 的配置方式有:

代碼: [選擇]
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -j MASQUERADE

echo 1 > /proc/sys/net/ipv4/ip_forward

另外一種使用方式:

代碼: [選擇]
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 -j SNAT --to 210.1.1.1

echo 1 > /proc/sys/net/ipv4/ip_forward

基本上最後的結果都是可以達成需求的,不過一般差別為:

   1) 使用 -j SNAT 一般會比 -j MASQUERADE 效率來的好,因為這牽涉到封包傳送通過相關介面時的相關比對問題

   2) 若是對外本身 ip 不是固定的,也就是撥接取得這類會非固定的環境之下,採用 -j MASQUERADE 會比較方便使用

=====

5
關於 "企業級 Linux 系統管理寶典" 這本書籍,是由我好友 cdchen 所撰寫的,有別於一般市面上只談 step by step 這類書籍,內容主要在於實際的觀念課題,實在是一本不錯的好書。

官方網站:http://slbu.cdchen.idv.tw/

==

6
工作機會 / 台北與台中徵才
« 於: 2005-03-09 18:02 »
中研院資訊所的 OSSF 計畫徵人,對推廣 open source 工作,
有興趣的朋友。工作地點在台北南港。
有合適的朋友,歡迎寄信到 marr@iis.sinica.edu.tw

另一則,工作地點在中部科學園區。
公司有意徵求多樣人才,當然包括資訊人員囉。
工作待遇不錯,待面議。
工作內容包括 CIM, MIS 等。
能力要求包括 VBA 程式編修。
有興趣者,歡迎寄信到
yclee @ auo.com 李小姐

7
雜七雜八 / 一文多 po ?
« 於: 2005-02-10 22:03 »
最近比較多時間在 study-area 與 vbird 論壇上發表文章,最近突然感覺有一堆問題其實都會兩篇都發表,然後只會一邊也不是,回兩邊又感覺似乎不大對。

不知道大家對於這樣的情況是怎樣看待的?也或者是其實本來因為就是不一樣的站台,所以這樣的情況算是正常的,用平常心面對就好呼?

頁: [1]