写在前面,大家测试玩iptables时要记得自己配置了那些东西,测试完成后记得删除啊,博主忘了删除一个input REJECT链的一条记录,后续测试搭建了apache服务器,始终无法访问,最后抓包发现提示 Host  administratively prohibited ,然后查看iptables发现有个reject的tcp记录,删除之后才能正常访问了。

本文出自 “贵在坚持_IT博客” 博客,请务必保留此出处

http://fdgui.blog.51cto.com/3484207/1437643

http://www.linuxso.com/linuxpeixun/10332.html

http://blog.chinaunix.net/uid-26495963-id-3279216.html 这个文章也不错更加的详细,做了参考添加在本文中了。

一、防火墙,iptables和netfilter定义

防火墙:是由软件和硬件设备组合而成的一种隔离技术,它工作于网络或主机的边缘(通信报文的进出口),对于进出本网络或主机的数据包根据事先定义的检测规则进行匹配检测,允许或是限制传输的数据包通过。

netfilter :内核的一部分,内核中工作在tcp/ip网络协议栈上的框架,由一些数据包过滤表组成,这些表包含内核用户控制数据包过滤处理的规则集。iptables定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)

iptables : administration tool for IPv4 packet filtering and NAT .将规则组成一个列表,实现绝对详细的访问控制功能。用来插入、修改和删除数据包过滤表中的规则的管理工具。定义的规则通过内核接口直接送至内核,立即生效,但不会永久有效,如果需要永久有效,需要保存至配置文件中,可以选择开机加载(方法???)或者手动加载。

规则被应用到内核空间中的5个位置,这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

1、内核空间中:从一个网络接口进来,到另一个网络接口取得  PREROUTING (路由前) #五个不一定对应正确,需要看下iptables的官方文档确定下

2、数据包从内核流入用户空间的    INPUT (数据包流入口)

3、数据包从用户空间流出的         FORWARD (转发关卡)

4、进入/离开本机的外网接口        OUTPUT  (数据包出口)

5、进入/离开本机的内网接口        POSTROUTING (路由后)

二、iptables 深入学习

定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式

1.filter 定义允许或者不允许的
2.nat 定义地址转换的 
3.mangle功能:修改报文原数据
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
 
 
 
 
 
 
 
iptables对于每一个chain,都是对其中的rule进行从上到下的匹配,规则越严格,应该放的越靠前,一旦匹配则不再向下匹配,因此在添加rule时要注意-A和-I的差别,一个添加在首部(-I),一个添加在尾部(-A)。

基本语法格式:

iptables  [ –t 表名 ]  命令选项  [ 链名 ]  [ 条件匹配 ]  [ –j 目标动作或跳转 ]

iptables -t filter -A INPUT -s 172.16.11.1 -p icmp -j REJECT
Tip1:若不指定表名,默认使用filter表。

iptables主要参数

-A 向规则链中添加一条规则,默认被添加到末尾
-t  指定要操作的表,默认是filter
-D 从规则链中删除规则,可以指定序号或者匹配的规则来删除
-R 进行规则替换
-I  插入一条规则,默认被插入到首部
-F 清空所选的链,重启后恢复
-N 新建用户自定义的规则链
-X 删除用户自定义的规则链
-p 用来指定协议可以是tcp,udp,icmp等也可以是数字的协议号,all代表所有,具体的协议号参考/etc/protocols
-s 指定源地址
-d 指定目的地址
-i 进入接口
-o 流出接口
-j 采取的动作,accept,drop,snat,dnat,masquerade,reject
--sport 源端口                                         #注意是双连接符
--dport 目的端口,端口必须和协议一起来配合使用

iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT   #仅允许从192.168.1.0/24网段ssh连接管理

Tip2:所有链名必须大写,表明必须小写,动作必须大写,匹配必须小写

简单Iptables使用示例:

1. 在filter表的INPUT链末尾增加一条规则:
  iptables -t filter -A INPUT -p tcp -j ACCEPT
2. 在filter表的INPUT链行首增加一条规则:
  iptables –I INPUT –p udp –j ACCEPT   ( 此处省略了“-t filter”选项,默认以filter处理)
3. 在filter表的INPUT链中插入一条防火墙规则,做为链的第二条规则:
  iptables –I INPUT 2 –p icmp –j ACCEPT
4. 查看filter表INPUT链中的所有规则,同时显示规则的序号:
  iptables -L INPUT --line-numbers
5. 删除filter表INPUT链中第2条规则:
  iptables –D INPUT 2
6. 清空filter、nat、mangle表各链中的所有规则:
  iptables –F
  iptables –t nat –F
  iptables –t mangle –F
7. 设置filter表FORWARD规则链的默认策略为DROP
  iptables –P FORWARD DROP

条件匹配示例:

1. 协议匹配:如拒绝进入防火墙的所有icmp协议数据包
iptables –I INPUT –p icmp –j REJECT

允许转发除icmp协议以外的所有数据(使用!可以将条件取反)

iptables –A FORWARD ! –p icmp –j ACCEPT

2. 地址匹配:(”-s 源地址”/ “-d 目标地址”)

拒绝转发来自192.168.1.1主机的数据

iptables –A FORWARD –s 192.168.1.1 –j REJECT

3. 网络接口匹配:(“-i 网络接口名”/ “-o 网络接口名”分别对应接收数据包的网卡和发送数据包的网卡)

丢弃从外网接口eth1进入防火墙本机的源地址为私网地址的数据包

iptables –A INPUT –i eth1 –s 192.168.0.0/16 –j DROP

iptables –A INPUT –i eth1 –s 172.16.0.0/12 –j DROP   (这里运用了子网汇总)

iptables –A INPUT –i eth1 –s 10.0.0.0/8 –j DROP

4. 端口匹配:用于检查数据包的TCP或UDP端口号,需要以“-p tcp”或“-p udp”匹配为前提,使用“--sport 源端口”、“--dport 目标端口”的形式。端口可以表示为单个端口号或者用冒号分割的端口范围。

仅允许管理员从192.168.1.0/24网段使用SSH方式远程登录防火墙主机

iptables –A INPUT –p tcp –dport 22 –s 192.168.1.0/24 –j ACCEPT

iptables –A INPUT –p tcp –dport 22 –j DROP

5. TCP标记匹配:在Iptables命令中使用“--tcp-flags  检查范围  被设置的标记”的形式,两个参数“检查范围”和“被设置的标记”均为TCP标记的列表,各标记之间以逗号分割。“检查范围”告诉Iptables需要检查数据包的哪几个标记,“被设置 的标记”则明确匹配对应只为1的标记。【SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)等均可使用于参数中,除此之外还可以使用关键词 ALL 和 NONE 进行比对】

拒绝从外网接口eth1直接访问防火墙本机的数据包,但是允许响应防火墙TCP请求的数据包进入;

iptables –P INPUT DROP

iptables –I INPUT –i eth1 –p tcp --tcp-flags SYN,RST,ACK  SYN –j REJECT

iptables -I INPUT  -i eth1 -p tcp  ! --syn -j ACCEPT

(注:--syn同等于:--tcp-flags SYN,RST,ACK,FIN SYN,详情可以man iptables)

6. ICMP类型匹配:ICMP类型可以使用字符串或数字代码,例如“Echo-Request”(数字代码为8),“Echo-Reply”(数字代码为0),“Destination-Unreachable”(数字代码为3),分别对应ICMP协议的请求、回显、目标不可达数据。

禁止其它主机ping防火墙主机,但是允许防火墙ping其它主机(允许接收ICMP回应数据)。

iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP

iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT

iptables -A INPUT -p icmp --icmp-type Destination-Unreachable -j ACCEPT

7. 显示条件匹配:这种匹配功能需要额外的内核模块提供,因此需要手工指定匹配方式,在Iptables命令中使用“-m 模块关键字”的形式调用显示匹配,当然还需要指定匹配内容。

a. MAC地址匹配:例如禁止转发来自MAC地址为00:01:12:AA:3F:DD的主机数据包

iptables –A FORWARD –m mac –mac-source  00:01:12:AA:3F:DD –j DROP

b. 多端口匹配:Iptables中使用“—dports 端口列表”,“—sports 端口列表”的形式对应源端口地址列表、目标端口地址列表。

允许防火墙本机开放TCP端口20、21、25、110及被动模式FTP端口1250~1280

iptables -A INPUT -p tcp -m multiport --dports 20,21,25,110,1250:1280 -j ACCEPT

c. 多IP地址匹配:Iptables中使用“--src-range IP地址范围”“--dst-range IP地址范围”的形式对应源IP地址范围、目标IP地址范围。

禁止转发IP地址为192.168.1.1~192.168.1.10的TCP数据包

iptables –A FORWARD –p tcp –m iprange –src-range 192.168.1.1-192.168.1.10 –j DROP

d. 状态匹配:常见的数据包状态包括NEW(与任何连接无关的)、ESTABLISHED(响应请求或已建立连接的)和RELATED(与已有连接相关的)

禁止转发与正常TCP连接无关的非--syn请求数据包(如网络中存在一些非法攻击数据包)

iptables –A FORWARD –m state –state NEW –p tcp ! –syn –j DROP

防火墙规则的导入、导出

直接执行iptables-save命令时,会把当前设置的防火墙规则信息输出到终端。通常情况下,可以使用重定向将信息保存为指定的配置文件,结合系统默认提供的Iptables服务脚本,可以自动加载位置于/etc/sysconfig/iptables文件中的规则配置。

使用iptables-restore命令,可以从已保存的配置文件中导入Iptables规则(该文件必须是使用Iptables-save命令导出的配置数据)。

一:前言
 
防火墙,其实说白了讲,就是用于实现Linux下访问控制的功能的,它分为硬件的或者软件的防火墙两种。无论是在哪个网络中,防火墙工作的地方一定是在网络的边缘。而我们的任务就是需要去定义到底防火墙如何工作,这就是防火墙的策略,规则,以达到让它对出入网络的IP、数据进行检测。
 
目前市面上比较常见的有3、4层的防火墙,叫网络层的防火墙,还有7层的防火墙,其实是代理层的网关。
 
对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。所以,对于设计原理来讲,七层防火墙更加安全,但是这却带来了效率更低。所以市面上通常的防火墙方案,都是两者结合的。而又由于我们都需要从防火墙所控制的这个口来访问,所以防火墙的工作效率就成了用户能够访问数据多少的一个最重要的控制,配置的不好甚至有可能成为流量的瓶颈。
 
二:iptables 的历史以及工作原理
 
1.iptables的发展:
 
iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用,而现在,它叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。
 
他们都是工作在用户空间中,定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器)
 
    作者一共在内核空间中选择了5个位置,
    1.内核空间中:从一个网络接口进来,到另一个网络接口去的
    2.数据包从内核流入用户空间的
    3.数据包从用户空间流出的
    4.进入/离开本机的外网接口
    5.进入/离开本机的内网接口
        
2.iptables的工作机制
 
从上面的发展我们知道了作者选择了5个位置,来作为控制的地方,但是你有没有发现,其实前三个位置已经基本上能将路径彻底封锁了,但是为什么已经在进出的口设置了关卡之后还要在内部卡呢? 由于数据包尚未进行路由决策,还不知道数据要走向哪里,所以在进出口是没办法实现数据过滤的。所以要在内核空间里设置转发的关卡,进入用户空间的关卡,从用户空间出去的关卡。那么,既然他们没什么用,那我们为什么还要放置他们呢?因为我们在做NAT和DNAT的时候,目标地址转换必须在路由之前转换。所以我们必须在外网而后内网的接口处进行设置关卡。        
 
 这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。
1.PREROUTING (路由前)
2.INPUT (数据包流入口)
3.FORWARD (转发管卡)
4.OUTPUT(数据包出口)
5.POSTROUTING(路由后)
这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。       
 
3.防火墙的策略
 
防火墙策略一般分为两种,一种叫“通”策略,一种叫“堵”策略,通策略,默认门是关着的,必须要定义谁能进。堵策略则是,大门是洞开的,但是你必须有身份认证,否则不能进。所以我们要定义,让进来的进来,让出去的出去,所以通,是要全通,而堵,则是要选择。当我们定义的策略的时候,要分别定义多条功能,其中:定义数据包中允许或者不允许的策略,filter过滤的功能,而定义地址转换的功能的则是nat选项。为了让这些功能交替工作,我们制定出了“表”这个定义,来定义、区分各种不同的工作功能和处理方式。
 
我们现在用的比较多个功能有3个:
1.filter 定义允许或者不允许的
2.nat 定义地址转换的 
3.mangle功能:修改报文原数据
 
我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。
 
小扩展:
对于filter来讲一般只能做在3个链上:INPUT ,FORWARD ,OUTPUT
对于nat来讲一般也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
而mangle则是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
 
iptables/netfilter(这款软件)是工作在用户空间的,它可以让规则进行生效的,本身不是一种服务,而且规则是立即生效的。而我们iptables现在被做成了一个服务,可以进行启动,停止的。启动,则将规则直接生效,停止,则将规则撤销。 
iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。在一个关卡设定,指定当有数据的时候专门去找某个特定的链来处理,当那个链处理完之后,再返回。接着在特定的链中继续检查。
 
注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
 
三.规则的写法:
 
 iptables定义规则的方式比较复杂:
 格式:iptables [-t table] COMMAND chain CRETIRIA -j ACTION
 -t table :3个:filter nat mangle
 COMMAND:定义如何对规则进行管理
 chain:指定你接下来的规则到底是在哪个链上操作的,当定义策略的时候,是可以省略的
 CRETIRIA:指定匹配标准
 -j ACTION :指定如何进行处理
 
 比如:不允许172.16.0.0/24的进行访问。
 iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
 当然你如果想拒绝的更彻底:
 iptables -t filter -R INPUT 1 -s 172.16.10.215 -p udp --dport 53 -j REJECT
 
 iptables -L -n -v #查看定义规则的详细信息
 
四:详解COMMAND:
 
1.链管理命令(这都是立即生效的)
-P :设置默认策略的(设定默认门是关着的还是开着的)
默认策略一般只有两种
iptables -P INPUT (DROP|ACCEPT)  默认是关的/默认是开的
比如:
iptables -P INPUT DROP 这就把默认规则给拒绝了。并且没有定义哪个动作,所以关于外界连接的所有规则包括Xshell连接之类的,远程连接都被拒绝了。
        -F: FLASH,清空规则链的(注意每个链的管理权限)
    iptables -t nat -F PREROUTING
    iptables -t nat -F 清空nat表的所有链
        -N:NEW 支持用户新建一个链
            iptables -N inbound_tcp_web 表示附在tcp表上用于检查web的。
        -X: 用于删除用户自定义的空链
            使用方法跟-N相同,但是在删除之前必须要将里面的链给清空昂了
        -E:用来Rename chain主要是用来给用户自定义的链重命名
            -E oldname newname
         -Z:清空链,及链中默认规则的计数器的(有两个计数器,被匹配到多少个数据包,多少个字节)
            iptables -Z :清空
 
2.规则管理命令
         -A:追加,在当前链的最后新增一个规则
         -I num : 插入,把当前规则插入为第几条。
            -I 3 :插入为第三条
         -R num:Replays替换/修改第几条规则
            格式:iptables -R 3 …………
         -D num:删除,明确指定删除第几条规则
        
3.查看管理命令 “-L”
 附加子命令
 -n:以数字的方式显示ip,它会将ip直接显示出来,如果不加-n,则会将ip反向解析成主机名。
 -v:显示详细信息
 -vv
 -vvv :越多越详细
 -x:在计数器上显示精确值,不做单位换算
 --line-numbers : 显示规则的行号
 -t nat:显示所有的关卡的信息
 
五:详解匹配标准
 
1.通用匹配:源地址目标地址的匹配
 -s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个IP之外
 -d:表示匹配目标地址
 -p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
 -i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
 -o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
        
2.扩展匹配
2.1隐含扩展:对协议的扩展
    -p tcp :TCP协议的扩展。一般有三种扩展
--dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
--dport 21  或者 --dport 21-23 (此时表示21,22,23)
--sport:指定源端口
--tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
    对于它,一般要跟两个参数:
1.检查的标志位
2.必须为1的标志位
--tcpflags syn,ack,fin,rst syn   =    --syn
表示检查这4个位,这4个位中syn必须为1,其他的必须为0。所以这个意思就是用于检测三次握手的第一次包的。对于这种专门匹配第一包的SYN为1的包,还有一种简写方式,叫做--syn
    -p udp:UDP协议的扩展
        --dport
        --sport
    -p icmp:icmp数据报文的扩展
        --icmp-type:
echo-request(请求回显),一般用8 来表示
所以 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
                  
2.2显式扩展(-m)
     扩展各种模块
      -m multiport:表示启用多端口扩展
      之后我们就可以启用比如 --dports 21,23,80
                  
        
六:详解-j ACTION
 
 常用的ACTION:
 DROP:悄悄丢弃
一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
 REJECT:明示拒绝
 ACCEPT:接受
custom_chain:转向一个自定义的链
 DNAT
 SNAT
 MASQUERADE:源地址伪装
 REDIRECT:重定向:主要用于实现端口重定向
 MARK:打防火墙标记的
 RETURN:返回
在自定义链执行完毕后使用返回,来返回原规则链。
 
练习题1:
     只要是来自于172.16.0.0/16网段的都允许访问我本机的172.16.100.1的SSHD服务
     分析:首先肯定是在允许表中定义的。因为不需要做NAT地址转换之类的,然后查看我们SSHD服务,在22号端口上,处理机制是接受,对于这个表,需要有一来一回两个规则,如果我们允许也好,拒绝也好,对于访问本机服务,我们最好是定义在INPUT链上,而OUTPUT再予以定义就好。(会话的初始端先定义),所以加规则就是:
     定义进来的: iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT  ###注意方向,要不SSH会断连
     定义出去的: iptables -t filter -A OUTPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
     将默认策略改成DROP:
  iptables -P INPUT DROP
  iptables -P OUTPUT DROP
  iptables -P FORWARD DROP
        
七:状态检测:
 
是一种显式扩展,用于检测会话之间的连接关系的,有了检测我们可以实现会话间功能的扩展
        什么是状态检测?对于整个TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫NEW连接,而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED),还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为RELATED。
所以我们的状态一共有四种:
        NEW
        ESTABLISHED
        RELATED
        INVALID
 
所以我们对于刚才的练习题,可以增加状态检测。比如进来的只允许状态为NEW和ESTABLISHED的进来,出去只允许ESTABLISHED的状态出去,这就可以将比较常见的反弹式木马有很好的控制机制。
        
对于练习题的扩展:
进来的拒绝出去的允许,进来的只允许ESTABLISHED进来,出去只允许ESTABLISHED出去。默认规则都使用拒绝
iptables -L -n --line-number  :查看之前的规则位于第几行
    改写INPUT
        iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
 
    此时如果想再放行一个80端口如何放行呢?
        iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
 
        iptables -R INPUT 1 -d 172.16.100.1 -p udp --dport 53 -j ACCEPT
 
练习题2:
假如我们允许自己ping别人,但是别人ping自己ping不通如何实现呢?
分析:对于ping这个协议,进来的为8(ping),出去的为0(响应).我们为了达到目的,需要8出去,允许0进来
 
在出去的端口上:iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
在进来的端口上:iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
 
小扩展:对于127.0.0.1比较特殊,我们需要明确定义它
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
 
八:SNAT和DNAT的实现
 
由于我们现在IP地址十分紧俏,已经分配完了,这就导致我们必须要进行地址转换,来节约我们仅剩的一点IP资源。那么通过iptables如何实现NAT的地址转换呢?
 
1.SNAT基于原地址的转换
基于原地址的转换一般用在我们的许多内网用户通过一个外网的口上网的时候,这时我们将我们内网的地址转换为一个外网的IP,我们就可以实现连接其他外网IP的功能。
所以我们在iptables中就要定义到底如何转换:
定义的样式:
比如我们现在要将所有192.168.10.0网段的IP在经过的时候全都转换成172.16.100.1这个假设出来的外网地址:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1
这样,只要是来自本地网络的试图通过网卡访问网络的,都会被统统转换成172.16.100.1这个IP.
那么,如果172.16.100.1不是固定的怎么办?
我们都知道当我们使用联通或者电信上网的时候,一般它都会在每次你开机的时候随机生成一个外网的IP,意思就是外网地址是动态变换的。这时我们就要将外网地址换成 MASQUERADE(动态伪装):它可以实现自动寻找到外网地址,而自动将其改为正确的外网地址。所以,我们就需要这样设置:
         iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
         这里要注意:地址伪装并不适用于所有的地方。
 
2.DNAT目标地址转换
对于目标地址转换,数据流向是从外向内的,外面的是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的ip通过我们对外的外网ip来访问我们服务器不同的服务器,而我们的服务却放在内网服务器的不同的服务器上。
 
    如何做目标地址转换呢?:
iptables -t nat -A PREROUTING -d 192.168.10.18 -p tcp --dport 80 -j DNAT --todestination 172.16.100.2
        目标地址转换要做在到达网卡之前进行转换,所以要做在PREROUTING这个位置上
 
九:控制规则的存放以及开启
 
注意:你所定义的所有内容,当你重启的时候都会失效,要想我们能够生效,需要使用一个命令将它保存起来
1.service iptables save 命令
它会保存在/etc/sysconfig/iptables这个文件中
    2.iptables-save 命令
iptables-save > /etc/sysconfig/iptables
 
    3.iptables-restore 命令
开机的时候,它会自动加载/etc/sysconfig/iptabels
如果开机不能加载或者没有加载,而你想让一个自己写的配置文件(假设为iptables.2)手动生效的话:
iptables-restore < /etc/sysconfig/iptables.2
则完成了将iptables中定义的规则手动生效
 
 
十:总结
         Iptables是一个非常重要的工具,它是每一个防火墙上几乎必备的设置,也是我们在做大型网络的时候,为了很多原因而必须要设置的。学好Iptables,可以让我们对整个网络的结构有一个比较深刻的了解,同时,我们还能够将内核空间中数据的走向以及linux的安全给掌握的非常透彻。我们在学习的时候,尽量能结合着各种各样的项目,实验来完成,这样对你加深iptables的配置,以及各种技巧有非常大的帮助。
 
附加iptables比较好的文章:
netfilter/iptables全攻略  http://www.linuxso.com/linuxpeixun/10332.html

【转】IPtables学习笔记的更多相关文章

  1. Linux防火墙iptables学习笔记(三)iptables命令详解和举例[转载]

     Linux防火墙iptables学习笔记(三)iptables命令详解和举例 2008-10-16 23:45:46 转载 网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能 ...

  2. Linux下iptables学习笔记

    Linux下iptables学习笔记 在Centos7版本之后,防火墙应用已经由从前的iptables转变为firewall这款应用了.但是,当今绝大多数的Linux版本(特别是企业中)还是使用的6. ...

  3. iptables学习笔记

    为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/SJQ. http://www.cnblogs.com/shijiaqi1066/p/3812510.html ...

  4. iptables学习笔记_____摘自朱双印个人日志 ____http://www.zsythink.net/

    iptables为我们预先定义了四张表 raw.mangle.nat.filter filter表负责过滤:允许那些ip访问.拒绝那些ip访问.允许那些端口...是最常用的表 #查看表里面所有的规则i ...

  5. iptables 学习笔记

    1. 安装iptables yum install iptables centos7: yum install -y iptables-services 2. service命令 查看iptables ...

  6. Linux学习笔记之iptables学习笔记

    iptables系列学习推荐: http://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptab ...

  7. Linux防火墙iptables学习

    http://blog.chinaunix.net/uid-9950859-id-98277.html 要在网上传输的数据会被分成许多小的数据包,我们一旦接通了网络,会有很多数据包进入,离开,或者经过 ...

  8. Hadoop学习笔记—22.Hadoop2.x环境搭建与配置

    自从2015年花了2个多月时间把Hadoop1.x的学习教程学习了一遍,对Hadoop这个神奇的小象有了一个初步的了解,还对每次学习的内容进行了总结,也形成了我的一个博文系列<Hadoop学习笔 ...

  9. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

随机推荐

  1. HTML5+JS 《五子飞》游戏实现(五)移动棋子

    上一章 我们知道了怎么处理两个重要的吃棋动作,想要吃对方的棋子,首先得移动自己的棋子.现在里沃特跟大家分享分享,怎么移动棋子. 想要移动棋子,在页面上,首先要点击一下要移动的棋子,然后再点击一下目标位 ...

  2. 吉特仓库管理系统-.SQL Server 2012 升级企业版

    随着业务数据的不断增大,单表的数量已经上亿,查询的数据越来越慢,所以考虑到将数据库表分区,同时也将数据库升级到SQL Server 2012. 当时没有考虑更多,在服务器上安装了 SQL Server ...

  3. MSSQL 问题集锦

    [1]关于SQL Server数据库连接字符串的特殊参数说明 MultipleActiveResultSets和Mars_Connection同义,指定此数据库连接是否复用数据库内已建立的相同用户的连 ...

  4. Linux终端更改提示符

    打开~/.bashrc可以看到命令提示的内容为:\u@\h\w\$ \u表示用户名,\h表示主机名,\w表示当前目录,\$表示命令提示符(普通用户$,超级用户#) 这个命令提示符有点长,很碍事,\u@ ...

  5. python内置数据类型-字典和列表的排序 python BIT sort——dict and list

    python中字典按键或键值排序(我转!)   一.字典排序 在程序中使用字典进行数据信息统计时,由于字典是无序的所以打印字典时内容也是无序的.因此,为了使统计得到的结果更方便查看需要进行排序. Py ...

  6. 1109关于redo_Log和undo_log和BIN-LOG

    转自http://www.cnblogs.com/Bozh/archive/2013/03/18/2966494.html 三者之间的区别BIN-LOG 一个对应BINLOG文件REDO-LOG 对应 ...

  7. 89c51中断入口地址表

    中断源   中断入口地址 外部中断0 0003H 定时器/计数器T0 000BH 外部中断1 0013H 定时器/计数器T1 001BH 串行口中断   0023H

  8. Django form 中文提交 错误

    在文件头部添加 刻解决 import sys reload(sys) sys.setdefaultencoding("utf-8")

  9. mysql数据库行级锁的使用(二)

    项目上的另外一个需求是: 在做统计的时候需要将当前表锁定不能更新当前表记录 直接上代码 package com.robert.RedisTest; import java.sql.Connection ...

  10. 【BZOJ 4600】【SDOI 2016】硬币游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=4600 转化成nim游戏 因为对于每一个反面朝上的硬币编号可以拆成\(2^a3^bc\),选择这个硬币 ...