- 浏览: 249517 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
liliang880504:
bitnami_redmine_merge这个数据库是创建和合 ...
bitnami-redmine服务器迁移
IPTables
Contents
引言
准备开始
创建一组简单的规则
界面
IP 地址
端口及协议
融会贯通
总结
连结
1. 引言
CentOS 内置了一个非常强劲的防火墙,统称为 iptables,但更正确的名称是 iptables/netfilter。iptables 是一个用户空间的模块。作为用户,你在命令行就是通过它将防火墙规则放进缺省的表里。netfilter 是一个核心模块,它内置于内核中,进行实际的过滤。iptables 有很多前端图像界面可以让用户新增或定义规则,但它们很多时不及使用命令行般有灵活性,而且限制用户了解实际发生的事情。我们将会学习 iptables 的命令行界面。
在我们正式应付 iptables 前,我们必须对它的运作有一个基本的理解。iptables 利用到 IP 地址、协议(tcp、udp、icmp)及端口这些概念。我们不需要成为这些方面的专家(因为我们可以找到所需的信息),但对它们有一般的理解会有帮助。
iptables 将规则放进缺省的规则链(INPUT、OUTPUT 及 FORWARD),而所有流量(IP 封包)都会被相关的规则链检查,根据当中的规则判断如何处理每个封包,例如:接纳或丢弃它。这些动作称为目标,而最常见的两个缺省目标就是 DROP 来丢弃封包;或 ACCEPT 来接纳封包。
规则链
我们可以在过滤表的 3 条缺省规则链内加入规则,来处理通过这些规则链的封包。它们分别是:
INPUT - 所有以主机为目的地的封包。
OUTPUT - 所有源自主机的封包。
FORWARD - 这些封包的目的地或来源地都不是主机,但路经主机(由它选路)。假若你的主机是一个路由器,这条规则链将会被应用。
我们将会花费最多时间处理 INPUT 规则链,藉以过滤进入我们的机器的封包 —— 亦即是将坏蛋拒诸门外。
规则是以列表的方式被加进每条规则链。每个封包会被头一条规则开始检查,才至最后一条。假若封包与其中一条规则吻合,相应的动作便会被执行,例如接纳(ACCEPT)或丢弃(DROP)封包。一旦有吻合的规则,这个封包便会按照规则来处理,而不再被规则链内的其它规则所检查。假如封包通过所有检查而不符合任何规则链内的任何一条规则,那应这条规则链的缺省动作将会被执行。这就是所谓的缺省政策,可以设置为接纳(ACCEPT)或丢弃(DROP)封包。
规则链拥有缺省政策这个概念带来两个基本的可能性,而我们必须考虑它们才能决定如何组织我们的防火墙。
1. 我们可以缺省一个政策来丢弃(DROP)所有封包,然后刻意加入规则来接纳(ACCEPT)源自被信任的 IP 地址的封包,或者打开那些提供服务的端口,如:bittorrent、FTP 服务器、网页服务器、Samba 文件服务器等。
又或者,
2. 我们可以缺省一个政策来接纳(ACCEPT)所有封包,然后刻意加入规则来拦截(DROP)来自有问题的 IP 地址或系列的封包,也或者阻止封包进出只作私人用途或未提供服务的端口。
普遍来说,第一个方法多数用在 INPUT 规则链,因为我们会希望控制哪些东西可以访问我们的机器;而第二个方法多数用在 OUTPUT 规则链,因为我们多数信赖那些离开(源自)我们机器的封包。
2. 准备开始
在命令行上使用 iptables 需要 root 的权限,因此你必须化身为 root 用户来做下面的事情。
[attachment:ArtWork/WikiDesign/icon-admonition-attention.png]
注意: 我们将会停用 iptables 及复位你的防火墙规则,因此假若你依赖你的 Linux 防火墙作为第一道防线,请特别留意这点。
iptables 应该缺省被安装在所有 CentOS 3.x、4.x 及 5.x 上。你可以这样来检查 iptables 是否已安装在你的系统上:
$ rpm -q iptables
iptables-1.3.5-1.2.1
要知道 iptables 是否正在运作中,我们可以检查 iptables 这个模块是否已被装入,并利用 -L 这个选项来查看活动的规则:
# lsmod | grep ip_tables
ip_tables 29288 1 iptable_filter
x_tables 29192 6 ip6t_REJECT,ip6_tables,ipt_REJECT,xt_state,xt_tcpudp,ip_tables
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere icmp any
ACCEPT esp -- anywhere anywhere
ACCEPT ah -- anywhere anywhere
ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp -- anywhere anywhere udp dpt:ipp
ACCEPT tcp -- anywhere anywhere tcp dpt:ipp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
从上面我们可看见缺省的规则,与及访问 SSH 服务用的规则。
如果 iptables 并未被执行,你可以这样启用它:
# system-config-securitylevel
3. 创建一组简单的规则
[attachment:ArtWork/WikiDesign/icon-admonition-attention.png]
注意: 此刻我们将会清除缺省的规则集。如果你是通过 SSH 远程连接到一台服务器来进行学习,你有可能会将自己拒诸这台机器之外。你必须将缺省的输入(input)政策改为接纳(accept),然后才清除现有规则,接著你要预先加入一条容许你自己访问机器的规则,避免你将自己封锁在外。
我们会采用一个以样例为本的方法来查看 iptables 的不同指令。在首个样例中,我们会创建一组简单的规则来设置一个「状态封包检验」(SPI)防火墙,容许对外的连接但拦截一切无用的对内连接:
# iptables -P INPUT ACCEPT
# iptables -F
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -L -v
你应该得到这样的输出:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
现在让我们逐一看看以上的 8 个指令,并理解我们实际做了什么:
iptables -P INPUT ACCEPT 假如利用远程连接,我们必须临时将 INPUT 链的缺省政策改为 ACCEPT,否则当我们清除现有的规则集时,便会将自己封锁在服务器之外。
iptables -F 我们利用 -F 选项来清除一切现存的规则,好让我们能够在崭新的状态下加入的规则。
iptables -A INPUT -i lo -j ACCEPT 现在是时候加入一些规则了。我们利用 -A 选项来附加(新增)规则到某条链,而这里所指的是 INPUT 链。接著我们利用 -i 选项(interface「界面」之意)来指定那些符合或来自 lo(localhost、127.0.0.1)界面的封包。最后我们 -j(jump「跳至」)符合这条规则的目标动作:在这里是 ACCEPT。所以这条规则会导致所有转至 localhost 界面的对内封包获得接纳。一般来说这是必须的,因为很多软件预期能够与 localhost 适配器沟通。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 这是担负起大部份工作的规则,而我们再一次将它加进(-A)INPUT 链内。这里我们利用 -m 选项来装入一个模块(state)。state 模块能够查看一个封包并判断它的状态是 NEW、ESTABLISHED 抑或 RELATED。NEW 指进入的封包属于不是由主机初始化的新增连接。ESTABLISHED 及 RELATED 指进入的封包隶属于一条现存的连接,或者与现存的连接有关系。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT 现在我们加入一条规则来容许 SSH 通过 tcp 端口 22 来连接。这样做是要防止我们连接到远程系统的 SSH 连接意外地被封销。我们稍后会更详细解释这条规则。
iptables -P INPUT DROP 这个 -P 选项设置某条规则链上的缺省政策。我们现在可以将 INPUT 链的缺省政策改为 DROP。意思就是,不符合任何一条规则的对内封包将会被丢弃。要是我们通过 SSH 远程连接而没有加入上一条规则,此刻我们便会被封锁于系统之外。
iptables -P FORWARD DROP 同样地,在这里我们将 FORWARD 链的缺省政策设为 DROP,因为我们并不是用计算机作为路由器,所以理应没有任何封包路经它。
iptables -P OUTPUT ACCEPT 而最后,我们将 OUTPUT 链的缺省政策设为 ACCEPT,因为我们想容许所有对外的流量(由于我们信任我们的用户)。
iptables -L -v 最后,我们可以列出(-L)刚加入的规则,并检查它们是否被正确地装入。
我们需要做的最后一件事情,就是存储我们的规则,好让它们在下次开机时会自动被重新装入:
# /sbin/service iptables save
这样做会执行 iptables 的 init 脚本,它会执行 /sbin/iptables-save 并将现有的 iptables 设置写进 /etc/sysconfig/iptables。开机时,iptables 的 init 脚本会通过 /sbin/iptables-restore 这个指令重新实施存储在 /etc/sysconfig/iptables 内的规则。
很明显的,在指令壳内输入这堆指令会颇乏味,因此运用 iptables 的最简易方法就是创建一个代你做以上一切的脚本。你可以将上面的指令输入到你喜欢的文字编辑器内并存储为 myfirewall,例如:
#!/bin/bash
#
# iptables 样例设置脚本
#
# 清除 iptables 内一切现存的规则
#
iptables -F
#
# 容让 SSH 连接到 tcp 端口 22
# 当通过 SSH 远程连接到服务器,你必须这样做才能群免被封锁于系统外
#
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#
# 设置 INPUT、FORWARD、及 OUTPUT 链的缺省政策
#
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
#
# 设置 localhost 的访问权
#
iptables -A INPUT -i lo -j ACCEPT
#
# 接纳属于现存及相关连接的封包
#
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# 存储设置
#
/sbin/service iptables save
#
# 列出规则
#
iptables -L -v
注: 我们可以在脚本内加入注释来提醒自己正在做什么。
现在令脚本可以被执行:
# chmod +x myfirewall
我们现在可以编辑这个脚本,并在指令壳内用以下指令来执行它:
# ./myfirewall
4. 界面
在上一个范本中,我们看见如何能接纳所有来自某个界面的封包,也就是 localhost 界面:
iptables -A INPUT -i lo -j ACCEPT
假设我们现在有两个独立的网络界面,分别是将我们连接到内部网络的 eth0 及连接到外部互联网的 ppp0 拨号调制解调器(或者 eth1 适配器)。我们或许会想接纳所有来自内部网络的对内封包,但依然过滤那些来自互联网的封包。我们可以这样做:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
让特别留意 —— 假如你接纳来自互联网界面(例如 ppp0 拨号调制解调器)的所有封包:
iptables -A INPUT -i ppp0 -j ACCEPT
你便等同于停用了我们的防火墙!
5. IP 地址
将整个界面开放给对内的封包也许不够严谨,而你想拥有更多控制权来决定接纳什么及拒绝什么。现在假设我们拥有一群采用 192.168.0.x 私人网络的计算机。我们可以打开防火墙给来自某个被信任 IP 地址(例如 192.168.0.4)的对内封包:
# 接纳来自被信任 IP 地址的封包
iptables -A INPUT -s 192.168.0.4 -j ACCEPT # change the IP address as appropriate
将这个指令分解,我们首先附加(-A)一条规则到 INPUT 链,指明来源(-s)IP 地址是 192.168.0.4 的封包都应该被接纳(ACCEPT)(请亦留意我们如何利用 # 符号来解释我们的脚本,因为 # 之后的所有文字都会被视为注释)。
当然,如果我们想接纳来自一系列 IP 地址的封包,我们可以为每个被位任的 IP 地址加入一条规则,而这样做的确是可行的。但是假如它们的数量很多,一次过加入一系列 IP 地址会比较简单。要这样做,我们可以利用一个子网掩码或标准的斜线记法来指定 IP 地址的范围。举个例说,如果我们想将防火墙开放给来自整个 192.168.0.x(当中 x=1 到 254)范围的封包,我们可以用下面其中一个方法来达致目的:
# 接纳来自被信任 IP 地址的封包
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT # using standard slash notation
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT # using a subnet mask
最后,除了过滤单一的 IP 地址外,我们亦可以配对该设备的 MAC 地址。要这应做,我们需要装入一个容许过滤 MAC 地址的模块(mac 模块)。较早前当我们用 state 模块来配对 ESTABLISHED 及 RELATED 封包时,我们看见模块扩展 iptables 功能的例子。在这里我们除了检查封包的 IP 地址外,更利用 mac 模块来检查来源地的 MAC 地址:
# 接纳来自被信任 IP 地址的封包
iptables -A INPUT -s 192.168.0.4 -m mac --mac-source 00:50:8D:FD:E6:32 -j ACCEPT
首先我们用 -m mac 来装入 mac 模块,然后我们用 --mac-source 来指定来源 IP 地址(192.168.0.4)的 MAC 地址。你要为每个需要过滤的以太网设备找出 mac 地址。以 root 的身份执行 ifconfig(无线设备用 iwconfig)可以将 mac 地址告诉你。
这样可防止来源地的 IP 地址被伪装,因为只有真正源于 192.168.0.4(MAC 地址是 00:50:8D:5D:E6:32)的封包才会被接纳,而所有假扮源于该地址的封包都会被拦截。请注意,过滤 MAC 地址在互联网上不能使用,却绝对能正确地在本地网络里运作。
6. 端口及协议
由上面我们看见如何将新增规则在防火墙内,用来过滤符合某个界面或来源 IP 地址的封包。 这样做让我们能经过防火墙访问某些被信任的来源(主机)。现在我们看看如何过滤协议及端口,好叫我们能进一步区别要接纳及拦截那些对内的封包。
在我们开始之先,我们须要知道个别服务所使用的协议及端口编号。让我们以 bittorrent 作为一个简单的样例。bittorrent 在 6881 端口上采用 tcp 协议,因此我们需要容许所有以 6881 为目标端口(它们到逹时所用的端口)的 tcp 封包。
# 接纳目标端口是 6881 号(bittorrent)的 tcp 封包
iptables -A INPUT -p tcp --dport 6881 -j ACCEPT
在这里我们附加(-A)一条规则到 INPUT 链,配对 tcp 协议(-p tcp)及从 6881 目标端口进入我们的机器(--dport 6881)。
注: 要配对目标或来源端口(--dport 或 --sport),你必须先指定协议(tcp、udp、icmp、all)。
我们亦可以扩展以上的样例来包含一系列的端口,例如,接纳 6881 至 6890 端口上的所有 tcp 封包:
# 接纳目标端口是 6881-6890 号的 tcp 封包
iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT
7. 融会贯通
既然我们已经有基本认识,现在便可以合并这些规则。
UNIX/Linux 上一个受欢迎的服务就是容许远程登录的 SSH 服务。SSH 缺省使用 22 号端口及采用 tcp 协议。因此假若我们想允许远程登录,我们需要容许 tcp 连接到 22 号端口:
# 接纳目标端口是 22 号(SSH)的 tcp 封包
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
这样做会开放 22 号端口(SSH)给所有对内的 tcp 连接,却会构成潜在的安全性威胁,因为骇客可以强行破入使用易猜测口令的户口。然而,假若我们知道那些通过 SSH 作远程登录的可信任机器的 IP 地址,我们便可以将访问权限制到那些来源 IP 地址。举个例说,如果我们只想将 SSH 的访问权开放给我们的私人网络(192.168.0.x),我们可以将来源 IP 地址限制在这个范围:
# 接纳来自私人网络,目标端口是 22 号(SSH)的 tcp 封包
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT
利用来源 IP 进行过滤容让我们能安全地开放 22 号端口上的 SSH 给可信任的 IP 地址来访问。举个例说,我们可以用这个方法允许工作与家用机器之间的登录。对于其它 IP 地址来说,这个端口(与及服务)就好像了关闭了一样,而服务亦依被停用,因此扫描端口的骇客多数会略过我们。
8. 总结
这里只是很初步地介绍 iptables 可以做的事情,但我希望这份教学文档提供了一个良好的基础,帮助各位创建更复杂的规则集。
Contents
引言
准备开始
创建一组简单的规则
界面
IP 地址
端口及协议
融会贯通
总结
连结
1. 引言
CentOS 内置了一个非常强劲的防火墙,统称为 iptables,但更正确的名称是 iptables/netfilter。iptables 是一个用户空间的模块。作为用户,你在命令行就是通过它将防火墙规则放进缺省的表里。netfilter 是一个核心模块,它内置于内核中,进行实际的过滤。iptables 有很多前端图像界面可以让用户新增或定义规则,但它们很多时不及使用命令行般有灵活性,而且限制用户了解实际发生的事情。我们将会学习 iptables 的命令行界面。
在我们正式应付 iptables 前,我们必须对它的运作有一个基本的理解。iptables 利用到 IP 地址、协议(tcp、udp、icmp)及端口这些概念。我们不需要成为这些方面的专家(因为我们可以找到所需的信息),但对它们有一般的理解会有帮助。
iptables 将规则放进缺省的规则链(INPUT、OUTPUT 及 FORWARD),而所有流量(IP 封包)都会被相关的规则链检查,根据当中的规则判断如何处理每个封包,例如:接纳或丢弃它。这些动作称为目标,而最常见的两个缺省目标就是 DROP 来丢弃封包;或 ACCEPT 来接纳封包。
规则链
我们可以在过滤表的 3 条缺省规则链内加入规则,来处理通过这些规则链的封包。它们分别是:
INPUT - 所有以主机为目的地的封包。
OUTPUT - 所有源自主机的封包。
FORWARD - 这些封包的目的地或来源地都不是主机,但路经主机(由它选路)。假若你的主机是一个路由器,这条规则链将会被应用。
我们将会花费最多时间处理 INPUT 规则链,藉以过滤进入我们的机器的封包 —— 亦即是将坏蛋拒诸门外。
规则是以列表的方式被加进每条规则链。每个封包会被头一条规则开始检查,才至最后一条。假若封包与其中一条规则吻合,相应的动作便会被执行,例如接纳(ACCEPT)或丢弃(DROP)封包。一旦有吻合的规则,这个封包便会按照规则来处理,而不再被规则链内的其它规则所检查。假如封包通过所有检查而不符合任何规则链内的任何一条规则,那应这条规则链的缺省动作将会被执行。这就是所谓的缺省政策,可以设置为接纳(ACCEPT)或丢弃(DROP)封包。
规则链拥有缺省政策这个概念带来两个基本的可能性,而我们必须考虑它们才能决定如何组织我们的防火墙。
1. 我们可以缺省一个政策来丢弃(DROP)所有封包,然后刻意加入规则来接纳(ACCEPT)源自被信任的 IP 地址的封包,或者打开那些提供服务的端口,如:bittorrent、FTP 服务器、网页服务器、Samba 文件服务器等。
又或者,
2. 我们可以缺省一个政策来接纳(ACCEPT)所有封包,然后刻意加入规则来拦截(DROP)来自有问题的 IP 地址或系列的封包,也或者阻止封包进出只作私人用途或未提供服务的端口。
普遍来说,第一个方法多数用在 INPUT 规则链,因为我们会希望控制哪些东西可以访问我们的机器;而第二个方法多数用在 OUTPUT 规则链,因为我们多数信赖那些离开(源自)我们机器的封包。
2. 准备开始
在命令行上使用 iptables 需要 root 的权限,因此你必须化身为 root 用户来做下面的事情。
[attachment:ArtWork/WikiDesign/icon-admonition-attention.png]
注意: 我们将会停用 iptables 及复位你的防火墙规则,因此假若你依赖你的 Linux 防火墙作为第一道防线,请特别留意这点。
iptables 应该缺省被安装在所有 CentOS 3.x、4.x 及 5.x 上。你可以这样来检查 iptables 是否已安装在你的系统上:
$ rpm -q iptables
iptables-1.3.5-1.2.1
要知道 iptables 是否正在运作中,我们可以检查 iptables 这个模块是否已被装入,并利用 -L 这个选项来查看活动的规则:
# lsmod | grep ip_tables
ip_tables 29288 1 iptable_filter
x_tables 29192 6 ip6t_REJECT,ip6_tables,ipt_REJECT,xt_state,xt_tcpudp,ip_tables
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
RH-Firewall-1-INPUT all -- anywhere anywhere
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain RH-Firewall-1-INPUT (2 references)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT icmp -- anywhere anywhere icmp any
ACCEPT esp -- anywhere anywhere
ACCEPT ah -- anywhere anywhere
ACCEPT udp -- anywhere 224.0.0.251 udp dpt:mdns
ACCEPT udp -- anywhere anywhere udp dpt:ipp
ACCEPT tcp -- anywhere anywhere tcp dpt:ipp
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
从上面我们可看见缺省的规则,与及访问 SSH 服务用的规则。
如果 iptables 并未被执行,你可以这样启用它:
# system-config-securitylevel
3. 创建一组简单的规则
[attachment:ArtWork/WikiDesign/icon-admonition-attention.png]
注意: 此刻我们将会清除缺省的规则集。如果你是通过 SSH 远程连接到一台服务器来进行学习,你有可能会将自己拒诸这台机器之外。你必须将缺省的输入(input)政策改为接纳(accept),然后才清除现有规则,接著你要预先加入一条容许你自己访问机器的规则,避免你将自己封锁在外。
我们会采用一个以样例为本的方法来查看 iptables 的不同指令。在首个样例中,我们会创建一组简单的规则来设置一个「状态封包检验」(SPI)防火墙,容许对外的连接但拦截一切无用的对内连接:
# iptables -P INPUT ACCEPT
# iptables -F
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -L -v
你应该得到这样的输出:
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh
Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
现在让我们逐一看看以上的 8 个指令,并理解我们实际做了什么:
iptables -P INPUT ACCEPT 假如利用远程连接,我们必须临时将 INPUT 链的缺省政策改为 ACCEPT,否则当我们清除现有的规则集时,便会将自己封锁在服务器之外。
iptables -F 我们利用 -F 选项来清除一切现存的规则,好让我们能够在崭新的状态下加入的规则。
iptables -A INPUT -i lo -j ACCEPT 现在是时候加入一些规则了。我们利用 -A 选项来附加(新增)规则到某条链,而这里所指的是 INPUT 链。接著我们利用 -i 选项(interface「界面」之意)来指定那些符合或来自 lo(localhost、127.0.0.1)界面的封包。最后我们 -j(jump「跳至」)符合这条规则的目标动作:在这里是 ACCEPT。所以这条规则会导致所有转至 localhost 界面的对内封包获得接纳。一般来说这是必须的,因为很多软件预期能够与 localhost 适配器沟通。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 这是担负起大部份工作的规则,而我们再一次将它加进(-A)INPUT 链内。这里我们利用 -m 选项来装入一个模块(state)。state 模块能够查看一个封包并判断它的状态是 NEW、ESTABLISHED 抑或 RELATED。NEW 指进入的封包属于不是由主机初始化的新增连接。ESTABLISHED 及 RELATED 指进入的封包隶属于一条现存的连接,或者与现存的连接有关系。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT 现在我们加入一条规则来容许 SSH 通过 tcp 端口 22 来连接。这样做是要防止我们连接到远程系统的 SSH 连接意外地被封销。我们稍后会更详细解释这条规则。
iptables -P INPUT DROP 这个 -P 选项设置某条规则链上的缺省政策。我们现在可以将 INPUT 链的缺省政策改为 DROP。意思就是,不符合任何一条规则的对内封包将会被丢弃。要是我们通过 SSH 远程连接而没有加入上一条规则,此刻我们便会被封锁于系统之外。
iptables -P FORWARD DROP 同样地,在这里我们将 FORWARD 链的缺省政策设为 DROP,因为我们并不是用计算机作为路由器,所以理应没有任何封包路经它。
iptables -P OUTPUT ACCEPT 而最后,我们将 OUTPUT 链的缺省政策设为 ACCEPT,因为我们想容许所有对外的流量(由于我们信任我们的用户)。
iptables -L -v 最后,我们可以列出(-L)刚加入的规则,并检查它们是否被正确地装入。
我们需要做的最后一件事情,就是存储我们的规则,好让它们在下次开机时会自动被重新装入:
# /sbin/service iptables save
这样做会执行 iptables 的 init 脚本,它会执行 /sbin/iptables-save 并将现有的 iptables 设置写进 /etc/sysconfig/iptables。开机时,iptables 的 init 脚本会通过 /sbin/iptables-restore 这个指令重新实施存储在 /etc/sysconfig/iptables 内的规则。
很明显的,在指令壳内输入这堆指令会颇乏味,因此运用 iptables 的最简易方法就是创建一个代你做以上一切的脚本。你可以将上面的指令输入到你喜欢的文字编辑器内并存储为 myfirewall,例如:
#!/bin/bash
#
# iptables 样例设置脚本
#
# 清除 iptables 内一切现存的规则
#
iptables -F
#
# 容让 SSH 连接到 tcp 端口 22
# 当通过 SSH 远程连接到服务器,你必须这样做才能群免被封锁于系统外
#
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#
# 设置 INPUT、FORWARD、及 OUTPUT 链的缺省政策
#
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
#
# 设置 localhost 的访问权
#
iptables -A INPUT -i lo -j ACCEPT
#
# 接纳属于现存及相关连接的封包
#
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# 存储设置
#
/sbin/service iptables save
#
# 列出规则
#
iptables -L -v
注: 我们可以在脚本内加入注释来提醒自己正在做什么。
现在令脚本可以被执行:
# chmod +x myfirewall
我们现在可以编辑这个脚本,并在指令壳内用以下指令来执行它:
# ./myfirewall
4. 界面
在上一个范本中,我们看见如何能接纳所有来自某个界面的封包,也就是 localhost 界面:
iptables -A INPUT -i lo -j ACCEPT
假设我们现在有两个独立的网络界面,分别是将我们连接到内部网络的 eth0 及连接到外部互联网的 ppp0 拨号调制解调器(或者 eth1 适配器)。我们或许会想接纳所有来自内部网络的对内封包,但依然过滤那些来自互联网的封包。我们可以这样做:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
让特别留意 —— 假如你接纳来自互联网界面(例如 ppp0 拨号调制解调器)的所有封包:
iptables -A INPUT -i ppp0 -j ACCEPT
你便等同于停用了我们的防火墙!
5. IP 地址
将整个界面开放给对内的封包也许不够严谨,而你想拥有更多控制权来决定接纳什么及拒绝什么。现在假设我们拥有一群采用 192.168.0.x 私人网络的计算机。我们可以打开防火墙给来自某个被信任 IP 地址(例如 192.168.0.4)的对内封包:
# 接纳来自被信任 IP 地址的封包
iptables -A INPUT -s 192.168.0.4 -j ACCEPT # change the IP address as appropriate
将这个指令分解,我们首先附加(-A)一条规则到 INPUT 链,指明来源(-s)IP 地址是 192.168.0.4 的封包都应该被接纳(ACCEPT)(请亦留意我们如何利用 # 符号来解释我们的脚本,因为 # 之后的所有文字都会被视为注释)。
当然,如果我们想接纳来自一系列 IP 地址的封包,我们可以为每个被位任的 IP 地址加入一条规则,而这样做的确是可行的。但是假如它们的数量很多,一次过加入一系列 IP 地址会比较简单。要这样做,我们可以利用一个子网掩码或标准的斜线记法来指定 IP 地址的范围。举个例说,如果我们想将防火墙开放给来自整个 192.168.0.x(当中 x=1 到 254)范围的封包,我们可以用下面其中一个方法来达致目的:
# 接纳来自被信任 IP 地址的封包
iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT # using standard slash notation
iptables -A INPUT -s 192.168.0.0/255.255.255.0 -j ACCEPT # using a subnet mask
最后,除了过滤单一的 IP 地址外,我们亦可以配对该设备的 MAC 地址。要这应做,我们需要装入一个容许过滤 MAC 地址的模块(mac 模块)。较早前当我们用 state 模块来配对 ESTABLISHED 及 RELATED 封包时,我们看见模块扩展 iptables 功能的例子。在这里我们除了检查封包的 IP 地址外,更利用 mac 模块来检查来源地的 MAC 地址:
# 接纳来自被信任 IP 地址的封包
iptables -A INPUT -s 192.168.0.4 -m mac --mac-source 00:50:8D:FD:E6:32 -j ACCEPT
首先我们用 -m mac 来装入 mac 模块,然后我们用 --mac-source 来指定来源 IP 地址(192.168.0.4)的 MAC 地址。你要为每个需要过滤的以太网设备找出 mac 地址。以 root 的身份执行 ifconfig(无线设备用 iwconfig)可以将 mac 地址告诉你。
这样可防止来源地的 IP 地址被伪装,因为只有真正源于 192.168.0.4(MAC 地址是 00:50:8D:5D:E6:32)的封包才会被接纳,而所有假扮源于该地址的封包都会被拦截。请注意,过滤 MAC 地址在互联网上不能使用,却绝对能正确地在本地网络里运作。
6. 端口及协议
由上面我们看见如何将新增规则在防火墙内,用来过滤符合某个界面或来源 IP 地址的封包。 这样做让我们能经过防火墙访问某些被信任的来源(主机)。现在我们看看如何过滤协议及端口,好叫我们能进一步区别要接纳及拦截那些对内的封包。
在我们开始之先,我们须要知道个别服务所使用的协议及端口编号。让我们以 bittorrent 作为一个简单的样例。bittorrent 在 6881 端口上采用 tcp 协议,因此我们需要容许所有以 6881 为目标端口(它们到逹时所用的端口)的 tcp 封包。
# 接纳目标端口是 6881 号(bittorrent)的 tcp 封包
iptables -A INPUT -p tcp --dport 6881 -j ACCEPT
在这里我们附加(-A)一条规则到 INPUT 链,配对 tcp 协议(-p tcp)及从 6881 目标端口进入我们的机器(--dport 6881)。
注: 要配对目标或来源端口(--dport 或 --sport),你必须先指定协议(tcp、udp、icmp、all)。
我们亦可以扩展以上的样例来包含一系列的端口,例如,接纳 6881 至 6890 端口上的所有 tcp 封包:
# 接纳目标端口是 6881-6890 号的 tcp 封包
iptables -A INPUT -p tcp --dport 6881:6890 -j ACCEPT
7. 融会贯通
既然我们已经有基本认识,现在便可以合并这些规则。
UNIX/Linux 上一个受欢迎的服务就是容许远程登录的 SSH 服务。SSH 缺省使用 22 号端口及采用 tcp 协议。因此假若我们想允许远程登录,我们需要容许 tcp 连接到 22 号端口:
# 接纳目标端口是 22 号(SSH)的 tcp 封包
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
这样做会开放 22 号端口(SSH)给所有对内的 tcp 连接,却会构成潜在的安全性威胁,因为骇客可以强行破入使用易猜测口令的户口。然而,假若我们知道那些通过 SSH 作远程登录的可信任机器的 IP 地址,我们便可以将访问权限制到那些来源 IP 地址。举个例说,如果我们只想将 SSH 的访问权开放给我们的私人网络(192.168.0.x),我们可以将来源 IP 地址限制在这个范围:
# 接纳来自私人网络,目标端口是 22 号(SSH)的 tcp 封包
iptables -A INPUT -p tcp -s 192.168.0.0/24 --dport 22 -j ACCEPT
利用来源 IP 进行过滤容让我们能安全地开放 22 号端口上的 SSH 给可信任的 IP 地址来访问。举个例说,我们可以用这个方法允许工作与家用机器之间的登录。对于其它 IP 地址来说,这个端口(与及服务)就好像了关闭了一样,而服务亦依被停用,因此扫描端口的骇客多数会略过我们。
8. 总结
这里只是很初步地介绍 iptables 可以做的事情,但我希望这份教学文档提供了一个良好的基础,帮助各位创建更复杂的规则集。
发表评论
-
ubuntu 16.04 安装PhpMyAdmin
2016-08-24 20:57 865转:http://blog.csdn.net/l680771 ... -
Ubuntu apt-get方法安装phpmyadmin(转)
2016-08-24 20:58 470转自:http://www.foolbirds.com/ub ... -
idea破解方案之搭建本地破解
2016-08-21 22:23 960原文链接:http://blog.csdn.net/lzh9 ... -
Ubuntu 连接投影机
2016-08-20 20:54 1871xrandr 显示所有支持的分辨率 xrandr -s ... -
Ubuntu 16.04 LTS安装好之后需要做的15件事
2016-08-20 20:28 775链接:http://www.cnbet ... -
ubuntu常用软件包deb的安装与卸载
2016-05-27 17:15 1387原文链接:http://blog.csdn. ... -
在 Linux 命令行脚本中执行 sudo 时自动输入密码
2016-05-23 15:23 2087原文链接:http://blog.163 ... -
-bash: ./test.sh: /bin/sh^M: bad interpreter: No such file or directory
2016-05-23 15:08 550在Windows下写了一个shell脚本,上传到Linux下 ... -
ubuntu 12.04中完全卸载软件
2016-09-01 12:09 576sudo apt-get purge xxx sudo ... -
ubuntu修改密码提示太短或太简单
2016-05-03 17:14 0原文链接:http://blog.sina.com.c ... -
[Linux] Ubuntu下的文件比较工具--meld
2016-05-03 14:34 0在ubuntu中需要比较文件的差异,于是安装mel ... -
完美修改\破解Ubuntu12.04t密码
2016-05-03 14:06 439原文链接: http://blog.csdn.net/dec ... -
LUbuntu,Ubuntu下设置自定义桌面分辨率
2016-04-05 10:20 1322转:http://blog.useasp.net/archi ... -
Ubuntu 12.04 下安装ncurses-devel
2016-02-21 20:51 860原文链接:http://blog.csdn.net/psvo ... -
Linux下几种文件传输命令 sz rz sftp scp
2016-02-19 11:49 744源文地址:http://blog.163.com/fjm_5 ... -
提供用户名和密码的SSH自动登录脚本
2016-02-02 16:47 1236原文链接:http://aqingsao.iteye.com ... -
Linux curl命令详解
2016-01-06 09:20 15556原文地址:http://ju.outo ... -
ls command not found
2015-06-05 10:59 868在设置 java环境变量时,编辑profile文件没有写正确, ... -
让secureCRT正确显示中文
2015-06-04 11:49 12341.安装linux时选择中文系统,或安装后vi /etc/s ... -
如何查看linux系统是32位还是64位
2015-04-19 19:49 5171.#uname -a 如果有x86_64就是64位的 ...
相关推荐
在Linux内核上,netfilter是负责数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪等功能的一个子系统,这个子系统包含一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables是一个...
Linux下使用Iptables配置NAT防火墙 ...5)防火墙体系构建,网络管理与安全策略; 6)Iptables软件的配置和管理; 7)经费预算,实施计划等; 8)设计小结; 计算机网络课程设计 TCP/IP课程设计 包含课设报告和任务书
Linux中的防火墙是由netfilter/iptables网络构架实现的包过滤防火墙,可以实现大部分硬件防火墙的功能,所以可以在企业的应用方案中可以作为硬件防火墙的替代品。 如果Linux的内核是在2.4以上的版本,都可以使用...
《Linux 网络管理》以Ubuntu为基础,循序渐进地讲解了Linux系统在网络管理方面的基本应用。全书遵循理论和实践并重的原则,内容编写采用项目式编排方式,分为10个项目,每一个项目又由若干个任务组成,其内容主要...
作为网络管理员与网络工程师,建议先学习下面列出的这些知识:网络的拓扑结构;各种协议的网络的基本配置方法,如说TCP/IP、AppleTALK等协议的网络;熟悉常见的各种网络产品,比如服务器、工作站(包括终端)、交换机...
考查内容:iptables 的规则管理操作;iptables 常用的通用匹配条件和扩展匹配条件;添加、修 改、删除自定义链的方法。 实验内容:1)使用 iptables 制定规则,包括添加、修改、保存和删除规则等。 2)使用通用匹配...
iptablesbuild旨在管理大型linux系统网络中的iptables配置。 它通过在中央位置使用全局配置文件来生成iptables配置,从而发挥作用。 它旨在与现有的Configuration环境结合使用。
Linux黄带教程,1.linux起源与发展 2RHEL...11.Linux网络管理 12.DHCP服务配置 13.BIND服务配置 14.NFS服务配置 15.vsftpd服务配置 16.Samba服务配置 17.Apache服务配置 18.Squid代理服务配置 19.IPTables防火墙配置
07_ssh、日志管理和网络管理 08_apache安装和配置 09_apache虚拟主机、防盗链和日志切割 10运维和shell脚本 11shell基础之变量 12shell核心知识表达式 13shell核心知识常见符号和流程控制 14shell核心知识之常见命令...
本书讲解清晰且实用性很强,适合Linux系统管理员、网络安全专业技术人员以及广大计算机安全爱好者阅读。 作者简介 Michael Rash世界级的安全技术专家,以防火墙、入侵检测系统等方面的造诣享誉安全界。他是psad,...
Netfilter/Iptables防火墙是Linux平台下的包过滤防火墙,Iptables防火墙不仅提供了强大的数据包过滤能力,而且还提供转发,NAT映射等功能,是个人及企业级Linux用户构建网络安全平台的首选工具。但是,由于种种原因...
Netfilter/Iptables防火墙是Linux平台下的包过滤防火墙,Iptables防火墙不仅提供了强大的数据包过滤能力,而且还提供转发,NAT映射等功能,是个人及企业级Linux用户构建网络安全平台的首选工具。但是,由于种种原因...
iptables或netfilter(网络过滤器) 是一个用户态的防火墙应用软件,允许系统管理员可以调整设定X表(Xtables)提供相关的系统表格(目前主要是在 iptables/netfilter 底下)以及相关的“键”与“规则”来管理网络封包的...
第1 讲Linux 应用与发展 第2 讲Linux 系统安装 第3 讲Linux 常用命令 第4 讲文本编辑器Vim 第5 讲Linux 引导流程解析 第6 讲Linux 软件包管理 第7 讲Linux 用户管理 ...第16 讲防火墙设置Netfilter/Iptables
主要内容包括:防火墙的基础知识,linux防火墙管理程序iptable,构建防火墙的方法,防火墙的优化,数据包的转发,网络监控和攻击检测,内核强化等。本书独立于linux某个发行版本,涉及常驻于linux内核的netfilter...
本书讲解清晰且实用性很强,适合Linux系统管理员、网络安全专业技术人员以及广大计算机安全爱好者阅读。 作者简介 Michael Rash世界级的安全技术专家,以防火墙、入侵检测系统等方面的造诣享誉安全界。他是psad,...
iptables的接口很可能是Linux有史以来最精致的,它使得Linux成为最有弹性的网络过滤系统。iptables将许多组繁复的规则集成组织成容易控管的形式,以便管理员可以进行分组测试,或关闭、启动某组规则集。 iptable...