iptables基础知识

iptables防火墙可以用于创建过滤(filter)与NAT规则。

iptables的结构:iptables --> Tables --> Chains -->Rules (简单地说,tables由chains组成,而chains又由rules组成)。

一:iptables的表和链
iptables具有Filter,NAT,Mangle,Raw四种内建表:
1.Filter表
Filter表示iptables的默认表,具有三种内建链:
INPUT链--处理来自外部的数据。
OUTPUT链--处理向外发送的数据。
FORWARD链--将数据转发到本机的其他网卡设备上。

2.NAT表
三种内建链:
PREROUTING 链--处理刚到达本机并在路由转发前的数据。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
POSTROUTING链--处理即将离开本机的数据包。它会转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
OUTPUT链 --处理本机产生的数据包。

3.Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
PREROUTING
OUTPUT
FORWARD
INPUT
POSTROUTING

4.Raw表
Raw表用于处理异常,具有2个内建链:
PREROUTING
OUTPUT

二:iptables规则(Rules)
牢记一下三点式理解iptables规则的关键:
Rules包括一个条件和一个目标(target)
如果满足条件,就执行目标(target)中的规则或者特定值。
如果不满足条件,就判断下一条Rules。

目标值(Target Values)
下面是你可以在target里指定的特殊值:
ACCEPT--允许防火墙接收数据包
DROP --防火墙丢弃包
QUEUE --防火墙将数据包移交到用户空间
RETURN--防火墙停止执行当前链中的后续Rules,并返回到调用链(the calling chain)中。

sudo iptables -t filter -L (查看filter表)== sudo iptables -L (默认显示filter表)
sudo iptables -t nat -L (查看nat表)
sudo iptables -t Mangle -L (查看Mangle表)
sudo iptables -t raw -L (查看raw表)

输出包含下列字段:
num--指定链中的规则编号
target--前面提到的target的特殊值
prot--协议;tcp,udp,icmp等
source --数据包的源IP地址
destination--数据包的目标IP地址

三:清空所有iptables规则
在配置iptables之前,通常需要用iptables -L 或者iptables -save命令查看有无现存规则,因为有时需要删除现有的iptables规则:
iptables --flush (iptables -F)
------------执行后不一定ok,仍然需要检查规则是不是真的清空了,因为有的linux发行版上这个命令不会清除NAT表中的规则,此时需要手动清除: iptables -t nat -F

四:永久生效
当删除,添加规则后,这些更改并不能永久生效,这些规则很可能在系统重启后恢复原样。为了让配置永久生效,根据平台的不同,具体操作也不同。
1.ubuntu
首先,保存现有的规则:iptables -save > /etc/iptables.rules
然后新建一个bash脚本,并保存到/etc/network/if-pre-up.d/目录下:
#!/bin/bash
iptables -restore < /etc/iptables.rules
(这样,每次系统重启后iptables规则都会被自动加载。)
注意:不要尝试在.bashrc或者.profile中执行以上命令,因为用户通常不是root,而且这只能在登录时加载iptables规则。

2.CentOS,RedHat
#保存iptables规则
service iptables save

#重启iptables服务
service iptables stop
service iptables start

查看当前规则:
cat /etc/sysconfig/iptables

五:追加iptables规则
可以使用iptables -A命令追加新规则,其中-A表示Append,因此新的规则被追加到链尾。
一般而言,最后一条规则用于丢弃(DROP)所有数据包。如果已经有这样的规则了,并且使用-A参数添加新规则,那么就是无用功。
1.语法
iptables -A chain firewall -rule
-A chain ---指定要追加规则的链
firewall -rule ---具体的规则参数

2.描述规则的具体参数
以下这些参数用于描述数据包的协议,原地址,目的地址,允许经过的网络接口,以及如何处理这些数据包。
-p 协议(protocol)
指定规则的协议,如tcp,udp,icmp等,可以使用all来指定所有的协议。
如果不指定-p参数,则默认是all值,这并不明智,请总是明确指定协议名称。
可以使用协议名(如tcp),或者协议值(比如6代表tcp)来指定协议。映射关系请查看/etc/protocols

-s 源地址(source)
指定数据包的源地址
参数可以使用IP地址,网络地址,主机名。(如:-s 192.168.1.10指定IP地址 ;-s 192.168.1.10/24指定网络地址)
如果不指定-s参数,就代表所有地址 (还可以使用--src或者--source)

-d 目的地址(destination)
指定目的地址(参数和-s相同;还可以使用--dst或者--destination)

-j 执行目标(jump to target)
指定了当前规则匹配时如何处理数据包
可能的值是ACCEPT,DROP,QUEUE,RETURN
还可以指定其他的链(Chain)作为目标

-i 输入接口(input interface)
-i指定了要处理来自哪个接口的数据包
这些数据包即将进入INPUT,FORWARD,PREROUTING链
例如: -i eth0 指定了要处理经由eth0进入的数据包 (不指定-i参数,将处理进入所有接口的数据包)
如果出现 ! -i eth0,那么将处理所有经由eth0以为的接口进入的数据包
如果出现 -i eth+ ,那么将处理所有经由eth开头的接口进入的数据包
还可以使用 --in-interface参数

-o 输出(out interface)
指定了数据包由哪个接口输出
这些数据包即将进入FORWARD,OUTPUT,POSTROUTING链
如果不指定-o参数,那么系统上的所有接口都可以作为输出接口
如果出现 ! -o eth0 ,那么将从eth0以外的接口输出
如果出现 -o eth+ ,那么将仅从eth开头的接口输出
还可以使用 --out-interface参数

3.描述规则的扩展参数
对规则有一个基本描述后,有时候我们还希望指定端口,tcp标志,ICMP类型等内容。
--sport 源端口(source port) 针对 -p tcp 或者 -p udp
缺省情况下,将匹配所有的端口
可以指定端口号或者端口名称,例如: -sport 22 或者 -sport ssh 。(映射关系见/etc/services)
还可以使用 --source-port

--dport 目的端口(destination port)针对 -p tcp 或者 -p udp
与-sport类似用法
还可以使用 --destination-port

--tcp-flags TCP标志 针对 -p tcp
可以指定由逗号分隔的多个参数
有效值可以是:SYN,ACK,FIN, RST, URG, PSH
可以使用ALL 或者NONE

--icmp-type ICMP类型 针对-p icmp
--icmp-type 0 表示Echo Reply
--icmp-type 8 表示Echo


4.追加规则的完整实例:仅允许SSH服务
本例实现的规则将仅允许SSH数据包通过本地计算机,其他一切连接(包括ping)都将被拒绝。
#1.清空所有iptables规则
iptables -F
#2.接收目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp -dport 22 -j ACCEPT
#3.拒绝所有其他数据包
iptables -A INPUT -j DROP

六:更改默认策略
上例的例子仅对接收的数据包过滤,而对于要发送出去的数据包却没有任何限制。本节主要介绍如何更改链策略,以改变链的行为。
1.默认链策略 (请勿在远程连接的服务器,虚拟机上测试!)
当我们使用-L选项验证当前规则时发现,所有的链旁边都有policy ACCEPT标注,这表明当前链的默认策略为ACCEPT:
这种情况下,如果没有明确添加DROP规则,那么默认情况下将采用ACCEPT策略进行过滤。除非:
a)为以上三个链单独添加DROP规则:
iptables -A INPUT -j DROP
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
b)更改默认策略:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
七:配置应用程序规则
5.4节介绍了如何初步限制除SSH以外的其他连接,但是那是在链默认策略为ACCEPT的情况下实现的,并且没有对输出数据包进行限制。 本节在上一节基础上,以SSH和HTTP所使用的端口为例,教大家如何在默认链策略为DROP的情况下,进行防火墙设置。在这里,我们将引进一种新的参数-m state,并检查数据包的状态字段。
1.SSH
#1.允许接收远程主机的SSH请求
iptables -A INPUT -i eth0 -p tcp -dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

#2.允许发送本地主机的SSH响应
iptables -A OUTPUT -o eth0 -p tcp -sport 22 -m state --state ESTABLISHED -j ACCEPT

-m state : 启用状态匹配模块(state matching module)
--state : 状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字字段都是ESTABLISHED
-sport 22 :sshd监听22端口,同时也通过该端口和客户端建立连接,传送数据。因此对于SSH服务器而言,源端口就是22
-dport 22 :ssh客户端程序可以从本机的随机端口与ssh服务器的22端口建立连接。因此对于ssh客户端而言,目的端口就是22


如果服务器也需要使用ssh连接其他远程主机,则还需要增加以下配置:
#1.送出的数据包的目的端口为22
iptables -A OUTPUT -o eth0 -p tcp -dsport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

#2.接收的数据包的源端口为22
iptables -A INPUT -i eth0 -p tcp -sport 22 -m state --state ESTABLISHED -j ACCEPT

2.HTTP
#1.允许接收远程主机的HTTP请求
iptables -A INPUT -i eth0 -p tcp -dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

#2.允许发送本地主机的HTTP响应
iptables -A OUTPUT -o eth0 -p tcp -sport 80 -m state --state ESTABLISHED -j ACCEPT


3.完整的配置(仅仅允许SSH连接请求 和HTTP请求 )
#1.删除现有规则
iptables -F
#2.配置默认链策略
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#3.允许远程客户端主机进行SSH连接
iptables -A INPUT -i eth0 -p tcp -dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 22 -m state --state ESTABLISHED -j ACCEPT
#4.允许本地主机进行SSH连接
iptables -A OUTPUT -o eth0 -p tcp -dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -sport 22 -m state --state ESTABLISHED -j ACCEPT
#5.允许HTTP请求
iptables -A INPUT -i eth0 -p tcp -dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -sport 80 -m state --state ESTABLISHED -j ACCEPT


摘自:http://blog.coocla.org/207.html

将iptables规则写在脚本里面,便于防火墙进行修改和维护。。(本脚本只对filter表;一般将INPUT 链设置的比较严,默认用DROP,而将FORWARD,OUTPUT设置较宽松,默认用ACCEPT )

#/bin/bash
Open_ports="80 21 22 25" 对外开放端口
Allow_ports="80 22 23 53" #本机请求远方服务的响应数据

#规则初始化
iptables -F #清空filter中所有链的规则设定
iptables -X #删除使用者自定义的table chain

#下面是规则的详细设置
iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT #允许网段为192.168.1.1--192.168.1.254的进入
iptables -A INPUT -i lo -j ACCEPT #允许环路
iptables -P INPUT DROP #将INPUT的默认策略改成DROP
iptables -P OUTPUT ACCEPT #将OUTPUT的默认策略改成ACCEPT
iptables -P FORWARD ACCEPT #将FORWARD的默认策略改成ACCEPT
#定义允许Internet数据进入本机的规则 (本机对外请求这些端口的服务)
for Port in $Allow_ports; do
iptables -A INPUT -i eth0 -p tcp --sport $Port -j ACCEPT
iptables -A INPUT -i eth0 -p udp --sport $Port -j ACCEPT
done

#定义本机对外开放的端口 (本机对外提供这些端口的服务)
for Port in $Open_ports; do
iptables -A INPUT -i eth0 -p tcp --dport $Port -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport $Port -j ACCEPT
done

#设置更安全的规则
iptables -A INPUT -i eth0 -p tcp -j REJECT --reject-with tcp-reset #非法IP连接服务器时,立刻发出tcp-reset的请求,这个封包会要求对方关闭联机,这样服务器的安全性又加强了
iptables -A INPUT -i eth0 -p udp -j REJECT --reject-with icmp-port-unreachable

你可能感兴趣的:(linux,server,防火墙)