Linux防火墙详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux防火墙详解相关的知识,希望对你有一定的参考价值。

一、iptables命令基本语法
二、iptables语法进阶
三、iptables显示扩展
四、iptables简单案例
五、iptables之forward
六、iptables之NAT

一、iptables命令基本语法

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]    //执行的动作
    -t:指定表
    -A:append,追加,默认最后
    -I:插入,默认插入为第一条
    -C:check,检查该条目是否存在
    -D:delete:删除,
        1.rule specification
        2.rule number
    -R:replace替换,和-D用法类似,但是必须指定rule lumber
        
    -S:显示命令行的命令格式,类似于iptables-save,-S输出结果然后重定向到配置那文件中
        iptables-restor 恢复配置
    -F:flush,清空规则
    -L:list 查看
        -n:numeric,以数字格式显示地址和端口
        -v:verbose,显示详细信息
        -vv:更详细
        -x:exactily,显示计算器的精确值,而不是换算后的结果
        --line-numbers:显示行号
        iptables -nvL //L应该写到右边,放在前面不能用
    -Z:zero,置0
        iptables的每条规则都有两个计数器
            1.由本规则匹配到的所有的packets
            2.由本规则匹配到的所有的bytes之和
    -P:policy,设置链的默认策略
        ACCEPT:接受
        DROP:丢弃
        REJECT:拒绝
    -E:rename,重命名自定义的未被引用(引用计数为0)的链
        iptables -E testchain mychain //重命名空链
    -N:new 新增一条自定义链
    -X:删除自定义链空链

CentOS7:    
    systemctl stop firewalld.service
    systemctl disable firewlld.service    
    
允许ssh登录:默认为DROP    
    iptables  -A INPUT -s 192.168.4.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
    iptables  -A OUTPUT -d 192.168.4.0/24 -p tcp -m tcp --sport 22 -j ACCEPT    

操作:设置filter的所有表默认DROP
    CentOS7,删除默认自定义链:for i in `iptables -L -n | grep  "Chain"  | cut -n -d' ' -f2 | tail -17`; do iptables -X $i;done
    iptables -t filter -P INPUT DROP
        
注:写规则的时候,需要同时考虑到INPUT和OUTPUT接口

二、iptables语法进阶
1.iptables/netfilter表和链
    表[按优先级]:raw-->mangle-->nat-->filter
    链:    PREROUTING-->INPUT-->OUTPUT--->POSTROUTING
        PREROUTING-->FORWARD--->POSTROUTING
    raw:PREROUTING,OUTPUT
    mangle:PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD
    nat:PREROUTING,OUTPUT,POSTROUTING
    filter:INPUT,OUTPUT,FORWARD
    
iptables [-t table] SUBCOMMAND chain [matches...] [target]
2.iptables/netfilter匹配和动作
    匹配条件:
        基本匹配:netfilter自带的匹配机制
            [!]-s,--source address/prefix[,..]; 原地址匹配,!表示不被匹配
            [!]-d,--destination,目标地址匹配
            [!]-i,--in-interface name,限制数据流入的接口,只能用于PREROUTING,INPUT,FORWARD
            [!]-o,--out-interface name,限制报文流出的接口,只能用于OUTPUT,FORWARD,POSTROUTING
            [!]-p,传输层协议,{tcp,udp,icmp}
                tcp扩展:
        扩展匹配:经由扩展模块引入的匹配机制,-m matchname //man iptables-extension查看所有的扩展
            隐式扩展:可以不用-m选项加载相应模块,前提是使用-p,选项匹配何种协议
            显示扩展:必须-m选项专门加载相应模块
    隐式扩展:
        [!]-p,--protocol PROTOCOL
        协议:tcp,udp,icmp,icmpv6,esp,ah,sctp,mh,all
        tcp:隐含指明了-m tcp

            [!] --source-port,--sport port[:port] //匹配报文中的tcp首部地址,可以使端口范围,10:1024,10,:1024,1024://冒号在前:0到该端口,冒号在后:该端口到最大端口
            [!] --destination-port,--dport port[:port]
            [!] --tcp-flags mask comp//tcp标志位,检查报文中的tcp标志位,检查报文中comp指明的tcp标志位,要求comp必须为1
                --tcp-flags syn,fin,ack,rst syn //检查四个,但是syn必须为1,其他必须为0,这是第一次握手
            [!] --syn //tcp第一次握手,相当于-tcp-flags syn,fin,ack,rst syn 
            [!] --tcp-option number

        udp:隐式扩展//tftp,named有用到
            -sport
            -dport
        icmp:
            [!] --icmp-type {type[/code]|typename}
            请求的是8,回应的是0
                type/code;
                    0/0 :echo reply ,ping回答
                    8/0 ;echo request ,ping请求
                别人ping me:入:8,出:0
                me ping别人:出:8,入:0
                
    处理动作:
        -j targetname
        RETURN:返回调用的链
        REDIRECT:端口重定向
        LOG:日志
        MARK:防火墙标记
        DNAT:目标地址转换
        SNAT:源地址转换
        MASQUERADE:地址伪装
        
三、iptables显示扩展:
    1.multiport:多端口匹配,以离散方式定义多端口匹配,可以指定多个离散端口

        [!] --source-ports,--sports port[,port|,port:port]...
        [!] --destination-ports,--dports port[,port|,port:port]...
        [!] --ports port[,port|,port:port]... //同时匹配,s和d
        iptables -I INPUT -s 0/0 -d 192.168.4.118 -p tcp -m multiport --dports 22,80 -j ACCEPT
        iptables -I INPUT -s 192.168.4.118 -d 0/0  -p tcp -m multiport --sports 22,80 -j ACCEPT

    2.iprange:指明一段连续的IP地址范围

       [!] --src-range from[-to]
        [!] --dst-range from[-to]
        iptables -A INPUT -d 192.168.4.118 -p tcp --dport 23 -m iprange --src-range  192.168.4.1-192.168.4.120 -j ACCEPT

   3.string:

        --algo {bm|kmp} //对于子串匹配是基于某种算法进行的,需要指定算法
        --from offset    //报文的偏移位置
        --to offset            //
        [!] --string pattern    //给定要检查的字符串模式
        [!] --hex-string pattern //16进制编码的子串
        //匹配到的子串
        iptables -I OUTPUT -s 192.168.4.118  -d 0/0 -p tcp --sport 80 -m string --algo bm --string "h7n9" -j REJECT

    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...],1-31
        [!] --weekdays day[,day...],Mon,Tue,Thu,Web,Fri,SAT,Sun
        iptables -R INPUT 4 -d 192.168.4.118 -p tcp --dport 23 -m iprange -src-range 192.168.4.1-192.168.4.120 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT

    5.connlimit:限制单个ip对s的连接数,即每个客户端的并发数量

        --connlimit-above n //下限,最低多少个,小于等于
        --connlimit-upto n //上限大于n,就采取某种动作
        iptables -A INPUT -s 0/0 -d 192.168.4.118 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
            //最多只允许两个用户登录
        iptables -R OUTPUT 4 -s 192.168.4.118 -d 0/0 -p tcp --sport 23 -j ACCEPT

    6.limit //基于令牌桶算法,对报文的速率做匹配

        --limit rate[/second|/minute|/hour|/day] //0
        --limit-burst number //同一时刻最多多少个请求,默认为5,并发个数,最多保持个数
        
        iptables -A INPUT -d 192.168.4.118 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 3 -j ACCEPT
        iptables -A OUTPUT -s 192.168.4.118 -p icmp --icmp-type 0 -j ACCEPT

    7.state //实现连接追踪的,对报文的状态做连接追踪
 

       [!] --state state    //INVALID, ESTABLISHED,NEW,RELATED,UNTRACKED.
        //记录了源地址基于什么协议访问了哪个目标地址,以及sport和dport
        //记录经过我,后者我处理过的进程


            
NEW:连接追踪模板中不存在的连接请求
ESTABLISHED:连接追踪模板中存在记录的模板
RELATED:例如ftp命令连接和数据连接,
INVALID:无法识别的连接,例如ACK,FIN,RST都是1
UNTRACKED:未追踪的连接,没有记录到模板中,在raw.PREROUTING可以设定
//链接追踪,在负载均衡器上,建议关闭,因为会大大降低性能
/proc/net/nf_contrack :链接追踪到的信息查看
链接追踪功能能够追踪到的,最大连接数
/proc/sys/net/nf_conntrack_max,最终到3w多,建议调大
sysctl -w net.nf_conntrack_max=300000 //追踪不到,可能会丢弃,所以建议放大
    //echo VALUE 也可以,但都是临时生效

contrack所能够追踪的链接数量的最大值,取决于/proc/sys/net/nf_conntrack_max的设定,超时之后会被删除;已经追踪到的并记录的位于/proc/net/nf_conntrack中
    超时的链接将会被删除;当模板满载时,后续的新连接有可能会超时,解决方法
        1.加大nf_contrack_max的值
        2.降低nf_conntrack条目的超时时长
            不同协议的连接追踪时长,定义在/proc/sys/net/netfilter/
链接追踪的作用:

    -A INPUT -s 192.168.4.0/24 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT
    -A OUTPUT -s 192.168.4.118/32 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEP
    
    -A OUTPUT -s 192.168.4.118/32 -p icmp -m icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
    -A INPUT -d 192.168.4.118/32 -p icmp -m icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT

//越可能匹配到的规则,应该写到前面,快速处理
//规则的检查次序:规则在链上的次序即为检查时的生效次序,因此,其优化使用有一定法则;
    1.同类规则(访问同一应用),匹配范围小的放前面,用于特殊处理;
    2.不同类的规则(访问不同应用),匹配范围大的放前面
    3.应该讲哪些可以用一条规则描述的多个规则合并为一.
    4.设置默认策略
    
四、iptables简单案例
    建立链接:
        1.tcp包头的[Sequence number],C发送给s的X,        SYN=1,ACK=0,FIN=0,RST=0 //FIN:断开标志,RST:重置
        2.s回复{X+1}作为确认号,并发送自己产生的随机数Y    SYN=1,ACK=1,FIN=0,RST=0
        3.c确认报文,发送[X+1],并发送确认号[Y+1]            SYN=0,ACK=1,FIN=0,RST=0 //同步已经完成
        //建立两条虚链路,每条都是单向的                    
    断开链接:
        1.c请求断开,c进入FIN_WAIT1,                        SYN=0,ACK=1,FIN=1,RST=0
        2.s确定断开,C进入FIN_WAIT2,s进入TIME_WAIT        SYN=0,ACK=1,FIN=0,RST=0
        3.s发送剩下的数据包,s进入LAST_ACK,                SYN=0,ACK=1,FIN=1,RST=0
        4.客户端发送确认,并断开                        SYN=0,ACK=1,FIN=0,RST=0
                
yum instal httpd,vsftpd,nfs,mairadb//测试之用
允许ssh,解决所有
    iptables -A INPUT -s 0/0 -d 192.168.4.118 -p tcp --dport 22 -j ACCEPT
    iptables -A OUTPUT -s 192.168.4.118 -d 0/0 -p tcp --sport 22 -j ACCEPT
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
放行80
    iptables -A INPUT -s 0/0 -d 192.168.4.118 -p tcp --dport 80 -j ACCEPT
    iptables -A OUTPUT -s 192.168.4.118 -p tcp --sport 80 -j ACCEPT
放行named
    自己做服务端:53/tcp,出去的53/udp
    自己做客户端:自己找根的时候,访问对方的53/tcp,接受对方53端口的通知,但是自己使用的端口却不知到
    953: tcp/udp 是rndc使用的端口
    区域传送使用:tcp/53
    域名解析:udp/53
iptables -A OUTPUT -s 127.0.0.1/32 -d 127.0.0.1/32 -p tcp -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT //放行自己sport :udp/53出去请求别人
iptables -A INPUT -p udp --sport 53 -j ACCEPT    //别人响应自己的
cat /etc/resolv.conf
    nameserver 192.168.4.118 //自己的ip地址
iptables -A INPUT -p udp --dport 53 -j ACCEPT    //别人请求我的
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT  //我回应别人的
    小结:
        1.用的都是udp:53号端口
        INPUT: 入和出接口都使用
            INPUT:    sport:udp:53
            OUTPUT:    dport:upd:53
        2*2=4两个两个交互
        A---B[二级NS]---s[一级]
            B请求S的时候:dport==udp:53
            S回应的时候:sport=udp:53
        A请求B的时候:dport=53
        B回应A的时候:sport=53
        
允许自己ping别人,但是不允许别人ping自己

    请求是8,回应是0
    iptables -A OUTPUT -s 192.168.4.118 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT
    iptables -A INPUT -s 0/0 -d 192.168.4.118 -p icmp --icmp-type 0 -j ACCEPT
    
    允许别人ping:
    iptables -A INPUT -d 192.168.4.118 -p icmp --icmp-type 8 -j ACCEPT
    iptables -A OUTPUT -s 192.168.4.118 -p icmp --icmp-type 0 -j ACCEPT
    
    telnet:非工作时间不让访问
    iptables -R INPUT 4 -d 192.168.4.118 -p tcp --dport 23 -m iprange -src-range 192.168.4.1-192.168.4.120 -m time --timestart 09:00 --timestop 18:00 -j ACCEPT
    iptables -R INPUT 4 -d 192.168.4.118 -p tcp --dport 23 -m iprange -src-range 192.168.4.1-192.168.4.120 -m time --timestart 09:00 --timestop 18:00 -m --weekdays 1,2,3,4,5 -j ACCEPT

放行vsftpd
    21:命令端口
    20:主动数据连接
    //ftp要想使用related状态,必须装载nf_conntrack_ftp
    modrpoeb nf_conntrack_max
    lsmod | grep ftp

    iptables -A INPUT -d 192.168.4.118/32 -p tcp -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
    iptables -A OUTPUT -s 192.168.4.118/32 -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

    注:入接口和出口的RELATED都得开启,而且入接口21/tcp的NEW必须打开,
    
    或则:
        INPUT: dport 21,NEW,ESTABLISHED
        OUTPUT: sport 21,ESTABLISHED  //命令连接
        
        INTPUT:tcp RELATED,ESTABLISHED    //数据连接
        OUTPUT:tcp ESTABLISHED
    1.加载nf_contrack_ftp模块
        modrproe nf_conntrack_ftp
    2.放行命令连接
        iptables -A INPUT -d 192.168.4.118 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
        iptables -A OUTPUT -s 192.168.3.118 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT  //这条可以不写,后一条OUTPUT已经包括该条
    3.放行数据连接
        iptables -A INPUT -d 192.168.4.118 -p tcp  -m state --state RELATED -j ACCEPT
        iptables -A OUTPUT -s 192.168.3.118 -p tcp  -m state --state ESTABLISHED -j ACCEPT

规则的有效期限:
    iptables命令添加的规则,手动删除之前,其生效期限为kernel的生命周期
    保存
        CentOS6: service iptables save
                iptables-save > /etc/sysconfit/iptables
        CentOS7:
                iptables -S > /path/to/some_rule_file
                iptables-save > /path/to/some_rule_file
    重载:
        iptables-restore <   /path/to/some_rule_file
        CentOS6:
            service iptables resart //会自动读取重载规则
    自动生效规则文件中的规则
        1.把iptables命令放在脚本文件中,让脚本文件开机自动运行
            /etc/rc.d/rc.local
        2.用规则文件保存规则,开机自动重载命令
            /etc/rc.d/rc.local
            iptables-restore <  /path/to/some_rule_file
    
问题:开机装载某模块

    cd /etc/sysconfig/modules/
    vim bridge.modules
        #/bin/sh 
        /sbin/modinfo -F filename bridge > /dev/null 2>&1  //-F显示模块路径名
        if [ $? -eq 0 ]; then 
            /sbin/modprobe bridge 
        fi
    chmod 755 bridge.modules   //这一步至关重要    
    reboot
    lsmod |grep bridge

    
    modinfo //会显示出所有模块信息
        -F 指定要显示的字段
注意:CentOS7:使用firewalld-cmd
    
五、iptables之forward
实验拓扑
    inet--- GW ----Internet
    GW的内网卡和inet的网卡类型:应该一样,例如都是host-only或者使用vmnet2,
        //此处自定义网络(仅主机模式):添加虚拟网络
    GW的外网卡为bridge模式
    
    注:GW的inet作为网关,不需要指定自己的网关
        建议:自己设置内网,vmware虚拟机的反应速度比较慢,网卡配置不能及时生效
    172.16.1.22-->172.16.1.1/192.168.4.118[外网]---->192.168.4.107 //外网
    Inet:ping 192.168.4.118 //能够ping同,因为linux的ip地址是内核的不是网卡的
    192.168.4.107:有路由到达172.16.1.0网段
    
    tcpdump -i eth0  icmp
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -P FORWARD DROP //
问题1:假如inet ping不通GW的外网ip
    GW没有到inet的路由,添加一条既可
    建议在inet上添加默认路由指向GW
问题2:echo 1 > /proc/sys/net/ipv4/ip_forward
    inet仍热ping不通外网
    因为,inet虽然能够出去,但是别人不知道怎么回来
    需要在目标主机上,添加回来的路由
        或者NAT
    例如:在107上windows,这样inet就能ping同107
        route add 172.16.1.0 mask 255.255.255.0 192.168.4.118
                
实验1:内网能够ping通外网,但是外网不能ping通内网
    1.echo 1 > /proc/sys/net/ipv4/ip_forward
    2.inet 172.16.1.22,外网:192.168.4.107                    
        iptables -P FORWARD  DROP
        iptables -A FORWARD -s 172.16.1.0/24 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT  
        iptables -A FORWARD -s 0/0 -d 172.16.1.0/24 -p icmp --icmp-type 0 -j ACCEPT                
    tcpdump -i eth0 -nn icmp            
    或者:
        iptables -F
        iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT //会直接放行icmp-type 0的回应
        iptables -A FORWARD -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT    
问题4:
    httpd和vsftpd服务正在运行 //
    iptables -P FORWARD DROP //INPUT和OUTPUT都是ACCEPT,但是该实验不经过INPUT和OUTPUT

    放心web:内网访问外网
        iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
        iptables -A  FORWARD -s 172.16.1.0/24 -p tcp --dport 80 -m state NEW -j ACCEPT
    放行ftp:访问外网的ftp
        iptables -A  FORWARD -s 172.16.1.0/24 -p tcp --dport 21 -m state NEW -j ACCEPT
        modprobe nf_contrack_ftp
        iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT //这样能够访问外部的ftp,对方的数据链接也可以

    假如需要自动载入的话,需要写入命令:/etc/rc.local    
        iptables-restore <  /etc/sysconfig/iptables-config
                
注:ip_forward,只能帮你发出去,回来的时候,路由需要手动指定
    若想回来的路由也被识别,那就得需要使用nat

处理动作:
    ACCEPT/DROP/REJECT
    LOG
    RETURN //自定义链返回
    REDIRECT
    SNAT
    DNAT
    MASQUERADE
    
LOG://先做日志,然后再做ACCEPT,或者DROP,REJECT操作
    --log-level level //emerg,alert,crit,error,warning,notice,info,debug.
    --log-prefix prefix //最多29个字符
    --log-tcp-sequence //
    --log-tcp-options //tcp头部
    --log-ip-options //ip头部
    --log-uid        //user id
    
    iptables -I FORWARD 1 -p tcp -m multiport --dports  22,21,80,23 -m state --state NEW -j LOG --log-prefix "New connections"
        //默认LOG级别为4
    tail /var/log/messages
RETURN:自定义链的返回

    iptables -N web
    iptables -A web -s 172.16.1.0/24 -p tcp --dport 80 -j ACCEPT
    iptables -I web -m string --algo kmp --string "old" -j REJECT
    iptables -A web -j RETURN //这个可加,可不加,默认会有return        
        //有时需要提前返回的话,需要手动指定
    iptables -A FORWARD -p tcp --dport 80 -j web

REDIRECT:端口重定向://只在nat table的PREROUTING,OUTPUT有效
    --to-ports port[-port]
    --random
    
    默认只有管理员使用大于1024的端口
    只对目标端口做修改
    GW:httpd 使用8888/tcp
    iptables -t nat -A PREROUTING -d 192.168.4.118 -p tcp --dport 80 -j REDIRECT --to-ports 8888
    
六、iptables之NAT    
NAT:network address translation
    iptables -t nat -F
    iptables -t filter -F
    iptables -P FORWARD ACCEPT
NAT表也有三个链:
    PREROUTING:
    POSTROUTING:
    OUTPUT:
    
    tail /var/log/httpd/acces_log //正常的模型先,外网请求httpd,用户是外网的地址
    
    SNAT:source nat
        修改IP报文中的源ip,目标ip不动
        //GW开启链接追踪功能,根据链接状态信息,区分不同的inet ip
        //让本地网络中的主机可使用同一地址与外部主机通信,从而实现地址伪装
        请求:修改源ip,如何修改由管理员定义
        响应:修改目标ip,由nat自动根据会话表中追踪机制实现响应修改.
        用途:主要用于内网用户访问外网
    DNAT:destination nat
        修改IP报文中的目标IP//源ip不变,一直是外部的
        用途:外网请求内网主机[服务],让本地网络中服务器使用同一的地址向外提供服务,但隐藏了自己的真实地址;
        请求:外部主机发起,修改其目标地址,由管理员定义
        响应:修改源地址,但由nat自动根据会话表中的追踪机制实现对应修改
    PNAT:port NAT
        REDIRECT就是一种port nat,但是,只能重新定向端口,而不能指定为其他ip
        DNAT可以实现,即修该目标地址,同时修改目标端口
                    
问题:REDIRECT,能不能定向到内网的非网关ip
    不能:因为REDIRECT只有--to-ports,也就是说只能重定向目标端口,不能重新定向目标ip
    
GW的数据包流向:PREROUTING--->FORWARD-->POSTROUTING
SNAT:应该在POSTROUTING链上做
DNAT:应该在PREROUTINT链上做

SNAT:只能用在nat表的{POSTROUTING,INPUT}chain上
    --to-source ipaddr-ipaddr[:port[-port]] //源地址可以有多个,也可以指定端口
    --random 端口映射将成为随机
    --persistent
    
    iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 192.168.4.118
    tcpdump -i eth0 -nn icmp
    //假如是pppoe拨号上网的话,地址会经常发生改变,因此需要写脚本定时更新
MASQUERADE,只能用在nat的POSTROUTING,自动获取外网Ip地址
    --to-ports port[-port]
    --random
    MASQUERADE:需要不停的去判断哪个外网地址可用,会浪费很多资源的
    iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE    
DNAT:只能用在nat (PREROUTING,OUTPUT)
    GW的80端口是关闭的,inet:172.16.1.22:80是开启的
    --to-destination [ipaddr[-ipaddr]][:port[-port]]
    iptables -t nat -A PREROUTING -s 0/0 -d 192.168.4.118 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.22
    
    端口映射:

    iptables -t nat -A PREROUTING -s 0/0 -d 192.168.4.118 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.22:8888 //可以指定为其他inet的地址和端口
    iptables -t nat -A PREROUTING -s 0/0 -d 192.168.4.118 -p tcp --dport 22 -j DNAT --to-destination 172.16.1.22 //及时GW和inet的22同时打开,也被定向为inet:22

    
recent:模块,对于本机的某个服务的访问速录做限制
    防止对22号端口做字典攻击//一定程度上有效

    (1)#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
    (2)#iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH //设置新的ssh链接名字为SSH
    (3)#iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds  300 --hitcount 3 --name SSH -j DROP

    connlimit:限制单个ip对s的链接
    1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
    2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制一分钟后即可恢复访问。
    3.第一句是记录访问tcp 22端口的新连接,记录名称为SSH
        --set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
    4.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。
        --update 是指每次建立连接都更新列表;
        --seconds必须与--update同时使用
        --hitcount必须与--update同时使用
    5.可以使用下面的这句记录日志:
    iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
    
    
第三方模块:
    layer7:识别大多数常见的应用层协议,例如http,qq等协议
    1.内核打补丁
    2.iptables打补丁
    
            
小结:
    iptables:
        四表:filter,nat,manle,raw
        五链:PREROUTING,INPUT,OUTPUT,FORWARD,POSTROUTING
    iptables命令
        表:-N,-X,-P,-E
        链:-A,-I,-R,-D,-F,-Z
        查看:-L,-S
            -L:-n,-x,-v,--line-number
    保存规则:iptables-save,iptables-restore
    匹配条件:
        基本匹配:-s,-d,-i,-o1
        扩展匹配:
            隐式扩展:
                -p{tcp|udp|icmp|sctp|udplite|...}
                -p tcp:
                    --sport,--dport,--tcp-flag,--syn
                -p udp:
                    --sport,--dport
                -p icmp:
                    --icmp-type //8请求,0响应
            显示扩展:
                1.state:--state //net_conntrack
                        NEW,ESTABLISHED,RELATED,INVALID,UNTRACKED
                2.iprange: --src-range,--dst-range
                3.string:--algo {bm|kmp},--string ,-hex-string
                4.multiport: --sports,--dports,--ports
                5.limit:--limit,--limit-burst  //速率限制
                6.connlimit:--connlimit-upto,--connlimit-above//一般不同时使用,单ip访问限制
                7.time:--datestart,--datestop,--timestart,--timestop,--mothdays,--weekdays
        处理动作:
            ACCEPT,DROP,REJECT,LOG,RETURN,REDIRECT,SNAT,DNAT,MASQUERADE
推荐博客:http://blog.csdn.net/ruixj/article/details/4268814


以上是关于Linux防火墙详解的主要内容,如果未能解决你的问题,请参考以下文章

保证Linux系统安全之firewalld防火墙配置地址伪装和端口转发详解

Linux之 linux7防火墙基本使用及详解

Linux-iptables详解

Linux系统安全之CentOS 7 firewalld防火墙入门详解

Linux—网络防火墙详解

Linux防火墙iptables详解