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 的表又是链的容器
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
企业内部局域网