platinum 回复于:2005-03-24 07:23:29 |
[quote:f485fa2c34="ht11"]做NAT时候觉得- -网上好多脚本是不是规范的多余了 没自定义链的情况下iptables -X没必要写 -Z清零的话个人认为是要IPTABLES SAVE了之后才用 根本就没想DORP三链的话,下面不用写 iptables -P INPUT ACCEPT ipta..........[/quote:f485fa2c34] 你考虑问题太简单了 [code:1:f485fa2c34] 下面三条最没必要写- -(泻特,难道默认的是DROP?) iptables -t nat -P PREROUTING ACCEPT iptables -t nat -P POSTROUTING ACCEPT iptables -t nat -P OUTPUT ACCEPT [/code:1:f485fa2c34] 这种东西看似没用,实际上是最严谨的写法,是可以让各种环境下的系统都可以正常运行脚本的意思,因为你无法猜测这个系统当前的默认规则到底是ACCEPT还是DROP 还有modprobe,为什么要这么写? 我只加载ip_nat_ftp和ip_conntrack_ftp,为什么? 我不加载其他的模块,比如ipt_MASQUERADE、ip_conntrack,为什么? /lib/modules/<version>/modules.dep又是做什么用的? 呵呵 |
網中人 回复于:2005-03-24 07:31:31 |
是的, 我認同 platinum 兄的說法. 那些設定大都為了照顧不同的環境, 因為你不確定執行 script 之前是怎樣設的. 不過, 若是在 redhat/fedora 系統裡, 我都是在 script 裡加一行 /etc/rc.d/init.d/iptables stop 將環境 reset 後再加新的規則. 不過, 樓主說的也不無道理. 道理在於指出了很多人或許不求甚解, 只會找著別人寫好的例子硬套, 而沒去按實際情形來調整. 強烈建議先搞懂原理以及每一行的意思, 再來使用 script 不遲. |
ht11 回复于:2005-03-24 14:35:50 |
[quote:8fafedf287="platinum"] 还有modprobe,为什么要这么写? 我只加载ip_nat_ftp..........[/quote:8fafedf287] 菜鸟不怕答错,有收获就行。加载模块- -环境centos3.4,lsmod的话,这些模块几乎都有,只不过后面注释不同罢了,就拿ip_nat_ftp来说后面标明used为0,也就是依赖它的核心模块为0,所以后面[]里标注的为unused,再比如其他诸如ip_tables的模块,used都为几个,具体依赖的核心模块在后面的[]里都有,至于还有类似8139too之类的驱动模块,后面的[]依赖一般都是antouclean,我视为根据环境自动移除~ 不知道这么回答有错否,偶手头上的资料只告诉了我这些,当然自己心里也没有底~明天把modprobe ip_nat_ftp注释掉,看下面的机器是否能正常上FTP就能清楚了 |
platinum 回复于:2005-03-24 14:41:08 |
是这样 ipt_REDIRECT ipt_MASQUERADE ipt_LOG ipt_state iptable_nat ip_conntrack ip_tables 等等这些模块都会在使用iptables的时候自动加载,所以没必要手动modprobe 比如 当你-j MASQUERADE的时候,ipt_MASQUERADE会自动加载 当你-m state的时候,ipt_state会自动加载 当你-j DNAT或者SNAT的时候,iptable_nat会自动加载 但是,ip_conntrack_ftp和ip_nat_ftp比较特殊 |
ht11 回复于:2005-03-24 14:48:03 |
[quote:4cd336a45f="platinum"]但是,ip_conntrack_ftp和ip_nat_ftp比较特殊[/quote:4cd336a45f] 绝对支持,同时愿闻其详,为这个我也很困惑,因为在modprobe这两项前后我都lsmod过,而且看到的结果都一样- -但是有很多朋友,就是没modprobe它们而无法通过地址转换连上公网的FTP,郁闷,感谢白金!!~ |
platinum 回复于:2005-03-24 15:03:50 |
[quote:f28ba51705] 在modprobe这两项前后我都lsmod过,而且看到的结果都一样 [/quote:f28ba51705] 你先service iptables stop,然后lsmod确保里面没有模块 接着再执行你自己的防火墙shell试试? |
網中人 回复于:2005-03-24 15:11:41 |
platinum 兄還是幫大家解釋一下 ftp 的 passive mode 與 active mode 吧. 然後再來說那兩個 ftp modules 幹嘛用的, 自然好理解. |
ht11 回复于:2005-03-24 15:12:17 |
[quote:690fc4723c="platinum"] 你先service iptables stop,然后lsmod确保里面没有模块 接着再执行你自己的防火墙shell试试?[/quote:690fc4723c] 哦,那如此看来网中人所说的在 script 裡加一行 /etc/rc.d/init.d/iptables stop 將環境 reset 後再加新的規則不是多余的,回家了拿家里的机器试~HOHO~~ |
JavaJing 回复于:2005-03-24 15:24:52 |
modprobe这个模块使用起来不是那么习惯。 |
網中人 回复于:2005-03-24 15:33:46 |
modprobe 其實也是跑 insmod 而已. 只是 modprobe 會聰明的將相依存的必需 modules 也一並 insmod 進來. 就這麼簡單, 沒啥習不習慣的問題. 至於 modules 被載入後, 如何拔除, 則看系統的 module 管理了. 我不確定 iptables stop 後, 會否自動 rmmod 啦. 既然有人去測, 那我們就等結果好了... |
platinum 回复于:2005-03-24 15:38:43 |
[quote:abb6ebf8ec="網中人"]platinum 兄還是幫大家解釋一下 ftp 的 passive mode 與 active mode 吧. 然後再來說那兩個 ftp modules 幹嘛用的, 自然好理解.[/quote:abb6ebf8ec] 摘抄自 http://www.study-area.org/linux/servers/linux_nat.htm#ftp 请参考 http://www.study-area.org/linux/servers/linux_nat.htm#ftp [quote:abb6ebf8ec] 在正常模式下﹕ 1、FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21請求連線。當順利完成 Three-Way Handshake 之後﹐連線就成功建立﹐但這僅是命令通道的建立。 2、當兩端需要傳送資料的時候﹐client 透過命令通道用一個 port 命令告訴 server ﹐客戶端可以用另一個高於 1024 的 port 做數據通道﹐並準備好 socket 資源。 3、然後 server 用 port 20 和剛才 client 所告知的 socket 建立數據連線。請注意﹕連線方向這是從 server 到 client 的﹐TCP 封包會有一個 SYN 旗標。 4、然後 client 會返回一個帶 ACK 旗標的確認封包﹐並完成另一次的 Three-Way Handshake 手續。這時候﹐數據通道才能成功建立。 開始數據傳送。 在 passive 模式下﹕ 1、FTP client 開啟一個隨機選擇的高於 1024 的 port 呼叫 FTP server 的 port 21請求連線﹐並完成命令通道的建立。 2、當兩端需要傳送資料的時候﹐client 透過命令通道送一個 PASV 命令給 server﹐要求進入 passive 傳輸模式。 3、然後 server 像上述的正常模式之第 2 步驟那樣﹐挑一個高於 1024 的 port ﹐並用命令通道告訴 client 關於 server 端用以做數據通道的 socket。 4、然後 client 用另一個高於 1024 的 port 呼叫剛才 server 告知的 scoekt 來建立數據通道。此時封包帶 SYN 標籤。 5、server 確認後回應一個 ACK 封包。並完成所有交握手續﹑成功建立數據通道。 開始數據傳送。 [/quote:abb6ebf8ec] 以下是我的理解 主动模式 server client 数据 命令 数据 命令 20 21 xx yy | | | | | |<----yy-----| | | |--- yyok--->| | |<---|------------|--->| | | | | 被动模式 server client 数据 命令 数据 命令 zz 21 xx yy | | | | | |<--被动?---| | | |--- zzok--->| | |<---|------------|--->| | | | | 另外一点心得 假设A是CLIENT,B是SERVER A->B,都没有防火墙,可以使用主动、被动模式 A->B,B有防火墙,B需要加载ip_conntrack_ftp A->B,A通过NAT出去,B有防火墙,B需要加载ip_conntrack_ftp,同时如果A的网关是LINUX系统,还必须加载ip_nat_ftp |
ht11 回复于:2005-03-24 15:39:36 |
[quote:238e83847e="網中人"]modprobe 其實也是跑 insmod 而已. 只是 modprobe 會聰明的將相依存的必需 modules 也一並 insmod 進來. 就這麼簡單, 沒啥習不習慣的問題. 至於 modules 被載入後, 如何拔除, 則看系統的 module 管理了. 我不..........[/quote:238e83847e] 这样一说。我倒觉得晚上有必要装个全新的centos看看了- -THX~ |
ht11 回复于:2005-03-24 15:42:16 |
[quote:fa57d29fea="platinum"] 以下是我的理解 主动模式 server client 数据 命令 数据 命令 20 21 xx yy | | | | | |<----yy-----| | | |--- yyok-..........[/quote:fa57d29fea] 受益~严重感谢 |
ht11 回复于:2005-03-24 18:37:25 |
结果出来了,iptables stop确实可以让所有与iptables脚本有关的模块移出- -只剩下几个驱动模块了- -不得不对白金说佩服(毕竟是老江湖了),反复iptables stop和lsmod后。得出结论。只要你做的NAT脚本是正确的,如果你没modprobe任何模块的话。系统会自动载入 ip_tables iptable_filter ip_conntrack iptable_nat ipt_state ipt_MASQUERADE 要加载的模块真的只要ip_nat_ftp和ip_conntrack_ftp了 谢谢白金和网中人 |
skylove 回复于:2005-03-26 13:41:45 |
有空看看内存是否有泄露?? 我记得以前调试某个模块的时候,多移出/载入几次,系统就开始慢...到最后不报告错误,但是整个系统就相当慢了...象类似的模块载入第一次是无问题的. |
glider126 回复于:2005-03-29 14:38:39 |
请问:ip_nat_ftp和ip_conntrack_ftp 这2个模块各自是干什么的? 我的理解(呵呵,菜鸟理解): ip_nat_ftp 是用在nat中控制ftp连接的 ip_conntrack_ftp 检查ftp的控制连接中的状态的 ip_conntrack_ftp被ip_nat_ftp调用。 看来有空还是用做试验~~~ |
網中人 回复于:2005-03-29 15:22:36 |
在做試驗之前, 可先用所學的基礎來論證一下, 將更有助理解. 首先要理解前面 platinum 兄貼的說明, 也就是關於 ftp 的兩種連線模式. 然後再來區分出 port command 的內容是在 ftp packet 內的, 而不是記錄在 tcp/ip header 內. 當我們的 firewall/nat 在沒有 modules 幫忙的情況下, 只會檢查及修改 tcp/ip header 的內容而不會去理會 ftp packet 的內容. 如此, 在 ftp active mode 下, 當來自 ftp server port 20 的 NEW packet 到達 firewall/nat 時, 由於沒有連線記錄也沒預先開好的規則讓 packet 通過, 那這時 ftp-data channel 就會斷掉. 若有 ip_conntack_ftp module 的幫忙, firewall 還會對所有 port 21 相關的 tcp packet 展開查看裡面的 ftp packet. 如發現有 port command, 那可事先為這個 RELATED 連線開通規則, 讓 ftp-data packet 穿過 firewall . 然而 conntrack module 只是監控連線, 不會對 packet 做任何的修改. 這在 direct-routing 環境下的 firewall 就夠用了. 但是在 nat 環境下呢? 先讓我們看看 ftp packet 裡的 port command 所使用的 address : 是使用 nat 之後的外部地址還是 nat 之前的內部地址呢? 假如沒有 ip_ftp_nat module 的幫忙, 那肯定是使用 nat 之前的內部地址. 這樣, 請問另一端的 server/client 的 ftp-data packet 要送到哪裡去? 呵, 當然是送到內部地址去啦. 但, 這在 internet 上是行不通的. 或根本就送錯地方而遭 reset ! okay, 如此, 怎才能讓另一端的 packet 送回這端的外部地址? 且還能改回到正確的內部地址去呢? 答案呼之欲出---就是 ip_nat_ftp 要做的事情! |
glider126 回复于:2005-03-29 17:32:08 |
網中人,正是功力深厚! 谢谢你的讲解,这样的讲解比得到一个现成的iptables配置要好数倍。 很多时候很容易知道怎么做,可是很难知道为什么这么做。 诶~~ 功力不够,向 網中人 致敬! 先草草看了一遍你的讲解,90%理解,现在下班回家好好搞搞你所讲的内容。 万分感谢~~~ (conntrack module就是来看ftp的ftp-control channel里的port和passive的吧,只是监视作用,ip_ftp_nat通过调用conntrack看懂ftp的ftp-control channel里的ftp控制信息,然后ip_ftp_nat根据这些信息来打开相应的端口,让ftp的ftp-data channel穿过iptables) |
gydoesit 回复于:2005-03-31 18:28:19 |
我就从来没加载ftp这两个模块,似乎也从来没有问题.各位告诉我是怎么回事???? redhat9和fedora core3 |
kawengao 回复于:2005-03-31 18:59:05 |
[quote:af07ea6dc6="網中人"]在做試驗之前, 可先用所學的基礎來論證一下, 將更有助理解. 首先要理解前面 platinum 兄貼的說明, 也就是關於 ftp 的兩種連線模式. 然後再來區分出 port command 的內容是在 ftp packet 內的, 而不是記錄在 tcp/..........[/quote:af07ea6dc6] 谢谢! |
網中人 回复于:2005-03-31 23:02:08 |
[quote:4221ff2604="gydoesit"]我就从来没加载ftp这两个模块,似乎也从来没有问题.各位告诉我是怎么回事???? redhat9和fedora core3[/quote:4221ff2604] 離開環境與資訊, 無從"猜"起... 好歹, 你也畫個圖, 標一下 client, firewall/nat, server 的地址. 再將"完整"的規則貼上來. 若能抓幾個包來看就更好了.... ----p.s.---- 天空烏雲密佈, 一位司機在沒月亮也沒路燈也沒任何照明設備下, 開車傳越一條九曲十八灣的車道, 卻絲毫無損. 為甚麼? |
kecai_cale 回复于:2005-04-01 01:06:08 |
哎,学不过来了 |