如何在Ubuntu 12.04上使用Iptables设置防火墙

本教程包括在ubuntuDroplet上使用iptables设置一个非常简单的防火墙。 iptables规则来自一系列可以组合以创建每个特定进程的选项。每个穿过防火墙的数据包都被检查

关于Iptables

为了使服务器在初始设置后更安全,Ubuntu附带了作为分发的默认防火墙的iptables。 首先,虽然配置了Ubuntu防火墙,但它被设置为允许虚拟专用服务器上的所有传入和传出流量。 为了在服务器上启用一些更强的保护,我们可以添加一些基本的iptables规则。

iptables规则来自一系列可以组合以创建每个特定进程的选项。 每个规则按顺序检查穿过防火墙的每个数据包。 一旦它匹配规则,数据包将跟随相关联的操作,否则它将沿着该行继续。

注: 本教程介绍IPv4的安全性。 在Linux中,IPv6安全性与IPv4分开维护。 例如,“iptables”仅维护IPv4地址的防火墙规则,但它有一个称为“ip6tables”的IPv6对等体,可用于维护IPv6网络地址的防火墙规则。

如果您的VPS配置为IPv6,请记住使用适当的工具保护IPv4和IPv6网络接口。 有关IPv6工具的更多信息,请参阅本指南: 如何配置工具使用IPv6在Linux VPS

Iptables命令

虽然本教程将讨论有限的命令,这将为服务器提供一些基本的安全性,但是有许多细微的和特定的情况可以为iptables开发。 以下是一些用于为您的VPS开发防火墙的最有用的命令,但请记住,这是一个简短的列表,并有各种其他选项。

-A: (Append), adds a rule to iptables
-L:  (List), shows the current rules
-m conntrack: allows rules to be based on the current connection state, elaborated in the the --cstate command.
--cstate: explains the states that connections can be in, there are 4: New, Related, Established, and Invalid
-p: (protocol), refers to the the protocol of the rule or of the packet to check.The specified protocol can be one of tcp, udp, udplite, icmp, esp, ah, sctp or the special keyword "all".
--dport: (port), refers to the the port through which the machine connects
-j: (jump), this command refers to the action that needs to be taken if something matches a  rule perfectly. It translates to one of four possibilities:
	-ACCEPT: the packet is accepted, and no further rules are processed
	-REJECT: the packet is rejected, and the 	sender is notified, and no further rules are processed
	-DROP: the packet is rejected, but the 	sender is not notified, and no further rules are processed
	-LOG: the packet is accepted but logged, and the following rules are processed 
-I: (Insert), adds a rule between two previous ones
-I INPUT 3: inserts a rule to make it the third in the list
-v: (verbose), offers more details about a rule

创建Iptables规则:

如果您键入以下内容,您可以查看当前iptables规则:

sudo iptables -L

他们应该看起来像这样:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

如果您有另一组规则或想要重新启动,则可以通过刷新和删除所有规则,将规则设置为默认值:

sudo iptables -F

此外,如果你想加快你的工作与iptables,你可以在命令中包括-n。 此选项禁用DNS查找,并阻止命令尝试查找规则集中每个IP的反向。 您可以使用此列表规则,例如:

iptables -L -n

基本防火墙

由于目前的规则允许所有连接,包括传入和传出。 没有任何安全措施。 在建立表时,请记住,一旦数据包处于ACCEPTED,REJECTED或DROPPED状态,就不会再处理其他规则。 因此,首先的规则优先于后面的规则。

在创建规则时,我们必须确保防止自己意外阻止SSH(我们连接到服务器的方法)。

要开始,让我们确保允许所有当前连接,所有在制定规则时的连接将保持在线:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

我们可以继续下去:

  1. -A告诉iptables追加一个规则表。
  2. 输入指定此规则输入链的一部分。
  3. 米连接跟踪其次--cstate ESTABLISHED,关联担保,此规则的结果将只适用于当前连接和那些与他们被允许
  4. -j ACCEPT告诉包JUMP接受和连接是否仍然存在。

在我们确信与虚拟专用服务器的所有当前连接可以保持不间断,我们可以继续开始阻止其他不安全的连接。

让我们假设我们要阻止所有传入的流量,除了那些进入2个常见端口:22对于SSH和80对于Web流量。 我们继续使用以下命令允许指定端口上的所有流量:

sudo iptables -A INPUT -p tcp --dport ssh -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

在这两个命令,-p选项表示与该连接正在取得,在这种情况下,TCP协议,而--dport指定,通过该数据包被发送的端口。

在我们保证所需的流量将通过防火墙后,我们可以通过阻止所有重新获得的流量访问我们的虚拟服务器来完成。 因为这是列表中的最后一条规则,所以匹配iptables中任何先前规则的所有流量都不会受到影响,并且会像之前设置的一样被处理。

让我们制定一条规则,阻止所有剩余的流量:

sudo iptables -P INPUT DROP

这样,我们可以看到我们的更新规则:

sudo iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            ctstate RELATED,ESTABLISHED 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:ssh 
ACCEPT     tcp  --  anywhere             anywhere            tcp dpt:http 

我们差不多完成了。 但是,我们还缺少一条规则。 我们需要为我们的VPS提供环回访问。 如果我们现在添加规则而没有其他限定符,则它将转到列表的末尾,并且由于它将遵循阻止所有流量的规则,因此永远不会生效。

为了解决这个问题,我们需要使用INPUT选项在列表中首先创建此规则:

sudo iptables -I INPUT 1 -i lo -j ACCEPT
  1. -I INPUT 1位这个规则在表的开头
  2. 指的是环回接口
  3. -j ACCEPT然后保证在同一个VLAN将被接受

现在我们已经完成了创建一个基本的防火墙。 您的规则应如下所示(我们可以通过键入-v查看iptable的详细信息):

sudo 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            
 1289 93442 ACCEPT     all  --  any    any     anywhere             anywhere             ctstate RELATED,ESTABLISHED
    2   212 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:ssh
    0     0 ACCEPT     tcp  --  any    any     anywhere             anywhere             tcp dpt:http     

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 157 packets, 25300 bytes)
 pkts bytes target     prot opt in     out     source               destination       

但是,一旦虚拟服务器重新启动,iptables规则将被擦除。 下一步将完成保存和恢复iptables规则。

保存Iptables规则

虽然iptables规则有效,但如果服务器重新启动,它们将自动被删除。 为了确保它们保持有效,我们可以使用名为IP-Tables persistent的包。

我们可以使用apt-get安装:

sudo apt-get install iptables-persistent

在安装过程中,将询问您是否要将iptables规则保存到IPv4规则和IPv6规则。 对两者说都是肯定的。

然后,您的规则将保存在/etc/iptables/rules.v4和/etc/iptables/rules.v6中。

一旦安装完成,启动iptables-persistent运行:

sudo service iptables-persistent start

任何服务器重新引导后,您将看到规则保留在原位。

作者Etel Sverdlov