1. 将PIX安放至机架,经检测电源系统后接上电源,并加电主机。
2. 将CONSOLE口连接到PC的串口上,运行HyperTerminal程序从CONSOLE口进入
PIX系统;此时系统提示pixfirewall>。
3. 输入命令:enable,进入特权模式,此时系统提示为pixfirewall#。
4. 输入命令: configure terminal,对系统进行初始化设置。
5. 配置以太口参数:
interface ethernet0 auto (auto选项表明系统自适应网卡类型 )
interface ethernet1 auto
6. 配置内外网卡的IP地址:
ip address inside ip_address netmask
ip address outside ip_address netmask
7. 指定外部地址范围:
global 1 ip_address-ip_address
8. 指定要进行要转换的内部地址:
nat 1 ip_address netmask
9. 设置指向内部网和外部网的缺省路由
route inside 0 0 inside_default_router_ip_address
route outside 0 0 outside_default_router_ip_address
10. 配置静态IP地址对映:
static outside ip_address inside ip_address
11. 设置某些控制选项:
conduit global_ip port[-port] protocol foreign_ip [netmask]
global_ip 指的是要控制的地址
port 指的是所作用的端口,其中0代表所有端口
protocol 指的是连接协议,比如:TCP、UDP等
foreign_ip 表示可访问global_ip的外部ip,其中表示所有的ip。
12. 设置telnet选项:
telnet local_ip [netmask]
local_ip 表示被允许通过telnet访问到pix的ip地址(如果不设此项,
PIX的配
置只能由consle方式进行)。
13. 将配置保存:
wr mem
14. 几个常用的网络测试命令:
#ping
#show interface 查看端口状态
#show static 查看静态地址映射
简单说,防火墙就是用来保护你的网络的一台主机,它对来自internet和你的内网(受保护)之间的通讯进行限制,反过来亦可。
非防火墙功能
误区 - 防火墙并不能保证你的网络绝对安全
堡垒主机(A bastion host)- In an ideal world, this would be true. However, a firewall is only as secure as the work you put into securing it.
主机安全替换(A replacement for host security) - 每一项防火墙允许的服务都是潜在的风险。
使用类型
本地 - 对于在实际的物理连接而言,没有安全可言。很明显,防火墙对此无能为力。
Local privilege escalation - The trojan horse attack. The attacker alreay has a local account on your box (inside the gates) and obtains root by some means (vulnerability or misconfiguration). A firewall cannot protect again this type of attacks.
Remote - Your host is listening on a port that the attacker is able to connect to remotely over a network and exploit a vunerability somehow. This is the only type of attack a firewall can (hopefully) protect you against. There is another important point here that most firewall howtos neglect. In order for someone to exploit your box remotely, it has to be listening on some ports (i.e. providing a way for an attacker to connect). Therefore, if your host isnt listening on any ports, you are safe from remote exploits (unless the attacker manages to attack the network stack itself).
提高网络安全 - 某些服务有着固有的风险,不可能作到安全性。防火墙可以帮助你提高网段或部分网络的安全性。
网络访问控制 - 防火墙可以强制性的在网络中应用安全规则。
日志记录 - 由于防火墙检测所有入站/出站的网络通讯,它可以记录网络中的活动。
防火墙的类型
代理防火墙 - 代理服务器.
包过滤防火墙 - 检测IP包 (Netfilter).
什么是 Netfilter/Iptables?
Linux 2.4内核中Netfilter是新的用来实现防火墙的. Iptables 是用来指定Netfilter规则的用户工具。
为什么Ipchains被改为Netfilter/Iptables
状态匹配 - 连接跟踪(can you trust the remote host to determine whether your firewall will accept a packet?).
自动碎片重装- Connection tracking automatically reassembles fragmented packets for examination.
改良的匹配规则 - 高级包匹配,例如速率限制、字符串匹配.
增强的日志功能 - 允许自定义日志级别和实体.
允许包撕裂(?mangle) - 允许撕裂包中的任何信息
用户队列Userspace queuing -允许userspace可以对包进行编程.
支持内置包转发 - 舍弃了IPMASQADM.
主要功能
状态包过滤(连接跟踪)
各种网络地址翻译
灵活、易扩展的急智机制
大量的增强型补丁包
Netfilter/iptables可以做什么?
建立Internet防火墙和基于状态的包过滤
用NAT和伪装(masquerading)共享上网
用NAT实现透明代理
和tc+iproute2配合使用可以实现QoS路由
用(mangling)修改IP包头的TOS字段来实现更复杂的功能
安装Iptables
下载
Iptables v1.2.2 (http://netfilter.samba.org/iptables-1.2.2.tar.bz2) md5sum 7d065a5d1e7003a061bece79a88d903
Linux kernel v2.4.5 (http://www.kernel.org/pub/linux/kernel/v2.4/linux-2.4.5.tar.bz2)
安装提示
注意,在编译、安装iptables之前,不需要编译内核。并且某些内核选项不可用,除非用"make patch-o-matic".
在/usr/src/linux目录中, make oldconfig (在没有.config文件时,make menuconfig)。
在iptables包的解报目录中, make && make install
打补丁,make patch-o-matic,推荐只打你需要的补丁。
返回 /usr/src/linux目录, make menuconfig ,选择新的、可用的选项
完成正常的内核编译过程(make dep; make clean; make bzImage)
编译 - Iptales编译一般比较简单
make && make install 将在缺省路径/usr/local中做一个最小安装.
make pending-patches 将给标准内核打上一些著名的漏洞补丁.
make patch-o-matic 将给标准内核打上一些增强功能的补丁.
make experimental && make install-experimental 将创建 iptables-save和 iptables-restore 二进制代码.
如果你想修改安装路径,可以带参数BINDIR=/usr/sbin LIBDIR=/usr/lib MANDIR=/usr/man 进行编译。 (e.g. make BINDIR=/usr/sbin LIBDIR=/usr/lib MANDIR=/usr/man install)
补丁包 - 每个补丁都有新的功能,但几乎每个都有漏洞,因此最好不要全部都安装。
注意: 下面列出的是v1.2.1a版本的,不是最新版本. 你可以用 make patch-o-matic命令列出补丁列表来.
CONFIG_IP_NF_TARGET_BALANCE 选项, 类似DNAT:把负载均分到一段地址上。(`--to-dest 1.2.3.4-1.2.3.7)
CONFIG_IP_NF_TARGET_NETLINK, 替代ipchains中的 -o 选项,通过增加一个NETLINK目标,把丢弃的包发往用户空间
CONFIG_IP_NF_TARGET_SAME ,类似SNAT,利用一段地址(`--to-source 1.2.3.4-1.2.3.7),对客户端的每个连接给相同的地址.
CONFIG_IP_NF_TARGET_TTL ,允许用户修改IP包中的TTL值。
CONFIG_IP_NF_MATCH_AH_ESP, 支持两个扩展匹配(`ah and `esp),允许在IPSec包中的AH或者ESP包头中匹配一段SPI范围
CONFIG_IP_NF_DROPTABLE . 将要被丢弃的包将通过这个表,来允许做日志记录,(此补丁有漏洞)
CONFIG_IP_NF_EGG: 连接跟踪。Connection tracking for eggdrop bot networks.
CONFIG_IP_NF_TARGET_FTOS ,允许你任意设置TOS值。从0x0-0xff
ftp-multi.patch 允许ftp连接跟踪和地址翻译到最多8个端口。在ip_conntrack_ftp和ip_nat_ftp模块中用 `ports=选项. 不然,将使用缺省21端口。另外,它还支持FXP(direct FTP 2 FTP transport).使用模块载入参数`fxp=1`可以来支持FXP
ftp-pasv-fix.patch :可以在使用ip_conntrack_ftp.o模块的情况下,在FTP服务器上实现状态类型防火墙功能
CONFIG_IP_NF_MATCH_IPLIMIT 允许限制每个客户端(每个IP)并发TCP连接的最大个数
例如:
#每个客户端最多允许2个telnet连接
iptables -p tcp -dport 23 -m iplimit --iplimit-above 2 -j REJECT
# you can also match the other way around:
iptables -p tcp -dport 23 -m iplimit ! --iplimit-above 2 -j ACCEPT
# 每个C类地址允许的http连接的并发最大个数为16
iptables -p tcp -dport 80 -m iplimit --iplimit-above 16 --iplimit-mask 24 -j REJECT
#允许每个IP地址可同时发起4个HTTP连接
iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-above 4 -j REJECT
#允许整个A类地址中每个地址的HTTP访问为4
iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-mask 8 --iplimit-above 4 -j REJECT
CONFIG_IP_NF_IRC: IRC支持模块,允许 DCC和NAT、连接跟踪一起工作。此补丁依赖丢弃表(dropped-table)和段偏移(seqoffset).
masquerade+fwmark.patch :一种复杂的路由设置,依靠防火墙的标记来路由,和 MASQUERADE NAT target组合来用
nat+conntrack-hashsize.patch 设置连接跟踪代码和NAT代码中的模块参数(hashsize=xxx) hash表的大小,NAT的缺省值为内存的
1/16384(对于大多数机器来说,比先前的缺省值64好多了).
CONFIG_IP_NF_POOL, 提供了一种从IP地址段中的一个位的位映射,它依赖于源或目的地址是否在地址池中设置了位。它也提供了一个目标池
CONFIG_IP_NF_MATCH_PSD, 支持端口扫描检测(PSD:PortScanDetection). 可以检测TCP和UDP端口扫描. 它源自Solar Designer磗 scanlogd.
支持的选项:
--psd-weight-threshold <threshold>
从同一主机发往不同目的端口的TCP/UDP包的总的优先级,被用来作为端口扫描次序
--psd-delay-threshold <delay>
由同一主机发往不同目的端口的包的延迟 (in hundredths of second) ,用来作为可能的端口扫描子次序
--psd-lo-ports-weight <weight>
特权目的端口的优先级,即目标端口(<=1024)的优先级
--psd-hi-ports-weight <weight>
非特权目的端口的优先级(>1024).
举例:iptables -A INPUT -m psd -j DROP
CONFIG_IP_NF_MATCH_RPC,支持两个模块ip_conntrack_rpc_udp和ip_conntrack_rpc_tcp(用来分别跟踪UDP和TCP的端口映射请求),在iptabIe 中添加record_rpc(用来匹配是否包的源地址已经发过端口映射请求,或者是一个新的发往端口映射的GET请求,以允许RPC过滤)
seqoffset.patch - 新的NAT中的 API 函数. 此API函数隐藏了所有的协议翻译(例如:ftp/irc)中的包重设大小和计算序列号的细节问题
要求:至少内核 2.4.2以上!
dropped-table-patch from netfilter patch-o-matic
CONFIG_IP_NF_NAT_SNMP_BASIC 基本的SNMP地址翻译支持. 如同RFC 2962中描述的,是 SNMP-ALG中的“基本”条目;它通过修改SNMP有效载荷中的IP地址来匹配IP层的地址翻译映射.
CONFIG_IP_NF_MATCH_STRING :允许在整个包里匹配字符串.
iptables -A INPUT -m string --string cmd.exe -j QUEUE
tcp-window-tracking.patch :通过Guido van Rooij的论文"IP过滤器中的实时状态TCP包过滤“( Real Stateful TCP Packet Filtering in IP Filter),实现了TCP连接跟踪.它包含新的支持已建立的连接控制的TCP连接跟踪. 并添加了窗口缩放支持(Window scaling).
CONFIG_IP_NF_MATCH_TTL option:允许用户根据包的TTL值来匹配包.
CONFIG_IP_NF_TARGET_ULOG:支持更多高级的包日志记录机制,目录libiptulog/ 下包含有收到的ULOG消息库.
更多信息:http://www.gnumonks.org/projects/ulogd
CONFIG_IP6_NF_TARGET_LOG :在ip6tables中添加LOG target.
CONFIG_IP6_NF_TARGET_REJECT:在ip6tables中添加拒绝目标( REJECT target). 请注意此处的 icmp-types与icmpv6 types不同(更多消息请看:ip6tables -j REJECT -h)
ipv6-ports.patch:ipv6 有IPv6的自己的端口匹配形式.
注意: 以上高亮显示的补丁并不表示你应该编译进你的内核中。仅表示我发现的有趣的功能。你可以把你感兴趣的补丁从目录patch-o-matic 中拷贝到usr/src/linux,并且运行 patch -R -p1 < name_of_the_patch.
下面是一篇转载的关于用IPTables实现字符串模式匹配 的文章
自1995年ipfwadm开始进入1.2.1的核心,Linux的防火墙实现有很长的时间了。Ipfwadm实现了标准的tcp/ip包过滤功能,比如过滤源地址与目的地址以及端口过滤。早在1999年第一个稳定的2.2.0核心中防火墙的实现被ipchains替代了,ipchains的新功能包括支持规则链,碎片包控制,较好的网络地址翻译功能(NAT)以及其他一些有用的改进。我们需要明白Linux防火墙包括核心级代码(通常是可加载核心模块或者核心源程序的补丁)和用户级代码(一个配置的工具,比如/usr/bin/ipchains,这是用来插入包规则到核心空间的)因此无论如何,只要新的linux防火墙代码被引入,核心和用户空间的有关代码都要改写。
2001年2.4的核心完成了,iptables出现了。它引入了很多重要的改进,比如基于状态的防火墙,基于任何TCP标记和MAC地址的包过滤,更灵活的配置和记录功能,强大而且简单的NAT功能和透明代理功能,通过速度限制实现DoS的阻止(更详细的资料请参看A Comparison of iptables Automation Tools一文)。
然而,最重要变化是引入了模块化的架构方式。比如,ipchains和ipfwadm兼容模式是通过一个核心模块的设置实现的,该模块能够在运行的核心中插入,以便提供相应的通讯功能。在附加的变化中,用户自定义编码功能已经成为了可能,比如过滤一定范围的端口,根据TTL值和包的到达时间进行判断,对自定义的协议进行状态监视,对随机的数据包进行监视等,这些目前都还不是iptable的一部分,但是在未来将被实现。很多很有趣的新模块已经完成了。编写一个可加载的核心模块来创建核心级代码,通过用户级代码实现控制过滤器的行为。参见Rusty Russells Linux iptables HOWTO
本文主要关注字符串模式匹配的功能,(显然,是通过模块实现的),该功能可以限制和研究数据包的有效载荷。这是iptable技术的一个非常有意义的突破,它超越了传统的包过滤防火墙的标准TCP/IP标志监视功能。传统的防火墙可以分为包过滤和应用代理两种类型,应用代理防火墙可以分别出应用层的协议比如telnet,HTTP或者SMTP,能够监视这些协议的有效载荷和检查命令,但是应用代理防火墙带来了巨大的性能缺陷:当通过网络协议栈处理上层即应用层的数据包。同时我们需要为每一个要监控的协议编写新的代理程序。包过滤防火墙通常只监视源地址和目的地址,源端口和目的端口,TCP/IP标志等,而完全忽略了高层协议的有效载荷。由于上述原因,包过滤防火墙通常比应用代理防火墙的速度快。应用代理提供了更加有力度的安全控制而包过滤可以用于更高的带宽线路满足更高的吞吐量。
基于以上的情况,iptables的新增功能提供了跨越两种防火墙类型的优势,避免了各自的缺陷,这个功能同时非常清晰的证明了新的模块化的架构较之老的ipchains的优势,它能够使得iptables工作在网络层(OSI模型的第三层)不必工作在高层协议,但是却可以监视高层协议的有效载荷,而不必分析应用层的通信结构。
在2001年5月以前,还没有提出字符串模式匹配模块以前。有一个尝试添加内容监控的能力给iptables防火墙的工程:Hogwash。该工程结合了Snort IDS规则模式匹配引擎,以便于iptable能够响应带有攻击信号的数据包。
现在我们提供了一个Step-By-Step的指导,以便于在RedHat Linux上实现模式匹配的包监视功能。标准的RH7.2提供了iptables 1.2.3的版本以及1.2.4的可用RPM升级包。然而,模式匹配功能没有被包含在标准的发行版中,因为开发人员将它标记为试验。
如果你使用的是RH7.1-7.2,你就已经使用了2.4的核心。你至少需要2.4.4的核心以便能够使用iptables 1.2.4的功能。通常推荐你从发行商那里下载最新的可用的核心。目前,有一个例外:iptables-1.2.4的字符串模式匹配补丁不能在2.4.9的核心下工作。你应该安装核心的源码RPM包(通常被放在/usr/src/linux-2.4.x的源码树内)或者从别处下载的核心源程序(比如www.kernel.org或者它的一个镜像)。
在本文中,将采用最新的2.4.16核心作为例子。测试也能运行在使用2.4.7核心的RedHat 7.2上,但是2.4.7的核心并不推荐使用,因为2.4.7的核心有一些小的安全问题,比如SYN-cookie保护和iptables的保存/恢复功能。
接下来需要从http://netfilter.samba.org/iptables-1.2.4.tar.bz2下载iptables。当对压缩文件进行解压缩之后,需要对iptables进行配置,合并相关的核心源程序树。可以使用半自动化的程序来完成这个目的。首先,可能需要运行程序以便包含已经考虑过的稳定的iptables补丁,但是这个补丁没有被包含在kernel的发行版内。从iptables的解压目录(在本例中iptables在/home/anton/iptables-1.2.4,核心源程序在/usr/src/linux-2.4.16)运行:
make pending-patches KERNEL_DIR=/usr/src/linux-2.4.16
这将开始运行交互式的补丁应用程序,虽然你可以安全应用所有的补丁,但是没有一个补丁是iptables的字符串匹配所必需的。对任何你认为需要的补丁都回答y(yes)。如果你希望能够安全的使用iptables,则选择none。
现在我们将准备应用试验部分的补丁,比如字符串模式匹配的支持。运行:
make patch-o-matic KERNEL_DIR=/usr/src/linux-2.4.16
在这个交互式的过程中,回答y(yes)以便应用string.patch。程序将遍历所有的可用的补丁,包括那些稳定的。
Testing... string.patch NOT APPLIED ( 2 missing files)
The string patch:
Author: Emmanuel Roger <[email protected]>
Status: Working, not with kernel 2.4.9
This patch adds CONFIG_IP_NF_MATCH_STRING which allows you to
match a string in a whole packet.
THIS PATCH DOES NOT WORK WITH KERNEL 2.4.9 !
Do you want to apply this patch [N/y/t/f/q/?] y
其余的补丁也许也让你非常感兴趣,不过它们与本文并不相关。如果你选择安装任何别的补丁,请注意开发者给出的警告信息,其中包括了补丁的功能(比如dropped表的补丁)确定你没有安装MAC过滤的补丁,因为最近发现这个补丁包含一个漏洞。
现在我们开始编译用户空间程序和相关的Libraries:
make KERNEL_DIR=/usr/src/linux-2.4.16
然后我们安装它们(iptables在/usr/local/user/sbin,libraries在/usr/local/lib/iptables)在root身份下执行以下内容:
make install KERNEL_DIR=/usr/src/linux-2.4.16
紧接着我们配置和编译核心:
Now we are ready to compile the user-space code and the libraries:
make KERNEL_DIR=/usr/src/linux-2.4.16
and then install them (iptables program goes in /usr/local/user/sbin and libraries go into /usr/local/lib/iptables). As root:
cd /usr/src/linux-2.4.16
可以使用任何的核心配置方法。有关详细的配置核心的方法,可以查阅Internet资源,Internet上有大量的这方面的文档,比如kernel HOWTO等。以下简要介绍一下:
make xconfig
在GUI界面下,选择Netfilter配置选项,然后在Strings match support前选择m(模块支持),如下图:
然后执行通常的操作:
make dep;make bzImage;make modules;make modules_install
现在按照你喜欢的方式安装核心,并重新启动。重新启动系统以后,测试一下iptables是否支持模式匹配功能,在root身份下执行:
/usr/local/sbin/iptables –m string –help
该命令将显示如下标准的iptables帮助信息:
STRING match v1.2.4 options:
--string [!] string Match a string in a packet
该功能允许你对匹配数据包的内容,我们可以通过netcat或者telnet来测试这一功能,从而确定我们确实可以获得数据包的内容。
运行:
iptables -A INPUT -m string --string "test" -j LOG --log-level
info --log-prefix "TEST"
然后启动一个netcat的服务器:
nc -l -p 3456
然后连接该netcat服务器:
telnet localhost 3456
然后输入:
test
whatevertestdoes
这样将引起iptables产生一个简单的记录,我们在记录文件中将会看到如下的信息(当然你需要设置了记录信息的级别为info)
Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00
SRC=127.0.0.1 DST=127.0.0.1 LEN=2154 TOS=0x00 PREC=0x00 TTL=64
ID=42880 DF PROTO=TCP SPT=3128 DPT=33018 WINDOW=32767 RES=0x00 ACK PSH URGP=0
Nov 27 23:16:53 pua kernel:
TEST IN=lo OUT=MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00
SRC=127.0.0.1 DST=127.0.0.1LEN=1830 TOS=0x00 PREC=0x00 TTL=64
ID=17451 DF PROTO=TCP SPT=8000 DPT=33017 WINDOW=32767 RES=0x00 ACK PSH URGP=0
在tcp/ip数据包中只要出现test字符串,以上的信息就会产生。这有什么好处呢?太多了。正如Filtering packets based on string matching这篇文章所建议的那样,该文章可以在linuxguru.net的sysctl内找到。它能够用来阻止那些讨厌的IIS蠕虫造成得Unix web服务器记录文件记录大量的对cmd.exe的请求,这些蠕虫将不再干扰你,但是如果你的/var分区(通常是记录文件存放的分区)不够大,那么这一功能将有一定的帮助。只要静静地丢弃蠕虫对80端口的请求或者使用记录限制功能,对这些信息进行记录,丢弃这些包的操作如下:
iptables -I INPUT -j DROP -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe"
每小时只记录一条这样的信息:
iptables -I INPUT -j LOG -p tcp -s 0.0.0.0/0 -m string --string "cmd.exe" -m limit
--limit 1/hour
Bill Steams(Mason firewall building script的作者)提供了一个极好的建议----转换网络IDS Snort的规则成为iptables字符串模式匹配的规则。Snort的攻击信号数据库中包含了大约1200种信号and appears to be the biggest publicly available attack database suitable for instant deployment。在iptables上使用现成的信号是合理的一种方式。http://www.strearns.org/snort2iptables 是Bill Stearm提供的试验性的软件。在这里你可以找到shell脚本以便将标准的Snort规则转换为iptables的规则。下面是一个将snort关于Linux下针对mountd的攻击和bind的攻击转化为iptables的规则的例子:
Snort 规则:
1. alert udp $EXTERNAL_NET any -> $HOME_NET 518
(msg:"EXPLOIT ntalkd x86 linux overflow";
content:"|0103 0000 000 0 0001 0002 02e8|";
reference:bugtraq,210; classtype:attempted-admin; sid:313; rev:2;)
2. alert tcp $EXTERNAL_NET any -> $HOME_NET 53
(msg:"EXPLOIT named tsig infoleak";
content: "|AB CD 09 80 00 00 00 01 00 00 00 00 00 00 01 00 01 20 20 20 20 02 61|";
reference:cve,CAN-2000-0010; reference:bugtraq,2302; reference:arachnids,482;
classtype:attempted-admin; sid:303; rev:3;)
3. alert udp $EXTERNAL_NET any -> $HOME_NET 635
(msg:"EXPLOIT x86 linux mountd overflow";
content:"|5eb0 0289 06fe c889 4604 b006 8946|";
reference:cve,CVE-1999-0002; classtype:attempted-admin; sid:315; rev:1;)
转化的iptables规则:
1. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 518 -m
string --string " è" -j LOG --log-prefix "SID313 " # "EXPLOIT ntalkd x86
linux overflow" bugtraq,210 classtype:
attempted-admin sid:313
2. iptables -A SnortRules -p tcp -s $EXTERNAL_NET -d $HOME_NET --dport 53 -m
string --string "?í .a" -j LOG --log-prefix "
SID303 " # "EXPLOIT named tsig infoleak" cve,CAN-2000-0010 bugtraq,2302
arachnids,482 classtype:attempted-admin sid:303
3. iptables -A SnortRules -p udp -s $EXTERNAL_NET -d $HOME_NET --dport 635 -m
string --string "^° ‰ tè‰F ° ‰F" -j LOG --log-prefix " cve-CVE-1999-0002
" # "EXPLOIT x86 linux mountd overflow" classtype:attempted-admin sid:315
显而易见,上面的转化使用了针对漏洞所使用的缓冲区溢出字符串作为捕获攻击的方式,有些规则不便于转化主要是因为在桢的控制方面snort比iptables要强大一点。
总之,iptables的字符串模式匹配功能能够被用来保护那些开放了易受攻击的而一般的包过滤又无法保护的网络服务(如WWW服务,mail服务,DNS服务,FTP服务等)的组织的网络(如果将它布置在组织的网关上)和单个的主机(使iptables成为主机的一部分),另外,iptables的字符串模式匹配功能还能够帮助实现强制安全策略,即通过关键字来阻止访问非法的内容。
配置内核
以下为和Netfilter相关的内核配置. 如何配置内核的详细信息可以参看http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html.
推荐 (non-netfilter related) - 这些选项可以在Linux内核中实现不同的网络功能,但它们可以在运行时允许/禁止
CONFIG_PROC_FS - 允许虚拟 /proc 文件系统
CONFIG_INET_ECN - 支持TCP 直接拥塞通知(Explicit Congestion Notification (ECN))
CONFIG_SYN_COOKIES - SYN cookies保护,可以用来保护不受syn洪水攻击 (synfloods)
CONFIG_IP_ADVANCED_ROUTER - 允许以下选项 (别的未列在此)
CONFIG_IP_ROUTE_VERBOSE - 允许详细的路由监控
CONFIG_IP_ROUTE_LARGE_TABLES - 改进的路由区域中的路由性能到超过64条实体
要求 - Kernel v2.4.x (推荐v2.4.5)
CONFIG_PACKET - 同packet socket
CONFIG_NETFILTER - 允许以下的所有的与netfilter相关的选项
Netfilter 相关- 星号表示推荐
CONFIG_IP_NF_CONNTRACK*
CONFIG_IP_NF_FTP*
CONFIG_IP_NF_QUEUE
CONFIG_IP_NF_IPTABLES*
CONFIG_IP_NF_MATCH_LIMIT*
CONFIG_IP_NF_MATCH_MAC
CONFIG_IP_NF_MATCH_MARK
CONFIG_IP_NF_MATCH_MULTIPORT*
CONFIG_IP_NF_MATCH_TOS
CONFIG_IP_NF_MATCH_TCPMSS
CONFIG_IP_NF_MATCH_STATE*
CONFIG_IP_NF_MATCH_UNCLEAN*
CONFIG_IP_NF_MATCH_OWNER
CONFIG_IP_NF_FILTER*
CONFIG_IP_NF_TARGET_REJECT*
CONFIG_IP_NF_TARGET_MIRROR
CONFIG_IP_NF_NAT*
CONFIG_IP_NF_NAT_NEEDED*
CONFIG_IP_NF_TARGET_MASQUERADE*
CONFIG_IP_NF_TARGET_REDIRECT
CONFIG_IP_NF_NAT_FTP*
CONFIG_IP_NF_MANGLE*
CONFIG_IP_NF_TARGET_TOS
CONFIG_IP_NF_TARGET_MARK
CONFIG_IP_NF_TARGET_LOG*
CONFIG_IP_NF_TARGET_TCPMSS
CONFIG_IP_NF_COMPAT_IPCHAINS
CONFIG_IP_NF_COMPAT_IPFWADM
举例- 以上编译iptables中,只有在给内核打上相应补丁后(可通过pending-patches 或patch-o-matic)
CONFIG_IP_NF_DROPTABLE
CONFIG_IP_NF_EGG
CONFIG_IP_NF_IRC
CONFIG_IP_NF_MATCH_AH_ESP
CONFIG_IP_NF_MATCH_IPLIMIT
CONFIG_IP_NF_MATCH_LENGTH
CONFIG_IP_NF_MATCH_PSD
CONFIG_IP_NF_MATCH_RPC
CONFIG_IP_NF_MATCH_TTL
CONFIG_IP_NF_NAT_SNMP_BASIC
CONFIG_IP_NF_POOL
CONFIG_IP_NF_TALK
CONFIG_IP_NF_TARGET_BALANCE
CONFIG_IP_NF_TARGET_FTOS
CONFIG_IP_NF_TARGET_NETLINK
CONFIG_IP_NF_TARGET_SAME
CONFIG_IP_NF_TARGET_TTL
CONFIG_IP_NF_TARGET_ULOG
CONFIG_IP6_NF_TARGET_LOG
CONFIG_IP6_NF_TARGET_REJECT
配置& 语法
约定
eth0 - 与Internet网的连接接口
eth1 - 内网接口
ip_address_of_eth0 - eth0的IP地址
ip_address_of_eth1 - eth1的IP地址
表、链和规则(Tables, chains, and rules)
当用Iptables来构造防火墙规则时,认清表、链和规则的区别很重要。
表提供特定的功能. 缺省表是filter, nat, 和mangle (除非你打了实验性的drop 表的补丁).
链是包传播的路径. 不同的表包含了不同的内置链. 用户自定义链能指向内置链. 如果一个包通过用户链中没有匹配,它将返回调用的链。如果一个包通过内置链中没有匹配,那么将由此链的缺省方针来确定是丢弃或接受
?/font>规则就是在链中用来实现某个特定匹配
包传播
在实施规则之前,必须知道包是如何在Netfilter的表和链中传播的。
可在以下连接中看到有关Netfilter中包的传播过程的更多细节,http://ods.dyndns.org/ipt_flow.html.
链的语法
创建新的链
iptables -N name_of_chain
删除空链 - 仅对自定义链
iptables -X name_of_chain*
*如果省略name_of_chain,将删除所有的自定义链
改变内置链的缺省方针Change the default policy
iptables -P name_of_chain name_of_policy*
*丢弃或接受
列出链的规则
iptables -L name_of_chain
清空链中的规则
iptables -F name_of_chain*
*如果省略name_of_chain,它将清空所有的链
将链中所有的规则的包和字节计数器归零
iptables -Z name_of_chain
规则的语法
典型的Iptables规则将指定:
A table (-t table_name). 省略情况下,为filter表.另外的内置表是nat和mangle表.
A rule action 链中的规则动作有: 添加(-A) , 删除(-D) 或替换(-R) 或插入(-I),后面跟表中链名
filter表中的内置规则:INPUT, FORWARD 和OUTPUT
nat表中的内置规则:PREROUTING, POSTROUTING 和OUTPUT
mangle表中的内置规则:PREROUTING 和OUTPUT
What to match - 可用的匹配(此列表不全):
!反符号,表示相反的意思
-p (协议: TCP, UDP, ICMP, 也可用数字- 见/etc/protocols)
-s (源地址)
-d (目的地址)
-i (入站的接口)
-o (出站的接口- 注意此说明发送包的接口)
--fragment (当源、目的端口无法区别时,将试图去匹配第二个和以后的碎片包,或者包的 ICMP类型)
--dport (目的端口)
--sport (源端口) 要么用数字,用么用/etc/services文件中的名字。可以用m:n来表示一组端口
--port (特殊的指定值的源和目的端口)
--mark (nfmark value)
--tcp-flags (允许基于匹配的TCP 标记) 此选项有两个参数:第一个表示要检查哪些标志;第二个表示哪些标志是1(其他则为0)
如: iptables -A INPUT --protocol tcp --tcp-flags ALL SYN,ACK -j DENY
表示ALL(SYN,ACK,FIN,RST,URG,PSH)的标志都要被检查,但是只有设置了SYN和ACK的才匹配。
--syn (等同 --tcp-flags SYN,RST,ACK SYN)
--tcp-option (检测TCP头中TCP项的数字值 - 如果TCP报头不全则丢弃)
TCP标记的一个解释
有时候只允许一个单向的TCP连接。例如,你只需要访问外部的WWW的服务器,而不允许外部访问你内部的WWW服务器。朴素的方法是阻塞所有从你的服务器发出的包,但是TCP连接需要一个双向的交流。解决的方法是只需要阻塞请求连接的包。这些包叫做SYN包。通过阻塞这些包,我们可以达到上面的目的。
--state (用来匹配特定状态下的数据包(由连接跟踪子系统来决定状态))
NEW - 发起新的连接
ESTABLISHED - 属于某个已经建立的连接的数据包
RELATED - 一个包与某个连接有关,但是不属于这个连接。例如一个ICMP错误消息或FTP数据连接
INVALID - 不匹配于任何连接,通常这些包会被drop
例子:
iptables -A state_chk -m state --state ESTABLISHED,RELATED -j ACCEPT - 在state_chk链中添加一条规则,接受所有的TCP回应包
iptables -A state_chk -m state --state NEW -i ! eth0 -j ACCEPT - 在state_chk链中添加一条规则,接受所有从非eth0接口来的连接请求包
--mac-source (源MAC地址) 例如:--mac-source 00:60:08:91:CC:B7
-m unclean (实际上装载一个模块,尝试匹配不寻常的或不健全的包 - 处于实验阶段) 提供随机的安全检查
--tos (用来匹配IP包头TOS字段的值)
--ttl (包里的ttl值)
一般的速率限制
--limit (匹配速率限制 - 可以按秒、分、时、日来给),缺省值是3/hour
--limit-burst (达到速率限制的最大的爆发数目(阀值)),缺省值是5。
(maximum burst number before the imposing the set rate limit)
例如?/span>?sbin/iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT
说明:对不管来自哪里的ip碎片都进行限制,允许每秒通过100个ip碎片,该限制触发的条件是100个ip碎片
例如: /sbin/iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
说明:对不管来自哪里的icmp包都进行限制,允许每秒通过一个包,该限制触发的条件是10个包
例如: iptables -A INPUT -p icmp -m limit --limit 6/m --limit-burst 5 -j ACCEPT
iptables -P INPUT DROP
然后从另一部主机上ping这部主机,就会发生如下的现象:
首先我们可以看到前四个包的回应都很正常,然后从第五个包开始,我们每10秒可以收到一个正常的回应。这是因为我们设定了单位时间(在这里是每分钟)内允许通过的数据包的个数是每分钟6个,也即每10秒钟一个;其次我们又设定了事件触发阀值为5,所以我们的前四个包都是正常的,只是从第五个包开始,限制规则开始生效,故只能每10秒收到一个正常回应。
假设我们停止ping,30秒后又开始ping,这时的现象是:
前两个包是正常的,从第三个包开始丢包,这是因为在这里我的允许一个包通过的周期是10秒,如果在一个周期内系统没有收到符合条件的包,系统的触发值就会恢复1,所以假如我们30秒内没有符合条件的包通过,系统的触发值就会恢复到3,假如5个周期内都没有符合条件的包通过,系统都触发值就会完全恢复?/span>?/span>
基于IP的速率限制(TCP) - experiemental
--iplimit-above - 允许按照IP地址来限制并发的TCP连接数
所有者匹配(Owner matching section)
--uid-owner userid (匹配由特定的用户进程所产生的包)
--gid-owner groupid (匹配由特定的用户组进程产生的包)
--pid-owner processid (匹配由特定的进程产生的包)
--sid-owner sessionid (匹配由特定的会话组进程产生的包)
端口扫描检测 - experimental
--psd-weight-threshold (极限threshold)
--psd-delay-threshold (延迟delay)
--psd-lo-ports-weight (优先级weight)
--psd-hi-ports-weight (优先级weight)
对于SNAT,还有一个特殊的匹配
--to-source <ipaddr>[-<ipaddr>][:port-port] 仅在nat表中的POSTROUTING链中使用
可指定单一源地址或一地址范围,端口范围(仅在指定协议-p tcp or -p udp)。
对于DNAT,还有一个特殊的匹配
--to-destination <ipaddr>[-<ipaddr>][:port-port] 仅在nat表中的PREROUTING链和OUTPUT链中使用
iptables -t nat -A PREROUTING -j DNAT --to-destination 1.2.3.4:8080 -p tcp --dport 80 -i eth1
对于MASQUERADE,还有一个特殊的匹配
--to-ports <port>[-<port>] 仅在nat表中的POSTROUTING链中使用
对于REDIRECT,还有一个特殊的匹配
--to-ports <port>[-<port>] 仅在nat表中的PREROUTING链和OUTPUT链中使用
iptables -t nat -A PREROUTING -j REDIRECT --to-port 3128 -i eth1 -p tcp --dport 80
如果匹配包的目的地 . 可能的目标有:
ACCEPT - 接受此报
DROP - 丢弃此报,并且不做记录
REJECT -丢弃此包并发送错误信息给发送者
这个模块基本等同于DROP,但是有一点不同。发送方将送出一个ICMP报文:“port unreachable”。注意以下情况不发送:
被过滤的包本身是一个ICMP差错控制或未知报文;
第二块及以后的分片
最近已经送出了许多ICMP差错控制报文到那个目标
LOG - 用syslogd记录此报并继续传播
ULOG - 把包发往一个用户日志进程(experimental)
MIRROR - 将包的源/目的IP地址互换并重发包(experimental)
QUEUE - 将包发往用户进程的队列中 - 如果没有匹配,最终包将被丢弃
QUENE是一个特殊的目标。他将包放到用户空间等待处理。需要两个额外的部件:
1 队列处理器(处理包在内核和用户空间的流通)
2 用户空间的应用程序(接受包、操作包)
标准的队列处理器模块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。
RETURN - 返回先前的调用的链;RETURN相当于到达chain的末尾。
对于一个内建的chain来说,执行相应的策略。对于自定义的,返回前一条chain
Name_of_a_custom chain - 用户定义, 一般都小写,但大写也可
mangle表提供了修改数据报各个字段的值的方法,这些在QoS中是很有用的
MARK
设置nfmark字段的值。我们可以修改nfmark字段的值。nfmark仅仅是一个用户定义的数据报的标记(可以是无符号长整数范围内的任何值)。该标记值用于基于策略的路由,通知ipqmpd (运行在用户空间的队列分捡器守护进程)将该数据报排队给哪个哪个进程等信息。
例: iptables -t mangle -A PREROUTING -j MARK --set-mark 0x0a -p tcp
TOS
设置数据报的IP头的TOS字段值。若希望适用基于TOS的数据报调度及路由,这个功能是非常有用处的。
例: iptables -t mangle -A PREROUTING -j TOS --set-tos 0x10 -p tcp --dport ssh
举例: iptables -t mangle -A PREROUTING -m state --state NEW -d 255.255.255.255 -i eth0 -j DROP
(此命令能够添加一条规则到mangle表的PREROUTING链,装载state 模块, 匹配发往eth0接口的目的地址为255.255.255.255的新连接,丢弃这些包并不记录)
下面是一个简单的IP伪装应用的Iptables规则(没有提供对外服务)
Bootstrapping Iptables
插入连接跟踪模块 (仅当没有编译进内核的情况下).
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp (如果你想用FTP)
设置缺省策略 - 设置内置链的缺省动作.
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
阻塞所有的新连接 除非连接是由内网(受保护的网络)发起的,此例中eth0接口接外网.
iptables -N state_chk - 在缺省的filter表中创建用户链state_chk
iptables -A state_chk -m state --state ESTABLISHED,RELATED -j ACCEPT - 在state_chk链中添加一条规则,接受所有的TCP回应包
iptables -A state_chk -m state --state NEW -i ! eth0 -j ACCEPT - 在state_chk链中添加一条规则,接受所有从非eth0接口来的连接请求包
iptables -A state_chk -j DROP - 在state_chk链中添加一条规则,其余的包丢弃
从INPUT和FORWARD链跳到 state_chk 链
iptables -A INPUT -j state_chk - 在INPUT链中添加一条规则,跳到state_chk链
iptables -A FORWARD -j state_chk - 在FORWARD链中添加一条规则,跳到state_chk链
伪装连接 - 仅当你需要与Internet连接.
允许IP转发 - 如果你要卸载Iptables规则,记得禁止IP转发.
echo "1" > /proc/sys/net/ipv4/ip_forward
装载NAT模块 - 仅当你已把它们当做模块编译了
modprobe iptable_nat
modprobe ip_nat_ftp (仅当你需要用FTP时)
允许IP伪装 - 当eth0为动态地址时用以下命令. 对于静态IP, 推荐使用源地址翻译(SNAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
(iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to ip_address_of_eth0)
允许源地址翻译(SNAT) - 仅当eth0有静态IP地址
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to ip_address_of_eth0
端口转发
Netfilter中端口转发是由Iptables来实现的. 你不再需要别的工具 (而在Ipchains中需要ipmasqadmin来实现). 仅当你需要在不同机器之间做通信转发时才需要端口转发。请注意这和转向(redirecting)不同.
Netfilter下做端口转发分两步骤.
目的地址翻译(Destination NAT the packets) (修改IP包头的目的IP地址和TC/UDP头的目的端口)
iptables -t nat -A PREROUTING -i eth0 -p protocol -d ip_address_of_eth0 --dport original_port_number -j DNAT --to destination_ip_address:destination_port_number
转发经过翻译的包(Forward the natted packets) (允许转发翻译过的包)
iptables -A FORWARD -i eth0 -o eth1 -p protocol -d destination_ip_address --dport destination_port_number -j ACCEPT
注意端口转发也要求允许IP转发和IP伪装或SNAT(返回的包需要修改源IP地址).
地址翻译(NAT Network Address Translation)
由于经常需要做IP伪装和对外开放内网的某些服务,因此这里把地址翻译单独拿出来讲。所谓的地址翻译一般来讲就是将内网地址翻译为外网地址,NAT有两种类型:Source NAT(SNAT)和Destination NAT(DNAT)。源NAT是指改变包的源地
址。很明显,这是在路由之后做。IP伪装是源NAT的特例。目的NAT是指改变包的目的地址,是在路由之前做。端口转
发是DNAT的特例。在ipchains中,端口转发需要其他的工具,如:ipmasqadm等,而现在Netfilter/Iptables本身就可解决!
NAT表中包括3个链(chain):PREROUTING(用于目的NAT)、POSTROUTING(用于源NAT)、OUTPUT(用于本地产生的包的目的
NAT)。下面给出两个典型应用
源NAT(SNAT)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3.4
(可指定端口范围 --to 1.2.3.4:1-1023 或地址范围 --to 1.2.3.4-1.2.3.6)
IP伪装(SNAT的特例)
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
目的NAT(DNAT)
iptables -t nat -A PREROUTING -i eth1 -s 192.168.1.0/24 -j DNAT --to 1.2.3.4:3128
端口重定向(DNAT的特例) ,可用来和代理服务器联合起来做“透明代理”
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j REDIRECT --to-ports 3128
Squid需要做的相应设置,在squid.conf中设置
http_port 3128
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
对于squid 2.4版本,还需要一个附加设置
httpd_accel_single_host off
分片处理(Fragment)
当一个包在传输过程中由于大于所经过的网络的最大传输单元(包的长度太大),将会分片,分成很多小的分片发出。在另一端再进行重组。关于分段的问题的是第一个分片可以很好的检查(IP + TCP/UDP/ICMP),但是后续的分片只有IP,没有上一层的信息。这对于过滤规则是不可能的。 因而,让我们看看过滤规则怎么处理分片。第一个分片跟普通的包处理没有任何区别,但是第二个以及以后的分片将由于缺少信息而不会与规则匹配。例如: 规则-p TCP --sport www将不会匹配任何分片(除了第一个分片)。同样规则-p TCP --sport ! www也不会匹配任何分片(除了第一个)。 但是可以使用-f 选项来描述规则,以适用于第二个和以后的分片。通常是让第二个和以后的分片通过,因为过滤规则适用于第一个分片,如果第一个分片没有通过,他的分片最终将不会重组。但是要小心大量的分片会崩掉你的网络或机器。
例如,下面的规则将会drop所有到192.168.1.1的分片:
# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP
iptables的可扩展性
iptables是可以扩展的,这就意味着内核和iptables工具都可以扩展以提供新的特性。
内核扩展位于内核的模块子目录,例如/lib/modules/2.3.15/net。需要你手工加入这些模块。
Iptables程序扩展位于目录/usr/local/lib/iptables/。
为了获得扩展的帮助,用选项(-p、-m、-j)来装载他并且后跟-h,
例如: # iptables -p tcp --help
iptables与ipchains的区别
·iptables的缺省链的名称从小写换成大写,并且意义不再相同:INPUT和OUTPUT分别放置对目的地址是本机以及本机发出的数据包的过虑规则。
·-i选项现在只代表输入网络接口,输入网络接口则使用-o选项。
·TCP和UDP端口现在需要用--source-port或--sport(或--destination-port/--dport)选项拼写出来并且必须置于"-p tcp"或"-p udp"选项之后,因为它们分别是载入TCP和UDP扩展的。
·以前TCP的"-y"标志现在改为"--syn",并且必须置于"-p tcp"之后。
·原来的DENY目标最后改为了DROP。
·可以在列表显示单个链的同时将其清空。
·可以在清空内建链的同时将策略计数器清零。
·列表显示链时可显示计数器的当前瞬时值。
·REJECT和LOG现在变成了扩展目标,即意味着它们成为独立的内核模块。
·链名可以长达31个字符。
·MASQ现在改为MASQUERADE,并且使用不同的语法。REDIRECT保留原名称,但也改变了所使用的语法
总结(rc files and such)
好了,现在你有了一个基本的防火墙, 你可能希望它们能在系统启动时就起作用. 有两个基本的选项. 首先把所有的规则写到rc shell脚本中.然后使用命令 iptables-save 和iptables-restore.
你可以在系统网络初始化完成之后立即启动rc中的防火墙设置.
Iptables 帮助
目标的简要说明
iptables -j name_of_TARGET --help
匹配的简要说明
iptables -m name_of_match --help
列出ICMP消息类型
iptables -p icmp --help
以下是 iptables -h的简单输出文本. 列出的选项不全. 要更多的细节,可以看mn iptables 8.
iptables v1.2.2
Usage: iptables -[ADC] chain rule-specification [options]
iptables -[RI] chain rulenum rule-specification [options]
iptables -D chain rulenum [options]
iptables -[LFZ] [chain] [options]
iptables -[NX] chain
iptables -E old-chain-name new-chain-name
iptables -P chain target [options]
iptables -h (print this help information)
Commands:
Either long or short options are allowed.
--append -A chain Append to chain
--delete -D chain Delete matching rule from chain
--delete -D chain rulenum
Delete rule rulenum (1 = first) from chain
--insert -I chain [rulenum]
Insert in chain as rulenum (default 1=first)
--replace -R chain rulenum
Replace rule rulenum (1 = first) in chain
--list -L [chain] List the rules in a chain or all chains
--flush -F [chain] Delete all rules in chain or all chains
--zero -Z [chain] Zero counters in chain or all chains
--check -C chain Test this packet on chain
--new -N chain Create a new user-defined chain
--delete-chain
-X [chain] Delete a user-defined chain
--policy -P chain target
Change policy on chain to target
--rename-chain
-E old-chain new-chain
Change chain name, (moving any references)
Options:
--proto -p [!] proto protocol: by number or name, eg. `tcp
--source -s [!] address[/mask]
source specification
--destination -d [!] address[/mask]
destination specification
--in-interface -i [!] input name[+]
network interface name ([+] for wildcard)
--jump -j target
target for rule (may load target extension)
--match -m match
extended match (may load extension)
--numeric -n numeric output of addresses and ports
--out-interface -o [!] output name[+]
network interface name ([+] for wildcard)
--table -t table table to manipulate (default: `filter)
--verbose -v verbose mode
--line-numbers print line numbers when listing
--exact -x expand numbers (display exact values)
[!] --fragment -f match second or further fragments only
--modprobe= try to insert modules using this command
--set-counters PKTS BYTES set the counter during insert/append
[!] --version -V print package version.
Netfilter/Iptables的防火墙功能介绍 3
IP概况
注意: 此处仅是讨论了和防火墙有关的一些IP内容,欲知更多细节请查Resources .
IP (网间互连协议Internet Protocol)
IP协议的分层位于物理层之上(非 OSI体系).其他的同样位于物理层之上的协议有 ARP 或NetBEUI..
TCP (传输控制协议Transmission Control Protocol)
TCP 控制了包的传输.这以为着它在通信双方之间建立了一个“虚拟”的连接,“虚拟”意味着不是实在的连接
三次握手Three-way Handshake
一个虚拟连接的建立是通过三次握手来实现的
1. (B) --> [SYN] --> (A)
假如服务器A和客户机B通讯. 当A要和B通信时,B首先向A发一个SYN (Synchronize) 标记的包,告诉A请求建立连接.
注意: 一个 SYN包就是仅SYN标记设为1的TCP包(参见TCP包头Resources). 认识到这点很重要,只有当A受到B发来的SYN包,才可建立连接,除此之外别无他法。因此,如果你的防火墙丢弃所有的发往外网接口的SYN包,那么你将不能让外部任何主机主动建立连接。
2. (B) <-- [SYN/ACK] <--(A)
接着,A收到后会发一个对SYN包的确认包(SYN/ACK)回去,表示对第一个SYN包的确认,并继续握手操作.
注意: SYN/ACK包是仅SYN 和 ACK 标记为1的包.
3. (B) --> [ACK] --> (A)
B收到SYN/ACK 包,B发一个确认包(ACK),通知A连接已建立。至此,三次握手完成,一个TCP连接完成
Note: ACK包就是仅ACK 标记设为1的TCP包. 需要注意的是当三此握手完成、连接建立以后,TCP连接的每个包都会设置ACK位
这就是为何连接跟踪很重要的原因了. 没有连接跟踪,防火墙将无法判断收到的ACK包是否属于一个已经建立的连接.一般的包过滤(Ipchains)收到ACK包时,会让它通过(这绝对不是个好主意). 而当状态型防火墙收到此种包时,它会先在连接表中查找是否属于哪个已建连接,否则丢弃该包
四次握手Four-way Handshake
四次握手用来关闭已建立的TCP连接
1. (B) --> ACK/FIN --> (A)
2. (B) <-- ACK <-- (A)
3. (B) <-- ACK/FIN <-- (A)
4. (B) --> ACK --> (A)
注意: 由于TCP连接是双向连接, 因此关闭连接需要在两个方向上做。ACK/FIN 包(ACK 和FIN 标记设为1)通常被认为是FIN(终结)包.然而, 由于连接还没有关闭, FIN包总是打上ACK标记. 没有ACK标记而仅有FIN标记的包不是合法的包,并且通常被认为是恶意的
连接复位Resetting a connection
四次握手不是关闭TCP连接的唯一方法. 有时,如果主机需要尽快关闭连接(或连接超时,端口或主机不可达),RST (Reset)包将被发送. 注意在,由于RST包不是TCP连接中的必须部分, 可以只发送RST包(即不带ACK标记). 但在正常的TCP连接中RST包可以带ACK确认标记
请注意RST包是可以不要收到方确认的?
无效的TCP标记Invalid TCP Flags
到目前为止,你已经看到了 SYN, ACK, FIN, 和RST 标记. 另外,还有PSH (Push) 和URG (Urgent)标记.
最常见的非法组合是SYN/FIN 包. 注意:由于 SYN包是用来初始化连接的, 它不可能和 FIN和RST标记一起出现. 这也是一个恶意攻击.
由于现在大多数防火墙已知 SYN/FIN 包, 别的一些组合,例如SYN/FIN/PSH, SYN/FIN/RST, SYN/FIN/RST/PSH。很明显,当网络中出现这种包时,很你的网络肯定受到攻击了。
别的已知的非法包有FIN (无ACK标记)和"NULL"包。如同早先讨论的,由于ACK/FIN包的出现是为了关闭一个TCP连接,那么正常的FIN包总是带有 ACK 标记。"NULL"包就是没有任何TCP标记的包(URG,ACK,PSH,RST,SYN,FIN都为0)。
到目前为止,正常的网络活动下,TCP协议栈不可能产生带有上面提到的任何一种标记组合的TCP包。当你发现这些不正常的包时,肯定有人对你的网络不怀好意。
UDP (用户数据包协议User Datagram Protocol)
TCP是面向连接的,而UDP是非连接的协议。UDP没有对接受进行确认的标记和确认机制。对丢包的处理是在应用层来完成的。(or accidental arrival).
此处需要重点注意的事情是:在正常情况下,当UDP包到达一个关闭的端口时,会返回一个UDP复位包。由于UDP是非面向连接的, 因此没有任何确认信息来确认包是否正确到达目的地。因此如果你的防火墙丢弃UDP包,它会开放所有的UDP端口(?)。
由于Internet上正常情况下一些包将被丢弃,甚至某些发往已关闭端口(非防火墙的)的UDP包将不会到达目的,它们将返回一个复位UDP包。
因为这个原因,UDP端口扫描总是不精确、不可靠的。
看起来大UDP包的碎片是常见的DOS (Denial of Service)攻击的常见形式 (这里有个DOS攻击的例子,http://grc.com/dos/grcdos.htm ).
ICMP (网间控制消息协议Internet Control Message Protocol)
如同名字一样, ICMP用来在主机/路由器之间传递控制信息的协议。 ICMP包可以包含诊断信息(ping, traceroute - 注意目前unix系统中的traceroute用UDP包而不是ICMP),错误信息(网络/主机/端口 不可达 network/host/port unreachable), 信息(时间戳timestamp, 地址掩码address mask request, etc.),或控制信息 (source quench, redirect, etc.) 。
你可以在http://www.iana.org/assignments/icmp-parameters中找到ICMP包的类型。
尽管ICMP通常是无害的,还是有些类型的ICMP信息需要丢弃。
Redirect (5), Alternate Host Address (6), Router Advertisement (9) 能用来转发通讯。
Echo (8), Timestamp (13) and Address Mask Request (17) 能用来分别判断主机是否起来,本地时间 和地址掩码。注意它们是和返回的信息类别有关的。 它们自己本身是不能被利用的,但它们泄露出的信息对攻击者是有用的。
ICMP消息有时也被用来作为DOS攻击的一部分(例如:洪水ping flood ping,死 ping ?呵呵,有趣 ping of death)?/p>
包碎片注意A Note About Packet Fragmentation
如果一个包的大小超过了TCP的最大段长度MSS (Maximum Segment Size) 或MTU (Maximum Transmission Unit),能够把此包发往目的的唯一方法是把此包分片。由于包分片是正常的,它可以被利用来做恶意的攻击。
因为分片的包的第一个分片包含一个包头,若没有包分片的重组功能,包过滤器不可能检测附加的包分片。典型的攻击Typical attacks involve in overlapping the packet data in which packet header is 典型的攻击Typical attacks involve in overlapping the packet data in which packet header isnormal until is it overwritten with different destination IP (or port) thereby bypassing firewall rules。包分片能作为 DOS 攻击的一部分,它可以crash older IP stacks 或涨死CPU连接能力。
Netfilter/Iptables中的连接跟踪代码能自动做分片重组。它仍有弱点,可能受到饱和连接攻击,可以把CPU资源耗光。
Netfilter/Iptables的防火墙功能介绍 4
Netfilter Automatic Rule Configurator(Netfilter/Iptables自动规则配置器)
注意: NARC,或别的什么防火墙,都不能保证你的网络的绝对安全。请看本问开始部分的关于防火墙的简单介绍。
安装NARC的系统要求:
- 系统内核必须2.4.x 以上 (http://www.kernel.org/)
- iptables tools (http://netfilter.samba.org/)
- 一个可工作的编译器 (如果你想自己编译)
谁可适用此工具?
如果你想用Netfilter/Iptables 来做防火墙,但你又对写脚本没有经验。NARC可以帮助你达成目标。
NARC是什么?
NARC是一个基于BSD license的免费的Netfilter/Iptables防火墙包。
NARC试图简化用iptables工具配置防火墙(状态包过滤)的难度。
Narc 的功能:(不全)
安装简单
连接跟踪(碎片重组)
可自定义日志记录
TCP & UDP探测保护
非法的TCP报头过滤
FIN, NULL, ACK 扫描保护
ICMP消息过滤和速率限制
SYN包长度检测
普通速率限制(防止DoS攻击)
基于TCP连接数的速率限制
SYN洪水保护
Smurf攻击保护
IP地址欺骗过滤
支持DMZ(非军事区)
支持端口转发
哪里得到NARC?
NARC的项目主页http://www.knowplace.org/netfilter/narc.html. 目前版本为v0.6.1http://www.knowplace.org/dl/narc-0.6.1.tgz (ae9011d1de7daa155a4a4b89ee3f0941).
Netfilter/Iptables常见问题解答
Q: 为什么用iptables -L,信息出来的非常慢?
A: 如果你没有用-n开关,Iptables将逆向解析IP地址,这将花费很多时间。使用--numeric 或-n 将显示数字化的地址和端口(如:iptables -L --line -nv).--line:显示行号,-n:数字化输出,-v:显示每条规则匹配的包数、字节数,并显示相应的接口。
Q:如何处理多播包multicast?
A: 由于多播包会击中NAT表, 但是目前连接跟踪(connection tracking)还不能处理多播包,最好丢弃它们
iptables -t mangle -I PREROUTING -j DROP -d 224.0.0.0/8
Q:为什么会看到如此信息:ip_conntrack: maximum limit of XXX entries exceeded?
A: 如果你在syslog中看到如此信息,可能是连接跟踪数据库(conntrack database)没有足够的环境空间。此值的缺省值会根据你的系统不同而有所不同。(如:64MB: 4096, 128MB: 8192, ...).
你可以简单的增加跟踪连接的数目,但要知道,每一个跟踪连接会吃掉350字节的内核存储空间。
例如:增加到8192,可以用以下命令:
echo "8192" > /proc/sys/net/ipv4/ip_conntrack_max
Q:我使用了ip_nat_ftp 和ip_conntrack_ftp 模块,但我的FTP服务器跑的不是标准的端口,如何办?
A: 带参数ports=#装载模块。例如,对于监听2121端口的FTP服务器,可用命令modprobe ip_nat_ftp ports=2121。如果需要指定多个端口,可用逗号格开(no space)。
Q: 如果我把模块静态的编译进了内核,我如何用这些选项呢?
A: 不要把它们编译进内核。
Q: Netfilter/Iptables支持NetMeeting (H.323)吗 ?
A: 不支持。目前还没有人写连接跟踪模块来支持它。平时可用http://openh323proxy.sourceforge.net/ 来在Netfilter下代理H.323连接。
Q: 我试图使用FTP安全补丁http://netfilter.samba.org/security-fix/ftp-security2.patch; 为什么不能很好的起作用?
A: 这个问题仅发生在v2.4.3以前的内核中。在后来发布的内核中,此问题已经解决。建议用最新的内核版本。
Q: 什么是patch-o-matic 并且我如何使用它?
A: Rusty的patch-o-matic帮助你给内核打上一些增强或实验性的功能。See http://www.knowplace.org/netfilter/ipt_compile.html for more details.
Q: Netfilter总是把日志记录显示在控制台上,我如何把它停止?
A: 有两个原因会导致这个问题。首先,确认/etc/syslog.conf中没有 kern.* /dev/console。如果没有,可以尝试用开关-c 3启动klogd。
Q: 我总是看到ACK FIN日志记录如:
kernel: IN=eth0 OUT= MAC=#:#:#:#:#:#:#:#:#:#:#:#:08:00 SRC=#.#.#.# DST=#.#.#.# LEN=40 TOS=0x00 PREC=0x00 TTL=43 ID=37639 DF PROTO=TCP SPT=# DPT=# WINDOW=4288 RES=0x00 ACK FIN URGP=0
有什么东西不对吗?
A: Well, yes and no. This is a known bug in which Netfilter appears to be dropping the conntrack entry for a specific connection too early. However, it isnt exactly clear if its Netfilter that has this wrong, or the server/client is doing this wrong. If you want to help, please send packet dumps (tcpdump) along with the error log to the netfilter mailing list (DO NOT just send the error logs). Either way, this is harmless beyond filling up your logs.
Q: 我用了一些不干净的补丁,为什么看起来它丢弃了一些有效包?这好象是从我升级内核到2.4.6以上时出现的
A: Its not called experimental for no reason. See http://lists.samba.org/pipermail/netfilter/2001-August/014748.html. The UNCLEAN match was always broken, but because it was never actually called, it didnt seem to break anything.
Q: 我如何列出 NAT/masqueraded 连接(ipchains -L -M)?
A: 使用 cat /proc/net/ip_conntrack.
Q: 当我使用 cat /proc/net/ip_conntrack来显示连接跟踪信息时,为什么在全部信息显示之前总是挂起一会?
A: /proc文件系统可以作为读-写锁被ip_conntrack同时访问。这可能是个短暂的现象并且可能不会经常发生。
Q: 如何列出所有可用的表?
A: cat /proc/net/ip_tables_names.
Q: 我如何列出 NAT/masqueraded 连接(ipchains -L -M)?
A: 使用 cat /proc/net/ip_conntrack.
Q: 我如何列出 NAT/masqueraded 连接(ipchains -L -M)?
A: 使用 cat /proc/net/ip_conntrack.
资源
ip_conntrack_ftp.c中的安全漏洞 (http://netfilter.samba.org/security-fix/index.html) - 此弱点仅在(<) to 2.4.4版本中存在。
Netfilter 工程(http://netfilter.samba.org/) - netfilter/iptables project home
Step-by-step Iptables tutorial (http://www.BoingWorld.com/workshops/linux/iptables-tutorial/) by Oskar Andreasson
Linux 2.4 packet filtering HOWTO (http://netfilter.samba.org/unreliable-guides/packet-filtering-HOWTO/index.html)
Linux 2.4 NAT HOWTO (http://netfilter.samba.org/unreliable-guides/NAT-HOWTO/index.html)
Iptables packet traverse diagram (http://ods.dyndns.org/ipt_flow.html)
Iptables connection tracking explained (http://www.cs.princeton.edu/~jns/security/iptables/iptables_conntrack.html)
Linux Networking-concepts HOWTO (http://netfilter.samba.org/unreliable-guides/networking-concepts-HOWTO/index.html)
RFC 1340 (http://andrew2.andrew.cmu.edu/rfc/rfc1340.html) - contains assigned numbers such as IP protocol number or well known port numbers
ICMP type-code summary (http://www.iana.org/assignments/icmp-parameters)
Netfilter mailing-list archive (http://msgs.securepoint.com/cgi-bin/get/netfilter-current.html) - searchable web interface provided by SecurePoint
Linux kernel howto http://www.linuxdoc.org/HOWTO/Kernel-HOWTO.html
ulogd project http://www.gnumonks.org/gnumonks/projects/project_details?p_id=1
The HoneyNet Project http://project.honeynet.org/ - know your enemies well
CERT?Coordination Center vulnerability news http://www.cert.org/nav/index_red.html
Understanding IP addressing http://www.3com.com/solutions/en_US/ncs/501302.html
Abnormal IP packets http://www.securityfocus.com/focus/ids/articles/abnormal1.html
TCP/IP refresher http://www.cs.wright.edu/~pmateti/Courses/499/TCPIP/
An Internet Encyclopedia http://packetderm.cotse.com/CIE/Topics/index.htm
SYN cookies ftp://koobera.math.uic.edu/syncookies.html
TCP window size http://www.ncsa.uiuc.edu/People/vwelch/net_perf/tcp_windows.html
Linux 2.4 Advanced Routing & Traffic Control http://www.ds9a.nl/2.4Routing/
Netfilter log format http://logi.cc/linux/netfilter-log-format.php3
Netfilter log analyzer http://logi.cc/linux/NetfilterLogAnalyzer.php3
--------------------------------------------------------------------------------
Glossary
bastion host - A heavily secured host.
host - Any computer that is connected to a network.
ICMP - Internet Control Message Protocol (RFC 792)
IP - Internet Protocol (RFC 791)
IP body - contains the actual data in an IP packet
IP packet - an IP packet is made up of an IP header and an IP body
IP header - an IP header contains meta-data about the IP body (diagram stolen from RFC 791)
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ |Version| IHL |Type of Service| Total Length | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Identification |Flags| Fragment Offset | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Time to Live | Protocol | Header Checksum | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Destination Address | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Network Address Translation (NAT) - A process that modifies either the source IP address or destination IP address of an IP packet.
packet - A unit of data exchange between hosts.
server - a host that will provide a network service to other hosts (i.e. accept new connections)
TCP - Transmission Control Protocol (RFC 793)
TCP handshake - a three step process that every (successful) TCP connection must follow (stolen diagram - dont remember where. Email me and Ill be glad to give you credit or take it down).
TCP header - a TCP header contains meta-data about the TCP body (diagram stolen from RFC 793) *slightly modified to add ECN and CWR.
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Source Port | Destination Port | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Sequence Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Acknowledgment Number | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Data | |C|E|U|A|P|R|S|F| | | Offset|Resrved|W|C|R|C|S|S|Y|I| Window | | | |R|N|G|K|H|T|N|N| | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Checksum | Urgent Pointer | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Options | Padding | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
TCP/IP - even though commonly spoken as if its a single protocol, TCP/IP is actually a TCP tunnel over the IP layer