iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables。
iptables的结构:iptables-->Tables-->Chains-->Rules,tables则chains组成,chains由rules组成。

iptables的表与链

勾子函数(hook function)netfilter规则链:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
iptables具有Filter,NAT,Mangle,Raw四种内建表(四种功能)
1.Raw表
Raw表用于处理异常,它具有2个内建链
PREROUTING chain
OUTPUT chain
2.Mangle表
Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
PREROUTING
OUTPUT
FORWARD
INPUT
POSTROUTING
3.NAT表
NAT表有三种内建链
PREROUTING链-处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT。
POSTROUTING链-处理即将离开本机的数据包。它会转换数据包中的源IP地址,通常用于SNAT。
OUTPUT链-处理本机产生的数据包
4.Filter表
Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
INPUT-处理来自外部的数据
OUTPUT链-处理向外发送的数据
FORWARD链-将数据转发到本机的其他网卡设备上

iptables规则(Rules)

牢记以下三点是理解iptables规则的关键:
Rules包括一个条件和一个目标(target)
如果满足条件,就执行目标(target)中的规则或者特定值。
如果不满足条件,就判断下一条Rules。
目标值(Target Values)
以下是可以在target里指定的特殊值:
ACCEPT-允许防火墙接收数据包
DROP-防火墙丢充包
QUEUE-防火墙将数据包移交到用户空间
RETURN-防火墙停止执行当前链中的后续Rules,交返回到调用链(the calling chain)中。
查看可用的规则:

iptables -t filter --list  
iptables -t mangle --list  
iptables -t nat --list  
iptables -t raw --list

清空所有iptables规则

在配置iptables之前,需要使用iptables --list查看现有的规则
iptables --flush
或者
iptables -F
有的linux发行版上这个命令并不会清除NAT中的规则,此时只能手动清除:
iptables -t NAT -F

永久生效

当删除、添加规则后,这些更改并不能永久生效,这些规则在重启系统或服务后会消失,为了让配置永久生效,根据平台的不同,具体操作也不同。

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规则。

CentOS,RedHat

保存iptables规则
service iptables save
查看当前规则:
cat /etc/sysconfig/iptables

追加iptables规则

可以使用iptables -A 命令追加新规则,其中-A表示Append。因此,新的规则将追加到链尾。

语法

iptables -A chain firewall-rule
-A chain-指定要追加规则的链
firewall-rule-具体的规则参数

描述规则的基本参数

-p 协议(protocol)
指定规则的协议,如tcp,udp,icmp等,可以使用all来指定所有协议;
如果不指定-p参数,默认是all值;
可以使用协议名(如tcp),或者是协议值(比如6代表TCP)来指定协议。映射关系请查看/etc/protocols;
还可以使用-protocol参数代替-p参数;
-s源地址(source)
指定数据包的源地址;
参数可以使用IP地址,网络地址,主机名;
例如:-s 192.168.1.101指定IP地址;
例如:-s 192.168.1.0/24指定网络地址;
如果不指定-s参数,就代表所有地址;
还可以使用-src或者-source
-d 目的地址(destination)
指定目的地址;
参数和-s相同;
还可以使用-dst或者-destination;
-j 执行目标(jump to target)
-j 代表“jump to target”;
-j指定了当与规则(Rule)匹配时如何处理数据包;
可能的值是ACCEPT,DROP,QUEUE,RETURN;
还可以指定其他链(Chain)作为目标;
-i输入接口(input interfqace)
-i代表输入接口(input interface);
-i指定了要处理来自哪个接口的数据包;
这些数据包即将进入INPUT,FORWARD,PREROUTE链;
如果不指定-i,那么处理进入所有接口的数据包;
如果出现!-i eth0,那么将处理所有纲目eth0以外接口进入的数据包;
如果再现-i eth+,将处理经由eth开头的接口进入的数据包;
还可以使用-in-interface参数;
-o 输出(out interface)
-o代表"output interface";
-o指定了数据包由哪个接口输出;
这些数据包即将进入FORWARD,OUTPUT,POSTROUTING链;
如果不指定-o选项,那么系统上所有接口都可以作为输出接口;
如果出现! -o eth0,那么将从eth0以外的接口输出;
如果出现-i eth+,那么将仅从eth开关的接口输出;
还可以使用-out-interface参数;

描述规则的扩展参数

--sport源端口(source port),针对-p tcp或者-p udp
缺省情况下,将匹配所有端口;
可以指定端口号或者端口史称,例如"--sport 22"或者"--sport ssh";
/etc/services文件描述了上述映射关系;
从性能上讲,使用端口号更好;
使用冒号可以匹配端口范围,如“-sport 22:100";
还可以使用"-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 Request;

追加规则的完整实例:仅允许SSH服务

1.清空所有iptables规则
iptables -F
2.接收目标端口为22的数据包
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
3.拒绝所有其他数据包
iptables -A INPUT -j DROP

更改默认策略

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

配置应用程序规则

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客户端程序可以从本机的随机端口与服务器的22端口建立连接。因此对于SSH客户端而言,目的端口就是22
如果服务器也需要使用SSH连接其他远程主机,则还需要增加以下配置:
1.送出的数据包目的端口为22:

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state --state NEW,ESTABLISHED -j ACCEPT

2.接收的数据包源端口为22

iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state --state ESTABLISHED -j ACCEPT

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

 posted on 2019-02-04 16:05  feng_land  阅读(354)  评论(1编辑  收藏  举报