防火墙介绍
Disclaimer: 下面描述的有些内容可能不完全正确.但希望对你理解iptables有帮助,如果你发现了错误,请通知我。
注意,此说明是非拷贝的(例如在GPL).如果你想做任何修改、发布、拷贝、引用,请先联系我。(哈哈,不管了)
什么是防火墙?
简单说,防火墙就是用来保护你的网络的一台主机,它对来自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 aclearcase/" target="_blank" >ccount 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 isn't 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
从同一主机发往不同目的端口的TCP/UDP包的总的优先级,被用来作为端口扫描次序
--psd-delay-threshold
由同一主机发往不同目的端口的包的延迟 (in hundredths of second) ,用来作为可能的端口扫描子次序
--psd-lo-ports-weight
特权目的端口的优先级,即目标端口(<=1024)的优先级
--psd-hi-ports-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)中的包重