📄 linux 2.4有状态防火墙设计(三).htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0050)http://www.linuxbyte.net/view.php?skin=art&ID=2586 -->
<HTML><HEAD><TITLE>linuxbyte</TITLE>
<META http-equiv=Content-Language content=zh-cn>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>A:link {
COLOR: #000000; TEXT-DECORATION: none
}
A:visited {
COLOR: #000000; TEXT-DECORATION: none
}
A:hover {
TEXT-DECORATION: underline
}
BODY {
FONT-SIZE: 12px; SCROLLBAR-ARROW-COLOR: #395d81; BACKGROUND-COLOR: #ffffff
}
TABLE {
BORDER-RIGHT: #889093 1px solid; BORDER-TOP: #889093 1px solid; FONT-SIZE: 9pt; BORDER-LEFT: #889093 1px solid; COLOR: #000000; BORDER-BOTTOM: #889093 1px solid
}
TEXTAREA {
BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; FONT-WEIGHT: normal; FONT-SIZE: 12px; BORDER-LEFT: #666666 1px solid; COLOR: #000000; BORDER-BOTTOM: #666666 1px solid; FONT-FAMILY: Verdana, Tahoma, Arial; BACKGROUND-COLOR: #f8f8f8
}
INPUT {
BORDER-RIGHT: #666666 1px solid; BORDER-TOP: #666666 1px solid; FONT-WEIGHT: normal; FONT-SIZE: 12px; BORDER-LEFT: #666666 1px solid; COLOR: #000000; BORDER-BOTTOM: #666666 1px solid; FONT-FAMILY: Verdana, Tahoma, Arial; BACKGROUND-COLOR: #f8f8f8
}
SELECT {
FONT-WEIGHT: normal; FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: Tahoma, Verdana; BACKGROUND-COLOR: #f8f8f8
}
.nav {
FONT-WEIGHT: bold; FONT-SIZE: 12px; FONT-FAMILY: Tahoma, Verdana
}
.header {
FONT-WEIGHT: bold; FONT-SIZE: 11px; COLOR: #ffffff; FONT-FAMILY: Tahoma, Verdana; BACKGROUND-COLOR: #698cc3
}
.category {
FONT-SIZE: 11px; COLOR: #000000; FONT-FAMILY: Tahoma, Verdana; BACKGROUND-COLOR: #efefef
}
.multi {
FONT-SIZE: 11px; COLOR: #003366; FONT-FAMILY: Tahoma, Verdana
}
.smalltxt {
FONT-SIZE: 11px; FONT-FAMILY: Tahoma, Verdana
}
.mediumtxt {
FONT-SIZE: 12px; COLOR: #000000; FONT-FAMILY: Tahoma, Verdana
}
.bold {
FONT-WEIGHT: bold
}
</STYLE>
</STYLE>
<META content="MSHTML 6.00.2800.1400" name=GENERATOR></HEAD>
<BODY leftMargin=0 background="Linux 2.4有状态防火墙设计(三).files/bg.gif" topMargin=0
rightMargin=0>
<TABLE
style="BORDER-RIGHT: #656b6d 1px solid; TABLE-LAYOUT: fixed; BORDER-TOP: #656b6d 1px solid; BORDER-LEFT: #656b6d 1px solid; BORDER-BOTTOM: #656b6d 1px solid; WORD-WRAP: break-word"
cellSpacing=0 cellPadding=0 width="98%" align=center bgColor=#ffffff border=0>
<TBODY>
<TR height=0>
<TD width="25%"></TD>
<TD width="65%"></TD>
<TD width="10%"></TD></TR>
<TR height=26>
<TD vAlign=center align=right width="100%"
background="Linux 2.4有状态防火墙设计(三).files/topbg.jpg" colSpan=3>
<FORM action=search.php method=post><SELECT name=radiobutton> <OPTION
value=news selected>-- 新闻搜索 --</OPTION> <OPTION value=articles>-- 文章搜索
--</OPTION> <OPTION value=software>-- 软件搜索 --</OPTION></SELECT><INPUT
size=15 name=Search> <INPUT type=image
src="Linux 2.4有状态防火墙设计(三).files/go.gif" border=0>
</FORM></TD></TR>
<TR>
<TD align=left width="20%"><IMG src="Linux 2.4有状态防火墙设计(三).files/logo.jpg"
border=0></TD>
<TD align=middle width="60%"><IMG
src="Linux 2.4有状态防火墙设计(三).files/logo2.jpg" border=1></TD>
<TD align=middle width="20%">::<A
href="http://www.linuxbyte.net/news.php">网站新闻</A>::<BR>::<A
href="http://www.linuxbyte.net/articles.php">技术文献</A>::<BR>::<A
href="http://www.linuxbyte.net/softs.php">软件中心</A>::<BR>::<A
href="http://www.linuxbyte.net/bbs/index.php" target=_blank>讨论区</A>::
</TD></TR>
<TR>
<TD background="Linux 2.4有状态防火墙设计(三).files/tabledi.jpg" colSpan=3
height=6></TD></TR>
<TR>
<TD background="Linux 2.4有状态防火墙设计(三).files/titlebg.jpg" colSpan=3
height=22><CENTER> <B><A
href="http://www.linuxbyte.net/index.php">首页</A></B> || <B><A
href="http://www.linuxbyte.net/bbs/index.php" target=new>讨论区</A></B> ||
<B><A href="http://www.linuxbyte.net/news.php">新闻中心</A></B> || <B><A
href="http://www.linuxbyte.net/articles.php">技术文献</A></B> || <B><A
href="http://www.linuxbyte.net/softs.php">软件中心</A></B> || <B><A
href="http://www.linuxbyte.net/about.php">关于本站</A></B> || <B><A
href="mailto:oneteam@mail.linuxbyte.net">联系本站</A></B>||</CENTER></TD></TR></TBODY></TABLE>
<TABLE
style="TABLE-LAYOUT: fixed; BORDER-COLLAPSE: collapse; WORD-WRAP: break-word"
cellSpacing=0 cellPadding=0 width="98%" align=center bgColor=#ffffff border=1>
<TBODY>
<TR><!--第二列-->
<TD vAlign=top align=left width="75%"><BR> <A
href="http://www.linuxbyte.net/index.php">首页</A><< <A
href="http://www.linuxbyte.net/articles.php">技术文献</A><< <B>Linux
2.4有状态防火墙设计(三)</B><BR><BR>
<UL> <BR><BR>第五章 有状态改进 <BR><BR>明确关闭 ECN
<BR><BR><BR>我以前提到过应当关闭 ECN(明确拥塞通知),以便因特网通信可以正确工作。虽然您可能会按我的建议禁用了
ECN,但在将来您也许会忘了这样做。或者,您可能将防火墙脚本传送给某个人,而那个人启用了 ECN。由于这些原因,最好使用 /proc
接口来明确禁用 ECN,如下所示: <BR><BR><BR>if [ -e /proc/sys/net/ipv4/tcp_ecn ]
<BR>then <BR>echo 0 > /proc/sys/net/ipv4/tcp_ecn <BR>fi
<BR><BR><BR>转发 <BR><BR>如果使用 Linux 机器作为路由器,那么应该启用 IP 转发,它给予内核许可权,以允许包在
eth0 和 eth1 之间传递,反之亦然。在我们的配置示例中,eth0 连接到 LAN,eth1 连接到因特网,在允许 LAN 经由
Linux 机器连接因特网时,启用 IP 转发是必要步骤。要启用 IP 转发,请使用以下这行命令: <BR><BR><BR>echo 1
> /proc/sys/net/ipv4/ip_forward <BR><BR><BR>处理拒绝,第 1 部分
<BR><BR><BR>目前,我们已经删除了所有来自因特网的未经请求的通信流。虽然这是一种阻止讨厌的网络活动的有效方法,但是它有一些缺点。这种方法最大的问题是闯入者很容易就可以检测到我们正在使用防火墙,因为我们的机器没有应答标准
TCP 复位和 ICMP 端口不可到达响应 -- 一般机器发送会的响应,用于表示对不存在服务的连接失败。 <BR><BR><BR>处理拒绝,第
2 部分
<BR><BR><BR>与其让潜在的闯入者知道我们在运行防火墙(对于在提示他们,我们正在运行一些他们不能得到的有价值服务),还不如假装我们根本没有运行服务。通过将以下两个规则添加到
INPUT 链的末端,可以成功地完成此项任务: <BR><BR><BR>iptables -A INPUT -p tcp -i eth1 -j
REJECT --reject-with tcp-reset <BR>iptables -A INPUT -p udp -i eth1 -j
REJECT --reject-with icmp-port-unreachable <BR><BR>第一个规则负责正确传递 TCP
连接,而第二个规则处理
UDP。只要这两个规则就位,闯入者就很难检测到我们运行了防火墙;但愿,这会使闯入者离开我们的机器,转而搜索其它更潜在的目标以供他滥用。
<BR><BR><BR>处理拒绝,第 3 部分 <BR><BR><BR>除了使防火墙变得更“隐蔽”,这些规则还消除了由于连接到某些 ftp 和
irc 服务器带来的延迟。这个延迟是由于服务器对您的机器执行身份查找(连接到端口 113)而引起的,并最终(大约 15
秒之后)导致超时。现在,防火墙将返回 TCP 复位,身份查找将立即失败,而不是重试 15 秒(而您正在耐心地等待服务器的响应)。
<BR><BR><BR>防止欺骗 <BR><BR><BR>在许多发行版中,当建成网络接口时,还会将旧的 ipchains
规则添加到系统。这些特殊规则是由发行版的创建程序添加的,用于处理电子欺骗问题,即包的源地址已经过调整,这样它们就包含了无效值(某些脚本骗子做的事)。虽然我们可以创建类似的
iptables 规则来阻拦受到欺骗的包,但还有一种更简单的方法。目前,内核的内置功能可以删除受到欺骗的包;我们要做的只是通过简单的 /proc
接口来启用它。方法如下。 <BR><BR>for x in lo eth0 eth1 <BR>do <BR>echo 1 >
/proc/sys/net/ipv4/conf/${x}/rp_filter <BR>done <BR><BR>此 shell
脚本将告诉内核删除接口 lo、eth0 和 eth1 上所有受到欺骗的包。可以将这些行添加到防火墙脚本中,也可以将它们添加到创建 lo、eth0
和 eth1 接口的脚本中。 <BR><BR><BR>伪装 <BR><BR><BR>NAT(网络地址转换)和 IP
伪装虽然与防火墙没有直接关系,但通常与防火墙一起使用。我们将讨论您可能需要使用的两种常用
NAT/伪装配置。第一个规则负责处理那种用拨号链接到使用动态 IP 的因特网 (ppp0) 的情况: <BR><BR><BR>iptables
-t nat -A POSTROUTING -o ppp0 -j MASQUERADE
<BR><BR>如果您属于这种情况,那么还应该转换防火墙脚本,将对 "eth1"(我们的示例 DSL 路由器)更改成 "ppp0"。如果
ppp0 还不存在,最好添加引用 "ppp0" 的防火墙规则。只要创建了 ppp0,一切立即就会正常工作。请确保还启用了 IP 转发。
<BR><BR><BR>SNAT <BR><BR><BR>如果使用 DSL 来连接因特网,那么您或许有两种可能配置中的一种。一种可能性是 DSL
路由器或调制解调器有其自己的 IP 号码,并为您执行网络地址转换。如果是这种情况,那么就不需要 Linux 来执行 NAT,因为 DSL
路由器已经这样处理了。 <BR><BR>但是,如果想要更多地控制 NAT 功能,也许应该与 ISP 讨论关于 DSL 连接的配置,以便使您的
DSL 连接处于“桥接方式”。在桥接方式中,防火墙将成为 ISP 的网络中的正式部分,DSL 路由器将会在 ISP 和您的 Linux
机器之间透明的来回转发 IP 通信流,而不会让任何人知道它的存在。它不再拥有 IP 号码;事实上,eth1(在我们的示例中)隐藏了
IP。如果有人从因特网上 ping 您的 IP,他们将从您的 Linux 机器上得到应答,而不是路由器。
<BR><BR><BR>使用了这种设置,就应该使用 NAT(源 NAT),而不是伪装。以下就是您应该添加到防火墙的一行代码:
<BR><BR><BR>iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to 1.2.3.4
<BR><BR>在这个示例中,应该将 eth1 更改成直接连接到 DSL 路由器的以太网接口,1.2.3.4 应该更改成静态 IP(以太网接口的
IP)。再次声明,请记住要启用 IP 转发。 <BR><BR><BR>NAT 问题 <BR><BR><BR>幸好,NAT
和伪装与防火墙能够和睦相处。在编写防火墙过滤规则时,应忽略正在使用 NAT
的事实。您的规则应该根据包的“真正”源地址和目的地址接受、删除或拒绝它们。防火墙过滤代码能够看到包的原始源地址,以及最终目的地址。这对我们很有用处,因为它可以让防火墙继续正常工作,即使我们暂时禁用了
NAT 或伪装。 <BR><BR><BR>了解表 <BR><BR><BR>在以上的
NAT/伪装示例中,我们将规则附加到链,但还做了一些略有不同的事。请注意 "-t" 选项。"-t"
选项可以让我们指定链所属的表。当省略这个选项时,缺省表将缺省为 "filter"。因此,以前所有与非 NAT 相关的命令修改 "filter"
表中的 INPUT 链。"filter" 表包含了所有与接收或拒绝包相关的规则,而 "nat"
表(如您假设的)包含了与网络地址转换相关的规则。还有其它内置 iptables 链,在 iptables 帮助页面以及 Rusty 的
HOWTO(请参阅本教程结尾处的“参考资料”部分,以获取链接)中详细描述了这些链。 <BR><BR><BR>增强的脚本
<BR><BR><BR>现在已经讨论过一些可能的增强,让我们看一下第二种更灵活的防火墙启动/停止脚本:
<BR><BR><BR>#!/bin/bash <BR><BR># An enhanced stateful firewall for a
workstation, laptop or router that isn <BR># running any network
services like a web server, SMTP server, ftp server, etc.
<BR><BR>#change this to the name of the interface that provides your
"uplink" <BR>#(connection to the Internet) <BR><BR>UPLINK="eth1"
<BR><BR>#if you e a router (and thus should forward IP packets between
interfaces), <BR>#you want ROUTER="yes"; otherwise, ROUTER="no"
<BR><BR>ROUTER="yes" <BR><BR>#change this next line to the static IP of
your uplink interface for static SNAT, or <BR>#"dynamic" if you have a
dynamic IP. If you don need any NAT, set NAT to "" to <BR>#disable it.
<BR><BR>NAT="1.2.3.4" <BR><BR>#change this next line so it lists all
your network interfaces, including lo <BR><BR>INTERFACES="lo eth0 eth1"
<BR><BR>if [ "$1" = "start" ] <BR>then <BR>echo "Starting firewall..."
<BR>iptables -P INPUT DROP <BR>iptables -A INPUT -i ! ${UPLINK} -j
ACCEPT <BR>iptables -A INPUT -m state --state ESTABLISHED,RELATED -j
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -