zoukankan      html  css  js  c++  java
  • iptables(1)


    iptables配置文件:/etc/sysconfig/iptables

    确认开启路由转发功能
    方法1:/sbin/sysctl -w net.ipv4.ip_forward=1
    方法2:echo 1 > /proc/sys/net/ipv4/ip_forward
    方法3:修改/etc/sysctl.conf,设置 net.ipv4.ip_forward = 1

    设置路由转发
    [root@localhost ~]# vim /etc/sysctl.conf 修改:
    net.ipv4.ip_forward = 1
    [root@localhost ~]# sysctl -p 注意:此设置为永久生效 或者:
    [root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
    又或者:
    [root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
    注意:此设置为临时生

    [root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG
    [root@localhost ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
    [root@localhost ~]# iptables -t filter -N MyLAN1
    [root@localhost ~]# iptables -A FORWARD -s 192.168.1.0/24 -j MyLAN1
    [root@localhost ~]# iptables -A FORWARD -d 192.168.1.0/24 -j MyLAN1
    [root@localhost ~]# iptables-A MyLAN1 -p icmp -j DROP
    [root@localhost ~]# iptables-A MyLAN1 ……
    [root@localhost ~]# iptables -X MyLAN1

    [root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
    [root@localhost ~]# iptables-I INPUT -p udp -j ACCEPT
    [root@localhost ~]# iptables-I INPUT 2 -p icmp -j ACCEPT
    [root@localhost ~]# iptables-P INPUT DROP
    [root@localhost ~]# iptables-L INPUT --line-numbers
    Chain INPUT (policy DROP)
    num target prot opt source destination
    1 ACCEPT udp -- anywhere anywhere
    2 ACCEPT icmp -- anywhere anywhere
    3 ACCEPT tcp -- anywhere anywhere

    [root@localhost ~]# iptables-D INPUT 2
    [root@localhost ~]# iptables-F
    [root@localhost ~]# iptables -t nat-F
    [root@localhost ~]# iptables -t raw -NTCP_PACKETS
    [root@localhost ~]# iptables -t raw -L
    Chain PREROUTING (policy ACCEPT)
    ……
    Chain OUTPUT (policy ACCEPT)
    ……
    Chain TCP_PACKETS (0 references)
    target prot opt source destination
    自定义链,最终要应用于默认链上,才能起作用。
    自定义链,只允许固定ip访问目标ip的ssh
    #iptables -N testssh --自定义链名称
    #iptables -A testssh -s 192.168.10.10/32 -j ACCEPT
    #iptables -A INPUT -p tcp --dport 22 -j testssh --把自定义链应用于INPUT链
    nat表上,自定义链的使用
    #iptables -N test -t nat
    #iptables -A test -t nat -d 192.168.10.0/24 -j SNAT --to 192.168.100.10
    #iptables -A POSTROUTING -t nat -s 192.168.21.0/24 -j test

    [root@localhost ~]# iptables -A FORWARD -p tcp --dport 22 -j ACCEPT
    [root@localhost ~]# iptables -A OUTPUT -p tcp --sport 20:80 -j ACCEPT
    [root@localhost ~]# iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT
    [root@localhost ~]# iptables -A INPUT -i eth0 -p icmp --icmp-type Echo-Request -j DROP
    [root@localhost ~]# iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT

    [root@localhost ~]# iptables -A FORWARD -m mac --mac-source 00:0C:29:27:55:3F -j DROP
    [root@localhost ~]# iptables -A INPUT -p tcp-m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
    [root@localhost ~]# iptables -A FORWARD -p tcp-m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
    NEW(与任何连接无关的数据包,一般表示新发起的数据连接请求)
    ESTABLISHED(响应请求或者已建立连接的数据包,一般表示服务器的正常响应数据)
    RELATED(与已有连接有相关性的数据包,例如使用FTP上传/下载文件时需要建立新的数据连接,这个连接与之前的FTP控制连接存在
    相关性)
    INVALID (表示来历不明的包,除以上状态以外的其他状态,视为有危险的包,全部被丢弃。)
    •当有人冒用其他主机的IP地址发送数据时,受害主机接收到的服务器响应数据包的状态也是“NEW”(因为本机并未发送过请求),这种类
    型的数据包一般也要丢弃掉
    --syn的用法为兼容旧版本iptables的形式
    [root@localhost ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
    [root@localhost ~]# iptables -A INPUT -p tcp-m state --state NEW -j DROP
    [root@localhost ~]# iptables -A INPUT -p tcp-m state --state ESTABLISHED,RELATED -j ACCEPT
    •导出规则
    –iptables-save
    –结合重定向输出“>”符号保存规则信息
    •导入规则
    –iptables-restore
    –结合重定向输入“<”符号恢复规则信息
    [root@localhost ~]# iptables-save > /etc/sysconfig/iptables
    [root@localhost ~]# service iptables restart
    [root@localhost ~]# chkconfig --level 35 iptables on
    [root@localhost ~]# iptables-restore < /etc/sysconfig/iptables
    --------------------------理解ESTABLISHED
    vm1
    # iptables -P INPUT DROP
    ping 192.168.56.201
    ssh 192.168.56.201
    全部失败
    # iptables -A INPUT -p all -m state --state ESTABLISHED -j ACCEPT
    ping 192.168.56.201
    ssh 192.168.56.201
    全部成功
    vm2关闭防火墙
    成功穿越反向防火墙。
    tracerout 192.168.56.201 失败 ,原因看下面
    --------------------------理解RELATE
    vm1
    # iptables -P INPUT DROP
    # iptables -F
    # iptables -A INPUT -p all -m state --state RELATED -j ACCEPT
    tracerout 192.168.56.201 成功。由第一个包产生的其他回包都属于RELATE状态。
    --------------------------理解NEW
    vm1
    OUTPUT默认策略为DROP。其他策略为ACCEPT
    # iptables -P INPUT ACCEPT
    # iptables -P OUTPUT DROP
    # iptables -F
    ping 192.168.56.201
    ssh 192.168.56.201
    全部失败
    # iptables -A OUTPUT -p all -m state --state ESTABLISHED,NEW -j ACCEPT
    --------------------------理解INVALID
    他需要特殊的第一条黑客工具产生,所以这里面紧急下面的用法。
    通常应用在INPUT表的第一条。
    # iptables -A INPUT -p all -m state --state INVALID -j DROP
    mangle表
    策略路由
    现要求对内网进行策略路由,所有通过TCP协议访问80端口的数据包都从ChinaNet线路出去,而所有访问UDP协议53号端口的数据包都
    从Cernet线路出去
    打标记:
    iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
    iptables -t mangle -A PREROUTING -i eth0 -p udp --dprot 53 -j MARK --set-mark 2
    注:创建完路由规则若需立即生效须执行#ip route flush cache;刷新路由缓冲
    建表
    ip rule add from all fwmark 1 table 10
    ip rule add from all fwmark 2 table 20
    (fwmark 1 是标记,table 1 是路由表1 。 意思就是凡事标记了 1 的数据使用table10 路由表)
    ip rule show 显示路由规则
    路由规则的添加
    ip rule add from 192.168.1.10/32 table 1 pref 100
    如果pref值(优先级)不指定,则将在已有规则最小序号前插入
    注:创建完路由规则若需立即生效须执行#ip route flush cache;刷新路由缓冲
    策略路由:
    ip route add default via 10.10.1.1 dev eth1 table 10
    ip route add default via 10.10.2.1 dev eth2 table 20
    RAW表
    4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter
    举例来说:如果PRROUTING链上,即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理
    RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用
    了RAW表,在 某个链上,RAW表处理完后,将跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了.
    RAW表可以应用在那些不需要做nat的情况下,以提高性能。如大量访问的web服务器,可以让80端口不再让iptables做数据包的链接跟踪
    处理,以提高用户的访问速度。
    执行如何指令即可
    iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK
    iptables -t raw -A PREROUTING -p tcp --sport 80 -j NOTRACK
    iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT
    --------------------------------------------
    环境:
    直播web服务器通过nginx+memcache方式提供显示数据的读取,采用的都是短链接模式,每次请求拿到数据后会断开连接。
    故障:
    cache服务器,不能创建新连接,message日志报错ip_conntrack: table full, dropping packet.
    导致直播web出现故障,同样错误ip_conntrack: table full, dropping packet.
    故障原因:链接跟踪表满了,导致不能创建新的连接。
    以前出现过类似故障,解决办法是
    vi /etc/sysctl.conf
    net.ipv4.ip_conntrack_max = 65000 加大链接跟踪表大小(加大最大跟踪连接条目)
    但是过一段时间又出现上面的问题,这说明一是访问量确实再加大,导致跟踪表full,另外也说明单纯加大这个参数只能解决眼前的问题,
    必须找出一个彻底解决此问题的办法。
    这次故障临时调整
    vi /etc/sysctl.conf
    net.ipv4.ip_conntrack_max = 855360
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1000 (连接跟踪表超时时间,通过测试这个参数的意义不大,和跟踪表自动清除
    的时间没有太大关系,但还是先减小,默认值是7天)
    vi /etc/modprobe.conf
    options ip_conntrack hashsize=855360
    设置桶的数量。提高性能,可以减少内核遍历时间。
    简单解释:
    上面的参数都是iptables涉及的参数,iptables为了处理封包,会对封包做跟踪。
    如果关闭iptables,上面的故障不会出现,但是不太可能。
    -允许的最大跟踪连接条目,CONNTRACK_MAX
    -存储跟踪连接条目列表的哈西表的数量, HASHSIZE,桶的数量
    内核要访问一个特定包的跟踪连接条目,内核必须:
    针对一个包中的已经定义的一些字符计算哈西值。这是一个不间断的计算。
    这个哈西值就会被当作哈西表的索引来使用,而跟踪连接条目的列表就存储在这里。
    反复的查看链接列表中的跟踪连接条目以找到匹配的那一个。
    这是一个耗资源的操作,依赖于列表的大小(也依赖于列表中被操作的跟踪连接条目的位置)。
    这个列表就是一个桶,HASHSIZE就是这些桶的数量,每个桶内的条目数就是 CONNTRACK_MAX/HASHSIZE
    如果 CONNTRACK_MAX=HASHSIZE那么列表大小是一,可以减少遍历的数目,提高性能,前提是内存足够大
    iptables这个桶的概念和LVS 内核桶的概念类似。
    彻底解决:关闭跟踪。
    直播web服务器
    vi /etc/sysconfig/iptables
    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
    -A PREROUTING -p tcp -m tcp --dport 10240:65000 -j NOTRACK
    -A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
    -A OUTPUT -p tcp -m tcp --sport 10240:65000 -j NOTRACK
    COMMIT
    注意 filter 里要加这句
    -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED,UNTRACKED -j ACCEPT
    后端cache服务器
    vi /etc/sysconfig/iptables
    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
    -A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
    -A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK
    -A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK
    COMMIT
    把80端口和11211端口去掉跟踪。
    用apache ab测试 观察 /proc/net/ip_conntrack 效果很明显
    如果web端配置
    -A PREROUTING -p tcp -m tcp --dport 11211 -j NOTRACK
    -A OUTPUT -p tcp -m tcp --sport 11211 -j NOTRACK
    是没有意义的,链接跟踪表还是会记录连接后端cache的条目,如果要加上-s之类的源IP地址,那么连接后端11211的出包都会被封,(测
    试结果)所以规则肯定不是这样定,具体的规则还要研究。
    对于cache服务器来说,以上配置是非常完善的。
    通过观察研究链接跟踪表(/proc/net/ip_conntrack)的内容,发现内有大量直播web连接后端cache 11211端口的连接条目,源端口是一万
    以上的端口。而且web服务器也有大量80端口的连接,这些链接不
    需要处理,所以不跟需踪这些链接。
    由于raw的output优先级高于filter input,所以如果设置成1024:65000 -j NOTRACK,那么这些端口都会被允许访问,所以设置成
    10240:65000 ,filter的input还是不可以封住的,但是以后启动的应用
    服务的端口要注意,必须选择10240以下的端口自行定义。虽然10240:65000这些端口可以在公网上扫到,但是由于没有服务对应,所以
    不会有问题。
    还要研究针对于访问后端的端口如何准确的去掉跟踪。
    上面思路比较乱,关键的点想反了,以下是纠正
    通过观察研究
    cat /proc/net/ip_conntrack
    tcp 6 431946 ESTABLISHED src=192.168.0.18 dst=192.168.0.17 sport=52292 dport=3306 packets=1 bytes=52 src=192.168.0.17
    dst=192.168.0.18 sport=3306 dport=52292 packets=1
    bytes=52 use=1
    tcp 6 431999 ESTABLISHED src=192.168.0.18 dst=192.168.0.165 sport=22 dport=2676 packets=27 bytes=2128 src=192.168.0.165
    dst=192.168.0.18 sport=2676 dport=22 packets=26
    bytes=1664 [ASSURED] use=1
    经过测试研究,并且看了几遍iptables-tutorial后,搞好了准确的去掉跟踪 结果
    web服务器
    *raw
    :PREROUTING ACCEPT [0:0]
    :OUTPUT ACCEPT [0:0]
    -A PREROUTING -p tcp -m tcp --dport 80 -j NOTRACK
    -A PREROUTING -p tcp -m tcp --sport 11211 -j NOTRACK 从17的11211端口返回给18的规则
    -A OUTPUT -p tcp -m tcp --sport 80 -j NOTRACK
    -A OUTPUT -p tcp -m tcp --dport 11211 -j NOTRACK 从18出到17的11211端口规则
    COMMIT
    测试结果表明:如果OUTPUT设置了相关端口,那么PREROUTING 必须针对OUTPUT设置的端口制定规则,否则封包不能出去。 (其实是
    回不来)
    原因如下
    连接跟踪的状态主要在两个地方被触发,一个是PREROUTING,另外一个数OUTPUT,他们分别对应外来报文和本级产生报文。例如我
    们从本级 发送一个报文,那么在OUTPUT链里面,它的状态会变成NEW,当我们接收到回应报文的时候,连接状态就PREROUTING处更
    改为 ESTABLISHED,以此类推。加入第一个报文不是我们尝试的,那么在PREROUTING出就设置为NEW,然后我们发送回复的时候,
    在 OUTPUT设置为ESTABLISHED。

  • 相关阅读:
    贴图叠加算法
    Tetrahedron based light probe interpolation(基于四面体的Light Probe插值)
    PS脚本博客
    【Unity优化】资源管理系列03:AssetBundle 基本原理
    【Unity优化】资源管理系列02:Resources 最佳实践
    【Unity优化】资源管理系列01:Assets, Objects and serialization
    【Unity优化】DrawCall与Batch
    【Unity3D技术文档翻译】第1.9篇 使用 Unity AssetBundle Browser tool (AssetBundle系列完结)
    【Unity3D技术文档翻译】第1.8篇 AssetBundles 问题及解决方法
    【Unity3D技术文档翻译】第1.7篇 AssetBundles 补丁更新
  • 原文地址:https://www.cnblogs.com/luoyan01/p/9734257.html
Copyright © 2011-2022 走看看