为什么80%的码农都做不了架构师?>>>   

//-----------------------------------------------------------------------------
<摘自TCP/IP经典三部之第三章 IP网际协议>

关于路由表, 还有路由表处理的位置...

. 每个路由器都有路由表, 路由表用来决策路由;
  路由表中路由有三类:
    . 链路层协议发现的路由(即直连路由);
    . 静态路由;
    . 动态路由协议发现的路由;

...IP层在内存中有一个路由表。当收到一份数据报并进行发送时,它都要对该表搜索一次。
当数据报来自某个网络接口时, IP首先检查目的 IP地址是否为本机的 IP地址之一或者 IP广播地址。
如果确实是这样,数据报就被送到由 IP首部协议字段所指定的协议模块进行处理。
如果数据报的目的不是这些地址,
那么
( 1 )如果 IP层被设置为路由器的功能,那么就对数据报进行转发(也就是说,像下面对待发出的数据报一样处理);
否则
( 2)数据报被丢弃。

路由表中的每一项都包含下面这些信息:
• 目的IP地址。
    它既可以是一个完整的主机地址,也可以是一个网络地址,由该表目中的标志字段来指定(如下所述)。
    主机地址有一个非0的主机号(见图1 - 5),以指定某一特定的主机,
    而网络地址中的主机号为0,以指定网络中的所有主机(如以太网,令牌环网)。
• 下一站(或下一跳)路由器( next-hop router)的 IP地址,或者有直接连接的网络 IP地址。
    下一站路由器是指一个在直接相连网络上的路由器,通过它可以转发数据报。下一站路由器不是最终的目的,
    但是它可以把传送给它的数据报转发到最终目的。
• 标志。
    其中一个标志指明目的 IP地址是网络地址还是主机地址,
    另一个标志指明下一站路由器是否为真正的下一站路由器,还是一个直接相连的接口。
• 为数据报的传输指定一个网络接口。
    IP路由选择是逐跳地( h o p - b y - h o p)进行的。从这个路由表信息可以看出,
    IP并不知道到达任何目的的完整路径(当然,除了那些与主机直接相连的目的)。
    所有的 IP路由选择只为数据报传输提供下一站路由器的 IP地址。
    它假定下一站路由器比发送数据报的主机更接近目的,而且下一站路由器与该主机是直接相连的。

IP路由选择主要完成以下这些功能:
    1) 搜索路由表,
        寻找能与目的 IP地址完全匹配的表目(网络号和主机号都要匹配)。
        如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。
    2) 搜索路由表,
        寻找能与目的网络号相匹配的表目。
        如果找到,则把报文发送给该表目指定的下一站路由器或直接连接的网络接口(取决于标志字段的值)。
        目的网络上的所有主机都可以通过这个表目来处置。例如,一个以太网上的所有主机都是通过这种表目进行寻径的。
        这种搜索网络的匹配方法必须考虑可能的子网掩码。关于这一点我们在下一节中进行讨论。
    3) 搜索路由表,寻找标为“默认( default)”的表目。
        如果找到,则把报文发送给该表目指定的下一站路由器。
如果上面这些步骤都没有成功,那么该数据报就不能被传送。
如果不能传送的数据报来自本机,那么一般会向生成数据报的应用程序返回一个“主机不可达”或“网络不可达”的错误。

完整主机地址匹配在网络号匹配之前执行。只有当它们都失败后才选择默认路由。
默认路由,以及下一站路由器发送的ICMP间接报文(如果我们为数据报选择了错误的默认路由), 是IP路由选择机制中功能强大的特性.

为一个网络指定一个路由器,而不必为每个主机指定一个路由器,这是 IP路由选择机制的另一个基本特性。这样做可以极大地缩小路由表的规模,
比如 Internet上的路由器有只有几千个表目,而不会是超过 100万个表目。

//-----------------------------------------------------------------------------
. 广播域
    就是说如果站点发出一个广播信号后能接收到这个信号的范围。通常来说一个局域网就是一个广播域。
    广播域内所有的设备都必须监听所有的广播包,如果广播域太大了,用户的带宽就小了,并且需要处理更多的广播,网络响应时间将会长到让人无法容忍的地步。
. 冲突域
    一个站点向另一个站点发出信号。除目的站点外,有多少站点能收到这个信号。这些站点就构成一个冲突域。

关于Hub与Switcher

集线器(Hub)设备不能识别MAC地址和IP地址,对接收到的数据以广播的形式发送,它的所有端口为一个冲突域同时也为一个广播域,
交换机设备具有MAC地址学习功能,通过查找MAC地址表将接收到的数据传送到目的端口,相比于集线器,交换机(Switch)可以分割冲突域,它的每一个端口相应的称为一个冲突域。

交换机虽然能够分割冲突域,但是交换机下连接的设备依然在一个广播域中,当交换机收到广播数据包时,会在所有的设备中进行传播,在一些情况下会导致网络拥塞以及安全隐患,
为了避免因不可控制的广播导致的网络故障风险,通信网络中使用路由器(Router)设备来分割广播域。

相比于交换机,路由器并不通过MAC地址来确定转发数据的目的地址。路由器工作在网络层,利用不同网络的ID号(IP地址,又称为网络地址、协议地址)来确定数据转发的目的地址。
MAC地址通常由设备硬件出厂自带不能更改,IP地址一般由网络管理员手工配置或系统自动分配。
路由器通过IP地址将连接到其端口的设备划分为不同的网络(子网),每个端口下连接的网络即为一个广播域,广播数据不会扩散到该端口以外,因此我们说路由器隔离了广播域.

//-----------------------------------------------------------------------------    
参考: http://support.huawei.com/ecommunity/bbs/10182879.html
<强叔侃墙系列>      
    http://support.huawei.com/ecommunity/bbs/10184167.html
    
防火墙设备的安全域
    安全区域是一个逻辑的结构,是多个处于相同属性区域的物理接口的集合。
    防火墙通过安全区域来划分网络, 标识报文流动的"路线";
    当不同安全区域之间相互通讯时,必须通过事先定义的策略检查才能通过;
    当在同一个安全区域进行通讯时,默认状态下允许不通过策略检查,经过配置后也可以强制进行策略检查以提高安全性。
    安全区域使防火墙的配置能更灵活同现有的网络结构相结合;
    
默认的安全区域访问控制策略:
    高优先级可访问低优先级区域; 反之不成立;
    同等优先级区域可相互访问;
    安全区域内(接口,IP)可相互访问;
    
    安全域名称    优先级
    Management    100
    Local        100        (防火墙设备主动发出的报文)
    Trust        85
    DMZ            50        (介乎内部网与外部网之间的安全区域)
    Untrust        5
    
Inbound, 报文从低级别 >> 高级别;
Outbound, 报文从高级别 >> 低级别;

会话:
会话的存活期:

五元组:
    sIP, dIP + sPort, dPort + Protocol;
    是会话(session)的重要信息, 称为五元组; 五元组相同的报文可认为属于相同的流(stream);

[英文术语]
. IDS(Intrusion Detection System)
    入侵检测系统;
. IPS(Intrusion Prevention System)
    入侵预防系统;
    是防病毒软件(Antivirus Programs)和防火墙(Packet filter,Application Gateway)的补充;
    IPS, IDS为相互协作的关系;
    
    在ISO/OSI网络层次模型中, 防火墙主要在第二到第四层起作用; 而杀毒软件主要在第五到第七层使用;
    为了弥补二者在第四到第五层之间留下的空挡...

. DoS(Denial of Service)
    拒绝服务(攻击)
. DDoS(Distributed DoS)
    分布式拒绝服务攻击

. NGFW(Next-Generation FireWall)
    集成传统防火墙(状态检测, NAT, VPN等);
    集成IPS;
    集成外部智能;
    应用感知和可视化;

//-----------------------------------------------------------------------------    
防火墙工作模式:
    路由模式
        采用路由模式时,可以完成ACL 包过滤、ASPF 动态过滤、NAT 转换等功能。
        然而,路由模式需要对网络拓扑进行修改(内部网络用户需要更改网关、路由器需要更改路由配置等),这是一件相当费事的工作,因此在使用该模式时需权衡利弊.
            ACL(访问控制列表)
                参考 百度百科 key=ACL;
                相对于在PREROUTING做过滤;
                格式: 协议+接口+方向;
                隐含选项: 全部拒绝;
                格式:
                    access-list access-list-number { permit | deny } {source [source-wildcard] | any}
                    access-list access-list-number { permit | deny } { protocol \ protocol-keyword } { source [ source-wildcard ] | any } { destination destination-wildcard } | any }[protocol-specific options][log]
            ASPF (Application specific packet filter)
    透明模式
    混合模式

//-----------------------------------------------------------------------------
网关是一个IP地址。是一个网络连接到另一个网络的“关口”。
路由器是一个物理设备。一般局域网的网关就是路由器的IP地址。

. Gateway网关
    与不同网段通讯时, 就需要配置默认网关;
    网关就是默认的路由;
    
. 网桥
    
. Routing路由:
    路由是指路由器从一个接口上收到数据包,根据数据包的目的地址进行定向并转发到另一个接口的过程。
    需要注意的是, 路由是工作在网络层的, 其主要作用是跨网段传输包;
        <比较>交换机, 工作在链路层, 其主要目的是标识一个冲突域(局域网);
    工作在ISO第三层;
        集线器, 第一层, 可视为线路;
        交换机, 第二层, 可识别MAC;
        路由器, 第三层, 可识别IP;
 
  静态路由, 动态路由, 主要指路由表的数据之来源而言;
 
    静态路由:
        管理员手动添加的路条目。Metric为0或1。
        当网络发生变化时,不会改变,需要管路员再次手动修改.
    
    动态路由:
        ICMP重定向, 重定向学习;
        路由通过路由协议(rip,ospf,eigrp,BGP等)学习到路由条目并自动保存路由表中。
        当网络发生变化时,根据路由协议的特性,路由器会自动收敛,路由表里会保存最新,最优的路由条目。
        大型网络网络拓扑复杂,路由器数量大,线路冗余多,管理人员相对较少,要求管理效率要高等原因,通常都会使用动态路由协议,适当的辅以静态路由的方式.
    
    Linux上实现动态路由: zebra; 支持ripv1,ripv2,ospf,bgp等动态路由协议; 一般使用quagga(zebra升级版);
    zerbar, 驻留服务程序;
    
    参考IBM的介绍如何用Linux打造路由器 (http://www.ibm.com/developerworks/cn/linux/l-router/); 动态路由表
    Linux Route命令详解 (http://www.cnblogs.com/snake-hand/p/3143041.html)
    
  默认路由:
    特殊的静态路由, 指的是当路由表中与包的目的地址之间没有匹配的表项时路由器能够做出的选择;
    默认情况下在路由表中直连路由优先级最高,静态路由优先级其次,下来为动态路由,默认路由最低;
    如果没有默认路由,那么目的地址在路由表中没有匹配表项的包将被丢弃;
    
  默认网关:
    其实我们在PC机上配的默认网关就是默认路由;
    
    
    Routing-Table(路由表)
        路由择域信息库(RIB)
            FIB(Forward Information Base)
        路由表中路由有三类:
        (1)链路层协议发现的路由(即是直连路由)
        (2)静态路由
        (3)动态路由协议发现的路由。
        
    路由表项说明:
        三要素: 目标地址, 掩码, 下一跳(next hop);
        
        destination mask pre costdestination:目的地址,
            用来标识IP包的目的地址或者目的网络。
        mask:网络掩码,
            与目的地址一起标识目的主机或者路由器所在的网段的地址。
        pre:标识路由加入IP路由表的优先级。
            可能到达一个目的地有多条路由,但是优先级的存在让他们先选择优先级高的路由进行利用。
        cost:路由开销; (Metric)
            当到达一个目的地的多个路由优先级相同时,路由开销最小的将成为最优路由。
        interface:输出接口,
            说明IP包将从该路由器哪个接口转发。
        nexthop:下一跳IP地址,
            说明IP包所经过的下一个路由器。

Destination 目标
            The destination network or destination host. 目标网络或目标主机。
        Gateway 网关
            The gateway address or '*' if none set. 网关地址,如果没有就显示星号。
        Genmask 网络掩码
            The  netmask  for  the  destination net; '255.255.255.255' for a
            host destination and '0.0.0.0' for the default route.
        Flags:总共有多个旗标,代表的意义如下:                        
            U (route is up):该路由是启动的;                       
            H (target is a host):目标是一部主机 (IP) 而非网域;
            G (use gateway):需要透过外部的主机 (gateway) 来转递封包;
            R (reinstate route for dynamic routing):使用动态路由时,恢复路由资讯的旗标;                       
            D (dynamically installed by daemon or redirect):已经由服务或转 port 功能设定为动态路由
            M (modified from routing daemon or redirect):路由已经被修改了;
            ! (reject route):这个路由将不会被接受(用来抵挡不安全的网域!)
            A (installed by addrconf)
            C (cache entry)
        Metric
            距离、跳数。暂无用。
            The 'distance' to the target (usually counted in  hops).  It  is
            not  used  by  recent kernels, but may be needed by routing daemons.
        Ref   
            不用管,恒为0。
            Number of references to this route. (Not used in the Linux  ker-nel.)
        Use
            该路由被使用的次数,可以粗略估计通向指定网络地址的网络流量。
            Count  of lookups for the route.  Depending on the use of -F and
            -C this will be either route cache misses (-F) or hits (-C).
        Iface 接口,即eth0,eth0等网络接口名
            Interface to which packets for this route will be sent.

//-----------------------------------------------------------------------------
& 参考:
http://blog.csdn.net/sdytlm/article/details/6544913/  Iptables经典详解!
http://blog.chinaunix.net/uid-26000296-id-4111127.html
http://www.linuxso.com/linuxpeixun/10332.html
http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646466.html

iptables使用范例详解
    http://www.linuxidc.com/Linux/2014-03/99159.htm

iptables—包过滤(网络层)防火墙 !!!
    http://www.linuxidc.com/Linux/2013-08/88423.htm

Linux防火墙iptables详细教程
    http://www.linuxidc.com/Linux/2013-07/87045.htm

iptables+L7+Squid实现完善的软件防火墙
    http://www.linuxidc.com/Linux/2013-05/84802.htm

iptables的备份、恢复及防火墙脚本的基本使用
    http://www.linuxidc.com/Linux/2013-08/88535.htm

Linux下防火墙iptables用法规则详解
    http://www.linuxidc.com/Linux/2012-08/67952.htm

//-----------------------------------------------------------------------------
HomePage:
    http://www.netfilter.org/documentation/index.html
参考:
    http://itindex.net/detail/49448-linux-%E6%95%B0%E6%8D%AE%E5%8C%85-%E8%B7%AF%E7%94%B1
    http://blog.chinaunix.net/uid-23069658-id-3160506.html

. Netfilter
    Linux操作系统核心层内部的一个数据包处理模块,它分四个基本模块
        1. Ct 链接追踪 (ConnTrack)
        2. Filter 过滤
        3. Nat 地址转换
        4. Mangle 修改数据报文
        
    ConnTrack是基础核心模块是状态防火墙和nat的基础. 而其他模块会维护一个全局表,也即我们用iptables命令的时候需要指定的表;
        Linux为每个经过网络堆栈的数据包, 生成一个新的连接记录项(Connection entry); 此后, 所有属于此连接的数据包都被唯一地
        分配给这个连接, 同时标识连接状态;
        关于这部分的详细代码实现, 参考博客 http://cooliron.blog.163.com/blog/static/12470313820134445336932/
    
    Netfilter平台中制定了五个数据包的挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,
    使我们有机会能在数据包路由的时候有机会改变它们的方向、内容),
    这5个挂载点分别是
        1) PRE_ROUTING
        2) INPUT
        3) OUTPUT
        4) FORWARD
        5) POST_ROUTING
    对于上面的模块在实际代码中是相对独立的初始化的:
        net/ipv4/netfilter/
        1.iptable_filter.c –>iptable_filter_init
        2. iptable_mangle.c –>iptable_mangle_init
        3.iptable_nat.c –>iptable_nat_init
        4.iptable_raw.c –>iptable_raw_init
        5.iptable_security.c —>iptable_security_init

. Iptables
    Netfilter所设置的规则是存放在内核内存中的,Iptables是一个应用层(Ring3)的应用程序,
    它通过Netfilter放出的接口来对存放在内核内存中的Xtables(Netfilter的配置表)进行修改;
    (这是一个典型的Ring3和Ring0配合的架构)
    
    iptables包含4个Table,5个Chain。其中
        Table -> 对数据包的操作;
        Chain -> 不同的Hook点;
    表和链实际上是netfilter的两个维度;
        Table包括:
            filter, 一般的过滤功能;
            nat, 用于NAT操作;
            mangle, 用于对特定数据包的修改;
            raw,
        Chain包括:
            PREROUTING
                数据包进入路由表之前;
            INPUT
                (数据包)通过路由表后且DIP为本机;
            FORWARDING
                (数据包)通过路由表后且DIP不是本机;
            OUTPUT
                (数据包)由本机产生, 向外转发;
            POSTROUTING
                (数据包)被发送到网卡前;

iptables中表与链的对应关系图:

. Xtables
    我们知道Netfilter是负责实际的数据流改变工作的内核模块,而Xtables就是它的规则配置文件,
    Netfilter依照Xtables的规则来运行,Iptables在应用层负责修改这个规则文件。

Xtables由"表"、"链"、"规则rule"组成
    1. Filter(表)
        filter表是专门过滤包的,内建三个链,可以毫无问题地对包进行DROP、LOG、ACCEPT和REJECT等操作;
        1) INPUT(链)
            INPUT针对那些目的地是本地的包
        2) FORWARD(链)
            FORWARD链过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的包
        3) OUTPUT(链)
            OUTPUT是用来过滤所有本地生成的包
    2. Nat(表) (Network Address Translation)
        Nat表的主要用处是网络地址转换,做过NAT操作的数据包的地址就被改变了,当然这种改变是根据我们的规则进行的。属于一个流的包(因为包
        的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作。
        也就是说,余下的包不会再通过这个表,一个一个的被NAT,而是自动地完成;
        1) PREROUTING(链)
            PREROUTING 链的作用是在包刚刚到达防火墙时改变它的目的地址
        2) INPUT(链)
        3) OUTPUT(链)
            OUTPUT链改变本地产生的包的目的地址
        4) POSTROUTING(链)
            POSTROUTING链在包就要离开防火墙之前改变其源地址。
    3. Mangle(表)
        这个表主要用来mangle数据包。我们可以改变不同的包及包头的内容,比如 TTL,TOS或MARK。
        注意MARK并没有真正地改动数据包,它只是在内核空间为包设了一个标记。防火墙内的其他的规则或程序(如tc)可以使用这种标记对包进行过滤或高级路由。
        注意,mangle表不能做任何NAT,它只是改变数据包的TTL,TOS或MARK,而不是其源目地址。NAT必须在nat表中操作的。
        1) PREROUTING(链)
            PREROUTING在包进入防火墙之后、路由判断之前改变包
        2) INPUT(链)
            INPUT在包被路由到本地之后,但在用户空间的程序看到它之前改变包
        3) FORWARD(链)
            FORWARD在最初的路由判断之后、最后一次更改包的目的之前mangle包
        4) OUTPUT(链)
            OUTPUT在确定包的目的之前更改数据包
        5) POSTROUTING(链)
            POSTROUTING是在所有路由判断之后

. Netfilter的Hook点
    Netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK)(或者说是回调函数),而在每个检测点上登记(callback)了一些处理函数进行处理(如包过滤,NAT等,甚至可以是 用户自定义的功能)
    1. NF_IP_PRE_ROUTING:
        刚刚通过数据链路层解包,进入网络层的数据包通过此点(刚刚进行完版本号,校验和等检测),目的地址转换在此点进行
    2. NF_IP_LOCAL_IN
        经路由查找后,送往本机的通过此检查点,INPUT包过滤在此点进行
    3. NF_IP_FORWARD
        要转发的包通过此检测点,FORWARD包过滤在此点进行
    4. NF_IP_POST_ROUTING
        所有马上便要通过网络设备出去的包通过此检测点,内置的源地址转换功能(包括地址伪装)在此点进行
    5. NF_IP_LOCAL_OUT
        本机进程发出的包通过此检测点,OUTPUT包过滤在此点进行

我们可以看到,通过"5个代表不同阶段的Hook点"、"表、链、规则"这种"松耦合"、"规则型"的结构,我们作为管理员可以获得最大程度的控制灵活性、可以有非常巨大的想象空间;

Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,

    数据包过滤、
    数据包处理、
    地址伪装、
    透明代理、
    动态网络地址转换(Network Address Translation,NAT),
    以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、
    包速率限制

Iptables/Netfilter的这些规则可以通过灵活组合,形成非常多的功能、涵盖各个方面,这一切都得益于它的优秀设计思想;
        
        
//-----------------------------------------------------------------------------
iptable默认配置文件位置:    
    /etc/sysconfig/iptables ip6tables
    /etc/sysconfig/iptables-config (nat helper? 有空研究)

主程序:
    /sbin/iptables
    
配置脚本程序:
    /etc/rc.d/init.d/iptables, iptables-restore, iptables-save, iptables-multi,
    使用:
        service iptables start/stop/status/save (参看脚本中的函数)
        
常用参数:
    查看所有Local链(INPUT,OUTPUT,FORWARD)
        iptables -L
    查看PREROUTING,POSTROUTING
        iptables -t nat -L PREROUTING/POSTROUTING
    清空指定/所有链的规则
        iptables -F [chain]
    
    
//-----------------------------------------------------------------------------
. 防火墙的策略:

! 规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。

我们现在用的比较多个功能有3个:
    1.filter
        包过滤; 内建三个链INPUT, FORWARD, OUTPUT;
        其中, Forward过滤所有不是本地产生的且目标不是本地的包;
        Input是那些目的地址为本地的包;
        Output是用来过滤所有本地产生的包;
    2.nat
        网络地址转换;
        PREROUTING链, 包刚刚到达防火墙时改变其目的地址;
        OUTPUT链, 改变本地产生包的目的地址;
        POSTROUTING链, 包在要离开防火墙之前改变其源地址;
    3.mangle
        主要用来操作数据包的, 可以改变不同的包或包头的内容;
        包括五个内建链, (PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING);
        (就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容)

//-----------------------------------------------------------------------------
. 规则的简单写法:

iptables [-t 表] [操作命令 [链]] [规则匹配器] [-j 目标动作]

table,
    表选项用于指定命令应用于哪个iptables内置表,
    包括filter表、nat表、mangle表和raw表。
        filter, 过滤器表(default, 未指定-t时均表示[-t filter]),
            定义是否允许包通过;
        nat(Network Address Translation),
            地址转换表;
        mangle表
            包含了链可以修改或者改变在NAT和包过滤之外的网络包的内容; (不常用)
    
    命令选项,
        告诉程序如何做,比如:插入一个规则,还是删除等; (维护实时的规则表)
    -P或–policy <链名>
        定义默认策略;
        e.g "iptables -P INPUT DROP"
            默认拒绝接收发送到本机的包;
    -L或–list <链名>
        查看iptables规则列表
    -A或—append <链名>
        在规则列表的最后增加1条规则
    -I或–insert <链名>
        在指定的位置插入1条规则
    -D或–delete <链名>
        从规则列表中删除1条规则
    -R或–replace <链名>
        替换规则列表中的某条规则
    -F或–flush <链名>
        删除表中所有规则
    -Z或–zero <链名>
        将表中数据包计数器和流量计数器归零
    
    chain,
    根据table中指定的表, 指定所对应的chain;
    
    对于filter表, 对应3个chain。对于每个包来说,内核都会选择三个链中适合的一个进行处理;
    . FORWARD链规则,
        用于从一个网络接口输入,再转发到另一个网络接口输出的包;
    . INPUT链规则,
        用于以本机为目的地的包;
    . OUTPUT链规则,
        用于从本地主机发出的包;

规则之匹配选项,
    -p或---proto <协议类型>
        指定数据包匹配的协议,如TCP、UDP和ICMP等
    -s或--source <源地址或子网>
        指定数据包匹配的源地址
    --sport <源端口号>
        指定数据包匹配的源端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
    -d或--destination <目标地址或子网>
        指定数据包匹配的目标地址
    --dport <目标端口号>
        指定数据包匹配的目标端口号,可以使用“起始端口号:结束端口号”的格式指定一个范围的端口
    -i或--in-interface <网络接口名>
        指定数据包从哪络接口进入,如ppp0、eth0和eth1等
    -o或--out-interface <网络接口名>
        指定数据包从哪块网络接口输出,如ppp0、eth0和eth1等

常用动作(Target)选项:
    ACCEPT
        接受数据包
    DROP
        丢弃数据包
    REDIRECT
        将数据包重新转向到本机或另一台主机的某个端口,通常用功能实现透明代理或对外开放内网某些服务
        e.g "iptables -t nat -D PREROUTING -p tcp --dport 8080 -i eth1 -j REDIRECT --to 80"
    SNAT
        源地址转换,即改变数据包的源地址
        e.g "iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1"
    DNAT
        目标地址转换,即改变数据包的目的地址
        e.g "iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102"
    MASQUERADE
        IP伪装,即是常说的NAT技术,
        MASQUERADE只能用于ADSL等拨号上网的IP伪装,也就是主机的IP是由ISP分配动态的;
        ! 如果主机的IP地址是静态固定的,就要使用SNAT;
    LOG
        日志功能,将符合规则的数据包的相关信息记录在日志中,以便管理员的分析和排错
    MARK
        给数据包打标记;
        e.g "iptables -t mangle -A PREROUTING -s 192.168.1.3 -j MARK --set-mark 60"
    ULOG
        在用户空间记录被匹配的包的信息;
        使用netlink socket将信息多播到用户空间;
        ULOGD (Userspace Logging Daemon)
        MYSQL
        具体配置, 参考 (http://linux.chinaunix.net/techdoc/net/2006/10/26/942862.shtml)

//-----------------------------------------------------------------------------
. command 常用操作命令列表

命令:  -P, --policy
    范例:  iptables -P INPUT DROP
    说明:  定义过滤政策。也就是未符合过滤条件之封包, 默认的处理方式。
    
    命令:  -A, --append
    范例:  iptables -A INPUT ...
    说明:  新增规则到某个规则链中,该规则将会成为规则链中的最后一条规则。

命令:  -D, --delete
    范例:  iptables -D INPUT --dport 80 -j DROP
           iptables -D INPUT 2
    说明:  从某个规则链中删除一条规则,可以输入完整规则,或直接指定规则编号加以删除。

命令:  -I, --insert
    范例:  iptables -I INPUT 2 --dport 80 -j ACCEPT
    说明:  插入一条规则,原本该位置上的规则将会往后移动一个顺位。
    
    命令:  -R, --replace
    范例:  iptables -R INPUT 1 -s 192.168.0.1 -j DROP
    说明:  取代现行规则,规则被取代后并不会改变顺序。

命令:  -F, --flush
    范例:  iptables -F INPUT
    说明:  删除filter 表中INPUT 链的所有规则。

命令:  -Z, --zero
    范例:  iptables -Z INPUT
    说明:  将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式攻击不可或缺的工具。

命令:  -N, --new-chain
    范例:  iptables -N allowed
    说明:  定义新的规则链。

命令:  -X, --delete-chain
    范例:  iptables -X allowed
    说明:  删除某个规则链。

命令:  -E, --rename-chain
    范例:  iptables -E allowed disallowed
    说明:  修改某自定义规则链的名称。

命令:  -L, --list
    范例1: iptables -L INPUT
    说明:  列出某规则链中的所有规则。
    范例2: iptables -t nat -L
    说明:  列出nat 表所有链中的所有规则。
        -v --verbose 详细的;
        -n --numeric ip地址和端口用数值而非名字显示;
        -x --exact
        --line-numbers 每条规则都显示序号;

//-----------------------------------------------------------------------------
. 常用封包匹配参数

基本匹配:
    
    参数:  -p, --protocol
    范例:  iptables -A INPUT -p tcp
    说明:  匹配通讯协议类型是否相符,可以使用! 运算符进行反向匹配,例如:
               -p !tcp
           意思是指除tcp 以外的其它类型,如udp、icmp ...等。
           如果要匹配所有类型,则可以使用all 关键词,例如:
               -p all

参数:  -s, --src, --source
    范例:  iptables -A INPUT -s 192.168.1.1
    说明:  用来匹配封包的来源IP,可以匹配单机或网络,匹配网络时请用数字来表示子网掩码,
    例如:
           -s 192.168.0.0/24
           匹配IP 时可以使用! 运算符进行反向匹配,例如:
           -s! 192.168.0.0/24。

参数:  -d, --dst, --destination
    范例:  iptables -A INPUT -d 192.168.1.1
    说明:  用来匹配封包的目的地IP,设定方式同上。

参数:  -i, --in-interface
    范例:  iptables -A INPUT -i eth0
    说明:  用来匹配封包是从哪块网卡进入,可以使用通配字符+ 来做大范围匹配,例如:
             -i eth+
          表示所有的ethernet 网卡
          也可以使用! 运算符进行反向匹配,例如:
             -i !eth0

参数:  -o, --out-interface
    范例:  iptables -A FORWARD -o eth0
    说明:  用来匹配封包要从哪块网卡送出,设定方式同上。
    
    
    隐含扩展匹配:
    这种匹配操作是自动的或隐含的装入内核的。
    例如使用-p tcp时,不需要再装入任何东西就可以匹配只有IP包才有的特点。
    隐含匹配针对三种不同的协议,即TCP, UDP, ICMP。它们分别有一套适用于相应协议的判断标准.
    
    TCP匹配 只能匹配TCP包的细节,必须有-p tcp作为前提;

参数:  --sport, --source-port
        范例:  iptables -A INPUT -p tcp --sport 22
        说明:  用来匹配封包的源端口,可以匹配单一端口,或是一个范围,例如:
                  --sport 22:80
               表示从22 到80 端口之间都算是符合条件,如果要匹配不连续的多个端口,则必须使用
                  --multiport 参数,详见后文。匹配端口号时,可以使用! 运算符进行反向匹配。

参数:  --dport, --destination-port
        范例:  iptables -A INPUT -p tcp --dport 22
        说明:  用来匹配封包的目的地端口号,设定方式同上

参数:  --tcp-flags
        范例:    iptables -p tcp --tcp-flags SYN,FIN,ACK SYN  //匹配那些SYN标记被设置而FIN和ACK标记没有设置的;
                iptables -p tcp --tcp-flags ALL NONE  //匹配所有标记都未置1的包
        说明:  匹配TCP 封包的状态标志;
               参数分为两个部分,
                 第一个部分列举出想匹配的标志,
                 第二部分则列举前述标志中哪些有被设置,未被列举的标志必须是空的。
               TCP 状态标志包括:
                  SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急) 、PSH(强迫推送)
               等均可使用于参数中,
               除此之外还可以使用关键词ALL 和NONE 进行匹配。
               匹配标志时,可以使用! 运算符行反向匹配。
               
    UDP匹配
        --sprot port
        --dport port

ICMP匹配
        参数:  --icmp-type
        范例:  iptables -A INPUT -p icmp --icmp-type 8
        说明:  用来匹配ICMP 的类型编号,可以使用代码或数字编号来进行匹配。
               请打iptables -p icmp--help 来查看有哪些代码可用。
               
    参数:  --syn
    范例:  iptables -p tcp --syn
    说明:  用来表示TCP 通信协议中,SYN 位被打开,而ACK 与FIN 位关闭的分组,即TCP 的初始连接,
           与iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 的作用完全相同,
           如果使用!运算符,可用来匹配非要求连接封包。

参数:  -m multiport --source-port
    范例:  iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
    说明:  用来匹配不连续的多个源端口,一次最多可以匹配15 个端口,
           可以使用! 运算符进行反向匹配。

参数:  -m multiport --destination-port
    范例:  iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
    说明:  用来匹配不连续的多个目的地端口号,设定方式同上

参数:  -m multiport --port
    范例:  iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
    说明:  这个参数比较特殊,用来匹配源端口和目的端口号相同的封包,设定方式同上。
           注意:在本范例中,如果来源端口号为80目的地端口号为110,这种封包并不算符合条件。

参数:  -m limit --limit
    范例:  iptables -A INPUT -m limit --limit 3/hour -j [...]
    说明:  用来匹配某段时间内封包的平均流量,
           上面的例子是用来匹配:每小时平均流量是否超过一次3 个封包。
           除了每小时平均次外,也可以每秒钟、每分钟或每天平均一次,默认值为每小时平均一次,参数如后:
               /second、/minute、/day
           除了进行封包数量的匹配外,设定这个参数也会在条件达成时,暂停封包的匹配动作,
           以避免因骇客使用洪水攻击法,导致服务被阻断。

参数:  --limit-burst
    范例:  iptables -A INPUT -m limit --limit-burst 5 -j [...]
    说明:  用来匹配瞬间大量封包的数量,
           上面的例子是用来匹配一次同时涌入的封包是否超过5个(这是默认值),超过此上限的封包将被直接丢弃。
           使用效果同上。

参数:  -m mac --mac-source
    范例:  iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
    说明:  用来匹配封包来源网络接口的硬件地址,
           这个参数不能用在OUTPUT 和POSTROUTING 规则链上,
           这是因为封包要送到网卡后,才能由网卡驱动程序透过ARP 通讯协议查出目的地的MAC 地址,
           所以iptables 在进行封包匹配时,并不知道封包会送到哪个网络接口去。

参数:  --mark
    范例:  iptables -t mangle -A INPUT -m mark --mark 1
    说明:  用来匹配封包是否被表示某个号码,
           当封包被匹配成功时,我们可以透过MARK 处理动作,将该封包标示一个号码,号码最大不可以超过4294967296。

参数:  -m owner --uid-owner
    范例:  iptables -A OUTPUT -m owner --uid-owner 500
    说明:  用来匹配来自本机的封包,是否为某特定使用者所产生的,
           这样可以避免服务器使用root或其它身分将敏感数据传送出,可以降低系统被骇的损失。
           可惜这个功能无法匹配出来自其它主机的封包。

参数:  -m owner --gid-owner
    范例:  iptables -A OUTPUT -m owner --gid-owner 0
    说明:  用来匹配来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

参数:  -m owner --pid-owner
    范例:  iptables -A OUTPUT -m owner --pid-owner 78
    说明:  用来匹配来自本机的封包,是否为某特定进程所产生的,使用时机同上。

参数:  -m owner --sid-owner
    范例:  iptables -A OUTPUT -m owner --sid-owner 100
    说明:  用来匹配来自本机的封包,是否为某特定连接(Session ID)的响应封包,使用时机同上。

参数:  -m state --state
    范例:  iptables -A INPUT -m state --state RELATED,ESTABLISHED
    说明:  用来匹配连接状态,
           连接状态共有四种:
               INVALID     表示该封包的连接编号(Session ID)无法辨识或编号不正确。
               ESTABLISHED 表示该封包属于某个已经建立的连接。
               NEW         表示该封包想要起始一个连接(重设连接或将连接重导向)。
               RELATED     表示该封包是属于某个已经建立的连接,所建立的新连接。
           例如:FTP-DATA 连接必定是源自某个FTP 连接。

//-----------------------------------------------------------------------------
. [-j target/jump] 常用的处理动作
    -j 参数用来指定要进行的处理动作,常用的处理动作包括:
       ACCEPT、REJECT、DROP、REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,

分别说明如下:
    动作:  ACCEPT
    说明:  将封包放行,
           进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规则链(natostrouting)。

动作:  REJECT
    说明:  拦阻该封包,并传送封包通知对方,
           可以传送的封包有几个选择:
               ICMP port-unreachable、
               ICMP echo-reply 或是
               tcp-reset(这个封包会要求对方关闭连接),
             进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。
    范例:  iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

动作:  DROP
    说明:  丢弃封包不予处理,进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。

动作:  REDIRECT
    说明:  将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹配其它规则。
           这个功能可以用来实现透明代理或用来保护web 服务器。
    范例:  iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

动作:  MASQUERADE
    说明:  改写封包来源IP 为防火墙NIC IP,可以指定port 对应的范围,
           进行完此处理动作后,直接跳往下一个规则链(manglepostrouting)。
           这个功能与SNAT 略有不同,当进行IP 伪装时,不需指定要伪装成哪个IP,IP 会从网卡直接读取,
           当使用拨号接连时,IP通常是由ISP 公司的DHCP 服务器指派的,这个时候MASQUERADE 特别有用。
    范例:  iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

动作:  LOG
    说明:  将封包相关讯息纪录在/var/log 中,详细位置请查阅/etc/syslog.conf 配置文件,
           进行完此处理动作后,将会继续匹配其规则。
    范例:  iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

动作:  SNAT
    说明:  改写封包来源IP 为某特定IP 或IP 范围,可以指定port 对应的范围,
           进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。
    范例:  iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source?194.236.50.155-194.236.50.160:1024-32000

动作:  DNAT
    说明:  改写封包目的地IP 为某特定IP 或IP 范围,可以指定port 对应的范围,
           进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或filter:forward)。
    范例:  iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

动作:  MIRROR
    说明:  镜射封包,也就是将来源IP 与目的地IP 对调后,将封包送回,
           进行完此处理动作后,将会中断过滤程序。

动作:  QUEUE
    说明:  中断过滤程序,将封包放入队列,交给其它程序处理。
           通过自行开发的处理程序,可以进行其它应用,例如:计算连接费用等。

动作:  RETURN
    说明:  结束在目前规则链中的过滤程序,返回主规则链继续过滤,
           如果把自定义规则链看成是一个子程序,那么这个动作,就相当于提前结束子程序并返回到主程序中。

动作:  MARK
    说明:  将封包标上某个代号,以便提供作为后续过滤的条件判断依据,
           进行完此处理动作后,将会继续匹配其它规则。
    范例:  iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

//-----------------------------------------------------------------------------
参考:    http://www.fedora.hk/linux/yumwei/show_23.html
        http://www.111cn.net/sys/linux/75503.htm
        http://www.myhack58.com/Article/48/66/Article_066_1.htm  (有空浏览其博客)

设定预设规则:
iptables -p INPUT DROP
iptables -p OUTPUT ACCEPT
iptables -p FORWARD DROP

在下面就是FORWARD链, FORWARD链的默认规则是DROP, 所以我们就写需要ACCETP(通过)的链, 对正在转发链的监控.
开启转发功能,(在做NAT时,FORWARD默认规则是DROP时,必须做)
    
    iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A FORWARD -i eth1 -o eh0 -j ACCEPT

丢弃坏的TCP包
    iptables -A FORWARD -p TCP ! --syn -m state --state NEW -j DROP

处理IP碎片数量,防止攻击,允许每秒100个
    iptables -A FORWARD -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT

设置ICMP包过滤,允许每秒1个包,限制触发条件是10个包.
    iptables -A FORWARD -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT

要设置NAT,首先要打开系统的路由功能:

echo "1" > /proc/sys/net/ipv4/ip_forward
    iptables –t nat –A POSTROUTING –s eht0 –o eth1 –j MASQUERADE    
    
    上段代码就是开启地址转换的功能了,当来自eth0接口的数据包要转发出去的时候,会将IP地址转换为eth1接口的IP地址,
    上边这么设的好处在于不必理会接口的IP地址是什么,转换会自动进行;
    如果接口有固定的地址或者多个地址,可以直接指定IP地址的值(静态地址转换):

iptables –t nat –A POSTROUTING –o eth1 SNAT --to 116.255.176.222
    iptables –t nat –A POSTROUTING –o eth1 SNAT --to 116.255.176.222-116.255.176.225

本地端口重映射:
    iptables –t nat –A PREROUTING --p tcp --dport 80 –j REDIRECT --to-ports 8080

这里可能就有人有疑问了,如果将filter表的过滤规则和NAT表的规则放一起是否有冲突,
这里解释一下,在LINUX入门篇之使用IPTABLES架设防火墙这里我们已经说过,规则是顺序匹配的,
一旦某一条规则与数据包相匹配,则后续规则不再进行匹配,而当数据进入本机的时候,
首先要经过的就是NAT表的PREROUTING链,如果是转发数据,再经过filter的forward链,
最后经过NAT的POSTROUTING链,所以说,如果LINUX主机判断出数据包是要进行NAT的,
是不会经过filter表中的INPUT和OUTPUT链过滤的,而一般情况下,filter表中的forward链默认策略是ACCPT,
所以很好的解决了NAT和防火墙策略冲突的问题。

//-----------------------------------------------------------------------------
<2016.7.19> 摘抄, 翻译自iptables manual.

RULE
由 匹配条件(Matching Condtion) + 目标(Target)构成;

. 规则参数 (PARAMETERS)
  下列参数(PARAMETERS)可用来构建规则(RULE),
 
    -p, ---protocol [!] protocol
        指定数据包匹配的协议,如tcp, udp, icmp, all...
        也可以使用协议序号; 0表示所有协议all;
        可使用取反符 '!';
        当前系统所支持的协议及序号定义在: /etc/protocols);
 
    -s, --source [!] address[/mask]
        数据包的源地址(hostname/networkname);
    
    -d, --destination [!] address[/mask]
        数据包的目的地址(hostname/networkname);
    
    -i, --in-interface [!] name
        接收此包的接口(interface)名, 即该包是由此接口接收到的;
        适用于chain={INPUT, FORWARD, PREROUTING}的规则;
        name, 指定接口名称; 可使用'+'进行更广泛的匹配, 例如"eth+"表示要匹配所有'eth'接口;
        
    -o, --out-interface [!] name
        将要发送包的接口名;
        适用于chain={FORWARD, OUTPUT, POSTROUTING}的规则;
        name, 指定接口名称; 可使用'+'进行更广泛的匹配, 例如"eth+"表示要匹配所有'eth'接口;
    
    [!]  -f, --fragment
        表示规则只匹配分组数据包, 而忽略分组首包?
        
    
. 匹配扩展模式 (MATCH EXTENSIONS)        
    当使用了"--protocol xxx"时, 可以继续定义扩展匹配参数;
    
    . addrtype
        可定义<type>:
            LOCAL
            BROADCAST
            ANYCAST
            MULTICAST
            ...
            
        . [!] --src-type <type>
            源地址是指定类型的地址;
            
        . [!] --dst-type <type>
            目的地址是指定类型的地址;
            
        . --limit-iface-in
            收包接口的地址类型过滤;
            适用于chain={INPUT, FORWARD, PREROUTING}的规则;
        
        . --limit-iface-out
            发包接口的地址类型过滤;
            适用于chain={FORWARD, OUTPUT, POSTROUTING}的规则;
            
        --limit-iface-in与--limit-iface-out互斥;
    
    . connbytes
    
    . connlimit
    
    . connmark
    
    . conntrack
    
    . dccp
        [!] --source-port,--sport port[:port]
        
        [!] --destination-port,--dport port[:port]
        
        [!] --dccp-types mask
            
            Match when the DCCP packet type is one of ’mask’. ’mask’ is a comma-separated  list  of  packet
            types.   Packet  types are: REQUEST RESPONSE DATA ACK DATAACK CLOSEREQ CLOSE RESET SYNC SYNCACK INVALID.
              
        [!] --dccp-option number
    
    . dscp
    
    . hashlimit
    
    . icmp
        当匹配定义了"--protocol icmp"时, 可以继续定义ICMP的类型,
        [!] --icmp-type typename
    
    . iprange
        [!] --src-range from[-to]
            定义匹配源IP地址区间;
              
        [!] --dst-range from[-to]
            定义匹配目的IP地址区间;
            
    . length
    
    . limit
    
    . mac
        [!] --mac-source address
        匹配源包的MAC;
        适用于chain={INPUT, FORWARD, PREROUTING}的规则;
    
    . mark
    
    . multiport
        匹配多个独立的端口(max=15); for "-p tcp / -p udp"
        
        [!] --source-ports,--sport port[,port|,port:port]...
        端口定义格式:
            端口用逗号分隔;
            端口范围用冒号连接;
        例如, 53,1024:65535
            定义了端口53及范围由1024至65535的所有端口;
        
        [!] --destination-ports,--dport port[,port|,port:port]...
        
        [!] --ports port[,port|,port:port]...
    
    . owner
    
    . physdev
    
    . pkttype
    
    . policy
    
    . quota
    
    . realm
    
    . recent
    
    . sctp
    
    . set
    
    . state
        [!] --state state
        
    
    . statistic
    
    . string
    
    . tcp
        当匹配定义了'--protocol tcp'时,
        
        [!] --source-port,--sport port[:port]
        
        [!] --destination-port,--dport port[,port]
        
        [!] --tcp-flags mask comp
        
        [!] --syn
        
        [!] --tcp-option number
        
    
    . tcpmss
    
    . time
    
    . tos
    
    . ttl
    
    . u32
        貌似很复杂的样子!
    
    . udp
        当匹配定义了'--protocol udp'时,
        
        [!] --source-port,--sport port[:port]
        
        [!] --destination-port,--dport port[:port]
    
. 规则目标扩展 (TARGET EXTENSIONS) (常用)
    . REJECT
        --reject-with type
        其中, type可以是
           icmp-net-unreachable
           icmp-host-unreachable
           icmp-port-unreachable
           icmp-proto-unreachable
           icmp-net-prohibited
           icmp-host-prohibited or
           icmp-admin-prohibited (*)
        
    . REDIRECT
        --to-ports port[-port]
        
        --random
        
    . SNAT
        --to-source ipaddr[-ipaddr][:port[-port]]
        可定义单个源IP, 或IP区间;
        可选地, 可定义单个端口或端口区间; (-p tcp / -p udp)
        
        --random
        随机进行端口映射;
    
    . DNAT
        --to-destination [ipaddr][-ipaddr][:port[-port]]
        
        --random
        
    . MASQUERADE
        --to-ports port[-port]
        
        --random        
    
    . LOG
        --log-level level
        
        --log-prefix prefix
        
        --log-tcp-sequence
        
        --log-tcp-options
        
        --log-ip-options
        
        --log-uid

//-----------------------------------------------------------------------------
实例: <2016.6.1>
配置路由器(linux)以联通两个网段:
    设两个网段分别为192.168.0.0(A网段)和192.168.100.0(B网段);
    . 使用 ifconfig 配置路由器上两块网卡的IP;
        eth0 : A网段 = 192.168.0.254
        eth1 : B网段 = 192.168.100.1
    . 在路由器(Linux)上, 使用 route 配置路由表(配置静态路由);
        route add –net 192.168.100.0 netmask 255.255.255.0 eth1
        route add –net 192.168.0.0 netmask 255.255.255.0 eth0
        (或 route add –net 192.168.0.0/24 eth0)
    . 为各网段中的终端设置默认网关;
        A网段中的终端配置网关为192.168.0.254;
        B网段中的终端配置网关为192.168.100.1;
            Linux中设置默认网关:
            route add default gw 192.168.0.200
    
    测试iptables
    首先, 打开IP转发:
        echo 1 > /proc/sys/net/ipv4/ip_forward
        或直接修改配置文件:
            /etc/sysctl.conf
    禁掉forward
        iptables -P FORWARD DROP
        应观察到PC终端不能ping通对方;
    允许指定网段的路由
        添加FORWARD通道规则:
            iptables -A FORWARD -d 192.168.100.0/24 -j ACCEPT
            iptables -A FORWARD -d 192.168.0.0/24 -j ACCEPT
            (/24表示的是网络地址占24位,主机地址占8位.)
        此时PC终端又可以ping通对方;

//-----------------------------------------------------------------------------
实例: <2016.6.15>
(
    参考: http://blog.jobbole.com/90005/
    关于NAT的详细解释, 包括其可实现的几种主要功能,
        数据伪装
        端口转发
        负载平衡
        透明代理
)

配置路由器以连接互联网;
    eth0, IP=192.168.0.254, 外网, 连上级路由器(可连通Internet, GW=192.168.0.1)
    eth1, IP=192.168.101.1, 内网, 连内网交换机或直连主机;
    
    . 打开IP转发:
        echo 1 > /proc/sys/net/ipv4/ip_forward
      或
        sysctl.conf :   net.ipv4.ip_forward = 1
        sysctl -p
      
    . 设置路由器默认网关:
      route add default gw 192.168.0.1
    
    . 设置外网使用的静态IP !!!
      iptables -t nat -A POSTROUTING -s 192.168.7.0/24 -o eth0 -j SNAT --to-source 192.168.0.254
      (
      把转发出去的包的源地址设置为路由器的外网IP, 此例中即为路由器在上级网络中的IP;
      这样, 所有的包看上去都象是由192.168.0.254地址发出的, 返回包也将被投递到此地址;
      而系统中的数据包处理模块会根据连接状态表(ct)最终找到这些数据包的目的地址(da);
      这部分的参考文章:
        http://blog.jobbole.com/90005/
        http://blog.jobbole.com/89946/
      )
      
        由于局域网的地址为私网地址, 在公网上不合法, 所以必须将私网地址转为服务器的外部地址进行地址映射哈~连接外网接口为 ppp0;
            iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
        
        MASQUERADE 和 SNAT 作用一样, 均是源地址转换的操作,但是 MASQUERADE 是针对外部接口为动态 IP 地址来设置滴,
        不需要使用--to-source 指定转换的 IP 地址。
        如网络采用的是拨号方式接入互联网,而没有对外的静态 IP 地址(主要用在动态获取 IP 地址的连接,如 ADSL拨号, DHCP 连接等), 建议使用 MASQUERADE;

注意:MASQUERADE 是特殊的过滤规则,其只可以映射从一个接口到另一个接口的数据;
        
    . Linux下查看/设置DNS
        cat /etc/resolv.conf

//-----------------------------------------------------------------------------
实例: <2016.6.25>
    摘自 (http://www.cnblogs.com/coser/archive/2012/07/18/2598392.html)

SNAT----de-SNAT
    DNAT----de-DNAT
    de-SNAT与de-DNAT发生地点与SNAT,DNAT相反,即
        SNAT(POSTROUTING)----de-SNAT(PERROUTING)
        DNAT(PERROUTING)----de-DNAT(POSTROUTING)
    de-SNAT与de-DNAT依据内核的连接状态表(ct)实现;
    参考 (http://lists.netfilter.org/pipermail/netfilter/2006-August/066503.html)

保护内网服务器IP不被外部访问
    拓普:
        Client[Client-IP]----[Router-WAN-IP]Router[Router-LAN-IP]----Server[Server-IP]
    
    1. Client端发出Req{Client-IP,Router-WAN-IP}到达Router;
    2. PERROUTING链, 匹配目的地址成功, 进行DNAT, 改为内部服务器地址;
        iptables -t nat -A PERROUTING --dst <Router-WAN-IP> -p tcp --dport 80 -j DNAT --to-destination <Server-IP>
    3. 经过PERROUTING后, 进行路由, 由于目的地址已改变, 数据包到达内网server;
    4. Server完成请求并回复Resp{Server-IP,Client-IP}, 通过Router, 进行de-DNAT, 得到Resp{Router-WAN-IP,Client-IP}, 发送给Client;

转载于:https://my.oschina.net/laozh/blog/793714

IPTABLES学习摘抄相关推荐

  1. Linux防火墙iptables学习

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

  2. iptables学习笔记:使用NAT实现简单的无线AP

    之前使用的是无线路由让手机上网.学习了iptables后,尝试在非openwrt系统的Linux上实现相同功能.本文简单记录一下. 手上有块X86的板子,上面安装了Linux系统.几个月前研究了WIF ...

  3. iptables学习笔记:同一端口号同时支持tcp和udp的转发

    前段时间,某项目中遇到一个端口转发问题,虽然我无缘参与项目,但由于项目使用到的一个平台恰好是我前不久搞过的,所以最终还是找我,于是中断了正在进行的任务进行协助.他们定位到只有udp无法转发成功,而tc ...

  4. centos Iptables学习笔记

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

  5. Netfilter和iptables学习总结

    最近一段时间一直在学习netfilter和iptables相关的知识.首先要感谢我的老大能给我时间.给我机会来学习.写这篇总结就只有一个目的,总j结近来学到的知识,理清思路,查漏补缺.看了半个多月的基 ...

  6. iptables学习总结

    iptables总结 声明:该博客为笔者对"朱双印个人日志-iptables详解"的学习总结.附原作链接:https://www.zsythink.net/archives/tag ...

  7. 摘自ubantuer-Linux防火墙iptables学习笔记(三)iptables命令详解和举例

    网上看到这个配置讲解得还比较易懂,就转过来了,大家一起看下,希望对您工作能有所帮助. 网管员的安全意识要比空喊Linux安全重要得多. iptables -F iptables -X iptables ...

  8. 路由及iptables学习笔记

    启动linux路由功能 echo "echo 1 >/proc/sys/net/ipv4/ip_forward" >> /etc/rc.d/rc.local 或者 ...

  9. iptables学习笔记

    1.数据包的流向 数据包在主机上有三个流向: a.发往本机:从本机的内核空间流向用户空间(应用程序) b.本机发出:从本机的用户空间流向内核空间,在经过网卡流出 c.转发:从本机的一个网卡进来,从另外 ...

最新文章

  1. 数论计算机科学与技术专业就业前景好,【数学】数学专业就业前景:你看不见的“前途似锦”...
  2. git 本地仓库同时推送到多个远程仓库
  3. 外部表不是预期的格式_超详细的CMDB介绍--概念、架构、模型、表设计及开源选择...
  4. 程序员面试金典适合java么,【程序员面试金典】面试题 01.03. URL化(示例代码)
  5. 作者:吴城文,男,清华大学计算机科学与技术系硕士生。
  6. linux 代码行数统计利器 ——cloc
  7. Nginx源码分析 - HTTP模块篇 - HTTP模块的阶段处理PHASE handler(23)
  8. Nginx从入门到精通(全)
  9. Gramine(原graphene-sgx)软件栈
  10. php如何计算天数,php计算日期相差天数二种方法
  11. 【折腾系列—All In One主机】1、 PVE虚拟机系统安装
  12. 【LEACH协议】基于matlab实现无线传感器网络LEACH与DEEC协议
  13. 【复杂网络建模】——Python可视化重要节点识别(PageRank算法)
  14. 香港主要房产公司计划寻求监管机构对代币化房地产的许可
  15. 三木运算符return错误:
  16. 2012年9月世界编程语言排行榜!
  17. python扩散模拟_扩散模拟 - 问答 - Python中文网
  18. 视频教程-PHP7入门手册视频版第一季-PHP
  19. 目标检测系列--YOLO V4
  20. python——字典

热门文章

  1. ip地址冲突导致ping时通时断显示超时问题处理过程
  2. 电脑知识入门:一步一步到成为电脑知识高手
  3. 大学生应该具备哪些计算机知识,大学生电脑知识是必备
  4. 解决最近Win11更新导致任务栏不能透明方法(实测有效)
  5. win7关机快捷键_一天一个关机小技巧
  6. [附源码]JAVA+ssm计算机毕业设计宾馆管理信息系统(程序+Lw)
  7. 获取设备当前的海拔高度和垂直高度
  8. minecraft国内的正版服务器,【图片】【Minecraft正版联盟】优秀正版服务器整合【minecraft正版吧】_百度贴吧...
  9. 中国成智能手机最大消费国 硬件成本降至400元
  10. javac不是内部或外部命令,也不是可运行的程序的解决方法