iptables

Nov 9, 2016


一. 总的命令格式

                    table        command          chain          parameters        action  

    iptables        -t filter    -A(追加在表尾)     PREROUTING     -p tcp(协议)       -j ACCEPT  
                       nat       -I(追加在表头)     POSTROUTING    -s ip(源ip)           DROP(丢弃且不响应)  
                                 -D(删除一条)       INPUT          -d ip(宿ip)           REJECT(拒绝且会给客户端响应)  
                                 -L(列举)          OUTPUT         --sport sp            DNAT(修改宿地址)  
                                 -n               FORWARD        --dport dp            SNAT(修改源地址)  
                                 -F(清空)                         -m  

二. 初次启用 iptables

    systemctl stop firewalld  
    systemctl mask firewalld  
    
        centos 默认使用的是firewall,因此需要先关闭它  
    
    yum install iptables-services  
    
        安装iptables service  
    
    systemctl enable iptables  
    
        开机启动iptables-service  
    
    systemctl start iptables  
    
        启动iptables  

三. 我的 /etc/sysconfig/iptables

    -A INPUT -i lo -j ACCEPT  
        允许本地访问  

    -A INPUT -p icmp -j ACCEPT  
        允许所有的ICMP协议的报文(即允许被ping)  

    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  
        允许已经建立的连接进行回包  


    
    -A INPUT -p tcp --dport 35628 -j ACCEPT  
        允许ssh(改了端口的ssh)被所有机器访问  
        
        

    -A INPUT -p tcp -s 10.47.86.0/24 --dport 9200 -m limit --limit 10/m --limit-burst 100 -j ACCEPT   
        允许 10.47.86.198/24 这个网段的机器访问这台机器的9200端口  
        (并发控制)9200端口的最大连接数是100,超过的话就限制每分钟只能10个连接  
        // 注意, -A 和 -I 都是追加一条规则,区别为 :  
        // -A 是追加在原有规则表的最后  
        // -I 是追加在原有规则表的开头  
    
    -A INPUT -p tcp --dport 9200 -j DROP  
        没有满足上述的并发控制的话,访问9200端口的请求就直接丢弃  
    
    -A OUTPUT -p tcp --sport 9200 -j ACCEPT  
        允许这台机器的9200端口,向任何机器返回数据  
        
        

    -A INPUT -p tcp --dport 8081:8089 -j ACCEPT  
        允许任何机器访问这台机器的8081~8089端口  
        


    -A INPUT -j REJECT  
        拒绝所有额外的数据包(无论什么协议的)  
        // 注意,必须是 -A,即在规则表的表尾;如果是 -I,则会导致所有应该接受的数据包也被拒绝掉  
        // 注意,一般的配置思路是accept的在表头,拒绝的次之  

四. SNAT转发

    改写源地址(作用在PostRouting链上,即向外发出数据包的时候)  
     
    应用场景 :  
     
        有一台HttpServer是A网段的,B网段的一台客户机想要访问A网段里的HttpSserver  
        需要在A网段和B网段之间架设一台nat服务器,通过iptables配置nat转发  
     
    具体做法 :  
     
        1. nat服务器,修改 /etc/sysctl.conf  
            添加 net.ipv4.ip_forward = 1  
            然后执行 sysctl -p 命令来使之生效  
            
        2. nat服务器,修改 /etc/sysconfig/iptables  
            添加 iptables -t nat -A POSTROUTING -p tcp -s B网段地址 -j SNAT --to A网段地址  
            然后执行 service iptables restart  
            
        3. 一定要确保客户机的网关地址,是这台nat服务器的地址  
            可以通过修改客户机的 /etc/sysconfig/network 来达到目的  
            否则的话,如果客户机的请求不巧发给了别的一台网关,那台网关上没有配置nat转发,就访问不了HttpServer了  
    
    // 这样一来,客户机就可以直接访问HttpServer(直接的意思是输入的url不变,就是HttpServer的地址)  

五. DNAT转发

    改写宿地址(作用在PreRouting链上,即接收数据包的时候)  
    
    应用场景  :  
    
        同上,还是B网段的客户机想要访问A网段上的http服务  
        但是稍微做些改动,客户机不是直接去访问server的地址,而是去访问nat服务器的地址,nat服务器再做转发  
        // 即,客户机访问nat服务器,但是实际上数据包被偷偷转发给了A网段的server  
    
    具体做法  :  
    
        1. nat服务器,修改 /etc/sysctl.conf  
            添加 net.ipv4.ip_forward = 1  
            然后执行 sysctl -p 命令来使之生效  
            
        2. nat服务器,修改 /etc/sysconfig/iptables  
            添加 iptables -t nat -A PREROUTING -p tcp -d 与客户机相连的网卡地址 --dport 80 -j DNAT --to HttpServer地址:端口  
            然后执行 service iptables restart  
    
    // 这样一来,客户机就可以间接访问HttpServer(间接的意思是客户机并不访问HttpServer的地址,而是使用nat的地址做url)