Category: Iptables

  • nf_conntrack: table full, dropping packet.问题解决

    centos6下在并发量大的时候出现这样的报错

    nf_conntrack: table full, dropping packet.
    nf_conntrack: table full, dropping packet.
    nf_conntrack: table full, dropping packet.

    看一下 nf_conntrack 表里的记录及数量

    less /proc/net/nf_conntrack

    wc -l /proc/net/nf_conntrack

    如果表满了会连 ssh 都连不上来

    默认表的最大值是 65535

    cat /proc/sys/net/nf_conntrack_max

    需要临时加大

    echo ‘100000’ > /proc/sys/net/nf_conntrack_max

    需要永久生效

    在 /etc/sysctl.conf 里添加

    net.nf_conntrack_max = 655360
    net.netfilter.nf_conntrack_max = 655350
    net.netfilter.nf_conntrack_tcp_timeout_established = 1200

    这里有个坑,如果在没有开启 iptables 的情况下使用

    iptables -L -t nat

    会导致加载 nf_conntrack 并使用默认值, sysctl 里的值就不生效了

    这时需要重启一下 iptables 才能加载 sysctl 中的值

  • 使用iptables遇到nf_conntrack table full

    环境 centos 6.6

    在/var/log/messages看到报错

    kernel: nf_conntrack: table full, dropping packet.

    nf_conntrack 默认最大值 65536

    cat /proc/sys/net/ipv4/ip_conntrack_max | wc -l

    超过这个 65536 便会报错。

    现在将值改为 655360 并且永久生效

    首先修改/etc/sysctl.conf

    net.nf_conntrack_max = 655360
    net.netfilter.nf_conntrack_max = 655350
    net.netfilter.nf_conntrack_tcp_timeout_established = 1200

    然后修改/etc/sysconfig/iptables-config
    注意如下两行

    IPTABLES_MODULES="ip_conntrack"
    IPTABLES_SYSCTL_LOAD_LIST=".nf_conntrack"

    之后重新 iptables.

  • mysql绑定多个ip地址

    my.cnf中有选项bind-address=127.0.0.1,是说mysql server监听的是本地发来的请求,如果是任意主机都可以请求,则写为0.0.0.0,但是这样又不太安全。监听某ip,指定此ip地址即可,但是要保证mysql的user中有允许此ip访问,否则不能对数据库操作。那么是否可以在配置里只规定几个ip呢?

    简单直接回答:不可能

    请参考:http://dev.mysql.com/doc/refman/5.1/en/server-options.html#option_mysqld_bind-address

    The MySQL server listens on a single network socket for TCP/IP connections. This socket is bound to a single address, but it is possible for an address to map onto multiple network interfaces. The default address is 0.0.0.0. To specify an address explicitly, use the –bind-address=addr option at server startup, where addr is an IPv4 address or a host name. If addr is a host name, the server resolves the name to an IPv4 address and binds to that address. The server treats different types of addresses as follows:

    If the address is 0.0.0.0, the server accepts TCP/IP connections on all server host IPv4 interfaces.
    If the address is a “regular” IPv4 address (such as 127.0.0.1), the server accepts TCP/IP connections only for that particular IPv4 address.

    但是有此需求,就会到访问控制,那么使用防火墙iptables可实现此效果

    mysql-server为192.168.1.3,只允许192.168.1.4,  192.168.1.5,  192.168.1.6来访问3306端口

    在my.cnf中

    bind-address = 0.0.0.0

    在访问3306端口的主机中,只允许192.168.1.4-6,其他ip一律DROP掉

    /sbin/iptables -A INPUT -p tcp -s 192.168.1.4 --dport 3306 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp -s 192.168.1.5 --dport 3306 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp -s 192.168.1.6 --dport 3306 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp --dport 3306 -j DROP

    /sbin/iptables -A INPUT -p tcp --dport 3306 ! -s 192.168.1.4 -j DROP
    /sbin/iptables -A INPUT -p tcp --dport 3306 ! -s 192.168.1.5 -j DROP
    /sbin/iptables -A INPUT -p tcp --dport 3306 ! -s 192.168.1.6 -j DROP

    保存防火墙规则

    service iptables save

    查看INPUT链包含3306的规则

    echo -e "target prot opt source destination\n$(iptables -L INPUT -n | grep 3306)"

    这样就实现了mysql只允许指定ip访问。

    参考:

    http://www.cyberciti.biz/faq/unix-linux-mysqld-server-bind-to-more-than-one-ip-address/

  • iptables的表和链

    iptables包含 4 个表,5 个链

    其中表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度

    4个表:filter, nat, mangle, raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter

    filter:一般的过滤功能
    nat:用于nat功能(端口映射,地址映射等)
    mangle:用于对特定数据包的修改
    raw: 优先级最高,设置raw时一般是为了不再让 iptables 做数据包的链接跟踪处理,提高性能

    5个链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING

    PREROUTING: 数据包进入路由表之前
    INPUT: 通过路由表后目的地为本机
    FORWARD: 通过路由表后,目的地不为本机
    OUTPUT: 由本机产生,向外转发
    POSTROUTIONG: 发送到网卡接口之前

  • iptables的ip(ipv4) match

    这个内置的匹配不用加 -m (match)就可以实现

    internet protocol ip协议

    -d [!] addr[/mask] 目标地址或范围
    –destination 同-d
    –dst 同-d

    [!] -f 第二标识,链接追踪会自动识别,不常用

    -i [!] 在哪个interface,后面有+,则会匹配所有有这个名字的interface
    –in-interface 同 -i

    -o [!] 不在哪个interface,后面有+,则不会匹配所有有这个名字的interface
    –out-interface 同 -o

    -p [!] 原始协议名或识别码,在 /etc/protocols 文件中或参见http://www.iana.org/assignments/protocol-numbers.

    -p 隐藏-m选项的,协议如 icmp, tcp, or udp.

    -s [!] addr[/mask] 原地址或范围
    –source Synonym for -s.
    –src Synonym for -s.

    可以用老式的 dotted-quad notation 点分四组表示法,如192.168.1.0/255.255.255.0,或

    Common Inter-Domain Routing(CIDR)表示法,如192.168.1.0/24

     

  • iptables的icmp match

     

    Internet Control Message Protocol(ICMP)

    ICMP的头信息如图

    ICMP header

    –icmp-type[!] typename匹配类型
    –icmp-type[!] type[/code]匹配标识码