您的位置:首页 > 运维架构 > Linux

Iptables配置心得

2016-03-03 18:51 477 查看
原创文章,转载请注明: 转载自 镜中影的技术博客

本文链接地址: Iptables配置心得

URL:http://blog.csdn.net/linkpark1904/article/details/50790404

一、 iptables原理概述

在linux内核中,iptables是一款自带的防火墙软件,基于内核实现网络流量的过滤,针对数据包的IP地址,端口号,标志位,连接状态定义相应的防火墙规则,匹配规则后用指定的处理机制进行处理,可以是允许,可以是丢弃。



如上图所示,数据包从网卡1进入linux主机后,首先进入内核维护的网络内存空间中,内核接手数据包后,会进行一系列流水线处理。在解封IP头部后,先检测数据包的目的IP,然后查询路由表,如果该IP指向自己,解封TCP头部,得到相应的端口号,将该报文发送给对应的应用程序。若数据包的目的IP不是自己,则在路由表中查看下一跳的地址,将改报文转发到相应的网卡。

Iptables分为两部分,一部分位于内核中,用来存放规则,称为NetFilter。还有一段在用户空间中,用来定义规则,并将规则传递到内核中,这段在用户空间中的程序就叫做iptables。

其中存放规则的地方有五处,如上图所示的prerouting、input、output、forward、postrouting:

prerouting:数据进来还未查询路由表之前的规则。

input:由外部发往用户空间内部的规则。

output:由用户空间内部发往外部的规则。

forward:不进入用户空间,进行路由转发的规则。

postrouting:查询完路由表后,将要转发的规则。

这五个点也叫做hook function(钩子函数),具体的数据流向如下图所示:



在prerouting规则中会拦截在查询路由表之前的ip报文,可以对ip报文进行修改、丢弃等操作,查询路由表后,数据包有可能走两条路径,一条直接进入用户空间,一条不经过用户空间,直接经由内核的forward规则进行转发,在转发出去的时候,也可以经由postrouting规则对ip报文进行相应的修改。

Iptables可以定义四类规则:

filter:防火墙核心所在

nat:网络地址转换

mangle:实现数据包修改

raw:连接跟踪表(不常用)

这四类规则,对应四张表,每一张表中拥有prerouting、input、output、forward、posting这五条链。

二、 iptables基础规则编写

定义防火墙规则一般有2种模式。一种是比较严格的,只放行允许通过的数据包,其余数据包全部阻止。还有一种比较宽松的,只阻止不允许通过的数据包。在企业应用中,一般使用第一种,根据业务需要放行对应的数据包。

Iptables定义规则的一般机制如下所示 :

-t,--table 用来指定该条规则记录在哪张表内,可选的表有四个:filter,nat,mangle,raw,默认表为filter。
Sub command:
Rule:
-A(append):追加
-I(insert):插入
-D(delete):删除,指定标准或者num
-R(replace):替换
Chain:
-F(flush):清空链
-N(new):新增一条链
-X:删除用户自定义的空链
-Z:清空计数器
关于计数器:每条规则都有2条计数器
1、  记录被本条规则匹配到的包个数
2、  记录匹配到本条规则到的包的体积之和
-E:重命名链
Policy:
-P chain{ACCEPT|DROP}
将INPUT链的默认策略修改为 DROP
iptables –t filter –P INPUT DROP
view:
-L:显示定义的规则
-n:使用这个选项,就不会去反向解析IP地址的主机名,加快察看速度
-v:详细信息,可以多加几个v,越多越详细
-x:精确显示数据包体积
--line-numbers
匹配条件:
通用匹配:
-s IP/NETWORK:源地址
-d IP/NETWORK:目标地址
-p {tcp|udp|icmp}:指定协议
-i input interface:指定数据包进入的接口
-o output interface:指定数据包出去的接口

example:
禁止192.168.1.0/24网段ping192.168.2.1主机
iptables -t fliter -A INTUP -s 192.168.1.0/24 -d 192.168.2.1 -p icmp -j DROP
扩展匹配
隐式扩展:指对-p选项中指定的协议进行的扩展
-p {tcp|udp|icmp}
--sport portnum 源端口
--dport portnum 目标端口
--tcpflags 针对tcp的标志位
--icmp-type icmp的包类型。

扩展上面的exapmle
iptables -t fliter -A INTUP -s 192.168.1.0/24 -d 192.168.2.1 -p icmp –icmp-type 8 -j DROP
这里明确拒绝了192.168.1.0/24网段的icmp-request包,8是icmp-request包,0是icmp-echo包


三、 NAT原理

前面讲述了iptables的原理,原理图如图1所示,NAT地址转换即是在prerouting,forward和postrouting这三条链上进行相应的操作。

3.1DNAT目的地址转换

假设从外部网络发来的ip数据包,要像进入内部网络,那么,在prerouting链上,将满足要求的报文的目的ip改为相应的内网网络ip和端口号,例如,外部网络要访问内网某台机器的 8080端口,那么有如下映射:

iptables -A PREROUTING -t nat -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.51:8080


只要是目的端口为8080的ip报文,则将其目的ip和端口改为相应的ip。改完之后,报文会走forward链,此时,forward链只需要允许目的ip网段为192.168.1.0的报文通过即可

iptables -A FORWARD -d 192.168.1.0/24 -j ACCEPT


3.2SNAT源地址转换

假设内网的某台机器想要访问外部网络,那么,其源ip肯定不能为内网ip,所以,在postrouting链上,对源ip为192.168.1.0网段内的ip数据包进行源地址改变

iptables -A POSTROUTING -t nat -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 222.197.181.4


外部数据要进入内网ip,经过forward链后,要将源ip改为相应的网关ip所以有如下:

iptables -A POSTROUTING -t nat -d 192.168.1.0/24 -j SNAT --to-source 192.168.1.1


四、 iptables配置实例

场景:一台网关服务器,内网有n台虚拟机,需要做端口映射,保证外面访问网关8080端口的直接映射到内网ip为192.168.1.51的机器的8080端口上,并且,内网机器能顺利访问外网,外部网络可以访问网关的22端口和8080端口,但不能访问其他任何端口,具体网络拓扑图如下图所示:



Iptables运行的脚本文件如下:

#!/bin/bash
#name myiptables.sh

#清空既有的iptables规则
iptables -F
iptables -X
iptables -Z
#PREROUTE
iptables -A PREROUTING -t nat -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.51:8080
#INPUT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#允许icmp协议进入(ping)
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

#允许ssh远程连接到本网关
iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited

#允许目的地址网段为192.168.1.0的进入FORWARD和源地址为192.168.1.0的网段进入FORWARD链
#FORWARD

iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -d 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited

#POSTROUTE
iptables -A POSTROUTING -t nat -d 192.168.1.0/24 -j SNAT --to-source 192.168.1.1

#内网中的机器源ip为192.168.1.0,并且目的地址不为192.168.1.0/24网段的ip将其源ip改为222.111.11.12
iptables -A POSTROUTING -t nat -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j SNAT --to-source 222.111.11.12


参考文献

iPtables博客:

http://lustlost.blog.51cto.com/2600869/937471

http://lustlost.blog.51cto.com/2600869/939989

http://lustlost.blog.51cto.com/2600869/940735

http://lustlost.blog.51cto.com/2600869/943110

linux man手册
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息