觉得iptable脚本真没必要那么规范

发表于:2007-07-04来源:作者:点击数: 标签:
做NAT时候觉得--网上好多脚本是不是规范的多余了 没自定义链的情况下iptables-X没必要写 -Z清零的话个人认为是要IPTABLESSAVE了之后才用 根本就没想DORP三链的话,下面不用写 iptables-PINPUTA CC EPT iptables-POUTPUTACCEPT iptables-PFORWARDACCEPT 下面

做NAT时候觉得- -网上好多脚本是不是规范的多余了
没自定义链的情况下iptables -X没必要写
-Z清零的话个人认为是要IPTABLES SAVE了之后才用
根本就没想DORP三链的话,下面不用写
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
下面三条最没必要写- -(泻特,难道默认的是DROP?)
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT
说实话,对-P真是不理解,它是要不符合规则的包强制使用策略----就是你后面注明DROP和ACCEPT的包。。。但是如果设定为ACCEPT的话,默认都是ACCEPT的,还有必要着重强制一下
对于INPUT链的安全问题,也不用在开头就-P INPUT DROP了
等你把LO、$LAN和其他端口、ESTABLISHED都ACCEPT后再, -A INPUT DROP是一样的效果(反之也行),对单独做NAT的机器来说,$LAN(局网)都没必要ACCEPT,转发又不靠他,MRTG的话lo ACCEPT就够了- -万一你内网比外网还凶险的话,ACCEPT岂不是得不偿失,我们这就是,网吧,天天一大群大虾在下面扫你,看见有什么开着就动歪脑筋,OH MY GOD~
还有modprobe,这玩意的写法怎么从LINUX7.3开始就没变过,唉~
纯属菜鸟一番牢骚- -因为最近做NAT不停的兢兢业业按格式写脚本,打了N多份了,越大速度越不理想- -人都要崩溃了,最后居然是自己随手写的一个最不正规的脚本效果最好- -昏倒。。。。。。。

 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
哎,学不过来了

原文转自:http://www.ltesting.net