iptables入门到进阶

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iptables入门到进阶相关的知识,希望对你有一定的参考价值。

Iptables入门到进阶

一、前言

Firewall(防火墙): 隔离工具;Packets Filter Firewall(包过滤防火墙);工作于主机或网络的边缘,对经由的报文根据预先定义的规则(匹配条件)进行检测,对于能够被规则匹配到的报文实行某预定义的处理机制的一套组件; 防火墙类型 从防火墙的实现形式来分的话,防火墙可以分为软件防火墙和硬件防火墙 硬件防火墙:在硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现; 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙; 从防火墙的服务范围来分的话,防火墙可以分为主机防火墙,网络防火墙;主机防火墙:服务范围为当前主机 网络防火墙:服务范围为防火墙被的局域网

二、netfilter/iptables IP信息包过滤系统:

iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤的内部结构。 netfilter/iptables 的最大优点是它可以配置有状态的防火墙,有状态的防火墙能够指定并记住为发送或接收信息包所建立的连接的状态。防火墙可以从信息包的连接跟踪状态获得该信息。在决定新的信息包过滤时,防火墙所使用的这些状态信息可以增加其效率和速度。这里有四种有效状态,名称分别为 ESTABLISHED 、 INVALID 、 NEW 和 RELATED。 netfilter/iptables 的另一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。 防火墙在做信息包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的信 息包过滤表中,而这些表集成在 Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 信息包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。 虽然 netfilter/iptables IP 信息包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。

1.netfilter:

定义规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter.(网络过滤器);它是防火墙框架,framework;位于内核空间,承载并生效规则;

报文流向:
    到本机某进程的报文:PREROUTING --> INPUT 
    由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
    由本机的某进程发出报文:OUTPUT --> POSTROUTING

技术分享

tcp/ip协议栈必须经过的地方,可以实现读取规则的五个位置作为控制的地方,这五个位置也被称为五个“钩子函数”(hooks function),也叫五个规则链

(1)INPUT——进来的数据包应用此规则链中的策略
(2)OUTPUT——外出的数据包应用此规则链中的策略
(3)FORWARD——转发数据包时应用此规则链中的策略
(4)PREROUTING——对数据包作路由选择前应用此链中的规则
(记住!所有的数据包进来的时侯都先由这个链处理)
(5)POSTROUTING——对数据包作路由选择后应用此链中的规则
(所有的数据包出来的时侯都先由这个链处理)

这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

2.iptables:

IP信息包过滤系统,命令行工具程序,位于用户空间;规则管理工具。 Iptables 是用来设置、维护和检查Linux内核的IP包过滤规则的。 可以定义不同的表,每个表都包含几个内部的链,也能包含用户定义的链。每个链都是一个规则列表,对对应的包进行匹配:每条规则指定应当如何处理与之相匹配的包。这被称作‘target‘(目标),也可以跳向同一个表内的用户定义的链。

技术分享

Tables:

(1)filter:过滤,防火墙;
(2)nat:network address translation,网络地址转换;
(3)mangle:拆解报文,做出修改,并重新封装;
(4)raw:关闭nat表上启用的连接追踪机制;

四种表的优先级次序(由高而低): raw –> mangle –> nat –> filter ;不同的表与钩子函数(规则链)之间的关系:

技术分享

raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT] ,OUTPUT,POSTROUTING;(在CentOS 7中nat多了一个INPUT链)
filter:INPUT,FORWARD,OUTPUT

技术分享

三、iptables规则的组成部分:

1.规则的定义

规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为根据指定的匹配条件来尝试匹配每个流经此处的报文,一旦匹配成功,则由规则后面指定的处理动作进行处理; 规则存储在内核空间的信息包过滤表中,这些规则分别指定了基础匹配条件,如源地址、目的地址、传输层协议(如TCP、UDP、ICMP),扩展匹配条件,如服务类型(如HTTP、FTP和SMTP)等。其中扩展匹配条件则需要借助于扩展模块进行指定的匹配条件,当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的 主要工作就是添加、修改和删除这些规则。

2.添加规则时需要考量的因素:

(1)实现的功能:用于判定将规则添加至哪个表;
(2)报文的流经位置:用于判断将规则添加至哪个链;
(3)报文的流向:判定规则中何为“源”,何为“目标”;
(4)匹配条件:用于编写正确的匹配规则;
    (a)专用于某种应用的同类规则,匹配范围小的放前面;
    (b)专用于某些应用的不同类规则,匹配到的可能性较多的放前面;同一类别的规则可使用自定义链单独存放;
    (c)用于通用目的的规则放前面;

filter表:过滤,“防火墙”意义的核心所在,其包含的链为:INPUT,FORWARD,OUTPUT;

四、iptables命令详解

1.安装

netfilter:位于内核中的tcp/ip协议栈报文处理框架;集成在内核中。

iptables: 在CentOS 5/6中使用iptables命令生成规则,生成的规则是直接送往内核的,立即生效,可保存于文件中以反复装载生效;

# iptables -t filter –F  //说明:将filter表的所有规则清空
# service iptables save  //说明:它能把规则自动保存在/etc/sysconfig/iptables中。
当计算机启动时,rc.d下的脚本将用命令iptables-restore调用这个文件,从而就自动恢复了规则。

使用帮助:

# man iptables
在CentOS 7是通过firewalld服务来生成iptables规则,这个服务生成规则的工具叫做firewall-cmd,可以通过其配置文件 firewall-config来对其进行配置。
# systemctl disable firewalld.service
# systemctl stop firewalld.service
说明:关闭开机启动并禁用firewalld服务;建议关闭firewalld服务继续使用iptables

在CentOS 7中使用帮助是分割开的分别是:

# man iptables
# man iptables-extensions

CentOS 7中的iptables的程序包是iptables, iptstate。

2.iptables命令:

iptabls命令的使用格式:

iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]

五、COMMANDS详解:

规则管理格式:

iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]

1.链管理命令:(立即生效)

-P:iptables [-t table] -P chain target  
    //定义链的默认策略,对filter表中的链而言,其默认策略有ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)。
    例如:
        # iptables -t filter -P INPUT DROP      //(设置filter表默认规则为丢弃)
        # iptables -t filter -P INPUT ACCEPT        //(设置filter表默认规则为接受)
-N:iptables [-t table] -N chain  
    //自定义规则链;默认为filter;仅在默认链通过某规则进行调用方可生效;因此,每个自定义链都有其引用记数 
-X:iptables [-t table] -X [chain]   
    //删除自定义的空的引用计数为0的链;
-F:iptables [-t table] -F [chain [rulenum]] [options...]    
    //清空指定的链,或删除指定链上的规则 ;
-E:iptables [-t table] -E old-chain-name new-chain-name     
    //重命名自定义的引用计数为0的链;
-Z:iptables [-t table] -Z  [chain [rulenum]] [options...]   
    //置零计数器;
        注意:每个规则都有两个计数器
            packets:被本规则所匹配到的所有报文的个数;
            bytes:被本规则所匹配到的所有报文的大小之和;

2.规则管理:

-A:--append, iptables [-t table] -A chain rule-specification
    //追加规则到指定的链尾部;
-I:--insert, iptables [-t table] -I chain [rulenum] rule-specification
    //插入规则到指定的链中的指定位置,默认为链首;
-D: --delete, iptables [-t table] -D chain rulenum
    //根据规则编号删除规则
-D: --delete, iptables [-t table] -D chain roule-specification
    //根据规则本身删除规则
-R:--replace,iptables [-t table] -R chain rulenum rule-specification
    //将指定的链上的指定规则替换为新的规则;

3.规则显示:

-L,--list,iptables [-t table] -L [chain [rulenum]] [options...]
    列出规则;
         -v, --verbose:详细信息。
        -vv,-vvv 更详细信息。
        -n, --numeric:数字方式显示地址和端口号。
        -x, --exact:显示计数器的精确值,而不是圆整后的值。
        --line-numbers:列出规则时,显示其在链上的编号。
 -S, --list-rules [chain]
    显示指定链的所有规则。

常用的规则显示命令:

iptables –vnL           
iptables -t net –nL     
iptables -t filter –nL
iptables -t raw –nL

六、匹配条件:

规则管理格式:

iptables [-t able] COMMAND chain cretieria [-m -m matchname [per-match-options]]  [-j targetname [per-target-options]]
其中rule-specification = [matches...] [target]

matches:匹配条件

匹配条件分为两种:基本匹配条件,扩展匹配条件 注意:多重条件之间的隐含逻辑为“与”操作;

1.通用匹配条件:无需加在任何模块,由iptables/netfilter自行提供。

[!] -s, --source address[/mask][,...]:
    检查报文中的源IP地址是否符合此处指定的地址或地址范围;
[!] -d, --destination address[/mask][,...]:
    检查报文中的目标IP地址是否符合此处指定的地址或地址范围;
例如:
    # iptables -t filter -A INPUT -s 172.16.69.8 -d 172.16.69.88 -j DROP
    说明:拒绝172.16.69.8对172.16.69.88的访问
[!] -p, --protocol protocol:
    检查报文中传输层的协议类型,支持tcp, udp, udplite, icmp,  icmpv6,esp, ah, sctp, mh,或者 "all";也可以使用数字格式指定协议
例如:
    # iptables -t filter -A INPUT -s 172.16.69.8 -d 172.16.69.88 -p icmp -j REJECT
    说明:禁止172.16.69.8通过icmp协议访问172.16.69.88,即禁止ping操作
[!] -i, --in-interface name:
    检查报文进入本机时的接口是否符合本处指定的接口;只能应用于数据报文流入的环节,只能应用于INPUT, FORWARD和PREROUTING链 ;
 例如:
    # iptables -t filter -R INPUT 1 -s 172.16.69.8 -d 172.16.69.88 -p icmp -i eth0 -j DROP 
    说明:禁止172.16.69.8通过icmp协议访问172.16.69.88的eth0网卡
[!] -o, --out-interface name:
    检查报文即将离开本机时经由的接口是否符合本处指定的接口;只能应用于数据报文流出的环节,只能应用于FORWARD, OUTPUT和POSTROUTING链;
            -m, --match match:显式指明要使用的扩展模块;
            -j, --jump target:跳转目标

2.扩展匹配条件:需要加载扩展模块,方可生效。

2.1隐式扩展:

不用-m选项明确给出要使用的扩展机制的扩展;此处主要指使用-p {tcp|udp|icmp}给定协议后可直接对给定的协议所进行的扩展;

-p tcp:可直接使用tcp协议对应的扩展选项,一般有三种;
    [!] --source-port,--sport port[:port]:
    匹配报文中的传输层的源端口;可给出多个连接的端口,但只能是连续的端口范围;
    [!] --destination-port,--dport port[:port]:
    匹配报文中的传输层的目标端口;可给出多个连接的端口,但只能是连续的端口范围;
    例如:
        # iptables -A INPUT -s 172.16.69.8 -d172.16.69.88 -p tcp --dport 22 -j DROP 
        说明:禁止172.16.69.8访问172.16.69.88的tcp协议的22号端口即ssh端口
    [!] --tcp-flags mask comp
    匹配报文中的tcp协议的标志位,Flags:SYN,ACK,FIN,RST,URG,PSH;
    mask:要检查的标志位列表,以逗号分隔,例如SYN,ACK,FIN,RST 
    comp:mask给定的众标志位中,其值必须为1的标志位列表,余下的必须为0;
        例如: --tcp-flags SYN,ACK,FIN,RST SYN
    说明:表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0; 
    [!] --syn:
    用于匹配tcp的第一次握手,相当于--tcp-flags SYN,ACK,FIN,RST SYN 
-p udp:可直接使用udp协议对应的扩展选项;
    [!] --source-port,--sport port[:port]:
    匹配报文中的传输层的源端口;可给出多个连接的端口,但只能是连续的端口范围;
    [!] --destination-port,--dport port[:port]:
    匹配报文中的传输层的目标端口;可给出多个连接的端口,但只能是连续的端口范围;
-p icmp:可直接使用cimp协议对应的扩展选项;
    [!] --icmp-type {type[/code]|typename}
            --icmp-type  0/0:匹配对ping请求的响应报文
            --icmp-type  8/0:匹配ping请求报文
     例如:
        # iptables -A INPUT -d 172.16.69.88 -p icmp --icmp-type 8 -j DROP
        说明:限制任何人来ping172.16.69.88主机

2.2显式扩展:

必须使用-m选项指明要调用的扩展模块,而且有些扩展都还存在专用选项;

(1)multiport: 以离散或连续的方式定义的多端口匹配条件,最多15个;

[!] --source-ports,--sports port[,port|,port:port]...:
    指定多个源端口;
[!]--destination-ports,--dport port[,port|,port:port]...:
    指定多个目标端口;
[!] --ports port[,port|,port:port]...:
    匹配此处指定的源或目标端口;
例如:
    # iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT
说明:允许所有主机的通过tcp22.80,139,445,3306端口访问172.16.0.7的主机

(2)iprange: 以连续的ip地址范围指明多地址匹配条件;

[!] --src-range from[-to]
[!] --dst-range from[-to]
例如:
    # iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j ACCEPT
说明:允许172.16.0.61-172.16.0.70地址范围内的主机的通过tcp22.80,139,445,3306端口访问172.16.0.7的主机

(3)string: 对报文中的应用层数据做字符串匹配检测;

[!] --string pattern
[!] --hex-string pattern
    --algo {bm|kmp}:字符串匹配检查算法;
    --from offset
    --to offset
例如:
# iptables -I OUTPUT -m string --algo bm --string "gay" -j REJECT
    说明:在OUTPUT链首行插入规则,匹配含有”gay”字符串的数据进行拒绝。

(4)time: 根据报文到达的时间与指定的时间范围进行匹配度检测;

    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]

    --timestart hh:mm[:ss]
    --timestop hh:mm[:ss]

    [!] --monthdays day[,day...]

    [!] --weekdays day[,day...]

     --kerneltz:使用内核配置的时区而非默认的UTC;

(5)connlimit: 根据每客户端IP做并发连接数限制,即限制单IP可同时发起连接请求;

    --connlimit-upto n:连接数小于等于阈值;
    --connlimit-above n:连接数超出阈值;
例如:
# iptables -I INPUT -d 172.16.0.7 -p tcp --syn --dport 22 -m connlimit --connlimit-above 2 -j REJECT

(6)limit: 基于令牌桶过滤机制,按照收发报文的指定速率进行匹配;

    --limit rate[/second|/minute|/hour|/day] 指定速率
    --limit-burst number 指定速率峰值
例如:                 
# iptables -A INPUT -d 172.16.0.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5  -j ACCEPT
说明:允许以每分钟20个包,每次最多5个包的速率对172.16.0.7主机进行ping操作。

(7)state: 状态检测:连接追踪机制(conntrack);

连接追踪机制(conntrack):追踪本机上的请求和响应之间的关系。对于整个TCP协议来讲,它是一个有连接的协议,三次握手中,第一次握手,我们就叫NEW连接,而从第二次握手以后的,ack都为1,这是正常的数据传输,和tcp的第二次第三次握手,叫做已建立的连接(ESTABLISHED),还有一种状态,比较诡异的,比如:SYN=1 ACK=1 RST=1,对于这种我们无法识别的,我们都称之为INVALID无法识别的。还有第四种,FTP这种古老的拥有的特征,每个端口都是独立的,21号和20号端口都是一去一回,他们之间是有关系的,这种关系我们称之为RELATED。

所以连接状态有如下几种:

NEW:新发出请求,连接追踪模板中不存在此连接的相关信息条目,因此将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
RELATED:相关联的连接,当前连接是个新请求,但附属与某个已存在的链接;
INVALID:无法识别的连接
UNTRACKED:未被追踪连接;

用法:

[!] --state state   
例如:
# iptables -A INPUT -d 172.16.100.76 -p tcp -m multiport --dports 22,80 -m state --state NEW, ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED –j ACCEPT
说明:在INPUT链追加将目标为172.16.100.76主机,目标端口tcp协议的22和80端口的NEW连接和ESTABLISHED连接放行的规则。同时在OUTPUT链追加源主机为172.16.10.67源端口为22和80端口的ESTABLISHED连接放行的规则

想要使用连接追踪机制需要加载相关的内核模块:

nf_conntrack
nf_conntrack_ipv4
nf_conntrack_ftp

已经追踪到的连接记录在/proc/net/nf_conntrack文件中;

不同的协议的连接追踪时长:/proc/sys/net/netfilter/;

能追踪的最大连接数量定义在:/proc/sys/net/nfconntrackmax,连接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时,建议调整至足够大;

如何开放被动模式的ftp服务:

(a) 装载追踪ftp协议的模块;
    # modprobe nf_conntrack_ftp

(b) 放行入站命令连接
# iptables -A INPUT -d SERVER_IP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT

(c) 放行入站数据连接
# iptables -A INPUT -d SERVER_IP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

(d) 放行出站的ESTABLISHED连接
# iptabls -A OUTPUT -s SERVER_IP -m state --state ESTABLISHED -j ACCEPT

七、处理动作(跳转目标):

如何使用自定义链:自定义链需要被调用才能生效;自定义链最后需要定义返回规则;返回规则使用的target叫做RETURN

-j targetname [per-target-options]

target可分为简单target和扩展target。

简单target: ACCEPT(允许),DROP(丢弃)

扩展target:

REJECT:用来返回一个错误数据包响应匹配的数据包
    --reject-with type
    给定的类型:

icmp-net-unreachable, 网络不可达
icmp-host-unreachable,主机不可达
icmp-port-unreachable,端口不可达
icmp-proto-unreachable,协议不可达
icmp-net-prohibited, 
icmp-host-prohibited,
icmp-admin-prohibited,
默认为icmp-port-unreachable;
    LOG:记录日志,日志需要在iptables规则生效之前进行记录,所以LOG规则需要放在允许或拒绝规则之前,否则是无法生效的。
        Turn  on  kernel  logging of matching packets.

        --log-level level 日志信息的等级
        --log-prefix prefix:日志信息的前导信息;
例如:
    # Iptables –R INPUT 2 –d 172.16.100.67 –p tcp –dport 21 -j LOG -- log-prefix “netfiles ftp:”
    说明:将INPUT链第二条规则修改为,将目标为172.16.100.67主机的tcp21端口的访问写入日志。并在日志中加上前缀netfiles ftp:

八、保存和载入规则

规则的有效期限:使用iptables命令定义的规则,手动删除之前,其生效期限为kernel的存活期限。为了使规则永久有效,需要将其保存至文件中。

保存命令:

# iptables-save > /PATH/TO/SOME_RULE_FILE

重载命令:

# iptabls-restore < /PATH/FROM/SOME_RULE_FILE
    -n, --noflush:不清除原有规则
    -t, --test:仅分析生成规则集,但不提交

CentOS 6:

保存规则命令:

    # service iptables save
    保存规则于/etc/sysconfig/iptables文件,覆盖保存;

重载规则:

    service iptables restart
    默认重载/etc/sysconfig/iptables文件中的规则 
    配置文件:/etc/sysconfig/iptables-config

自动生效规则文件中的规则:

    (1)用脚本保存个iptables命令;让此脚本开机后自动运行
        /etc/rc.d/rc.local文件中添加脚本路径:
        /PATH/TO/SOME_SCRIPT_FILE
    (2)用规则文件保存个规则,开机时自动载入此规则文件中的规则;
        /etc/rc.d/rc.local文件中添加:
        iptabls-restore < /PATH/FROM/SOME_RULE_FILE

CentOS 7:

(1) 自定义Unit File,进行iptables-restore;
(2) firewalld服务;
(3) 自定义脚本;


规则优化的思路: 服务器端规则设定:任何不允许的访问,应该在请求到达时给予拒绝;

使用自定义链管理特定应用的相关规则:

(1)优先放行双方向状态为ESTABLISHED的报文;
(2)服务于不同类别的功能的规则,匹配到报文可能性更大的放前面;
(3)服务于同一类别的功能的规则,匹配条件较严格的放在前面;
(4)设置默认策略:白名单机制
    (a) iptables -P,不建议;
    (b) 建议在规则的最后定义规则做为默认策略;

九、iptables/netfilter网络防火墙:

netfilter 是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组 成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用filter功能时,我们没有必要显式的指明"-t filter"。 nat表也有四条缺省的"链"(chains),这四条链也是规则的容器,它们分别是:

PREROUTING、INPUT、OUTPU、POSTROUTING(注意Centos7版本才INPUT链)

1、构建网络防火墙的基本前提:

(1) iptables主机必须工作为网关;

(2) 我们需要将定义的规则添加在filter表的FORWARD链;添加方法与主机防火墙相同。

2、要注意的问题:

(1) 我们在FORWARD链上添加规则时,要确保请求-响应报文均会经由FORWARD链,要注意规则的方向性;

(2) 如果要启用conntrack(连接追踪)机制,建议将双方向的状态为ESTABLISHED的报文直接放行;

3、NAT: Network Address Translation(网络地址转换)

在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角 色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数 据包做任何修改。NAT(Network Address Translation网络地址转换)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作. NAT的目的:既为了隐藏内网主机,又让内网主机更多使用可重复使用的私网IP,从而节约IP地址资源。

其中请求报文中的源地址和目标地址可以由管理员定义,但响应报文的源地址和目标地址由NAT的conntrack机制自动实现; 从原理的角度可将NAT分成了两种类型,即源NAT(SNAT)和目的NAT(DNAT),顾名思义,所谓SNAT就是在请求报文中改变转发数据包的源地址,所谓DNAT就是在请求报文中改变转发数据包的目的地址。SNAT的使用环境是内网中的客户端的私网IP通过同一个公网IP访问公网中的外部服务器。DNAT的使用环境是内网中的N台服务器通过同一个公网IP对公网中的客户端提供服务。所以根据其数据报文流经位置,SNAT需要定义在POSTROUING链上,DNAT需要定义在PREROUTING链。DANT可以针对有限的几个服务设置,SNAT则不可以。

NAT不仅可以转换源地址和目标地址还进行端口转换又被称之为端口映射,即PAT;

4、target实现:

SNAT:源地址转换,这个调转目标适用在nat表的PREROUTING和OUTPUT链,以及用户自定义链上,仅能够被POSTROUTING链和INPUT链调用。

--to-source [ipaddr[-ipaddr]]
例如:
# iptables –t nat –A POSTROUTING –s 192.168.1.0/24 –j SNAT --to-source 172.16.0.1

DNAT:目标地址转换,这个调转目标适用在nat表的PREROUTING和OUTPUT链,以及用户自定义链上,仅能够被POSTROUTING链和INPUT链调用。

--to-destination [ipaddr[-ipaddr]][:port[-port]]
例如:
# iptables –t nat –A PREROUTING –d 172.16.0.1 –p tcp –dport 80 –j DNAT  --to-destination    192.168.1.1

MASQUERADE:地址伪装 SNAT场景中应用于POSTROUTING链上的规则实现源地址转换,但外网地址不固定时,使用此target;

REDIRECT:端口重定向 这个调转目标适用在nat表的PREROUTING和OUTPUT链,或者用户自定义链上,仅能够被POSTROUTING链和INPUT链调用。

--to-ports port[-port]
例如:
# iptables –t nat  -A PREROUTING –d 172.16.69.8 –p tcp –dport 80 –j REDIRECT  --to-ports 8080

十:总结

Iptables是一个非常重要的工具,它是每一个防火墙上几乎必备的设置,也是我们在做大型网络的时候,为了很多原因而必须要设置的。学好Iptables,可以让我们对整个网络的结构有一个比较深刻的了解,同时,我们还能够将内核空间中数据的走向以及linux的安全给掌握的非常透彻。我们在学习的时候,尽量能结合着各种各样的


以上是关于iptables入门到进阶的主要内容,如果未能解决你的问题,请参考以下文章

Atom编辑器入门到精通 Atom使用进阶

Atom编辑器入门到精通 Atom使用进阶

Atom编辑器入门到精通 Atom使用进阶

算法竞赛入门码蹄集进阶塔335题(MT3330-3335)

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用

Kotlin基础从入门到进阶系列讲解(基础篇)Fragment的基本使用