• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

IPtable 1.0.7 指南

发布: 2007-7-02 21:50 | 作者: admin | 来源: | 查看: 10次 | 进入软件测试论坛讨论

领测软件测试网

为什么?
我发现目前所有的HOWTO 都缺乏新的Linux 2.4.x 内核中的新Iptables 函数的信息,于是我试图回答象一些新的可能性在诸如状态匹配之中的问题. 假设问一下, 你的服务器上能否构建这么一种情况,它 允许被动的FTP访问 ,但不许从IRC中流出DCCs. 我将在例子 rc.firewall文件中构建这种情况,你可以在你的/etc/rc.d/ scripts中使用。是的,最初这篇文章是伪装成HOWTO文档的形式书写的,因为许多人只接受HOWTO文档,。
还有一个小脚本,我写它只是为使你在配置它的时候能象我一样振奋,具体文件可以在flush-iptables.txt中获得.

怎么样?
我已经向Marc Boucher 及netfilter团队的其他核心成员提出了问题。对他们的工作以及对我在为boingworld.com书写这个指南时的帮助表示极大的谢意。这个文档将一步一步教你setup过程,让你对iptables包有更多的了解。这大部分的东西都基于例子rc.firewall 文件,因为我发现这是学习iptables的一个好方法。我不太确定如何组织这篇文章,但我最后决定自顶向下地跟随rc.firewall 文件,换句话说,你可以阅读rc.firewall 文件,当你碰到不懂的东西时再来查看这个文件。

你是谁?
我是这样一个人,在我的局域网上有很多旧机器,等待连接到Internet上并保证安全。在这一点上,新的iptables 是从旧的ipchains 上的一个很好的升级,以前,你可以通过丢失所有的包,并将它们不送往特定的端口来建立一个安全的网络,但这将导致类似被动的 FTPs 或在IRC中流出DCCs的问题,你得服务器分配端口,并告知客户端,然后再让客户连接。但是,新的iptables 代码中也有一些小毛病,在某些方面我发现这些代码并没有为作为完整的产品发布做好准备,但我仍然建议那些使用ipchains 或更老的ipfwadm 的人进行升级,除非他们对正在使用的代码满意,或则它们足以满足他们的需要。

从哪获得 ?
iptables 用户空间包可以从netfilter 的一个主页获得。iptables 还使用了内核空间包,在配置时可以加入内核,有用的部分我们将在下文讨论。

内核setup
运行iptables 最基本的部分,你需要将下面的选项配置入内核:
CONFIG_PACKET
CONFIG_NETFILTER
当然你需要配置好你的接口,使它们工作,那就是Ethernet, PPP 和 SLIP 接口。如果你想用更高级的选项,你需要将下面的选项配置入内核:

CONFIG_IP_NF_CONNTRACK
CONFIG_IP_NF_FTP
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_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
你还可以看到很多,在此我不一一解释,如果你需要或好奇可以自己仔细去看看。built-in 在配置时有帮助,其他命令对于了解基本的东西会有帮助,详细情况请看一下netfilter 主页上的HOWTO"s
下文中的一些选项是你所需要使用而且我也将要讲述的.
CONFIG_PACKET
CONFIG_NETFILTER
CONFIG_IP_NF_CONNTRACK
CONFIG_IP_NF_FTP
CONFIG_IP_NF_IPTABLES
CONFIG_IP_NF_MATCH_STATE
CONFIG_IP_NF_MATCH_UNCLEAN
CONFIG_IP_NF_TARGET_REJECT
CONFIG_IP_NF_TARGET_MASQUERADE

使用过的选项的解释
CONFIG_PACKET 使得类似tcpdump 的程序工作,在本指南中并没有真正使用,但因为你读了,我假设你对安全方面感兴趣, 在这一点上,tcpdump和snort是好的添加。
CONFIG_NETFILTER 能使内核中信息包进行过滤,没有这一选项,你不能使用iptables ,没有它你也不能伪装你的连接。
CONFIG_IP_NF_CONNTRACK ------连接跟踪,它跟踪连接,并知道在一个连接中信息包如何、在哪相关联。它在伪装或做任何一种NAT操作的时候需要!
CONFIG_IP_NF_FTP 跟踪FTP连接,因为它与基本的过滤器有点问题,所以是分开的代码。当你想在FTP的连接上伪装时需要它。
CONFIG_IP_NF_IPTABLES 是iptables 支持,如果你想使用iptables就需要它。(如果你不需要它我不知道你为什么要读这篇文章)。
CONFIG_IP_NF_MATCH_STATE 是iptables的状态匹配代码,对2.3.x 和 2.4.x 内核来说它是一种新的特性,但到目前为止还没有很好的文档对它加以描述,这也是我所想补救的。它所做的就是在基于信息包与其他连接的关系上增加包过滤的可能性,例如你可以使一个被动的FTP 客户通过一个其他方面是完全关闭的服务器,下载文件,列表目录等。
CONFIG_IP_NF_MATCH_UNCLEAN 支持通过观察包头部的一系列域来匹配不干净的包或无效包。
CONFIG_IP_NF_TARGET_REJECT 这段代码向你的过滤器中增加REJECT 目标。换句话说,它可以让你用`ICMP error" 回答,而不只是丢弃死包。这在你想告诉别人无法连接时有好处。
CONFIG_IP_NF_NAT 允许你做伪装、端口传送等等操作。如果你只有一个配置的IP ,但是还想将所有的网络设备都连到Internet 上,就需要它将你的局域网连到Internet 上。
CONFIG_IP_NF_TARGET_MASQUERADE 使改变你的局域网到 Internet 的连接成为可能,使他们看起来象是从其他的主机而不是普通的box IP来。想知道它在理论上是怎么工作的请查看masquerading HOWTO。
当然你可能不会用到所有的这些选项,或者你想使用其他的配置选项,以上这些是我在这个指南中将要用到的,为了在你的网络设备上建立基本的安全体制。
用户设置
在这你要做的就是获取iptables 包并配置好它, iptables包在netfilter的一个主页可下载. 。当然,安装这个包也是个好主意。
rc.firewall 文件
例子 rc.firewall

好了,你已经建立好了一切,准备好看看例子rc.firewall文件 。这个文件很长,有很多注释,看看它再回来看解释。

rc.firewall的解释

额外模块的初始加载
首先我们注意到模块关联文件通过发布/sbin/depmod ——一个命令而保持最新的。然后我们加载一些我们感兴趣的模块。比如你想要支持REJECT 和MASQUERADE 目标,但你没有将它在你的内核中编译,我们就加载这些模块。
下一步是加载ipt_owner 模块的选择,比如只允许特定用户做特定连接等。在这个例子中我不用它,但基本上,你可以只允许根做与redhat 和 DROP及其他一切的 FTP 和 HTTP连接。或者除了你的用户和根以外,你不许其他用户从你的网络设备连接Internet,可能对其他人不方便,但你在黑客攻击前可能安全些。
这之后是我们状态匹配过滤器使用的第一部分,ip_conntrack_ftp 和 ip_conntrack_irc的加载。通过它可以做我在本文一开始就鼓吹的事情: 状态匹配,比如不允许被动的FTP 而允许DCC 工作,我们只加载了ip_conntrack_ftp 模块,却没加载ip_conntrack_irc模块。为使他们工作,这两者必须没被编译进内核,我重复一遍,必须没有。反之亦然,我们在哪希望被动的FTP 工作,却没发送DCC ,当然我们得用其他方式做,加载IRC 模块,而不是FTP 模块。它所做的就是比如增加内核辨认一个与当前活跃的FTP 控制流程相关联的被动FTP连接的能力,但因为IRC 模块没被加载,内核没法辨认它是否与当前某个活跃的流相关联,因此它不允许这些连接。如果你用相反的方式做,相反的结果成立。

为了IP传送的内核初始化及其他

之后,我们通过给/proc/sys/net/ipv4/ip_forward 回应一个 ”1”来开始IP 传送 ,可以使用下面的方式:
echo "1" > /proc/sys/net/ipv4/ip_forward
万一你需要动态的IP 支持,比如你使用SLIP, PPP或DHCP等等 ,你需要做下面的操作来启动ip_dynaddr 选项:
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
如果还有其他选项你要开启,那么你要遵循它们的格式,有其他的文章介绍如何去做这些工作,在本文中就不做介绍了。

真正开始伪装

我们第一个任务就是开始真正的伪装,是吗?至少对我是这样的。首先我们向nat table添加一条规则,在POSTROUTING 链上,该规则将伪装出自我们与Internet连接的接口的所有包。对我来说这是eth0,-t 告诉我们用哪个表,在这种情况下是nat,-A 告诉我们,我们将在一个叫做POSTROUTING 的已存在链上加一个新规则,-o eth0 告诉我们匹配eth0 上的所有流出包,我们最后的目标是伪装包。所有与这条规则匹配的包都被伪装,看起来象来自你的Internet 接口。很简单,是吗?
下一步是接收所有来自输入接口eth1 的并通过默认表过滤器中的FORWARD链的包,eth1是与内部网络连接的接口。所有在我们网络设备被传送的包都将穿过过滤器表中的FORWARD 链。
下一件事是接收所有来自任何地方的建立或关联某个连接的包。换句话说,在eth1后我们先在本地网络设备发送一个包,因为它来自eth1, 所以我们接收它,然后当Internet 网络设备应答的时候,它被这个规则俘获,因为连接在两个方向上都看见了这个包。
最后的事情就是记录滑过边缘命中省缺策略的负载,这是那些应该通过却没有通过的包。在其他情况下,他们可能是那些显然不能通过的包,你要通报这一点。我们允许这条规则每分钟最多匹配3次,限制是3。这意味着在这条线上,我们每分钟最多得到3条记录(log entries),限制仍是3,所以如果我们在2秒钟内得到3条记录,下条记录我们要等1分钟。如果有人对你倾倒废物的话这是好的,否则会产生许多兆字节的日志记录。我们在日志前加一个前缀——log-prefix,将日志级别设为log-level,日志级别将告诉syslogd或logging facility这条日志到底重要到什么程度。

不同链的规则取代,为什么?
我用尽可能多的节约CPU资源 的方式取代了不同的链。不让TCP 包穿过ICMP,
UDP 和 TCP规则,我只是匹配TCP 包,让TCP 包穿过另一条链。使用这种方法我们并没有耗费太多资源。下面的图画试着解释一个包如何穿过你的ipfilters。这副图来自

首先做一个路由决策,如果它的目的地是你的主机,它是发向INPUT,如果它的目的地是本地网的某个网络设备,它是发向FORWARD。然后它们穿过那些链。如果你的本地网络设备对去往服务器的包做出应答,它们将穿过OUTPUT 链。
这有一幅图给出它们怎么穿过INPUT 、 FORWARD 、 OUTPUT链,
当一个包碰到INPUT 链,它首先被检查是否是ICMP 包,如果是,则被发往icmp_packets 被检查是否被允许。如果允许,我们只是离开INPUT 链接收这个包。如果不允许,它将到达icmp_packets 链尾,回到INPUT 链,到达链尾做更多的检查,看它是否来自本地主机或本地网,如果是它将被接收。通过检查它是否是一个已建立或相关连接的一部分来检查这个包是否属于其他连接,在这种情况下我们要接收它们。如果它什么也不匹配,它将由丢弃链规则来处理,这条规则负责丢弃它所碰到的任何东西。
如果是个TCP 包,它不会匹配是ICMP 包的规则,传到下一个检查是否是TCP包的规则。因为是,所以匹配,将被传送到tcp_packets 链。这里我们将检查它是否去往我们所允许或不允许的一个端口,如果是, 我们将它传送到允许的链做最后的检查。如果在检查中它失败了,它将被送到INPUT 链,穿过与ICMP 包相同的路。
UDP包基本上一样,除了它要穿过udpincoming_packets 链,如果它在那什么规则也没匹配,它将被送到INPUT 链,穿过与TCP包和ICMP 包相同的路 。具体图片可以在以下地址获得.
如果包去往或来自我们的本地网,它将被路由到FORWARD链。如果包来自我们的局域网,我们接收它,不多不少。如果我们愿意,我们可以只接收SYN包,但我跳过它了。如果包去往我们的本地网,我们只是匹配已建立的或相关的流,因为我们不想建立从外部到我们本地网的新连接。如果这些规则都不匹配,包将被我们的链规则丢弃。具体图片可以在以下地址获得.
这个链是很直接的。我们允许任何东西从本地主机发出,我们允许任何东西从本地网的ip发出,最后我们允许任何东西从我们自己的ip 发出到internet。你可能在某种情况下希望消除这一切,不过不要忘了消除OUTPUT 链的默认规则是丢弃所有的东西。

建立不同的使用链
现在你有点了解包如何穿过不同链以及它们之间的从属关系,我们负责将它们联系起来。 首先我们用一个简单的命令配置不同链上的默认规则。iptables -P
默认规则在包不能与链中规则匹配时使用。然后我们建立我们想与-N 命令一同使用的不同的特殊链。新链将建立起来而且内部没有任何规则。我们使用的链是icmp_packets,tcp_packets, udpincoming_packets 和tcp_packets允许的链。在eth0上的包,凡是属于ICMP 类的,将被重定向到icmp_packets,属于TCP 类的,将被重定向到tcp_packets ,而来自eth0 的UDP 类包则定向到 udpincoming_packets 链。

TCP允许的链,允许TCP前的最后一次检查
如果一个包来自eth0 是TCP 类的,它穿过tcp_packets 链,如果连接与一个允许的端口相反,我们将要做一些最后的检查来看我们是否真的允许它。首先我们象以前一样建立链。然后我们检查包是否是SYN 类的。如果是,它很可能是一个新连接的第一个包,当然,我们允许它。然后我们检查包是否来自一个已建立的或相关的连接,如果是,我们当然也允许它。一个已建立的连接(ESTABLISHED connection )是一个双向都有负载的连接,因为我们获取了一个SYN包和一个对SYN包的应答,连接必为已建立(ESTABLISHED)状态。链中的最后一条规则将把剩下的所有东西丢弃。在这种情况下意味着没有看到两个方向的负载,也就是没对SYN包做应答,或者他们开始与一个不是SYN的包连接。不开始一个与SYN 包的连接没有什么实际用途,除了对 那些进行端口扫描的人。当前没有可利用的TCP/IP 应用支持打开一个除了SYN 包的TCP 连接,所以丢弃这些废物, 因为它99%是进行端口扫描。

ICMP链
这是我们决定ICMP 类允许什么的地方。如果一个ICMP类型的包在INPUT 链上来自eth0,我们将使它重定向到icmp_packets 链。在这我们将检查什么种类的ICMP类被允许。象现在我只允许传入的ICMP Echo Replies, Destination unreachable, Redirect 和 Time Exceeded。
我允许这些ICMP 包的原因如下,Echo Replies是你ping 其他主机时获得的,如果不允许这个,我们就不能ping 其他主机了。Destination Unreachable 在特定主机无法到达时使用,所以比如我们发出一个HTTP 请求,主机不可到达,无法找到主机路由的最后一个网关应答Destination Unreachable 告诉我们找不到它。这使我们不用等到浏览器的60秒或更多的超时设定到达。Redirect,我允许它因为我可能没有使用到达一个主机的最佳路径,比如我向Gateway 1(G1) 发送一个包,与Gateway 2(G2)在同一个网段,G1 将包发给G2,G2可能告诉你使用G2而不是G1 来节省一跳。这样我们有时可以传送的快一点,不是很多,但至少好一点。Time Exceeded被允许是因为我们可能想跟踪一些主机或一个包获得的生存期为0,我们将得到关于这个的应答。比如当你跟踪某个人时,你从TTL = 1开始,在向外的第一跳它减小到0,从第一个网关返回一个Time Exceeded 到我们跟踪的主机,则TTL = 2 ,第二个网关发送Time Exceeded,等等,直到我们从想到达的主机得到应答。
这是ICMP 类的一个总列表:
Table 1. ICMP types

Type Code Description
0 0 Echo Reply
3 0 Network Unreachable
3 1 Host Unreachable
3 2 Protocol Unreachable
3 3 Port Unreachable
3 4 Fragmentation needed but no frag bit set
3 5 Source routing failed
3 6 Destination network unknown
3 7 Destination host unknown
3 8 Source host isolated (obsolete)
3 9 Destination network administratively prohibited
3 10 Destination host administratively prohibited
3 11 Network unreachable for TOS
3 12 Host unreachable for TOS
3 13 Communication administratively prohibited by filtering
3 14 Host precedence violation
3 15 Precedence cutoff in effect
4 0 Source quelch
5 0 Redirect for network
5 1 Redirect for host
5 2 Redirect for TOS and network
5 3 Redirect for TOS and host
8 0 Echo request
9 0 Router advertisement
10 0 Route sollicitation
11 0 TTL equals 0 during transit
11 1 TTL equals 0 during reassembly
12 0 IP header bad (catchall error)
12 1 Required options missing
13 0 Timestamp request (obsolete)
14 0 Timestamp reply (obsolete)
15 0 Information request (obsolete)
16 0 Information reply (obsolete)
17 0 Address mask request
18 0 Address mask reply ?/TD>

如想获取更多的信息,我建议你阅读下面的网站和报告:
The Internet Control Message Protocol ICMP
RFC792
又及,阻碍你想要做的某些事情可能是我的错误,但对我来说,阻碍其它我不允许的ICMP 类型将会使我的一切东西都工作的很好。

TCP 链
现在我们讲TCP连接。它指定了从Internet的防火墙上什么端口可以被使用。当然这还要做更多的检查,所以我们发送每一个TCP包,其中总有一个会到达我们前面提到的允许的链中。一个tcp_packets 告诉iptables 在哪个链中添加新规则,规则被添在链尾。-p TCP 告诉它匹配TCP包,-s 0/0 匹配所有的源地址,从0.0.0.0 ,掩码为0.0.0.0,换句话说就是所有的源地址,实际上这是省缺的行为,但我在这忽略用它。--dport 21表示目标端口21,换句话说,如果包去向端口21他们也匹配。如果所有的标准都匹配了,包就去向允许的链。如果它有任何一条规则没匹配,它将被传回到发送它到tcp_packets 链的链。
象现在,我允许TCP port 21,或FTP 控制端口,它用来控制FTP 连接,稍后我还允许所有的相关连接,而且那样我还允许PASSIVE 和 PORT 连接,因为ip_conntrack_ftp 模块被加载。如果我们完全不允许FTP ,我们可以卸载ip_conntrack_ftp 模块,从rc.firewall 文件中删除那条链。
端口22是SSH,比允许端口23上的telnet 好,如果你想允许外面的人使用你网络设备上的 shell。
端口80是HTTP,换句话说就是你的网络服务器,如果你不想在你的站点上运行一个网络服务器就删掉它。
最后,我们允许端口113,它是IDENTD ,对于使用象IRC的协议工作好有用处。
如果你想增加更多的开放端口,那怎样做则就是你自己的事情了。

UDP 链
现在,如果我们在INPUT 链上获得一个UDP 包,我们则将它继续传送到udpincoming_packets。
现在,如果我们确实在INPUT 链上获得一个UDP 包,我们则将它继续传送到udpincoming_packets,在那用-p UDP 再为UDP协议做一个匹配,匹配了所有的源地址为0.0.0.0 掩码为0.0.0.0 的东西,换句话说所有的东西又匹配了。如果他们还有源端口53,我们直接接收它们。
现在,我从端口53 接收来的UDP 包,用来做DNS 查找,没有这个我们做不了域名查找而且我们只能使用IP"s。我们不希望这种行为,所以我们当然允许DNS。
我个人还允许端口123,是NTP 或网络时间协议(network time protocol)。这个协议用来将你的计算机的时间设置为与具有非常准确的时钟的服务器相同的时间。虽然你们大多数人可能不用这个协议,我允许它是因为我知道有些人用。
我们现在还允许端口2074,用于象speak freely 一类的实时多媒体应用。使用speak freely你可以通过喇叭、麦克风或耳机与其他人实时交谈。
端口4000,现在众所周知是ICQ协议。我觉得没有必要进一步解释它是干什么的。

nat table的PREROUTING 链
PREROUTING 链与它的字面意思一样,在它们真正遇到将它们送到过滤表上不同的INPUT/FORWARD/OUTPUT 链的路由表之前过滤包。这是检查包是否具欺骗性的好地方。
首先我们检查显然欺骗的IP 地址,就象万一我们从Internet 接口处获得一个包,声明有一个源IP 192.168.x.x, 10.x.x.x 或 172.16.x.x, 我们马上把它们扔掉,因为这些地址是为本地内部网保留的,显然不能在Internet上使用。这也可以反过来使用,比如我们从$LAN_IFACE 处获得一个包,声明不是从$LAN_IP_RANGE的IP地址处来的,我们也把它扔掉 。

INPUT 链
象我写的INPUT 链大多使用其他链来工作。在这种方法下,我们并没有从iptables处获得太多的负载,因此它在那些高负载下可能丢失包的慢机器上也能工作的很好。
在这我们对坏包做特别检查。如果你想完全了解这一点,你要看附录的regarding state NEW and non-SYN packets getting through other rules。在特殊条件下这些包被允许,但99%的情况下我们不希望这些包通过。所以我们将它们记录到日志并丢弃。首先我们匹配引入接口$INET_IFACE的INPUT 链的所有ICMP包,引入接口是eth0,把包传到前面讲过的icmp_packets。然后我们对$INET_IFACE 上的TCP 包做同样的匹配,并将它们送到tcp_packets 链,之后所有的UDP 包送到udpincoming_packets 链。最后我们检查来自$LOCALHOST_IP的所有东西,一般是127.0.0.1 ,接收从那来的所有负载,对来自$LAN_IP_RANGE的做同样的事,一般是192.168.0.0/24,这之后要考虑一下安全问题了,我们允许来自我们自己Internet IP 的任何东西,它们或者已建立连接或者与某些连接相关联。我们还允许我们局域网的广播负载,一些应用依赖于它,象Samba , 没有它这些应用无法很好地工作。
在我们遇到INPUT 链的默认规则前,我们把它记入日志以便发现可能的问题或bugs。它或者是一个我们不允许的包,或者是对我们做坏事的人,或者是我们防火墙中的一个问题,不允许那些被允许的包。无论是那种情况我们都想知道然后做出处理。虽然每分钟我们记录不超过3个包,这是为了使日志文件不被垃圾充斥,我们还为日志记录加了前缀,使我们知道它是哪来的。
不被匹配的东西就会被INPUT 链的默认规则扔掉。默认规则是很早以前设置的,你应该记得。

OUTPUT 链
因为我知道除了我之外没人使用这个部分用做防火墙和工作站的网络设备,我允许来自它拥有源地址$LOCALHOST_IP, $LAN_IP 或 $STATIC_IP的任何东西。其他的所有东西都以某种方式欺骗,尽管这样我还是怀疑某个我知道的人会在我的网络设备上这么做。最后,我们将扔掉的所有东西记录下来。如果它确实被扔掉了,我们确定会因为这个或那个而想知道它。不管它是一个令人厌恶的错误或是一个奇怪的包,都是欺骗。最后我们扔掉默认规则中的包。

FORWARD 链
我虽然没在rc.firewall 例子文件中建立一个特别的块,但是我将对其中的几行加以评论。象现在这样,我用下面这行接收来自我们局域网的所有包:
/usr/local/sbin/iptables -A FORWARD -i $LAN_IFACE -j ACCEPT
所以不管情况怎样来自我们本地网接口的任何东西都被接收。之后我们接收来自任何地方具有ESTABLISHED 或RELATED状态的任何东西,换句话说,如果我们打开一个从我们局域网到Internet上某个东西的连接,我们允许从那个站点回来的具有ESTABLISHED 或RELATED状态的包。之后我们记录所有的东西并丢弃它。我们每分钟最多记录3个日志记录以防止日志文件溢出,加一个短前缀, 可做文件内的字符串查找。同样我们也可以做调试级的记录。我们最后会碰到FORWARD链的默认规则,丢弃所有东西。

其他例子
rc.DMZ.firewall.txt

你将在下书URL处找到这一脚本:rc.DMZ.firewall.txt
。这一脚本是为那些拥有一个可信赖的网络、一个De-Militarized Zone 、一个Internet 连接的人。De-Militarized Zone 是1-to-1 NAT"ed ,需要你在防火墙上做一些IP别名,就是你必须使网络设备认识来自多于一个IP的包。在这个指南的后面你将看到如何做IP别名(IP aliasing )的例子,现在 你还看不到什么实际的例子。从图中你可以看出你需要2个内部网络。一个使用的ip范围是192.168.0.0/24 ,包括De-Militarized Zone。如果internet 上的某个人向我们的DNS_IP发送一个包,我们使用DNAT(Destination Network Adress Translation)将包发送到DMZ上的DNS 。当DNS 看到我们的包时,包将去向真正的DNS 内部网IP,而不是外部的DNS IP。如果包不被翻译,DNS不应答包。DNAT 代码如下面的例子:
$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP –dport 53 -j DNAT --to-destination $DMZ_DNS_IP
首先DNAT 只能在nat table的PREROUTING 链中执行。然后我们来看看拥有匹配$DNS_IP的目的IP的$INET_IFACE 上的TCP协议,被指向端口53,是DNS"s中地域传送的TCP 端口。如果我们真得到了一个目的为DNAT的包,即Destination NAT。之后我们用--to-destination 选项规定想让包去的地方,将它赋值$DMZ_DNS_IP,即我们DMZ上DNS 的IP。这就是DNAT 工作的基本原理。当对DNAT包的应答穿过防火墙,它自动被un-DNAT"ed。
现在你该知道一切是怎么工作的,能够在较简单的情况下地了解这个脚本了吧? 如果有什么你不了解,而且我的指南也没讲,那么请发邮件给我,因为那也许是我的错误。

没有DCC的被动FTP , 感兴趣的额外阅读
这是关于2.4.x 内核的新iptables 支持的真正美好的部分之一,比如你可以允许被动的FTP 连接,但不允许DCC 发送带有新状态匹配代码的函数。你可能会问自己如何做到,只要你想就很简单。只要编译内核中的ip_conntrack_irc 和ip_conntrack_ftp 模块。这些模块做的就是增加对conntrack 模块的支持,使它可以识别一个被动的FTP 连接或一个DCC发送连接。比如你想允许一个被动的FTP连接而不允许DCC发送,你将加载ip_conntrack_ftp 模块,而不是ip_conntrack_irc 模块,然后做:
/usr/local/sbin/iptables -A INPUT -p TCP -m state --state RELATED –j ACCEPT
允许被动的FTP 而不允许DCC。如果你想做相反的,你就加载ip_conntrack_irc 模块而不是ip_conntrack_ftp 模块。

规定 NEW 信息包 但没有 SYN 置位
iptables 有一个特点没被很好的说明, 因而可能被许多人忽视。如果你使用状态NEW,SYN 位没置的包将穿过你的防火墙。有这个特点是因为特定情况下我们不认为一个包是另一个防火墙上已建立连接的一部分。这个特点使得有两个或更多的防火墙成为可能。这个子网的防火墙将被我们的第二防火墙取代,状态NEW 因此允许相当多的任何种类的TCP连接,不管这是否是三方握手(3-way handshake) 。为解决这个问题,我们向防火墙的INPUT, OUTPUT 和 FORWARD 链添加如下规则:
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j LOG --log-prefix "New not syn:"
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP"
上述规则将解决这个问题。这是netfilter/iptables 计划中文档的严重问题,应该被提出。换句话说在你的防火墙上对此种行为应该发出严重警告。

使用赋值的 IP"s的奇怪的ISP"s

我增加了这个是因为我的一个朋友告诉我我几乎忘光了的一件事,一些愚蠢的ISP"s为他们的本地网 使用用IANA 赋值的IP"s 。例如瑞典的ISP 和电话垄断者Telia在他们的DNS 服务器上使用这种方法,使用10.x.x.x IP 范围。你最可能遇到的问题是,在这个脚本中我们不允许任何在10.x.x.x范围内的IP"s 到我们的连接,因为可能有欺骗。好,这有个例子,你在那些规则上的花些力气。你可能在欺骗部分插入一个ACCEPT 规则,允许来自那些DNS 服务器的负载,或者你可以注释那部分脚本。它看起来象这样:
/usr/local/sbin/iptables -t nat -I PREROUTING -i eth1 -s 10.0.0.1/32 –j ACCEPT
我将咒骂这些ISP"s。这个范围不是为你用来做填充的,至少在我的知识范围内不是,对于大的公司站点更不是,或者对于你的家庭网络,但你不能迫使我们开放自己只因为你的一些whince 。


更新并刷新你的表

如果你弄乱了你的iptables,有命令可以刷新它,你不必要重启动。到现在为止我遇到这个问题好多次了,所以我想我将在这回答它。如果你错误地增加了一条规则,你可以在你加错的那一行上将-A 参数改为-D,iptables 将发现错误行并替你抹去,万一你有几行看起来相同,它抹去它发现的与你的规则匹配的第一个实例。如果这不是你想要的行为,你就要试着使用-D 选项,iptables -D INPUT 10,将INPUT链中的第十条规则抹去。
还有你想刷新整个链的情况,这时你要执行-F 选项。比如iptables -F INPUT将抹去整个INPUT 链,虽然它不会改变默认规则。因此如果默认规则被置为“DROP” ,而且你想象上面一样使用,则你要阻塞整个INPUT链,重置链规则,象你置“DROP”一样做。例如iptables -P INPUT ACCEPT。
我做了一个小的脚本 (作为附录)可以刷新并重置你的iptables,你在创建你的rc.firewall文件时可以考虑使用。还有一件事情,如果你在弄乱的表中变的混乱,这个脚本不会抹去它们,它只添加抹去它们需要的几行,但在这我不添加它们,因为弄乱的表在我的rc.firewall 脚本中不使用。

其他的资源及连接
这是我获得信息的一些连接:

system control via /proc etc
The official site of iptables and netfilter
The official netfilter FAQ
Rusty"s Unreliable Guide to packet filtering
Rusty"s Unreliable Guide to Network Address Translation
Rusty"s Unreliable Netfilter Hacking HOWTO
Netfilter user mailing-list
当然,还包括iptables 的原始资料,文档及帮助我的人。

贡献者
我感谢下面的人在我写这篇文章时对我的帮助:
Fabrice Marie, 修改我的语法及拼写. 感谢他将指南修改成 DocBook 格式并带有 make files等等。
Marc Boucher, 在使用状态匹配代码上给予了我很大的帮助。
Frode E. Nyboe,完善了 rc.firewall 的规则,在我重写ruleset时给了我很大灵感,使我引入了在同一文件中使用多重表格的方法。*
Chapman Brad, Alexander W. Janssen, 他们使我认识到,我在想包如何以它们显示的顺序穿过基本的 NAT和 filters tables时最初是想错了。
Michiel Brandenburg, Myles Uyema,帮助我书写一些状态匹配代码并使它们工作。
Kent `Artech" Stahre, 帮助我从绘图的烦琐工作中解脱出来,我知道我热中于绘图,但是你是我所知道的绘图最好的人,还感谢你帮我检查指南的错误。
Jeremy `Spliffy" Smith, 感谢在可能扰乱人的素材上给我以暗示,感谢尝试它并检查我写的东西的错误。
还有所有我曾经谈过话、向他们询问过建议的朋友。

例子 rc.firewall <>

#!/bin/sh
#
# rc.firewall - Initial SIMPLE IP Firewall test script for 2.4.x
#
# Author: Oskar Andreasson
# (c) of BoingWorld.com, use at your own risk, do whatever you please
with
# it as long as you don"t distribute this without due credits to
# BoingWorld.com
#

###########
# Configuration options, these will speed you up getting this script to
# work with your own setup.

#
# your LAN"s IP range and localhost IP. /24 means to only use the first
24
# bits of the 32 bit IP adress. the same as netmask 255.255.255.0
#
# STATIC_IP is used by me to allow myself to do anything to myself,
might
# be a security risc but sometimes I want this. If you don"t have a
static
# IP, I suggest not using this option at all for now but it"s stil
# enabled per default and will add some really nifty security bugs for
all
# those who skips reading the documentation=)

LAN_IP_RANGE="192.168.0.0/24"
LAN_IP="192.168.0.2/32"
LAN_BCAST_ADRESS="192.168.0.255/32"
LOCALHOST_IP="127.0.0.1/32"
STATIC_IP="194.236.50.155/32"
INET_IFACE="eth0"
LAN_IFACE="eth1"
IPTABLES="/usr/local/sbin/iptables"

#########
# Load all required IPTables modules
#

#
# Needed to initially load modules
#
/sbin/depmod -a

#
# Adds some iptables targets like LOG, REJECT and MASQUARADE.
#
/sbin/modprobe ipt_LOG
#/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_MASQUERADE

#
# Support for owner matching
#
#/sbin/modprobe ipt_owner

#
# Support for connection tracking of FTP and IRC.
#
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc

#
# Enable ip_forward, this is critical since it is turned off as defaul
in Linux.
#

echo "1" > /proc/sys/net/ipv4/ip_forward

#
# Dynamic IP users:
#
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr

#
# Enable simple IP Forwarding and Masquerading
#

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j MASQUERADE

#
# Bad TCP packets we don"t want
#

$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP"

#
# Accept the packets we actually want to forward
#

$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT FORWARD packet died: "

#
# Set default policies for the INPUT, FORWARD and OUTPUT chains
#

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

#
# Create separate chains for ICMP, TCP and UDP to traverse
#

$IPTABLES -N icmp_packets
$IPTABLES -N tcp_packets
$IPTABLES -N udpincoming_packets

#
# The allowed chain for TCP connections
#

$IPTABLES -N allowed
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j
ACCEPT
$IPTABLES -A allowed -p TCP -j DROP

#
# ICMP rules
#

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

#
# TCP rules
#

$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed
$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed

#
# UDP ports
#

$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 53 -j
ACCEPT
$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 123 -j
ACCEPT
$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 2074 -j
ACCEPT
$IPTABLES -A udpincoming_packets -p UDP -s 0/0 --source-port 4000 -j
ACCEPT

#
# PREROUTING chain.
#
# Do some checks for obviously spoofed IP"s
#

$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 192.168.0.0/16 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 10.0.0.0/8 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 172.16.0.0/12 -j DROP


#
# INPUT chain
#
# Take care of bad TCP packets that we don"t want
#

$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP"

#
# Rules for incoming packets from the internet
#

$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets
$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets
$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udpincoming_packets

#
# Rules for special networks not part of the Internet
#

$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST_ADRESS -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $LOCALHOST_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -d $STATIC_IP -m state --state
ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT INPUT packet died: "

#
# OUTPUT chain
#

$IPTABLES -A OUTPUT -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A OUTPUT -p tcp ! --syn -m state --state NEW -j DROP"

$IPTABLES -A OUTPUT -p ALL -s $LOCALHOST_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $STATIC_IP -j ACCEPT
$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "


例子 rc.DMZ.firewall <>

#!/bin/sh
#
# rc.DMZ.firewall - DMZ IP Firewall script for Linux 2.4.x
#
# Author: Oskar Andreasson
# (c) of BoingWorld.com, use at your own risk, do whatever you please
with
# it as long as you don"t distribute this without due credits to
# BoingWorld.com
#

###########
# Configuration options, these will speed you up getting this script to
# work with your own setup.

#
# your LAN"s IP range and localhost IP. /24 means to only use the first
24
# bits of the 32 bit IP adress. the same as netmask 255.255.255.0
#
# STATIC_IP is used by me to allow myself to do anything to myself,
might
# be a security risc but sometimes I want this. If you don"t have a
static
# IP, I suggest not using this option at all for now but it"s stil
# enabled per default and will add some really nifty security bugs for
all
# those who skips reading the documentation=)

LAN_IP_RANGE="192.168.0.0/24"
LAN_IP="192.168.0.2/32"
LAN_BCAST_ADRESS="192.168.0.255/32"
LAN_IFACE="eth1"

INET_IP="194.236.50.152/32"
INET_IFACE="eth0"

HTTP_IP="194.236.50.153/32"
DNS_IP="194.236.50.154/32"
DMZ_HTTP_IP="192.168.1.2/32"
DMZ_DNS_IP="192.168.1.3/32"
DMZ_IP="192.168.1.1/32"
DMZ_IFACE="eth2"

LO_IP="127.0.0.1/32"
LO_IFACE="127.0.0.1/32"


IPTABLES="/usr/local/sbin/iptables"

###########################################
#
# Load all required IPTables modules
#

#
# Needed to initially load modules
#

/sbin/depmod -a

#
# Adds some iptables targets like LOG, REJECT and MASQUARADE.
#

/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_MASQUERADE

#
# Support for connection tracking of FTP and IRC.
#
#/sbin/modprobe ip_conntrack_ftp
#/sbin/modprobe ip_conntrack_irc


#CRITICAL: Enable IP forwarding since it is disabled by default.
#

echo "1" > /proc/sys/net/ipv4/ip_forward

#
# Dynamic IP users:
#
#echo "1" > /proc/sys/net/ipv4/ip_dynaddr

###########################################
#
# Chain Policies gets set up before any bad packets gets through
#

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

#
# the allowed chain for TCP connections, utilized in the FORWARD chain
#

$IPTABLES -N allowed
$IPTABLES -A allowed -p TCP --syn -j ACCEPT
$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j
ACCEPT
$IPTABLES -A allowed -p TCP -j DROP

#
# ICMP rules, utilized in the FORWARD chain
#


$IPTABLES -N icmp_packets
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 0 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 3 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 5 -j ACCEPT
$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

###########################################
# POSTROUTING chain in the nat table
#
# Enable IP SNAT for all internal networks trying to get out on the
Internet
#

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source
$INET_IP

###########################################
# PREROUTING chain in the nat table
#
# Do some checks for obviously spoofed IP"s
#

$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 192.168.0.0/16 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 10.0.0.0/8 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s 172.16.0.0/12 -j DROP
$IPTABLES -t nat -A PREROUTING -i $INET_IFACE -s $INET_IP -j DROP

#
# Enable IP Destination NAT for DMZ zone
#

$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $HTTP_IP --dport
80 -j DNAT --to-destination $DMZ_HTTP_IP
$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP --dport
53 -j DNAT --to-destination $DMZ_DNS_IP
$IPTABLES -t nat -A PREROUTING -p UDP -i $INET_IFACE -d $DNS_IP --dport
53 -j DNAT --to-destination $DMZ_DNS_IP

###########################################
#
# FORWARD chain
#
# Get rid of bad TCP packets
#

$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP

#
# DMZ section
#
# General rules
#

$IPTABLES -A FORWARD -i $DMZ_IFACE -o $INET_IFACE -j ACCEPT
$IPTABLES -A FORWARD -i $INET_IFACE -o $DMZ_IFACE -m state --state
ESTABLISHED,RELATED -j ACCEPTED

#
# HTTP server
#

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_HTTP_IP
--dport 80 -j allowed
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $DMZ_IFACE -d DMZ_HTTP_IP
-j icmp_packets

#
# DNS server
#

$IPTABLES -A FORWARD -p TCP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP
--dport 53 -j allowed
$IPTABLES -A FORWARD -p UDP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP
--dport 53 -j ACCEPT
$IPTABLES -A FORWARD -p ICMP -i $INET_IFACE -o $DMZ_IFACE -d $DMZ_DNS_IP
-j icmp_packets

#
# LAN section
#

$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#
# LOG all packets reaching here
#

$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT FORWARD packet died: "

###########################################################
#
# Firewall rules
# Rules applying to the firewall box
#
#
# INPUT chain
#
# Get rid of bad packets
#

$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP

#
# Packets from the Internet to this box
#

$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

#
# Packets from LAN, DMZ or LOCALHOST
#

# From DMZ Interface to DMZ firewall IP
$IPTABLES -A INPUT -p ALL -i $DMZ_IFACE -d $DMZ_IP -j ACCEPT

# From LAN Interface to LAN firewall IP
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_IP -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -d $LAN_BCAST_ADRESS -j ACCEPT

# From Localhost interface to Localhost IP
$IPTABLES -A INPUT -p ALL -i $LO_IFACE -d $LO_IP -j ACCEPT

# All established and related packets incoming from the internet to the
firewall
$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state
ESTABLISHED,RELATED -j ACCEPT

# Logging rule
$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEB

###########################################################
#
# OUTPUT chain
#

#
# Get rid of bad TCP packets
#

$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j LOG
--log-prefix "New not syn:"
$IPTABLES -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP

#
# Allow ourself to send packets not spoofed everywhere
#

$IPTABLES -A OUTPUT -p ALL -d $LO_IFACE -s $LO_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -d $LAN_IP-s $LAN_IP -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -d $INET_IFACE -s $INET_IP -j ACCEPT

#
# Logging rule
#

$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG
--log-level DEBUG --log-prefix "IPT OUTPUT packet died: "

刷新规则
#!/bin/sh
#
# Resets the iptables to default values, in case you screw something up
# while setting your rc.firewall up - as I did quite a few times;)
#
# Author: Oskar Andreasson
# (c) of BoingWorld.com, use at your own risk, do whatever you please
with
# it as long as you don"t distribute this with due credits to
# BoingWorld.com

#
# reset the default policies in the filter table.
#
/usr/local/sbin/iptables -P INPUT ACCEPT
/usr/local/sbin/iptables -P FORWARD ACCEPT
/usr/local/sbin/iptables -P OUTPUT ACCEPT

#
# reset the default policies in the nat table.
#
/usr/local/sbin/iptables -t nat -P PREROUTING ACCEPT
/usr/local/sbin/iptables -t nat -P POSTROUTING ACCEPT
/usr/local/sbin/iptables -t nat -P OUTPUT ACCEPT

#
# flush all the rules in the filter and nat tables.
#
/usr/local/sbin/iptables -F
/usr/local/sbin/iptables -t nat -F

#
# erase all chains that"s not default in filter and nat table.
#
/usr/local/sbin/iptables -X
/usr/local/sbin/iptables -t nat -X

延伸阅读

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网