美文网首页
iptables相关以及sudo

iptables相关以及sudo

作者: 佐岸的咖啡 | 来源:发表于2018-11-16 15:14 被阅读0次

    (一)、详述iptables五链

    iptables: 包过滤型的防火墙

    firewall: 防火墙,隔离工具;工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配的报文做出相应处理的组件;

    • 主机防火墙
    • 网络防火墙
    • 软件防火墙(软件逻辑)
    • 硬件防火墙(硬件和软件逻辑)

    四表五链概念

    四表五链

    四表:

    • raw: PREROUTING, OUTPUT
    • mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
    • nat: PREROUTING, INPUT, OUTPUT, POSTROUTING
    • filter: INPUT, FORWARD, OUTPUT

    五链:

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

    报文流向

    报文流向
    • 流入本机: PREROUTING--->INPUT
    • 由本机流出: OUTPUT--->POSTROUTING
    • 转发: PREROUTING--->FORWARD--->POSTROUTING

    (二)、举例实现iptables多端口匹配、连接追踪、字符串匹配、时间匹配、并发连接限制、速率匹配、报文状态匹配等应用

    测试环境搭建

    主机类别 ip地址
    远程访问的Client 192.168.30.105
    服务器主机Server 192.168.30.104

    第一: 服务器开启iptables功能,且保证规则为空

    [root@CentOS7_Server ~]#iptables -vnL
    Chain INPUT (policy ACCEPT 6 packets, 428 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 4 packets, 448 bytes)
     pkts bytes target     prot opt in     out     source               destination
    

    第二: 服务器端安装测试软件,包括但不限于(httpd,telnet,samba,ftp,vsftpd,mariadb等)

    [root@CentOS7_Server ~]#yum install httpd telnet-server samba ftp vsftpd mariadb-server -y
    

    第三: 启动服务器上iptables并加入开机启动项

    [root@CentOS7_Server ~]#systemctl start firewalld.service
    [root@CentOS7_Server ~]#systemctl status firewalld.service
    [root@CentOS7_Server ~]#systemctl enable firewalld.service
    

    第四: 配置服务器端iptables规则

    [root@CentOS7_Server ~]#iptables -A INPUT -d 192.168.30.104 -p tcp --dport 22 -j ACCEPT  ###入站-放行SSH的22号端口
    [root@CentOS7_Server ~]#iptables -A OUTPUT -s 192.168.30.104 -p tcp --sport 22 -j ACCEPT ###出站-放行SSH的22号端口
    
    [root@CentOS7_Server ~]#iptables -A INPUT -i ens33 -j REJECT   ###入站-拒绝通过ens33网卡的连接
    [root@CentOS7_Server ~]#iptables -A OUTPUT -o ens33 -j REJECT  ###出站-拒绝通过ens33网卡的连接
    
    [root@CentOS7_Server ~]#iptables -I OUTPUT 2 -s 192.168.30.104 -p icmp --icmp-type 8 -j ACCEPT  ###出站-允许服务器ping外部主机
    [root@CentOS7_Server ~]#iptables -I INPUT 2 -d 192.168.30.104 -p icmp --icmp-type 0 -j ACCEPT  ###进站-允许服务器接收主机ping要求
    [root@CentOS7_Server ~]#iptables -vnL --line-numbers
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1      907 69892 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.30.104       tcp dpt:22
    2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.30.104       icmptype 0
    3       22  2364 REJECT     all  --  ens33  *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1      471 48640 ACCEPT     tcp  --  *      *       192.168.30.104       0.0.0.0/0            tcp spt:22
    2        0     0 ACCEPT     icmp --  *      *       192.168.30.104       0.0.0.0/0            icmptype 8
    3        0     0 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    

    1.基本匹配条件: (无需加载任何模块,由iptables/netfilter自行提供)

    参数选项 解释说明
    -s, --source address[/mask][....] 检查报文中的源ip地址是否符合此处指定的地址或范围
    -d, --destination address[/mask][...] 检查报文中的目标ip地址是否符合此处指定的地址或范围
    -p, --protocol protocol protocol: tcp,udp,udplite,icmp,icmpv6,esp,ah,sctp,mh or "all"
    -i, --in-interface name 数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链
    -o, --out-interface name 数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD,OUTPUT和POSTROUTING链

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

    隐式扩展: 在使用-p选项指明了特定的协议时,无需再同时使用-m选项指明扩展模块的扩展机制
    显式扩展: 必须使用-m选项指明要调用的扩展模块的扩展机制

    Step1.隐式扩展:

    不需要手动加载扩展模块,因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块

    tcp参数选项:
    参数选项 解释说明
    --source-port, --sport port[:port] 匹配报文的源端口;可以是端口范围
    --destination-port, --dport port[:port] 匹配报文的目标端口;可以是端口范围
    --tcp-flags mask comp
    --tcp-flags SYN,ACK,FIN,RST SYN 要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
    [root@CentOS7_Server ~]#iptables -A INPUT -d 192.168.30.104 -p tcp --dport 22 -j ACCEPT
    [root@CentOS7_Server ~]#iptables -A OUTPUT -s 192.168.30.104 -p tcp --sport 22 -j ACCEPT
    
    udp参数选项:
    参数选项 解释说明
    --source-port, --sport port[:port] 匹配报文的源端口;可以是端口范围
    --destination-port, -dport port[:port] 匹配报文的目标端口;可以是端口范围
    [root@CentOS7 ~]#iptables -I INPUT -d 192.168.30.104 -p udp --dport 137:138 -j ACCEPT
    [root@CentOS7 ~]#iptables -I OUTPUT -s 192.168.30.104 -p udp --sport 137:138 -j ACCEPT
    
    icmp参数选项:
    参数选项 解释说明
    --icmp-type {type[/code]typename}
    echo-request: 8 ping请求报文(出站)
    echo-reply: 0 ping响应报文(进站)
    [root@CentOS7_Server ~]#iptables -I OUTPUT -s 192.168.30.104 -p icmp --icmp-type 8 -j ACCEPT
    [root@CentOS7_Server ~]#iptables -I INPUT -d 192.168.30.104 -p icmp --icmp-type 0 -j ACCEPT
    

    Step2.显式扩展:

    必须使用-m选项指明要调用的扩展模块的扩展机制

    (1)、mutliport,多端口匹配

    以离散或连续的方式定义多端口匹配条件,最多15个

    参数选项 解释说明
    --source-ports,--sports port[,port|,port:port] 指定多个源端口
    --destination-ports,--dports port[,port|,port:port] 指定多个目标端口

    第一步: 启动所有服务器端测试服务(80,139,445)

    [root@CentOS7_Server ~]#ss -tnl
    State       Recv-Q Send-Q                           Local Address:Port                                          Peer Address:Port              
    LISTEN      0      50                                           *:445                                                      *:*                  
    LISTEN      0      128                                  127.0.0.1:9000                                                     *:*                  
    LISTEN      0      50                                           *:3306                                                     *:*                  
    LISTEN      0      50                                           *:139                                                      *:*                  
    LISTEN      0      128                                          *:111                                                      *:*                  
    LISTEN      0      5                                192.168.122.1:53                                                       *:*                  
    LISTEN      0      128                                          *:22                                                       *:*                  
    LISTEN      0      128                                  127.0.0.1:631                                                      *:*                  
    LISTEN      0      100                                  127.0.0.1:25                                                       *:*                  
    LISTEN      0      128                                  127.0.0.1:6010                                                     *:*                  
    LISTEN      0      128                                  127.0.0.1:6011                                                     *:*                  
    LISTEN      0      50                                          :::445                                                     :::*                  
    LISTEN      0      50                                          :::139                                                     :::*                  
    LISTEN      0      128                                         :::111                                                     :::*                  
    LISTEN      0      128                                         :::80                                                      :::*                  
    LISTEN      0      128                                         :::22                                                      :::*                  
    LISTEN      0      128                                        ::1:631                                                     :::*                  
    LISTEN      0      100                                        ::1:25                                                      :::*                  
    LISTEN      0      128                                        ::1:6010                                                    :::*                  
    LISTEN      0      128                                        ::1:6011                                                    :::* 
    

    第二步: 创建index测试页面

    [root@CentOS7_Server ~]#cd /data/www/html/
    [root@CentOS7_Server html]#vim index.html
    [root@CentOS7_Server html]#curl http://192.168.30.104
    <h1> Multiport Test !! </h1>
    
    防火墙阻挡httpd
    [root@CentOS7_Server html]#iptables -I INPUT -d 192.168.30.104 -p udp --dport 137:138 -j ACCEPT
    [root@CentOS7_Server html]#iptables -I OUTPUT -s 192.168.30.104 -p udp --sport 137:138 -j ACCEPT
    

    第三步: 添加多端口规则,然后测试80访问页面以及samba服务

    [root@CentOS7_Server html]#iptables -R INPUT 3 -d 192.168.30.104 -p tcp -m multiport --dports 22,80,139,445 -j ACCEPT 
    [root@CentOS7_Server html]#iptables -R OUTPUT 3 -s 192.168.30.104 -p tcp -m multiport --sports 22,80,139,445 -j ACCEPT 
    [root@CentOS7_Server html]#iptables -vnL --line-numbers
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.30.104       udp dpts:137:138
    2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.30.104       icmptype 0
    3      209 16884 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.30.104       multiport dports 22,80,139,445
    4      116  9327 REJECT     all  --  ens33  *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        5   552 ACCEPT     udp  --  *      *       192.168.30.104       0.0.0.0/0            udp spts:137:138
    2        0     0 ACCEPT     icmp --  *      *       192.168.30.104       0.0.0.0/0            icmptype 8
    3       39  3700 ACCEPT     tcp  --  *      *       192.168.30.104       0.0.0.0/0            multiport sports 22,80,139,445
    4       65  6525 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    

    <测试samba服务>

    [root@CentOS7_Client1 ~]#smbclient -L 192.168.30.104 
    Enter SAMBA\root's password: 
    Anonymous login successful
    
        Sharename       Type      Comment
        ---------       ----      -------
        print$          Disk      Printer Drivers
        IPC$            IPC       IPC Service (Samba 4.7.1)
    Reconnecting with SMB1 for workgroup listing.
    Anonymous login successful
    
        Server               Comment
        ---------            -------
    
        Workgroup            Master
        ---------            -------
        SAMBA   
    
    测试httpd正常
    (2)、iprange,ip范围匹配

    以联系地址块的方式来指明多ip地址匹配条件

    参数选项 解释说明
    --src-range from 匹配源地址
    --dst-range from 匹配目标地址

    第一步:添加一个test账户并启动telnet进程

    [root@CentOS7_Server ~]#useradd usertest
    [root@CentOS7_Server ~]#echo "usertest"|passwd --stdin usertest
    [root@CentOS7_Server ~]#systemctl start telnet.socket 
    [root@CentOS7_Server ~]#ss -tnl|grep 23
    LISTEN     0      128         :::23                      :::*
    

    第二步:添加规则允许IP范围连接23端口

    [root@CentOS7_Server ~]#iptables -I INPUT 4 -d 192.168.30.104 -p tcp --dport 23 -m iprange --src-range 192.168.30.104-192.168.30.106 -j ACCEPT
    [root@CentOS7_Server ~]#iptables -I OUTPUT 4 -s 192.168.30.104 -p tcp --sport 23 -m iprange --dst-range 192.168.30.104-192.168.30.106 -j ACCEPT
    
    [root@CentOS7_Server ~]#iptables -vnL --line-numbers
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            192.168.30.104       udp dpts:137:138
    2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.30.104       icmptype 0
    3     1172 94005 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.30.104       multiport dports 22,80,139,445
    4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.30.104       tcp dpt:23 source IP range 192.168.30.104-192.168.30.106
    5      595 59003 REJECT     all  --  ens33  *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1       29  3072 ACCEPT     udp  --  *      *       192.168.30.104       0.0.0.0/0            udp spts:137:138
    2        0     0 ACCEPT     icmp --  *      *       192.168.30.104       0.0.0.0/0            icmptype 8
    3      685 78044 ACCEPT     tcp  --  *      *       192.168.30.104       0.0.0.0/0            multiport sports 22,80,139,445
    4        0     0 ACCEPT     tcp  --  *      *       192.168.30.104       0.0.0.0/0            tcp spt:23 destination IP range 192.168.30.104-192.168.30.106
    5       68  6705 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    

    第三步测试telnet服务(client 192.168.30.105): 连接成功

    [root@CentOS7_Client1 ~]#telnet 192.168.30.104
    Trying 192.168.30.104...
    Connected to 192.168.30.104.
    Escape character is '^]'.
    Kernel 3.10.0-862.el7.x86_64 on an x86_64
    CentOS7_Server login: usertest  
    Password: 
    
    [usertest@CentOS7_Server ~]$ ifconfig
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.30.104  netmask 255.255.255.0  broadcast 192.168.30.255
    

    测试telnet服务(client 192.168.30.107): 连接失败

    [root@ftp-server ~]#telnet 192.168.30.104
    Trying 192.168.30.104...
    telnet: connect to address 192.168.30.104: Connection timed out
    
    (3)、time, 匹配访问网络的时间
    参数选项 解释说明
    --timestart hh:mm[:ss] 时间开始点
    --timestop hh:mm[:ss] 时间结束点
    --weekdays day[,day...] 一周的第几天
    --monthdays day[,day...] 一月的第几天
    --datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期开始时间点
    --datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期结束时间点
    --kerneltz: 使用内核配置的时区而非默认的UTC CentOS7才需要操作

    第一: 开放进出站对时间的端口
    ntp端口123
    chrony端口323

    [root@CentOS7_Server ~]#iptables -I INPUT 5 -d 192.168.30.104 -p udp -m multiport --dports 123,323 -j ACCEPT
    [root@CentOS7_Server ~]#iptables -I OUTPUT 5 -s 192.168.30.104 -p udp -m multiport --sports 123,323 -j ACCEPT
    

    第二: 配置IP端在什么时间段可以访问

    [root@CentOS7_Server ~]#iptables -I INPUT 3 -d 192.168.30.104 -p tcp --dport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 1,2,3,4,5,6 --kerneltz -j ACCEPT
    [root@CentOS7_Server ~]#iptables -I OUTPUT 3 -s 192.168.30.104 -p tcp --sport 23 -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 1,2,3,4,5,6 --kerneltz -j ACCEPT
    ###周一至周五早9点到晚18点允许访问,周六日全天可以访问,--kerneltz使用内核中的时间
    
    (4)、string, 对应字符串匹配
    参数选项 解释说明
    --algo {bm|kmp} 字符串选择的类型
    --string pattern 匹配模式
    --hex-string pattern
    --from offset
    to offset
    [root@CentOS7_Server html]#iptables -I INPUT 5 -d 192.168.30.104 -p tcp -m string --algo bm --string "linux" -j REJECT
    [root@CentOS7_Server html]#iptables -I OUTPUT 5 -s 192.168.30.104 -p tcp -m string --algo bm --string "linux" -j REJECT
    
    (5)、connlimit, 并发连接数限制
    参数选项 解释说明
    --connlimit-upto n 小于n被允许
    --connlimit-above n 大于n被拒绝
    [root@CentOS7_Server html]#iptables -R INPUT 4 -d 192.168.30.104 -p tcp -m multiport --dports 80,139,445,3306 -j ACCEPT
    [root@CentOS7_Server html]#iptables -R OUTPUT 4 -s 192.168.30.104 -p tcp -m multiport --sports 80,139,445,3306 -j ACCEPT
    ###开启对3306端口的放行
    [root@CentOS7_Server html]#iptables -I INPUT 6 -d 192.168.30.104 -p tcp --dport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
    [root@CentOS7_Server html]#iptables -I OUTPUT 6 -s 192.168.30.104 -p tcp --sport 3306 -m connlimit --connlimit-upto 2 -j ACCEPT
    ###设置对访问mariadb并发连接数小于2个的时候被允许
    
    [root@CentOS7_Server html]#iptables -vnL --line-numbers
    Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            192.168.30.104       icmptype 0
    2     2696  198K ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.30.104       tcp dpt:22
    3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.30.104       tcp dpt:23 TIME from 09:00:00 to 18:00:00 on Mon,Tue,Wed,Thu,Fri,Sat
    4        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.30.104       multiport dports 80,139,445,3306
    5        0     0 REJECT     tcp  --  *      *       0.0.0.0/0            192.168.30.104       STRING match  "linux" ALGO name bm TO 65535 reject-with icmp-port-unreachable
    6        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            192.168.30.104       tcp dpt:3306 #conn src/32 <= 2
    7       86  7883 REJECT     all  --  ens33  *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    
    Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    
    Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
    num   pkts bytes target     prot opt in     out     source               destination         
    1        0     0 ACCEPT     icmp --  *      *       192.168.30.104       0.0.0.0/0            icmptype 8
    2     1647  200K ACCEPT     tcp  --  *      *       192.168.30.104       0.0.0.0/0            tcp spt:22
    3        0     0 ACCEPT     tcp  --  *      *       192.168.30.104       0.0.0.0/0            tcp spt:23 TIME from 09:00:00 to 18:00:00 on Mon,Tue,Wed,Thu,Fri,Sat
    4        0     0 ACCEPT     tcp  --  *      *       192.168.30.104       0.0.0.0/0            multiport sports 80,139,445,3306
    5        0     0 REJECT     tcp  --  *      *       192.168.30.104       0.0.0.0/0            STRING match  "linux" ALGO name bm TO 65535 reject-with icmp-port-unreachable
    6        0     0 ACCEPT     tcp  --  *      *       192.168.30.104       0.0.0.0/0            tcp spt:3306 #conn src/32 <= 2
    7       31  2516 REJECT     all  --  *      ens33   0.0.0.0/0            0.0.0.0/0            reject-with icmp-port-unreachable
    
    (6)、limit, 速率限制

    这里的限制是指报文的发包速率限制。使用的是令牌桶算法,每拿一个令牌才能相应的发一个报文,而令牌按照固定频率发放,在没有报文发送的时候,会像桶一样把令牌攒起来,在需要发送报文的时候会一次性把桶里的报文都发出去,这就叫做令牌桶算法

    参数选项 解释说明
    --limit rate[/second|/minute|/hour|/day] 按秒/分/时/天限制速率
    --limit-burst number 所拥有的令牌桶数量
    --syn, -m limit 限制本机某tcp服务接收新请求的速率
    [root@CentOS7_Server html]#iptables -I INPUT 6 -d 192.168.30.104 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 15/minute -j ACCEPT
    [root@CentOS7_Server html]#iptables -I OUTPUT 6 -s 192.168.30.104 -p icmp --icmp-type 0 -j ACCEPT
    
    令牌桶测试
    7、state(报文状态匹配)

    主要参数: --state state

    参数 解释说明
    NEW 新连接请求
    ESTABLISHED 已经建立的连接
    INVALID 无法识别的连接
    RELATED 相关联的连接,当前连接是一个新请求,但附属于某个已经存在的连接
    UNTRACKED 未追踪的连接

    追踪到的连接:/proc/net/nf_conntrack
    调整可记录的连接数量最大值:/proc/sys/net/nf_conntrack_max
    超时时长:/proc/sys/net/netfilter/timeout

    [root@CentOS7_Server html]#iptables -F
    [root@CentOS7_Server html]#iptables -A INPUT -d 192.168.30.104 -p tcp -m multiport --dports 22:23,80,139,445,3306 -m state --state NEW -j ACCEPT
    ###清空之前规则,添加目前服务所有tcp端口
    [root@CentOS7_Server html]#iptables -I INPUT -d 192.168.30.104 -m state --state ESTABLISHED -j ACCEPT
    [root@CentOS7_Server html]#iptables -A OUTPUT -s 192.168.30.104 -m state --state ESTABLISHED -j ACCEPT
    ###进站和出站只要是ESTABLISHED都允许放行
    [root@CentOS7_Server html]#iptables -I INPUT 2 -d 192.168.30.104 -p udp --dport 137:138 -m state --state NEW -j ACCEPT
    ###第一次访问udp137和138端口的NEW允许放行
    [root@CentOS7_Server html]#iptables -A INPUT -d 192.168.30.104 -j REJECT
    [root@CentOS7_Server html]#iptables -A OUTPUT -s 192.168.30.104 -j REJECT
    ###默认规则调整为全部拒绝
    
    httpd测试访问
    samba测试访问
    RELATED状态的追踪:

    需要手动装载状态的追踪模块:nf_conntrack_ftp

    iptables -I OUTPUT -s 192.168.30.104 -p tcp -m multiport --sports 22,80,139,445,3306 -m state --state ESTABLISHED,RELATED -j ACCEPT
    
    处理动作(跳转目标)
    - -j targetname [per-target-options]
        - 简单target:
            - ACCEPT, DROP
        - 扩展target:
            - REJECT
                - --reject-with type
            - LOG
                - --log-level
                - --log-prefix
                - 默认日志保存于/var/log/messages
        - 自定义链做为target:
    

    保存和载入规则:

    保存: iptables-save >/PATH/TO/SOME_RULE_FILE
    重载: iptables-restore </PATH/TO/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
    CentOS 7:
    (1)自定义Unit File,进行iptables-restore
    (2)firewalld服务
    (3)自定义脚本
    

    规则优化的思路:

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

    (三)、举例实现iptables之SNAT源地址修改及DNAT目标地址修改和PNAT端口修改等应用

    SNAT是source network address translation的缩写,即源地址目标转换。
    比如,多个PC机使用ADSL路由器共享上网,每个PC机都配置了内网IP,PC机访问外部网络的时候,路由器将数据包的报头中的源地址替换成路由器的ip,当外部网络的服务器比如网站web服务器接到访问请求的时候,他的日志记录下来的是路由器的ip地址,而不是pc机的内网ip;
    这是因为,这个服务器收到的数据包的报头里边的“源地址”,已经被替换了所以叫做SNAT,基于源地址的地址转换.
    简单来说: SNAT是指在数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,这样,接收方就认为数据包的来源是被替换的那个IP的主机

    Step1.搭建环境

    设备名称 ip地址
    Client客户端 172.16.0.0/16
    SNAT服务器 ens33: 192.168.30.105, ens36: 172.16.8.100
    远程云端服务器 192.168.30.103
    SNAT

    Step2.SNAT转发服务器配置双网卡

    [root@SNAT-Server ~]#ifconfig
    ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 192.168.30.105  netmask 255.255.255.0  broadcast 192.168.30.255
            inet6 fe80::ebca:5abc:36ce:599c  prefixlen 64  scopeid 0x20<link>
            inet6 240e:82:f00d:95c6:2e01:fc37:1f2e:8c41  prefixlen 64  scopeid 0x0<global>
            inet6 fe80::ba8f:a1a3:c743:29eb  prefixlen 64  scopeid 0x20<link>
            inet6 fe80::a5b9:2f8e:5a1a:78fd  prefixlen 64  scopeid 0x20<link>
            ether 00:0c:29:38:0b:78  txqueuelen 1000  (Ethernet)
            RX packets 2845  bytes 254075 (248.1 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 1770  bytes 251538 (245.6 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.168.0.254  netmask 255.255.255.255  broadcast 0.0.0.0
            inet6 240e:82:f00d:95c6:44f:4c38:4b14:7  prefixlen 128  scopeid 0x0<global>
            inet6 fe80::ed88:92f2:476d:be7d  prefixlen 64  scopeid 0x20<link>
            inet6 240e:82:f00d:95c6:4353:9518:a38c:247d  prefixlen 64  scopeid 0x0<global>
            ether 00:0c:29:38:0b:82  txqueuelen 1000  (Ethernet)
            RX packets 887  bytes 97703 (95.4 KiB)
            RX errors 0  dropped 0  overruns 0  frame 0
            TX packets 97  bytes 14111 (13.7 KiB)
            TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    

    Step3. 在SNAT转发服务器开启核心转发功能

    [root@SNAT-Server ~]#sysctl -w net.ipv4.ip_forward=1   ###开启服务器的核心转发功能
    net.ipv4.ip_forward = 1
    [root@SNAT-Server ~]#systemctl start firewalld.service
    [root@SNAT-Server ~]#systemctl enable firewalld.service
    

    Step4.配置iptables规则,使得192.168.30.0/24网段能够正常访问

    [root@SNAT-Server ~]#iptables -F
    [root@SNAT-Server ~]#iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o ens33 -j SNAT --to-source 192.168.30.105
    

    Step5.如果是动态ip环境,配置如下规则:

    [root@SNAT-Server ~]#iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j MASQUERADE
    

    DNAT是destination network address translation的缩写,即目标网络地址转换。
    典型的应用是,有个web服务器放在内网配置内网ip,前端有个防火墙配置公网ip,互联网上的访问者使用公网ip来访问这个网站当访问的时候,客户端发出一个数据包,这个数据包的报头里边,目标地址写的是防火墙的公网ip,防火墙会把这个数据包的报头改写一次,将目标地址改写成web服务器的内网ip,然后再把这个数据包发送到内网的web服务器上,这样,数据包就穿透了防火墙,并从公网ip变成了一个对内网地址的访问了,即DNAT,基于目标的网络地址转换.
    简单来说:DNAT,就是指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B。


    DNAT
    [root@SNAT-Server ~]#iptables -t nat -A PREROUTING -d 172.16.0.254 -p tcp  --dport 80 -j DNAT --to-destination 192.168.30.103
    

    PNAT端口修改

    PNAT
    [root@SNAT-Server ~]#iptables -t nat -A PREROUTING -d 192.168.30.103 -p tcp --dport 80 -j REDIRECT --to-ports 8080
    

    (四)、简述sudo安全切换工具,及详细讲解visudoer

    sudo

    su: switch user

    • 用户切换
    • (1) su -l user
    • (2) su -l user -c 'COMMAND'

    sudo:

    • 能够让获得授权的用户以另外一个用户的身份运行指定的命令
    - 授权机制: 授权文件 /etc/sudoers
        - root    ALL=(ALL)   ALL
        - %wheel  ALL=(ALL)   ALL
    
    - 编译此文件的专用命令: visudo
        - 授权项:
            - who    where=(whom)  commands
            - user   hosts=(runas) commands
                           - users:
                    - username
                    - #uid
                    - %groupname
                    - %#gid
                    - user_alias
                    - 支持将多个用户定义为一组用户,称之为用户别名,即user_alias
                - hosts:
                    - ip
                    - hostname
                    - NetAddr
                    - host_alias
                - runas:
                    - ...
                    - runas_alias
                - commands:
                    - command
                    - directory
                    - sudoedit: 特殊权限,可用于向其他用户授予sudo权限
                    - cmnd_alias
    

    sudo命令的使用示例:

    1.创建和删除

    ###创建系统用户并设置密码
    [root@CentOS7_Client1 ~]#useradd hello
    [root@CentOS7_Client1 ~]#echo "hello" |passwd --stdin hello
    
    ###su到对应用户下无法创建新用户或者删除用户,提示权限不够
    [root@CentOS7_Client1 ~]#su - hello
    [hello@CentOS7_Client1 ~]$ useradd linux
    -bash: /usr/sbin/useradd: Permission denied
    [hello@CentOS7_Client1 ~]$ userdel hello
    -bash: /usr/sbin/userdel: Permission denied
    
    ###visudo编辑添加对应的权限操作
    [root@CentOS7_Client1 ~]#visudo
    ## Same thing without a password
    # %wheel        ALL=(ALL)       NOPASSWD: ALL
    hello   ALL=(ALL)  /usr/sbin/useradd,/usr/sbin/userdel
    
    ###重新su到hello账户,添加和删除创建的用户
    [root@CentOS7_Client1 ~]#su - hello
    Last login: Fri Nov 16 14:38:52 CST 2018 on pts/0
    
    [hello@CentOS7_Client1 ~]$ sudo useradd linuxtest
    [hello@CentOS7_Client1 ~]$ tail /etc/passwd
    hello:x:1002:1002::/home/hello:/bin/bash
    linuxtest:x:1003:1003::/home/linuxtest:/bin/bash
    
    [hello@CentOS7_Client1 ~]$ userdel linuxtest
    -bash: /usr/sbin/userdel: Permission denied
    [hello@CentOS7_Client1 ~]$ sudo userdel linuxtest
    

    注意:一般sudo命令会验证su账号的密码才能使用,默认时间是5分钟,超过时间后执行会再次提示输入密码

    2.自定义组实现sudo

    [root@CentOS7_Client1 ~]#usermod -a -G wheel hello
    [root@CentOS7_Client1 ~]#newgrp wheel
    [root@CentOS7_Client1 ~]#id hello
    uid=1002(hello) gid=1002(hello) groups=1002(hello),10(wheel)
    
    [root@CentOS7_Client1 ~]#visudo
    ## Same thing without a password
    %wheel  ALL=(ALL)       /usr/sbin/useradd,/usr/sbin/userdel
    
    [root@CentOS7_Client1 ~]#su - hello
    Last login: Fri Nov 16 14:41:44 CST 2018 on pts/0
    [hello@CentOS7_Client1 ~]$ sudo -k
    [hello@CentOS7_Client1 ~]$ sudo useradd hellouser1
    [sudo] password for hello: 
    [hello@CentOS7_Client1 ~]$ id hellouser1
    uid=1004(hellouser1) gid=1004(hellouser1) groups=1004(hellouser1)
    

    注意: 使用sudo su -root可以无密码切换到管理员账户,风险很大,所以需要做对应的修改

    ## Same thing without a password
    %wheel  ALL=(ALL)       ALL, !/bin/su, !/usr/bin/passwd root
    

    3.定义别名实现sudo

    [root@CentOS7_Client1 ~]#visudo
    ## Allows people in group wheel to run all commands
    #%wheel ALL=(ALL)       ALL
    User_Alias USERADMIN=fedora,centos
    Cmnd_Alias NETADMINCMD=/sbin/ip, /sbin/ifconfig, /sbin/route
    Cmnd_Alias USERADMINCMD=/sbin/useradd, /sbin/userdel, /bin/passwd, !/bin/passwd root
    fedora  ALL=(ALL)       NETADMINCMD  
    centos  ALL=(ALL)       USERADMINCMD
    
    [root@CentOS7_Client1 ~]#su - fedora
    Last login: Fri Nov 16 15:08:38 CST 2018 on pts/0
    [fedora@CentOS7_Client1 ~]$ sudo -l
    User fedora may run the following commands on CentOS7_Client1:
        (ALL) /sbin/ip, /sbin/ifconfig, /sbin/route
    
    [fedora@CentOS7_Client1 ~]$ su - centos
    Password: 
    [centos@CentOS7_Client1 ~]$ sudo -l
    User centos may run the following commands on CentOS7_Client1:
        (ALL) /sbin/useradd, /sbin/userdel, /bin/passwd, !/bin/passwd root
    

    注意:每次用户操作的时候都要输入用户密码,只要在规则的别名前面加一个标签NOPASSWD就可以不需要密码操作。每次需要用户输入密码则加PASSWD。

    [root@CentOS7_Client1 ~]# visudo
     USERADMIN ALL=(ALL) NOPASSWD:NETADMINCMD,PASSWD:USERADMINCMD
    

    相关文章

      网友评论

          本文标题:iptables相关以及sudo

          本文链接:https://www.haomeiwen.com/subject/wwgdfqtx.html