1、安全优化

大并发的情况下,不能开iptables。我们使用硬件防火墙,当然硬件防火墙也有一定的吞吐量。根据公司业务流量选择防火墙。

iptables提示nf_conntrack: table full, dropping packet解决办法

“连接跟踪表已满,开始丢包”!相信不少用iptables的同学都会见过这个错误信息吧,这个问题曾经也困扰过我好长一段时间。此问题的解决办法有下面几种:

一、关闭防火墙。 简单粗暴,直接有效

chkconfig iptables off 
chkconfig ip6tables off 
service iptables stop 
service ip6tables stop
切记:在防火墙关闭状态下,不要通过iptables指令(比如 iptables -nL)来查看当前状态!因为这样会导致防火墙被启动,而且规则为空。虽然不会有任何拦截效果,但所有连接状态都会被记录,浪费资源且影响性能并可能导致防火墙主动丢包!

二、加大防火墙跟踪表的大小,优化对应的系统参数

  1、状态跟踪表的最大行数的设定,理论最大值 CONNTRACK_MAX = RAMSIZE (in bytes) / 16384 / (ARCH / 32)

    以64G的64位操作系统为例,CONNTRACK_MAX = 64*1024*1024*1024/16384/2 = 2097152

    即时生效请执行:

sysctl –w net.netfilter.nf_conntrack_max = 2097152

  2、其哈希表大小通常为总表的1/8,最大为1/2。CONNTRACK_BUCKETS = CONNTRACK_MAX / 8

    同样64G的64位操作系统,哈希最佳范围是 262144 ~ 1048576 。

    运行状态中通过 sysctl net.netfilter.nf_conntrack_buckets 进行查看,通过文件 /sys/module/nf_conntrack/parameters/hashsize 进行设置

    或者新建 /etc/modprobe.d/iptables.conf ,重新加载模块才生效:

options nf_conntrack hashsize = 262144

  3、还有些相关的系统参数`sysctl -a | grep nf_conntrack`可以调优(/etc/sysctl.conf ):

net.netfilter.nf_conntrack_max  =   1048576  
net.netfilter.ip_conntrack_tcp_timeout_established  =   3600  
net.netfilter.nf_conntrack_tcp_timeout_close_wait  =   60  
net.netfilter.nf_conntrack_tcp_timeout_fin_wait  =   120  
net.netfilter.nf_conntrack_tcp_timeout_time_wait  =   120

 

  (1)、尽可能不给服务器配置外网IP。

  (2) 并发不是很大的话可以开启iptables。

 

iptables 包括的四个表、常用的前两个(filter、nat、mangle,raw)

filter: 负责过滤功能,防火墙;内核模块: iptables_filter

nat: network address translation 网络地址转换功能

mangle: 拆解报文,做出修改,重新分装的功能。

raw: 连接追踪。

iptables 使用配置文件配置 iptables config_iptables 使用配置文件配置

iptables 的表又是链的容器

INPUT,OUTPUT、FORWARD、perrouting、postrouting

表名

                  链名

 

INPUT

FORWARD

OUTPUT

PREROUTING

POSTROUTING

filter

*

*

*

 

 

nat

×××

 


*

*

mangle

*

*

*

*

*

* 代表包含

                                                  centos6 与centos7 系统中nat表中包含链不同,centos7中nat表中多了一个input链。

可以使用下面的命令查看表中包含的链:

iptables -L -n  -t filter

 

                                                

规则中的链命令一定是大写

filter表: 强调:主要和主机自身有关,真正负责主机防火墙的(过滤流入流出主机的数据包)。

filter表示iptables 默认使用的表。企业工作场景: 主机防火墙。

INPUT: 负责过滤所有目标地址是本机地址的数据包。通俗讲就是过滤进入主机的数据包。

FORWARD: 负责转发流经主机的数据包。起到转发的作用。和NAT 表关系很大,后面会详细介绍。LVS NAT模式。net.ipv4.ip_forward=0

基本的处理行为:

ACCEPT(接受)  DROP(丢弃)、REJECT(拒绝,)

比较: DROP 好于REJECT

命令行执行的规则,仅仅在内存里临时生效。

-A 添加(追加规则的最低部)

-I 插入(默认放在第一)

iptables -A INPUT -p tcp -s 10.0.0.0/8 --dport 22 -j DROP

禁止ping

iptables -A INPUT -p icmp --icmp-type 8 -i eth0 -s 0.0.0.0/0 -j DROP

禁止除了192.168.1.141之外的源地址:

iptables -A INPUT -p tcp   ! -s 192.168.1.141 --dport 22 -j DROP

端口范围

iptables -A INPUT -p tcp --sport 53 -j ACCEPT

iptable -A INPUT -p udp --dport 53 -j DROP

匹配指定端口之外的端口( ! 加在参数的前面)

iptables -A INPUT -p tcp    ! --dport  22

iptables -A INPUT -s  10.0.0.0/8

iptables -A INPUT  ! -s 10.0.0.0/8

端口范围(指定端口的格式)

iptables -A INPUT -p tcp --sport 22:80

iptables -A INPUT -p tcp  -s 10.0.0.0/0 -m multiport --dport 22,3306 -j DROP

 

iptables -A INPUT -i eth0 

iptables -A OUTPUT  -o eth0

 

根据状态:

-m state --state 

NEW: 新的连接

ESTABLISHED: 已建立的连接

RELATED: 正在启动新连接

INVALID: 非法或无法识别的连接

FTP服务是特殊的,需要配置状态连接

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

-m limit 限制模块

--limit  n/{second/minute/hour}

 

生产环境:

iptables -F

iptables -X

iptables -Z

iptables -A 

iptables -A INPUT -p tcp  -s 10.0.0.0/8 --dport 22 -j ACCEPT 

iptables -A INPUT -i lo -j  ACCEPT

iptables -A OUTPUT -o lo  -j  ACCEPT

iptables -P OUTPUT ACCEPT

iptables -P FORWARD DROP

iptables -P INPUT DROP

#允许合法的公司IP地址进入

iptables -A INPUT -s 10.0.0.0/24 -p  all -j ACCEPT  (加入公司自己的IP)

#开启对外提供服务的端口

iptables -A INPUT -p tcp  --dport 80 -j ACCEPT

iptables -A INPUT -p tcp --dport 443 -j ACCEPT

#icmp 是否禁止ping

iptables -A INPUT -p imcp  --icmp-type 8  -j DROP

#状态

iptables -A INPUT -m state --state  ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

 

 

linux 做nat地址转换提供上网功能:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.07

外网地址变化时:

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

端口映射(把外部ip及端口映射到内部ip及端口通过访问10.0.0.19:80 端口就可以访问到192.168.1.19:9000提供的web服务)

iptables -t nat -A PREROUTING -p tcp -d 10.0.0.19  --dport 80 -j DNAT --to-destination 192.168.1.19:9000

 

 

 

 

iptabes 其他限制规则:            

#防御太多DOS攻击连接,可以允许外网每个IP最多15个初始连接,超过的丢弃,第二条是在第一条的基础上允许已经建立的连接和子连接允许

iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 --connlimit-mask 32 -j DROP  (--connlimit-mask 32为主机掩码,32即为一个主机ip,也可以是网段)
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT

#抵御DDOS ,允许外网最多24个初始连接,然后服务器每秒新增12个,访问太多超过的丢弃,第二条是允许服务器内部每秒1个初始连接进行转发
iptables -A INPUT  -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT

#允许单个IP访问服务器的80端口的最大连接数为 20 

iptables -I INPUT -p tcp --dport 80 -m connlimit  --connlimit-above 20 -j REJECT 

 #对访问本机的22端口进行限制,每个ip每小时只能连接5次,超过的拒接,1小时候重新计算次数

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --rcheck --seconds 3600 --hitcount 5 -j DROP

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name SSHPOOL --set -j ACCEPT

 (上面recent规则只适用于默认规则为DROP中,如果要适用默认ACCEPT的规则,需要--set放前面 并且无-j ACCEPT)

iptables 常用企业案例:

1、linux 主机防火墙(表:filter)

2、局域网上网(nat  POSTROUTING)

iptables -t nat -A POSTROUTING -s  -o eth0 -j SNAT --to-source  10.10.10.10

3、端口映射(NAT PREROUTING)

iptables -t nat -A PREROUTING -d 118.234.12.24 -ptcp --dport 80 -j DNAT --to-destination 192.168.1.8:8080 

 

企业内部局域网