from http://www.geekfan.net/6921/git
Iptables是专为Linux操做系统打造的极其灵活的防火墙工具。对Linux极客玩家和系统管理员来讲,iptables很是有用。本文将向你展现如何配置最通用的Linux防火墙。github
Iptables是一个基于命令行的防火墙工具,它使用规则链来容许/阻止网络流量。当一条网络链接试图在你的系统中创建时,iptables会查找其对应的匹配规则。若是找不到,iptables将对其采起默认操做。
几乎全部的Linux发行版都预装了iptables。在Ubuntu/Debian中更新/安装iptables的命令为:安全
1
|
sudo apt-get install iptables
|
现有的一些图形界面软件也能够替代iptables,如Firestarter。但iptables用起来并不难。配置iptables的规则时要特别当心,特别是在你远程登录服务器的时候。由于这时的一个错误有可能让你和服务器永久失去链接,而你必需要到服务器面前才能解决它。服务器
Iptables的规则链分为三种:输入、转发和输出。
输入——这条链用来过滤目的地址是本机的链接。例如,若是一个用户试图使用SSH登录到你的PC/服务器,iptables会首先匹配其IP地址和端口到iptables的输入链规则。网络
转发——这条链用来过滤目的地址和源地址都不是本机的链接。例如,路由器收到的绝大数数据均须要转发给其它主机。若是你的系统没有开启相似于路由器的功能,如NATing,你就不须要使用这条链。
有一个安全且可靠的方法能够检测你的系统是否须要转发链:app
1
|
iptables -L -v
|
上图是对一台已经运行了几个星期的服务器的截图。这台服务器没有对输入和输出作任何限制。从中能够看到,输入链和输出链已经分别处理了11GB和17GB的数据,而转发链则没有处理任何数据。这是由于此服务器没有开启相似于路由器的转发功能。ssh
输出——这条链用来过滤源地址是本机的链接。例如,当你尝试ping howtogeek.com时,iptables会检查输出链中与ping和howtogeek.com相关的规则,而后决定容许仍是拒绝你的链接请求。tcp
注意:当ping一台外部主机时,看上去好像只是输出链在起做用。可是请记住,外部主机返回的数据要通过输入链的过滤。当配置iptables规则时,请牢记许多协议都须要双向通讯,因此你须要同时配置输入链和输出链。人们在配置SSH的时候一般会忘记在输入链和输出链都配置它。工具
在配置特定的规则以前,也许你想配置这些链的默认行为。换句话说,当iptables没法匹配现存的规则时,你想让它做出何种行为。
你能够运行以下的命令来显示当前iptables对没法匹配的链接的默认动做:spa
1
|
iptables -L
|
正如上面所显示的,咱们可使用grep来使输出的结果变得更加简洁。在上面的截图中,全部的链默认状况下均接受全部的链接。
一般状况下,你会但愿你的系统默认状况下接收全部的网络数据。这种设定也是iptables的默认配置。接收网络链接的配置命令是:
1
2
3
|
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT
iptables --policy FORWARD ACCEPT
|
你也能够在使用默认配置的状况下,添加一些命令来过滤特定的IP地址或端口号。咱们稍后在本文介绍这些命令。
若是你想默认状况下拒绝全部的网络链接,而后在其基础上添加容许的IP地址或端口号,你能够将默认配置中的ACCEPT变成DROP,以下图所示。这对于一些含有敏感数据的服务器来讲是极其有用的。一般这些服务器只容许特定的IP地址访问它们。
1
2
3
|
iptables --policy INPUT DROP
iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP
|
下面来看看如何对特定的IP地址或端口做出设定。本文主要介绍三种最基本和常见的设定。
Accept – 接收全部的数据。
Drop – 丢弃数据。应用场景:当你不想让数据的来源地址意识到你的系统的存在(最好的处理方法)。
Reject – 不容许创建链接,可是返回一个错误回应。应用场景:当你不想让某个IP地址访问你的系统,但又想让它们知道你的防火墙阻止了其访问。
为了直观的区分上述三种状况,咱们使用一台PC来ping一台配置了iptables的Linux电脑:
容许访问
在配置完基本的规则链以后,你就能够配置iptables来容许或者阻止特定的IP地址或者端口。
注意:在这些例子中,咱们使用iptables -A将额外的规则添加到现存的链中。Iptables在执行匹配的时候,会从列表的顶端开始搜索。你可使用iptables -I [chain] [number]将新的规则插入到列表的指定位置。
来自同一IP地址的链接
下面这个例子展现了如何阻止来自IP地址为10.10.10.10的全部链接。
1
|
iptables -A INPUT -s 10.10.10.10 -j DROP
|
来自一组IP地址的链接
下面这个例子展现了如何阻止来自子网10.10.10.0/24内的任意IP地址的链接。你可使用子网掩码或者标准的/符号来标示一个子网:
1
|
iptables -A INPUT -s 10.10.10.0/24 -j DROP
|
或
1
|
iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP
|
特定端口的链接
这个例子展现了如何阻止来自10.10.10.10的SSH链接。
1
|
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP
|
你能够将“ssh”替换成其它任何协议或者端口号。上述命令中的-p tcp告诉iptables链接使用的是何种协议。
下面这个例子展现了如何阻止来自任意IP地址的SSH链接。
1
|
iptables -A INPUT -p tcp --dport ssh -j DROP
|
咱们以前提到过,许多协议均须要双向通讯。例如,若是你打算容许SSH链接,你必须同时配置输入和输出链。可是,若是你只想容许来自外部的SSH请求,那该怎么作?
下面这个例子展现了如何容许源IP地址为10.10.10.10同时阻止目的地址为10.10.10.10的SSH链接:
1
2
|
iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m state --state ESTABLISHED -j ACCEPT
|
上述方法对iptables规则做出的改变是临时的。若是你想永久保存这些更改,你须要运行额外的命令(不一样Linux发行版下的保存命令也不相同):
Ubuntu:
1
|
sudo /sbin/iptables-save
|
Red Hat / CentOS:
1
|
/sbin/service iptables save
|
或者
1
|
/etc/init.d/iptables save
|
列出iptables的当前配置:
1
|
iptables -L
|
使用-v选项将显示数据包和字节信息;使用-n选项将以数字形式列出信息,即不将IP地址解析为域名。
换句话讲,主机名,协议和网络都以数字的形式列出。
清除当前全部的配置规则:
1
|
iptables -F
|