⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 防火墙软件netfilter之包过滤技术.txt

📁 BBS的精华之处
💻 TXT
📖 第 1 页 / 共 2 页
字号:
  
--syn 
  
等同于--tcp-flags SYN,RST,ACK SYN (100) 
  
--source-port 或者 --sport 
  
描述源端口,要么用数字,用么用/etc/services文件中的名字。可以用m:n来表 
示一组端口。 
  
--destination-port 或者 –dport 
  
描述目的端口 
  
--tcp-option 
  
检查一个包是否有相应的tcp选项,如果没有的话,包将被drop掉。 
  
l TCP标记的一个解释 
  
有时候只允许一个单向的TCP连接。例如,你只需要访问外部的WWW的服务器,而 
不允许外部访问你内部的WWW服务器。朴素的方法是阻塞所有从你的服务器发出的 
包,但是TCP连接需要一个双向的交流。解决的方法是只需要阻塞请求连接的包。 
这些包叫做SYN包。通过阻塞这些包,我们可以达到上面的目的。 
  
标志—syn将被使用。他仅仅适用于TCP协议。例如: 
  

-p TCP -s 192.168.1.1 --syn 
  
这条规则描述所有从192.168.1.1发起的连接。 
  
l UDP扩展 
  
如果-u udp 被描述,所有扩展自动装载。他提供与TCP类似的选项--source-port, 
--sport, --destination-port, --dport。 
  
l ICMP扩展 
  
如果选项-p icmp被描述,所有的扩展自动装载。他只提供一个选项: 
  
--icmp-type 
  
看名字就知道是指类型,具体的名字参看-p icmp –help提供的帮助信息。 
  
l 其他匹配扩展 
  
这些选项可以用-m来启动。 
  
Mac 
  
这个模块可以用-m mac或者--match mac来启动。用于匹配输入包的MAC地址,因此 
之用于PREROUTING and INPUT chains。他只提供一个选项:--mac-source 
  
   例如:--mac-source 00:60:08:91:CC:B7 
  
limit 
  
可以用-m limit或者--match limit来启动。用于限制机器,如压缩log信息等等。 
  
Owner 
  
只用于output chain中,并且有些包没有owner(如icmp包),因而没有匹配。 
  
--uid-owner userid 包的产生进程的有效用户id等于userid 
  
--uid-owner groupid包的产生进程的有效组id等于groupid 
  
--pid-owner processid 包的产生进程的进程的id等于processid 
  
--sid-owner sessionid 包的产生进程的session id 等于sessionid 
  
unclean 
  
提供随机的安全检查 
  
l 状态匹配 
  
最有用的匹配规则是由状态扩展来提供的。因此推荐用模块ip_conntrack。描述 
-m state允许一个附加的—state选项。是一个逗号分开的状态列表,这些状态有: 
  
NEW 
  
包建立了一个新的连接 
  
ESTABLISHED 
  
包属于一个已经存在地连接 
  
RELATED 
  
一个包与某个连接有关,但是不属于这个连接。 
  
INVALID 
  
包无法定义,通常这些包会被drop 
  
  
  
11. 目标描述 
  
现在我们已经知道了怎么检查包,下一步就是决定对匹配的包做什么动作。这一 
步叫做规则的目标。 
  
两种基本的目标是DROP和ACCEPT。我们已经很清楚了。 
  
但是还有的目标:扩展、用户定义的chains。 
  
  
  
用户定义的chains 
  
iptables从ipchains继承的一个重要的特性就是用户可以自定义新的chains(除 
了3个内建的INPUT, FORWARD和OUTPUT)。 
  
当一个包在用户定义的chain中进行规则匹配时,将遍历chain中的所有规则。直 
到找到匹配。 
  
下面考虑两个2个chain:INPUT(内建)、test(用户定义)。 
  
         `INPUT' `test' 
        ---------------------------- ---------------------------- 
        | Rule1: -p ICMP -j DROP | | Rule1: -s 192.168.1.1 | 
        |--------------------------| |--------------------------| 
        | Rule2: -p TCP -j test | | Rule2: -d 192.168.1.1 | 
        |--------------------------| ---------------------------- 
        | Rule3: -p UDP -j DROP | 
        ---------------------------- 
假设一个包来自192.168.1.1,其目的地址是1.2.3.4。他首先进入INPUT chain, 
规则1不匹配。规则2匹配并且其目标是test,因此下一个检查的规则是test的第 
一个规则。规则1匹配,但是没有描述目标,因此规则2被检查。规则2不匹配,到 
达chain的末尾。于是返回INPUT 
chain,这里我们已经检查过规则2,于是检查规则3,不匹配。因此包的检查路径是: 
  
                                v __________________________ 
         `INPUT' | / `test' v 
        ------------------------|--/ -----------------------|---- 
        | Rule1 | /| | Rule1 | | 
        |-----------------------|/-| |----------------------|---| 
        | Rule2 / | | Rule2 | | 
        |--------------------------| -----------------------v---- 
        | Rule3 /--+___________________________/ 
        ------------------------|--- 
                                v 
用户定义的chains也可以把目标设为用户定义的chains。但是不要形成环。 
  
  
  
Iptables的扩展:新的目标 
  
新的目标包括一个内核模块和一个可选的扩展选项(新的命令选项)。在netfilter 
的发行版本中有下面的几个扩展: 
  
LOG 
  
这个模块使得内核可以记录匹配的包的日志。 
  
REJECT 
  
这个模块基本等同于DROP,但是有一点不同。发送方将送出一个ICMP报文: 
“port unreachable”。注意以下情况不发送: 
  
l 被过滤的包本身是一个ICMP差错控制或未知报文; 
  
l 第二块及以后的分片 
  
l 最近已经送出了许多ICMP差错控制报文到那个目标 
  
  
  
特殊的内建目标 
  
有两个特殊的内建目标:RETURN 和QUEUE 
  
RETURN相当于到达chain的末尾。对于一个内建的chain来说,执行相应的策略。 
对于自定义的,返回前一条chain。 
  
QUENE是一个特殊的目标。他将包放到用户空间等待处理。需要两个额外的部件: 
  
l 队列处理器(处理包在内核和用户空间的流通) 
  
l 用户空间的应用程序(接受包、操作包) 
  
标准的队列处理器模块ip_queue。 
  
下面是一个例子: 
  
# modprobe iptable_filter 
# modprobe ip_queue 
# iptables -A OUTPUT -p icmp -j QUEUE 
有了这条规则,本地产生的外出ICMP包将流到ip_queue模块,然后他再将包送到 
用户空间的应用程序。如果没有用户空间的应用程序等待这个包,DROP。 
  
怎么写用户空间的应用程序呢?用libipq API。他是和iptables一起发布的。程 
序例子在CVS中的testsuide工具里。 
  
ip_queue的状态可以通过下面的命令查看: 
  
/proc/net/ip_queue 
  
队列的最大长度可以用下面的命令来控制: 
  
/proc/sys/net/ipv4/ip_queue_maxlen 
  
缺省值是1024。 
  
  
  
12. 对整个chain的操作 
  
l 创建一个新的chain 
  
假设我们要创建一个名字为test的chain: 
  
# iptables -N test 
  
是不是很简单?现在你就可以按照我上面所说的加规则了。 
  
  
  
l 删除一个chain 
  
同样的简单。用 –X 或者 –delete-chain选项。 
  
# iptables -X test 
  
注意,删除chain之前,chain必须为空,即没有规则。三个内建chain不能被删除。 
如果不加名字就删除所有可以删除的chain。 
  
  
  
l 清空chain中的所有规则 
  
用-F选项 
  
# iptables -F FORWARD 
  
如果没有chain的名字,将清空所有的chain的所有规则。 
  
  
  
l 列出一个chain中的所有规则 
  
用 –L 或者 –list选项 
  
refcnt列是指用户定义的chain的规则数。只有refcnt = 0,chain才可以删除。 
  
另外附加选项 –n 可以避免域名解析,只有IP地址。 
  
-v 选项显示更多细节。 
  
-x 选项显示具体数字,不用K、M、G等表示1000、1000000、1000000000。 
  
  
  
l 记数复位 
  
用 –Z 选项。 
  
例如: 
  
# iptables -L FORWARD 
# iptables -Z FORWARD 
在上面的两条命令之间,可能会有一些包通过。因此可以将他们合在一起,复位记数。 
  
  
  
l 设置策略 
  
当一个包没有找到合适的规则匹配,这时候策略将会决定包的命运。仅仅只有3个内 
建的chain才有策略。因为当一个包到达用户定义的chain的末尾,会返回前一个chain。 
  
策略可以为ACCEPT或者DROP,例如: 
  
# iptables -P FORWARD DROP 
  
  
  
13. 使用ipchains和ipfwadm 
  
这是对于老用户熟悉了以前的,又不想学习iptables的。有两个模块ipchains.o 和 
ipfwadm.o。 
  
只要插入相应的模块就可以了。 
  
14. 混合NAT和包过滤技术 
  
在应用包过滤技术不用考虑NAT的存在,二者结合很好。 
  
关于NAT,将在下一篇中描述。 
  
  
  
15. 包过滤技术的设计建议 
  
在计算机安全领域,一种说法是阻塞所有的东西,然后当需要时才打开一些小洞小 
坑。就像古罗马的竞技场。Ipchains的作者强烈推荐这种方法。 
  
  
  
不运行你不需要的服务!! 
  
  
  
如果运行防火墙,开始时阻塞所有的包,然后再慢慢地让需要的包通过。 
  
  
  
建议将包过滤与tcp-wrappers、代理技术、路由检验结合起来。 
  
  
  
强烈建议跟踪连接:需要装载模块ip_conntrack.o。例如,下列命令: 
  
# iptables -N no-conns-from-ppp0 
# iptables -A no-conns-from-ppp0 -m state --state ESTABLISHED,RELATED 
-j ACCEPT 
# iptables -A no-conns-from-ppp0 -m state --state NEW -i ! ppp0 -j ACCEPT 
# iptables -A no-conns-from-ppp0 -i ppp0 -m limit -j LOG --log-prefix 
"Bad packet from ppp0:" 
# iptables -A no-conns-from-ppp0 -i ! ppp0 -m limit -j LOG --log-prefix 
 "Bad packet not from ppp0:" 
# iptables -A no-conns-from-ppp0 -j DROP 
  

  
  
# iptables -A INPUT -j no-conns-from-ppp0 
# iptables -A FORWARD -j no-conns-from-ppp0 
细细体会之。 
' 
  
责任编辑:eight(01-07-17 21:27) [关闭窗口][转寄邮箱] 
  
  
-- 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -