Iptables配置心得

来源:互联网 发布:phpmyadmin for linux 编辑:程序博客网 时间:2024/06/14 15:09

原创文章,转载请注明: 转载自 镜中影的技术博客
本文链接地址: Iptables配置心得
URL:http://blog.csdn.net/linkpark1904/article/details/50790404

一、 iptables原理概述

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

图 1-1 iptables转发原理图

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

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

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

  • prerouting:数据进来还未查询路由表之前的规则。
  • input:由外部发往用户空间内部的规则。
  • output:由用户空间内部发往外部的规则。
  • forward:不进入用户空间,进行路由转发的规则。
  • postrouting:查询完路由表后,将要转发的规则。

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

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

  1. filter:防火墙核心所在
  2. nat:网络地址转换
  3. mangle:实现数据包修改
  4. 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 DROPview:-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 -Fiptables -Xiptables -Z#PREROUTEiptables -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 ACCEPTiptables -A INPUT -j REJECT --reject-with icmp-host-prohibited #允许目的地址网段为192.168.1.0的进入FORWARD和源地址为192.168.1.0的网段进入FORWARD链#FORWARDiptables -A FORWARD -s 192.168.1.0/24 -j ACCEPTiptables -A FORWARD -d 192.168.1.0/24 -j ACCEPTiptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited#POSTROUTEiptables -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.12iptables -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手册
0 0
原创粉丝点击