![[ 永远的UNIX::UNIX技术资料的宝库 ]](/images/title.gif)
|
| 首页 > 系统管理 > 其它 > 正文 |
 |
| ipchains 的问题 |
| http://www.fanqiang.com (2001-06-04 18:08:00) |
小州 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
这样的封包永远是抓不到的因为来自 202.2.3.4 的封包不可能从 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
--
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
>
> --
>
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) 就完成了。
效率是明显的加快了
[ 馀下恕删 .... ]
--
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 哦)
嗯不知道这样说还有误导吗
--
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
To: netman
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 中符合规则的封包必须同时获得 inputoutput 的 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 的一些讨论(虽然其中或有错误小心就是了)。
http://www.study-area.net/tips/mail_fr.htm
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) 一个封包从内部 sokcet1.2.3.4:1025 到远端 socket4.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
To: Netman
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 上的讨论。其它的希望您能好好消化一下也希望能仔细阅读和思考。
祝学习愉快
(http://www.fanqiang.com)
进入【UNIX论坛】
|
|
| 相关文章 |
ipchains网卡设置菜鸟必读 (2001-09-27 08:00:00) ipchains的参数和使用 (2001-09-27 07:00:00) ipchains参数介绍 (2001-08-21 10:00:00) 为什么我用 ipchains 构建的子网里的机器不能用 ftp? (2001-06-20 08:10:00) ipchains 的问题 (2001-06-04 18:08:00) 怎样用ipchains构建防火墙 (2001-04-21 19:38:25) ipchains的工作流程 (2001-04-21 18:02:09)
|
|
|
|
 |
★ 樊强制作 欢迎分享 ★ |