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

时间: 2024-10-11 00:54:33

Linux防火墙详解(二)的相关文章

Linux 信号详解二(信号分类)

信号分类 信号分为可靠信号和不可靠信号 不可靠信号的缺点 ①:处理完信号,需要重新再注册信号:②信号可能丢失. Linux已经对缺点①做了优化,现在的不可靠问题主要指的是信号可能丢失 信号还可以分为实时信号和非实时信号--一般不可靠信号指的是前32种信号,这32种信号已经有了预定义值,每个信号有了确定的用途及含义,并且每种信号都有各自的缺省动作 --可靠信号指的后32种信号 --非实时信号都不支持排队,都是不可靠信号:实时信号都支持排队,都是可靠信号.

Linux防火墙详解(一)

1.从协议角度,看数据包流程:        #########################        #                        #资源子网:一层        #    用户空间            #        #########################        #                        #        #    内核空间            #通信子网:三层        ###################

Linux iptables防火墙详解 + 配置抗DDOS攻击策略实战

inux iptables防火墙详解 + 配置抗DDOS攻击策略实战 Linux 内核中很早就实现了网络防火墙功能,在不同的Linux内核版本中,使用了不同的软件实现防火墙功能.在2.0内核中,防火墙操作工具叫:ipfwadm在2.2内核中,防火墙操作工具叫:ipchains在2.4以后的内核,防火墙操作工具叫:iptables ipfwadm 和 ipchains 比较老,已成历史版本,本章主要介绍Iptables 一.iptable 操作命令参数详解 -A  APPEND,追加一条规则(放到

Linux基本命令详解《二》(Linux中对目录和文件管理所使用的命令)

Linux基本命令详解<二>内容概述:Linux目录结构查看及检索文件备份及恢复文档vi文本编辑器一,Linux目录结构:树形目录结构(自顶而下)常见的子目录及作用:a./root:系统管理员root的宿主目录b./home:普通用户的宿主目录c./boot:系统内核/启动文件d./dev:设备文件e./etc:配置文件f./bin:所有用户可执行的命令g./sbin:管理员可执行的管理命令h./usr:应用程序i./var:日志文件(俗称可变长文件目录)j./proc :硬件配置信息k. /

Linux信号详解

Linux信号详解 一 信号的种类 可靠信号与不可靠信号, 实时信号与非实时信号 可靠信号就是实时信号, 那些从UNIX系统继承过来的信号都是非可靠信号, 表现在信号 不支持排队,信号可能会丢失, 比如发送多次相同的信号, 进程只能收到一次. 信号值小于 SIGRTMIN的都是非可靠信号. 非可靠信号就是非实时信号, 后来, Linux改进了信号机制, 增加了32种新的信号, 这些信 号都是可靠信号, 表现在信号支持排队, 不会丢失, 发多少次, 就可以收到多少次. 信号值 位于 [SIGRTM

linux awk详解与应用

文章来自于本人个人博客: linux awk详解与应用 1.awk awk是一个强大的文本分析工具,它可以通过分析文本来生成一个数据报告.它的原理就是读取每行的输入,然后按照分隔符切分(默认是空格),再进行定制计算. awk '{print $1}' /etc/passwd   #打印出passwd文件的所有行的第一列 这是awk的基础语法,在awk中$n代表列数,即$1--第一列,$2---第二列....,但是$0代表整行 接下来我们按照指定的分隔符打印数据: awk -F ':' '{pri

linux命令详解

一.cat主要有三大功能: 1.一次显示整个文件.$ cat filename2.从键盘创建一个文件.$ cat > filename (只能创建新文件,不能编辑已有文件)3.将几个文件合并为一个文件: $cat file1 file2 > file 参数:-n 或 --number 由 1 开始对所有输出的行数编号-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行-v

Linux权限详解,多用户多组各种权限配置原理

网上有太多关于Linux权限详解,这里不啰嗦那些.主要解释下这些权限是杂用的,否则知道了什么用户.组之类的权限也配不好. 一.权限分类 r:读取权限,数字代号为"4". w:写入权限,数字代号为"2". x:执行或切换权限,数字代号为"1". -:不具任何权限,数字代号为"0". linux内每一段为r+w+x的值,最大777,见下图 二.权限在何时使用 目录写权限:可以增删目录内所有内容,改文件和目录名. 目录读权限:可以l

Linux procfs详解

1.0 proc文件系统总览在类Unix系统中体现了一种良好的抽象哲学,就是几乎所有的数据实体都被抽象成一个统一的接口--文件来看待,这样我们就可以用一些简单的基本工具完成大量复杂的操作.在Linux中存在着一类特殊的伪文件系统,用于使用与文件接口统一的操作来完成各种功能,例如ptyfs.devfs.sysfs和procfs.而procfs就是其中应用最广泛的一种伪文件系统.procfs是Linux内核信息的抽象文件接口,大量内核中的信息以及可调参数都被作为常规文件映射到一个目录树中,这样我们就