小州 <kenduest.bbs@bbs.cynix.com.tw> wrote in message
news:3gGgL2$74H@bbs.cynix.com.tw...
> ※ 引述《shrink.bbs@bbs.cis.nctu.edu.tw (Le Petit Prince)》之銘言:
> > 首先謝謝小州回答我的問題
> > 另外在問一個ipchains的問題
> > 請問一下在ipchains有三個chain rules(input ,output,forward)
> > 那假設在相同的source and destination位址
> > 但加在不同的chain上,有什麼不同呢? 一直搞不懂ㄋㄟ
>
>   那你列出 input chains 與 output chains 的 ipchains 指令設定,
>   讓大家來比較討論一下
>

不好意思﹐幫小州回答一下﹕

搞不懂為什麼會有“相同的source and destination位址”呢﹖
如果您是指在同一個封包上﹐那其實沒什麼意義﹐因為根本不會送到 FW 上面。
如果指 ipchains 的規則的話﹐則可以這樣理解﹕
-s ﹕來自 source 的封包
-d ﹕送到 distinatiion 的封包。
然後﹐
在 ipchains 規則裡面﹕
-s 1.2.3.4 是指來自 1.2.3.4 的封包﹐
-d 1.2.3.4 是指送給 1.2.3.4 的封包。

假設﹕

您有一個內部 IP 是 10.3.2.1 經過 FW 的 eth0 傳入﹐
再經過 eth1 傳出給外部的 202.2.3.4 ﹐如圖﹕

10.3.2.1------> eth0   F/W   eth1 -------> 202.2.3.4

那麼﹕

input -i eth0 -s 10.3.2.1 -d 202.2.3.4
是指來自 10.3.2.1﹐ 從 eth0 進來﹐要送給 202.2.3.4 的封包。
如果您不指定 -i 是哪個界面﹐這樣的封包﹐只能出現在 eth0 上面。
但如果您將 eth0 換成 eth1 的話:
input -i eth1 -s 10.3.2.1 -d 202.2.3.4
這樣的封包永遠是抓不到的﹐因為來自 10.3.2.1 的封包不可能從 eth1 進來。


同樣﹕

output -i eth1 -s 10.3.2.1 -d 202.2.3.4
是指來自 10.3.2.1﹐ 從 eth1 出去﹐要送給 202.2.3.4 的封包。
如果您不指定 -i 是哪個界面﹐這樣的封包﹐只能出現在 eth1 上面。
但如果您將 eth1 換成 eth0 的話:
output -i eth0 -s 10.3.2.1 -d 202.2.3.4
這樣的封包永遠是抓不到的﹐因為要送給 202.2.3.4 的封包不可能從 eth0 出去。


歸納﹕

如果指定界面﹐下面的封包是抓不到的﹕
input -i eth0 -s 202.2.3.4
input -i eth0 -d 10.3.2.1
input -i eth1 -s 10.3.2.1
input -i eth1 -d 202.2.3.4
output -i eth0 -d 202.2.3.4
output -i eth0 -s 10.3.2.1
output -i eth1 -s 202.2.3.4
output -i eth1 -d 202.2.3.4


所以﹕

為了避免混亂和更好理解﹐
在 iptables 上面﹐將傳出界面和傳入界面分開了﹕
傳入界面﹕-i
傳出界面﹕-o
這樣的話﹐
在 output 的規則上﹐是不存在 -i 界面的﹔
在 input 的規則上﹐是不存在 -o 界面的。
例如﹕
input -i eth0 -s 10.3.2.1 -d 202.2.3.4
output -o eth0 -s 202.2.3.4 -d 10.3.2.1
input -i eth1 -s 202.2.3.4 -d 10.3.2.1
output -o eth1 -s 10.3.2.1 -d 202.2.3.4

這樣﹐只要將 -i 和 -s 以及 -o 和 -d 聯繫起來﹐
再判斷其可能性﹐
就會清晰多了﹐您不覺得嗎﹖

關於 ipchains 的一些說明﹐可以到如下網頁看看﹕
http://www.study-area.net/linux/linux_nat.htm

--

<Joestar.bbs@bbs.cis.nctu.edu.tw> wrote in message news:3gH4Kj$GjV@bbs.cis.nctu.edu.tw...
> ==> 在 shrink@cis_nctu (Le Petit Prince) 的文章中提到:
> > ==> 在 kenduest.bbs@bbs.cynix.com.tw (小州) 的文章中提到:
> > >   那你列出 input chains 與 output chains 的 ipchains 指令設定,
> > >   讓大家來比較討論一下
> > 比如說我要檔掉從外部來的xxx.xxx.xxx.xxx的位址,且假設本地的位址
> > 為yyy.yyy.yyy.yyy
> > 那應該下
> > ipchains -A input -s xxx.xxx.xxx.xxx -d yyy.yyy.yyy.yyy -j DENY
> > 那麼下ipchains -A ouput -s xxx.xxx.xxx.xxx -d yyy.yyy.yyy.yyy -j DENY
> > 也是可以吧
> > 那這樣的話這樣種有什麼不同呢?如果想同那就不要弄得那麼複雜阿
> > 那如果是下ipchains -A forward -s xxx.xxx.xxx.xxx -d yyy.yyy.yyy.yyy -j DENY
> > 呢?
> > 請指教
>
> 在ipchains 裡,input/forward/output chain的定義如下
> input chain: 只要是封包流入網路介面,或者是給local process的都會受到 input
>                 chain的檢查
> forward chain: 只要收到的封包不是給local process, 須經過routing decision
>                 的,會受到forward chain的檢查
> output chain: 只要封包流出網卡,或者是本機要送給 local process的都會受到
>                 output chain的影響
>
> [a] --- [b] ---[c]
>
>
> 封包流向: (telnet 為例)  在 b 上所受到chain影響順序
> 去 a --> c ,回 c --> a        input->forward->output, input->forward->output
> 去 a --> b ,回 b --> a        input, output
> 去 b --> b ,回 b --> b        output->input, output->input
>
> 因為許多人對input跟output的不了解,所以在iptables 對 input, output就重新做定義
>
> INPUT chain: 只要封包是給本機上的local process的都會受到 INPUT chain的檢查
> FORWARD chain: 只要收到的封包不是給local process, 須經過routing decision
>                 的,會受到FORWARD chain的檢查
> OUTPUT chain: 只是本機 local process 要送出的都會受到 OUTPUT chain的影響
>
> [a] --- [b] ---[c]
>
> 封包流向: (telnet 為例)  在 b 上所受到chain影響順序
> 去 a --> c ,回 c --> a        forward, forward
> 去 a --> b ,回 b --> a        input, output
> 去 b --> b ,回 b --> b        output->input, output->input
>
> 對於網路介面的設定也從原本的 單獨指定網路介面(-i) 變成要指定 進/出 的網路介面
>
> ipchains -A input -i eth0 -j RETURN == iptables -A INPUT -i eth0 -j RETURN
> 而 iptables -A INPUT -o eth1 -j RETURN 是不合法的
>
> ipchains -A ouput -i eth0 -j RETURN == iptables -A OUTPUT -o eth0 -j RETURN
> 而 iptables -A OUTPUT -i eth1 -j RETURN 是不合法的
>
> 這樣的分法不但是更清楚,且在 FORWARD chain更能指定封包流向
> 如 主機 B有三張網路卡,定義如下
> eth0 為  Internet
> eth1 為  DMZ 140.113.0.0/24
> eth2 為  Intranet, 可連到 192.168.1.0/24,192.168.2.0/24,172.13.12.5/24
>
> 任何主機從 Intranet 網路介面都可連到 DMZ, 而Internet 皆不行
> 你當然可以 以 網路介面所接的IP 子網路當作是rule的條件,若eth2 可連到各個內部的
> 網域,單靠IP子網路可能要設很多條. 我們可以這樣設
> iptables -A FORWARD -i eth0 -o eth1 -j DROP
> iptables -A FORWARD -i eth2 -o eth2 -j ACCEPT
> 這是ipchains 所做不到了. 如果配合 "state"(connection tracking) 新功能,
> 你更可以為每個網路介面設安全優先值,只有在修先權高的網路介面主機可以連
> 往優先權低的網路
> 如
>
> eth0, Internet, 0
> eth1, DMZ, 5
> eth2, Intranet, 10
>
> eth0 -> eth1 ==> DROP
> eth1 -> eth0 ==> ACCEPT
> eth0 -> eth2 ==> DROP
> eth2 -> eth0 ==> ACCEPT
> eth1 -> eth2 ==> DROP
> eth2 -> eth1 ==> ACCEPT
>
> --
>


<Joestar.bbs@bbs.cis.nctu.edu.tw> wrote in message
news:3gH4Kj$GjV@bbs.cis.nctu.edu.tw...
> ==> 在 shrink@cis_nctu (Le Petit Prince) 的文章中提到:
> > ==> 在 kenduest.bbs@bbs.cynix.com.tw (小州) 的文章中提到:
> > >   那你列出 input chains 與 output chains 的 ipchains 指令設定,
> > >   讓大家來比較討論一下
> > 比如說我要檔掉從外部來的xxx.xxx.xxx.xxx的位址,且假設本地的位址
> > 為yyy.yyy.yyy.yyy
> > 那應該下
> > ipchains -A input -s xxx.xxx.xxx.xxx -d yyy.yyy.yyy.yyy -j DENY
> > 那麼下ipchains -A ouput -s xxx.xxx.xxx.xxx -d yyy.yyy.yyy.yyy -j DENY
> > 也是可以吧
> > 那這樣的話這樣種有什麼不同呢?如果想同那就不要弄得那麼複雜阿
> > 那如果是下ipchains -A forward -s xxx.xxx.xxx.xxx -d yyy.yyy.yyy.yyy -j
DENY
> > 呢?
> > 請指教
>
> 在ipchains 裡,input/forward/output chain的定義如下
> input chain: 只要是封包流入網路介面,或者是給local process的都會受到 input
>                 chain的檢查
> forward chain: 只要收到的封包不是給local process, 須經過routing decision
>                 的,會受到forward chain的檢查
> output chain: 只要封包流出網卡,或者是本機要送給 local process的都會受到
>                 output chain的影響
>
> [a] --- [b] ---[c]
>
>
> 封包流向: (telnet 為例)  在 b 上所受到chain影響順序
> 去 a --> c ,回 c --> a        input->forward->output,
input->forward->output
> 去 a --> b ,回 b --> a        input, output
> 去 b --> b ,回 b --> b        output->input, output->input

嗯﹐我這裡想補充一下﹐不如將圖換成﹕

[a] --- if0[b]if1  ---[c]

然後我們可以這樣看﹕

a -> c 的封包﹕對 if0 來說是 input﹐對 if1 來說是 output﹐ if0 和 if1 之間要
做 forward
c -> a 的封包﹕對 if1 來說是 input﹐對 if0 來說是 output﹐ if1 和 if0 之間要
做 forward
a -> b 之 if0 封包﹕只有 if0 的 input﹐沒有 output 和 forward
b 之 if0 -> a 的封包﹕只有 if0 的 output ﹐沒有 input 和 forward
a -> b 之 if1 的封包﹕也只有 if0 的 input﹐對 if1 來說是沒有 input 的﹐因為
已經交由 local process 處理了﹐所以也沒有 output 和 forward。
b 之 if1 -> a 的封包﹕只有 if0 的 output﹐對 if1 來說沒有 ouput﹐因為是
local process 產生的﹐所以沒有 input 和 forward。
提醒一下﹕關於 if1 和 a 的封包沒有 forward 存在。[注意了﹗﹗]

我們再看 iptables 的情形﹕

[a] --- if0[b]if1  ---[c]

a -> c 的封包﹕經過路由判斷之後﹐直接交由 if0 到 if1 的 forward﹐根本沒存在
input 和 output
c -> a 的封包﹕直接交由 if1 到 if0 的 forward﹐根本沒存在 input 和 output
a -> b 之 if0 或 if1 的封包﹐屬於 if0 的 input ﹐沒有經過 if1﹐也沒有 ouput
和 forward。
b 之 if0 或 if1 -> a 的封包﹐屬於 if0 的 output﹐沒有經過 if1﹐也沒有 input
和 forward。

>
> 因為許多人對input跟output的不了解,所以在iptables 對 input, output就重新做
定義

我認為這並非是因為人們的不理解﹐而是這樣的設計﹐比起 ipchains 有明顯的改良﹕
對於原本進行 forward 的封包 (如﹕a -> c)﹐
ipchains 要進行三個 process (input, forward, ouput) 才完成一個封包處理﹔
而到了 iptables﹐一個 process (forward) 就完成了。
效率是明顯的加快了﹗

[ 餘下恕刪 .... ]

--



<Joestar.bbs@bbs.cis.nctu.edu.tw> wrote in message
news:3gHSE6$FzR@bbs.cis.nctu.edu.tw...
> > > 因為許多人對input跟output的不了解,所以在iptables 對 input, output就重
新做
> > 定義
> > 我認為這並非是因為人們的不理解﹐而是這樣的設計﹐比起 ipchains 有明顯的改
良﹕
> > 對於原本進行 forward 的封包 (如﹕a -> c)﹐
> > ipchains 要進行三個 process (input, forward, ouput) 才完成一個封包處理﹔
> > 而到了 iptables﹐一個 process (forward) 就完成了。
> > 效率是明顯的加快了﹗
> > [ 餘下恕刪 .... ]
>
>
> 恩..我想這個問題是見仁見智. linux 上的packet filter 跟其他種的最大不同且也

> 最大的優點的就是有所謂chain 的觀念. 就我所知,如ipfw, ipfilter,或cisco PIX
等,
> 對於rule的比對都是用sequential match的方式,有些是first match, 有些是last
match.

如果以 last match 為原則的話﹐一定要跑完所有 rules 才能判斷(否則何來 last)﹐
但以 first match 為原則的話﹐一旦找到符合的 rule 就不再往下找了。
很明顯﹐first match 會是一個不錯的選擇﹐假如您在乎過濾效率的話。

> 但不管如何只要rule一多(對於稍大的網路,上百條的規則是很常見的),都免不要考慮

> 效能的因素而須對filtering rule順序做考量. 而因為 linux  上有chain的觀念,講
白話點
> 就是將所有的rule 做分類.從最上層的default chain(input/forward/output)
> 到第二層至第三層的user defined chain. 一但做的分類之後,所須比對的rule數目
就大幅
> 降低.
>
> 如
> rule 1 --> match 所有 tcp 封包 , jump to chain 3
> rule 2 --> match 所有 udp 封包, jump to chain 4
> chain 3
> rule 3-1 -> match 所有到 A 的 www 封包, jump to chain 5
> rule 3-2 -> match 所有到 A 的 smtp 封包, jump to chin 6
> ...
> ..... 等等
>
> chain 5
> rule 5-1 -> match 所有來自 Internet X 的封包, accept
> rule 5-2 -> match 所有來自 Intranet B 的封包, deny
>
> 以這種方式來設的話,一個封包可能只需要受到10的比對就可以,而不需要像其他種
> 需要比到到第 50條才能決定這封包的命運.
>
> 我們再回到最上層的 default chain. 無庸置疑的iptables 對default chain的定義
方式
> 主要為 所有的封包最多只會被一個default chain所match. 當然在程式寫作上會變
簡單
> 且效能上會有大幅的增進. 但我個人還是覺得,這主要是因為先有三個default chain
> 的定義, 才會決定程式的實作。
>
> 當然我不是netfilter 的作者,這問題的解答是該是他才最清楚的吧...:P
>

多謝指教﹐不過﹐不知道是否弟的表達有問題﹐還是閣下有所誤會了呢﹖

前面我說指出的是 iptables 與 ipchains 對同一個封包的處理方式﹐
而不是比較雙方的 rules 的管理方式。

而事實上﹐正如您所指出﹐ipfwadm ﹐ipchains 和 iptables 相同之處﹐
都用 chains 來管理 rules (所謂 chains 就是一堆 rules 的集合)﹐
除了預設的 chains 外﹐還允許 user defined 的 chains﹐
根據條件或是在 defined chains 結束後回到 jumped from 的 chains﹐
從而提高過濾檢查效率﹐的確是個非常棒的設計。

不過﹐這個優點﹐對於 ipchains 和 iptables 都一樣吧﹖
我不認為 chains 設計技巧﹐會因為在 iptables 或在 ipchains 會有不同。
您可以在 ipchains 設計出最高效的 chains ﹐同樣也可以在 iptables 做到。
而我所指出的是﹕
就算大家使用的 chains 技巧都一樣﹐當處理一個非本機封包時﹐
iptables 只需 forward 處理就可以﹐
而無需像 ipchains 那樣要進行 input, forward, output 這樣的三部曲。

試想﹕您的 [預設] policy 對所有 chians 都是 DENY 好了。
在 iptables 上面﹐只要路由判斷之後﹐丟給 forward﹐
然後找到符合的規則﹐再 ACCEPT 就完成轉遞。
而在 ipchains 上呢﹐
首先要在 input 上 ACCEPT﹐
然後要在 forward 上 ACCEPT﹐
最後還要在 output 上 ACCEPT﹐
三者缺一不可。
(再提醒一下﹕policies 都為 DENY 哦)

嗯﹐不知道這樣說還有誤導嗎﹖


--


<Joestar.bbs@bbs.cis.nctu.edu.tw> wrote in message
news:3gHcdB$H1I@bbs.cis.nctu.edu.tw...
> 呵呵..不好意思,之前是為了強調Linux 上packet filter有"chain"
> 這個優點,而舉了的一些不相關的的例子. 我所要強調的是,
> ipchains 跟 iptables 對於3 個 default chain處理方式的不同,
> 除了效能的考量是一個因素,可是最主要的原因應該是對基本定義的不同.
> 因為基本定義的不同,才會去決定程式的寫作.
>
> ipchains (kernel 2.2.x)
> input: 只要packet流入某張網路介面都會受到 input chain的審核
> ouput: 只要packet流出某張網路介面都會受到 output chain的審核
>
> 所以在許多的情況之下,封包都很可能同時會被 input, forward, output chain所
match.
> 那我們只要在某個default chain裡設下deny rule便可以有效果,那會一個封包為何
要受到
> 這麼多的default chain的審核呢?? 我個人認為這絕對不是因為這樣程式才好寫,而
是決定
> 於三個default chain 的定義上才會有這種結果.
>
>
> 那後來,被人質疑,為何一個packet要同時受到這麼多個default chain的審核,不但使
用者
> 容易混淆,且效率也會不好. 所以才會對default chain重新定義. 改寫code.
>
> iptables (netfilter)
> input: 只要packet 是送往local process,都會受到input chain的審核
> ouput: 只要packet 是local process送出的,都會受到ouput chain 的審核.
>
> 其實您的論點是因為效能的考量,才導致封包上處理的不同.只是小弟認為是
> 因為最基本定義之不同,才會有處理上的不同.
>
>

不好意思﹐剛纔回去重讀了 Joester 兄的文章﹐的確非常佩服您的高見﹗
您說的沒錯﹐只是大家都繞了一圈又回到原來的地方了。 :)

或許﹐您所說的“許多人不了解”應該是“許多人不理解”吧﹖
只有當您“了解” ipchains 對同一個封包所進行的“多餘”動作﹐
才會“不理解”為什麼那樣吧﹖

哈哈﹐看來弟這裡也是鑽牛角尖了﹐恕罪恕罪~~~

無論如何﹐受 Joster 兄教了﹐謝謝﹗


--

WAN網 <12tw@ctw.tw> wrote in message news:9d8fij$1lcla$1@news.ht.net.tw...
> 我有一個問題喔
> 在router上每個介面都有分in out
> 那麼我要說
> a-c    a為if0與if1的in
> c-a    c為if1與if0的in
> a-c    a為if0與if1的out
> c-a    c為if1與if0的out
> 也就是一個封包每經過一個介面就有in和out
>
> ???????????????????????????
>
> 哇-----鑽牛角間了
>

鑽得好啊~~~  :)

[a] --- if0[b]if1  ---[c]

如果您指的是封包從 b 丟到 if 的時候﹐在 ipchains 或 iptables 上看來﹐沒有分
那麼細啦。
從哪個 if 進入的就屬於 input﹐從哪個 if 出去的就屬於 output。
請問﹐如果您硬要這細樣分﹐有什麼好處呢﹖可以提出來和大家談談。
不過﹐我相信 Rusty Russell 的頭腦應該不會被我們笨就是了﹐
從 ipchains 到 iptables 的轉變﹐就可見一斑。

如果您不指上面的﹐那我想問﹕

a->c 的封包﹐如何作為 if1 的 in 呢﹖又如何會成為 if0 的 out 呢﹖
c->a 的封包﹐如何從 if0 那邊 in 呢﹖又如何從 if1 那邊 out 呢﹖

要解答這樣的問題﹐先問一下﹕
a->c 的封包是從哪裡送出來的﹖又要送到哪裡去﹖所經過的路由如何﹖
c->a 的封包是從哪裡送出來的﹖又要送到哪裡去﹖所經過的路由如何﹖

如果您能告訴我﹕
1) a->c 的封包經過怎樣路由後從 if1 送進 b 然後從 if0 送出去﹖
2) c->a 的封包經過怎樣路由後從 if0 送進 b 然後從 if1 送出去﹖

那我們再來討論好了。

--


 
----- Original Message -----
From: Tony <kaola7@ms32.hinet.net>
To: netman <netman@study-area.net>
Sent: Wednesday, May 09, 2001 4:16 PM
Subject: 想請教一些ipchains的觀念

netman大人你好,最近看到BBS上再討論ipchains
覺得你對這方面十分有研究,希望你能幫幫我釐清
一些ipchains的觀念。

                  eth1     eth0
 192.168.0.1/24      aaa.bbb.ccc.ddd/32
 
請注意﹕在封包過濾中﹐要是指單一 IP 的話﹐不能用 24 bit﹐只能用 32bit﹐除非您改成﹕192.168.0.0/24 來指一個 IP 範圍。

請問一下我現在想要設定內部網路,只可使用telnet,ftp,email,www,dns,ssh這幾個服務,本機中無任何服務
還有一些特定的windows程式,會經由win98的port10000連結到對方主機7000,我是不是可以如下設定

☆設定一:拒絕所有類型封包
ipchains -P input DENY
ipchains -P output DENY
ipchains -P forward DENY


☆設定二:啟動封包轉送
之前看了BBS上討論Ipchians的文章時,有討論到input及output,
我也有相同的困擾,就是在TCP 3way shaking時不是先從本地隨機選一個port(2000)
和對方特定的port(如http80)連結,如果這個隨機的port沒被佔用,就開始
用這個port(2000)傳遞資料。在設定ipchains的時候,我有看到兩種設定法
 其一,ipchains -A forward -p tcp -s 192.168.0.0/24 -d 0.0.0.0 80 -J MASQ
       ipchains -A forward -p tcp -s 192.168.0.0/24 -d 0.0.0.0 25 -J MASQ
       ipchains -A forward -p tcp -s 192.168.0.0/24 -d 0.0.0.0 21 -J MASQ
       ipchains -A forward -p tcp -s 192.168.0.0/24 -d 0.0.0.0 53 -J MASQ
       ipchains -A forward -p udp -s 192.168.0.0/24 -d 0.0.0.0 53 -J MASQ
       ipchains -A forward -p tcp -s 192.168.0.0/24 10000 -d 0.0.0.0 7000 -J MASQ
   (如果有多人要用,port10000不就被佔掉,還是沒關係??)
 
這個我也不確定﹐不知道機制是如何建立的。通常使用固定 port 的都屬於 service﹐或是需要從對方建立回來的連線。

   
  想問一下,是不是這樣的寫法,就代表我上述講的讓特定服務用>1024的port溝通
  所以也不必設定input及output DENY,只要在input設定檔一些icmp等封包就可以
  這樣的設定是否較為有效率?因為若不設定轉送救無法讓封包通過?感覺起來好像
  比較接近iptable的觀念?可以幫我解釋一下嗎?
 
如果按您上面那樣將 input 和 output 都 DENY 掉了﹐雖然在 forward 裡面已經使用了 MASQ﹐但如果沒有其它 input 和 output 的 ACCEPT﹐封包還是沒辦法通過。請參考我們在 BBS 上的討論文章。要記住一點﹐如果 default policies 都設為 DENY﹐在 ipcchains 中﹐符合規則的封包必須同時獲得 input﹐output 的 ACCEPT 以及 forward 的 ACCEPT 或 MASQ ﹐才能通過 firewall 。如果在 iptables﹐則非本機的封包﹐只需被 forward 規則 ACCEPT 或 MASQUERADE 就可以了。
 

  另外想問一下請問這樣的封包轉送是雙向的嗎?也就是說由內到外及由外到內都可以嗎?
 
一個封包的傳送是單向的﹐但一個連線卻是雙向的。連線是否能建立﹐先要看封包是否能成功路由﹐再看封包是否能穿越防火牆﹔封包是否能穿越您的防火牆﹐則看您的 firewall 怎麼設定。但如果內部用私有 IP 的話﹐從外面連進來的機會不大﹐因為外面無法路由﹐除非對方有辦法將路由一直指到您的 gateway 上。

  還是只能從由內到外呢?如果是雙向的,那不就很危險,因為若區域網路有服務,只要他
  知道IP,不就慘了,還是說這可以用防止IP詐騙檔掉?
 
所謂的 IP 詐騙﹐是指對方修改了封包的 source 或 destination 位址﹐讓封包能穿過防火牆的規則。等我們談到下面的 three-way handshack 再回來討論。
 
但如果只能從由內到外,那封包傳
  回時若沒有設定不就不能通過?
 
對啊﹐準確的說﹐是對方傳回來的封包﹐而不是原來的那個封包傳回來。
 
那要如何傳回Client呢?還是說這就是ipchain的機制,
  會記錄來源ip:port,等回來時再傳回?那這和socks的防火牆不就相同了嗎?
 
是否和 socks 一樣﹐我不清楚﹐但 MASQ 是會建立記錄來記下封包的來源 socket ﹐然後將之改寫﹐換成 firewall 自己的 socket 再送﹐請參考後面的敘述。
 
如proxy先由
  3128出去,待取回時再還給特定的ip??
 
不對﹐proxy 服務和封包改寫不同。proxy 會針對服務進行處理﹐例如 HTTP 和 FTP 等。 client 送來的請求到達 port 23128 之後﹐proxy 會根據目的 socket 建立自己的連線請求﹐然後將回應結果處理後再送回 client。但在封包改寫機制裡面﹐NAT 不管您用什麼 service﹐單純的修改 socket 就好了﹐處理的僅是封包。所以﹐理論上可以讓 client 獲得完全的連線能力。但對於一下特殊的服務﹐例如 ftp ﹐需要再從外面建立連線請求回來的﹐就要用 passive 或模組來處理了。(這部份﹐請您再仔細看看我的網頁“架設 NAT”)
 
像這樣的機制中,看到你的版上有貼限制syn封包
  進入,也就是說只有syn+ack的封包才能進入,我是不是可以用下列規則檔掉
  ipchains -A input -p TCP -i eth0 ! -y -s 0.0.0.0 -j ACCEPT    
這裡不能說要擋掉帶 syn 的封包﹐而是說﹕只允許不帶 syn 的封包通過而已哦。如果您將規則改為﹕
ipchains -A input -p TCP -i eth0 -y -s 0/0 -j DENY
那才是擋掉帶 syn 的封包。
 
仔細想想看﹐兩者有什麼不同﹖不過要小心使用 DENY﹐因為﹐或許別的連線還需要 ACCEPT 帶 syn 的連線﹐而不小心寫在這行之後﹐則會造成失敗。
再仔細看您規則﹐您一定要確定 eth0 是連接外部網路的界面﹐才能過濾掉來自外面的封包。
 
好了﹐這時候再看看前面談到的 IP 詐騙﹐如果對方直接偽造一個 socket 試圖連進內部的網路(前提是路由允許的)﹐假如用上面的兩條規則之一﹐還是可以攔下來(只要不在更前面的規則 ACCEPT 進來的話)。但﹐如果對方能夠完全的偽造一個已經 established 的外部連線的 socket ﹐也就是說﹐連線是從內部建立﹐而且對方的 port 就算隨機產生的也能準確的偽造。能否通過過呢﹖
 
答案還是不肯定的﹐因為在 TCP 封包裡面﹐還需要 sequence number 和 acknowledgement number ﹐還有封包的其它序號和除錯機制﹐來檢測連線的狀況﹐還有資料封包本身需要攜帶程式所需要的正確資料(因為這不是一個初始連線)﹐如果偽造封包不能正確的偽造下一個 expected 封包所有元素﹐就算能通過 firewall 還是沒辦法和裡面的機器連接得上(某些防火牆軟體還能針對這些元素來進行封包過濾)。
 

 其二,讓所有封包都可轉送再限制input, output
 
不對﹐在 ipchains 裡面﹐就算允許了 forward﹐在 input 和 output 上是要得到允許才能通過﹐不管您如何限制其規則。

       ipchains -A forward -p all -s 192.168.0.0/24 -d 0.0.0.0/0 -j MASQ
       ipchains -A input  -i lo -j ACCEPT
       ipchains -A output -i lo -j ACCEPT
       #讓內部(eth1)封包通過
       ipchains -A input  -i eth1 -j ACCEPT
       ipchains -A output -i eth1 -j ACCEPT
       #防止外部IP(eth0)詐騙
       ipchains -A input -i eth0 -s 192.168.0.0/24 -j DENY
       ipchains -A input -i eth0 -s 127.0.0.1/32 -j DENY
       #開啟提供連線服務
       #讓SSH Client可以連出去

                        eth1             eth0                            遠端
         192.168.0.1/24        aaa.bbb.ccc.ddd/24           port:22
                      port:1500/2000

  這裡有點搞不太清楚,就是有關3way shaking,因為開的port不固定,所已有可能是
  port1500或2000想請問一下,這裡該如何設定呢?我是不是只要設定destination port
  就可以了,如
  ipchains -A input -i eth1 -p TCP -s 192.168.0.0/24 1024:65535 -d 0.0.0.0 22 -j ACCEPT
  ipchains -A output -i eth0 -p TCP -s aaa.bbb.ccc.ddd/32 1024:65535 -d 0.0.0.0 22 -j ACCEPT
 
怎麼到了 output 的時候又變成 aaa.bbb.ccc.ddd/32 了﹖只有一個可能﹕
您的 forward 規則是這樣寫的﹕
ipchains -A forward -p TCP -s 192.168.0.0/24 1024:65535 -d 0/0 22 -j MASQ

        那回來的封包怎麼辦?是向下面這樣嗎?覺得有點不太清楚ipchains的運作,看過你網站上的資料
  及書籍介紹,都滿片段的,希望你能為我解說一下,謝謝!
 
 
或許﹐您可以到如下聯結看看﹐然後選擇上面的‘N ’﹐關於 NAT 的一些討論(雖然其中或有錯誤﹐小心就是了)。

  ipchains -A input -i eth0 -p TCP -s 0.0.0.0/0 1024:65535 -d aaa.bbb.ccc.ddd/32 1024:65535 -j ACCEPT
 
應改成﹕
ipchains -A input -i eth0 -p TCP -s 0/0 22 -d aaa.bbb.ccc.ddd/32 1024:65535 -j ACCEPT

  ipchains -A output -i eth1 -p TCP -s aaa.bbb.ccc.ddd/32 1024:65535 -d 192.168.0.0/24 1024:65535 -j ACCEPT
應改成﹕
ipchains -A input -i eth0 -p TCP -s 0/0 22 -d 192.168.0.0/24 1024:65535 -j ACCEPT
 
嗯﹐看來您還不是很明白 MASQ 的運作細節﹐或許可以參考這樣的例子﹕
 
1) 一個封包從內部 sokcet﹕1.2.3.4:1025  到遠端 socket﹕4.3.2.1:22 ﹔
2) 被送到NAT 進行 MASQ 處理之後﹐將來源端 socket 換成其自己的外部 socket ﹕4.3.2.254:2001﹐然後將這個動作記錄起來﹕
1.2.3.4:1024 vs 4.3.2.254:2001
3) 但遠端 socket 則沒改變﹐這樣當遠端收到這個封包的時候﹐會發現來源 socket 為﹕4.3.2.254:2001﹐
然後﹐處理完送出回應封包﹐會將來源 socket 和目的地 socket 掉換一個位置﹕
來源 socket 為 4.3.2.1:22  ﹔目的 socket 為 4.3.2.254:2001
4) 當封包抵達 NAT 的時候﹐NAT 會檢查其 MASQ 記錄﹐發現 4.3.2.254:2001 原來是從 1.2.3.4:1025 改來的﹐
於是進行 DEMASQ ﹐再將這個封包的目的 socket 換回 1.2.3.4:1025 。
5) 當封包到達內部主機的時候﹐它根本就不知道 NAT 做了什麼手腳。
 
好了﹐請想想為什麼我將您上面那兩行改了﹖

感謝你看完這封信,期待你能幫我解決心中的疑問。
不客氣﹗我希望這些說明對您的理解有幫助。
 
 
----- Original Message -----
From: Tony <kaola7@ms32.hinet.net>
To: Netman <netman@study-area.net>
Sent: Thursday, May 10, 2001 7:52 PM
Subject: Re: 想請教一些ipchains的觀念

Dear NETMAN大大:
        非常謝謝您的回答,我去翻了一下TCP/IP及防火牆的書,整理了一下,用一個實例來和您請教,
        分為兩大部分,第一部份就防火牆規劃,第二部分就防禦攻擊來和您討論


    第一部份:
            Telnet服務連結外部主機
                                         
                                            1                                  2                                            3
                       內部                            eth1                                eth0                              外部
                 192.168.0.0/24                192.168.0.254                 aaa.bbb.ccc.ddd/32
                                            6                                  5                                           4                                                       

一個完整的連結封包應該總共會走這六個地方

                  服務方向            來源                       目的                  來源阜                目的阜                   規則
    封包1          出去          192.168.0.1          192.168.0.254               1025                       23                      INPUT
    封包2        改寫封包      將192.168.0.1:1025改寫為aaa.bbb.ccc.ddd:2000                                            FORWARD
    封包3          出去        aaa.bbb.ccc.ddd              外部                     2000                      23                      OUTPUT
    封包4          進入               外部      aaa.bbb.ccc.ddd                         23                      2000                   INPUT
    封包5     改寫封包      將aaa.bbb.ccc.ddd:2000改寫為192.168.0.1:1025                                               FORWARD
    封包6         進入          192.168.0.254       192.168.0.1                       23                       1025                  OUTPUT


我首先想問一下,在BBS上看到有些INPUT或OUTPUT並未指定網路裝置,這樣ipchains怎會知道封包是從eth0還是
eth1進出,設定上應該比較容易搞混吧!至於FORWARD看到您在BBS上的留言,似乎是不管封包2或封包5皆須設定
但看您回我的信裡,感覺起來IPCHAINS本身就有這機制,只要設定封包2的規則就好,不知這樣說對嗎?
 
唉﹐我真沒話可說了﹐我明明在 “架設 NAT”的文章是這樣說的﹕
**********
如果指定界面 (-i )﹐所謂 input 就是從該界面傳入主機的封包﹐所謂 output 就是從該界面傳出去的封包。如果沒有指定界面﹐則泛指從所有界面 傳入(input) 或 傳出(output) 的封包。
**********
 
這篇文章不知道您看得太快還是根本沒看呢﹖我很建議您仔細看看啦。


 ☆設定一:拒絕所有類型封包
 ipchains -P input DENY
 ipchains -P output DENY
 ipchains -P forward DENY

 #我會想這樣設定是因為我要檔木馬程式及一些我不想讓區域網路使用的特定服務
 
非常正確﹗設定防火牆本應該要有這樣的危機意識﹐只不過這要求您對所有規則﹐以及它們的處理順序瞭如指掌才行﹐難道當然更高。
 
 接下來,我想就個別封包來討論,首先應該先讓lo封包通過對嗎?
 ipchains -A input -i lo -j ACCEPT
 ipchains -A output -i lo -j ACCEPT

 封包1,資料從區域網路流至eth1所以應該設定
 ipchains -A input -i eth1 -p TCP -s 192.168.0.0/24 1024:65535 -d 0/0 23 -J ACCEPT
 
注意 -J 是小寫﹐如下同。
 
 封包2,進行FORWARD
 ipchains -A forward -p TCP -s 192.168.0.0/24 1024:65535 -d 0/0 23 -J MASQ

 封包3,資料從eth0 流出INTERNET
 ipchains -A output -i eth0 -p TCP -s aaa.bbb.ccc.ddd/32 1024:65536 -d 0/0 23 -J ACCEPT
  這裡就有點不太明白source要如何設定了,還是不用設定呢?此外,關於您所回答我的答案
  是不是就是這這個意思呢?還有別種寫法嗎?
 
你設的沒錯﹐因為在forward 的時候已經改為 aaa.bbb.ccc.ddd 的位址了﹐如果繼續使用 192.168.0.0/24 就不行。

 封包4,資料從INTERNET留回eth0
 ipchains -A input -i eth0  -p TCP -s 0/0 23 -d aaa.bbb.ccc.ddd/32 1024 1024:65535 -J ACCEPT
 
第一個 1024  不必了吧﹖

 封包5,回復原來封包
 是不是不用設定??
 
不用﹐NAT 有自己的記錄﹐如果設了您就糟糕了﹐別人可以從外面的 port 23 連進來(如果 input 和 output 沒限制的話)﹗

 封包6,資料留回區域網路
 ipchains -A output -i eth1 -p TCP -s 0/0 1024:65536 -d 192.168.0.0/24 1024:65536 -J ACCEPT
 
不對﹗應該是 -s 0/0 23 ﹐因為回來的改寫是改寫回應封包的 destination socket ﹐而回應封包的 source socket 沒變啊。還好您的 input 和 forward 有限制﹐要不等對外面開發所有的 hi port 了﹗

 不曉得上述的規則有無錯誤,敬請指教。還是我觀念有錯誤,或設定得太複雜??

 
 第二部份
 至於SYN封包的阻擋,在3way handshake的過程中,要建立連結時,會帶只有SYN的封包,
 而回復此封包時,會帶SYN+ACK1的封包,往後都會帶ACK封包,因此我想要確定此封包是由
 內部主動連結的,而不是外部丟過來的,最簡單的方法,應是檢查ACK,看是否為1,順便提
 
對﹐理論如此﹐我也不知道為什麼 ipchains 沒設 ack bit﹐不過 iptables 有改進過來啦。

 一下您回答我的問題,就算對方偽造一個socket,試圖穿越防火牆(這就是IP詐騙的意義?)
 
對啊﹐要不你是怎麼理解的﹖

 連結進來,其實這樣的封包是無效的,因為本機會檢查sequence number,就會發現找不到
 sequence為0的封包而丟棄此封包,不曉得您的意思是不是這樣??
所以我有辦法直接對封包 檢查ACK嗎?因為如果檔SYN,第二個封包會收不到,要如何才能確定呢?
 
升級到 iptables 吧。

 另外關於封包詐騙,因該是說1.宣稱為內部封包192.168.0.0/24或2.試圖穿越防火牆規則,
 這兩個其實也是一樣道理,就是要進入內部網路,可是我有個疑問,如果向我上述那樣設定,
 需要設定ipchains檔掉這類的攻擊嗎?因為預設是DENY,不符規則的就檔掉,還是也要設定
 ipchains規則於eth0上,防止他宣稱為內部網路???
 
如果您沒對 sync 限制呢﹖外面不是可以建立連線了嗎﹖要從通盤的規則來考慮﹐相信您應該有體會才對。
但你不能在 eth0 的 output 上擋掉 -s 192.168.0.0/24 的封包﹐因為那樣連 NAT 自己進來的封包都無法通過。但根據 first match 原則﹐您一定要 DENY 的話﹐那就在這行規則之前執行﹕
ipchains -A ouput -i eth0 -s 192.168.0.254 -d 192.168.0.0/24 -j ACCEPT。
 
不過﹐我認為沒必要這樣龜毛﹐只要其它界面的 input 和 forward 做好就沒問題。


 PS,謝謝您看完我的文章,也請您回答我的問題,若不嫌棄,在和您討論完相關問題時,
     可否請您收於您的網站,嘉惠後者??因為感覺這類的文章不太多。謝謝!至於上次
     所提的一些其他觀念,還在研究中,待研究出來在與您討論。
 
嗯﹐我正有整理之意﹐連同上次在 bbs 上的討論。其它的﹐希望您能好好消化一下﹐也希望能仔細閱讀和思考。
 
祝學習愉快﹗