一, iptables 使用场景:
内网情况下使用; 在大并发的情况下不要开 iptables 否则影响性能
二, iptables 出现下面的问题:
在 yewufangwenbijiaoman/var/log/message 中出现 ip(nf)_conntrack: table full 使得企业访问较慢的解决方法:
- VIM /etc/sysctl.conf
- # 加大 ip_conntrack_max 值
- net.ipv4.ip_conntrack_max =393216
- net.ipv4.netfilter.ip_conntrack_max =393216# 降低 ip_conntrack timeout 时间
- net.ipv4.netfilter.ip_conntrack_tcp_timeout_established =300
- net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait =120
- net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait =60
- net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait =120
三, 安全优化
尽可能不给服务器分配外网 IP, 可以通过代理转发; 并发布不是特别大的外网 ip 环境, 尽量开启防火墙
四, iptables 简介
基于数据包过滤的防火墙工具, 主要工作在 osi 模型的二三四层(经过内核编译可以实现七层控制)
五, 基本名词介绍
四表: filter(INPUT,FORWARD,OUTPUT),NAT(OUTPUT,PREROUTING,POSTROUTING), MANGLE(五链),RAW
五链(要大写):INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
链 (chain) 是规则 (policy) 的容器
六, 详细介绍
filter 表: 主要和主机自身相关, 真正负责防火墙功能的(过滤流入流出主机的数据包).
INPUT: 负责过滤所有进入主机的数据包(最主要)
FORWARD: 负责流经主机的数据包
OUTPUT: 处理所有源地址都是本机地址的数据包(也就是主机发出去的数据包)
nat 表: 主要负责网络地址之间的转换, 包括来源和目的端口以及 ip(PREROUTING), 可以共享上网(POSTROUTING), 端口转换, 企业路由和网关
OUTPUT: 和从主机发出去的数据包有关, 改变数据包的目的地址
PREROUTING: 在数据包到达防火墙时进行路由判断之前的的规则, 作用是改变数据包的目的地址, 目的端口等
POSTROUTING: 离开防火墙时进行路由判断之后执行的规则, 作用是改变数据包的源地址和源端口
mangle: 路由标记(TTL,TOS,mark)....
七, iptables 的工作流程
采用的是数据包过滤的机制, 会对请求的数据包的包头数据进行分析, 按照规则从上到下匹配
小结: 防火墙是层层过滤的, 通过匹配上规则来允许或者组织数据包的走向, 默认规则是最后处理的.
八, iptables 表和链的工作流程图
总结: 在使用 nat 表的时候要注意和 nat 的 PREROUTING,filter 的 FORWARD 和 nat 的 POSTROUTING 一起使用
在使用 filter 的时候只是在 INPUT 链加以控制即可
九, 实战演练
(0), 查看防火墙:
iptables -L -n (-v -x)
iptables -L -n --line-numbers 带序号显示配合删除
无法启动 iptables 的解决(setup)
lsmod | egrep "nat | filter" 查看加载的内核文件
modprobe + 内核加载文件 可以添加内核加载文件
(1), 清理参数
iptables -F : 清除所有的防火墙规则
iptables -X [chain] : 删除自定义的链 iptables -N chain 新建自定义的链
iptables -Z: 对链计数器的清零
(2), 禁止规则
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP 禁止 SSH 远程登录
-t 指定表 -A 追加 -p 指定协议 --dport 指定目的端口 -j 采取的方式
掉 SSH 的处理方法: 下机房, 管理卡, 计划任务关防火墙,
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP 会造成找不到网页不会造成 404
(3), 添加规则
封 IP 实战演练:
首先要分析日志中的 ip 连接数:
awk '{print $1}' /opt/nginx/access.log | sort |uniq -c | sort -rn -k1
然后再封 ip
iptables -I INPUT -p tcp -s IP --dport 80 -j DROP 将此规则置顶
iptables -I INPUT 2 -p tcp -s IP --dport 8080 -j DROP 将此规则放到第二位
iptables -t filter -A INPUT -i eth0 -s 172.1.1.2 -j DROP 封 ip
禁止某个网段连入: 不管什么服务都连不进来
iptables -A INPUT -i eth0 -s 172.1.1.0/24 -j DROP
取消该网段连入
iptables -A INPUT -i eth0 !-s 172.1.1.0/24 -j DROP
封一下 ICMP 协议(不让 ping), 其他服务可以使用:
iptables -A INPUT -p icmp-type 8(any) -i eth0 !-s 172.1.1.2 -j DROP
更改 SSH 和 rootuankouzhihoude 防火墙操作
iptables -A INPUT -p tcp --dport 65535 ! -s 172.1.1.0/24 -j DROP
封掉 3306 端口
iptables -A INPUT -p tcp --dport 3306 -j DROP
匹配 DNS 端口: tcp&udp
- iptables -A INPUT -p tcp --sport 53
- iptables -A INPUT -p udp --sport 53
匹配指定端口以外的端口:
- iptables -A INPUT -p tcp --dport ! 22
- iptables -A INPUT -p tcp ! --doprt 22 -s 172.1.1.0/24 -j DROP
端口匹配范围:
- iptables -A INPUT -p tcp --sport 22:80
- iptables -A INPUT -p tcp -m mulport --dport 21,25,24,80 -j ACCEPT
匹配网络状态
-m state --state
NEW: 建立的或者将启动新的连接
ESTABLISHED: 已经建立的连接
RELATED: 正在启动新连接
INVALID: 非法连接
FTP
允许关联的状态包:
- iptables -A INPUT -m state --state ESTABLISHE,RELATED -j ACCEPT
- iptables -A OUTPUT -m state --state ESTABLISHE,RELATED -j ACCEPT
- -m limit
--limit n/{second/minute/hour}: 指定时间内的请求速度 "n" 为速率, 后面的时间分别是秒分时
--limit-burst [n]: 在同一时间允许通过的请求 "n" 位数字, 不能指定为默认的 5
限制每分钟请求和并发不超过 6 个
- iptables -A INPUT -s 172.1.1.0/24 -d 172.1.1.2 -p icmp --icmp-type 8 -m limit --limit 20/min --limit-burst 6 -j ACCEPT
- iptables -A OUTPUT -s 172.1.1.2 -d 172.1.1.0/24 -p icmp --icmp-type 0 -j ACCEPT
企业实战
企业及防火前实战模式: 逛公园模式和看电影模式
看电影模式:
(1)清理所有的防火墙规则
- iptables -F
- iptables -X
- iptables -Z
(2)设置 SSH 登录
iptables -A INPUT -p tcp --dport 65535 -s 172.1.1.0/24 -j ACCEPT
(3)允许本机 lo 通信机制
- iptables -A INPUT -i lo -j ACCEPT
- iptables -A OUTPUT -o lo -j ACCEPT
(4)设置默认的防火墙允许和禁止规则
- iptables -P OUTPUT ACCEPT
- iptables --policy FORWARD DROP
- iptables --policy INPUT DROP
(5)开启信任的网段
- iptables -A INPUT -s 172.1.1.1/24 -p all -j ACCEPT
- iptables -A INPUT -s 172.168.1.2/24 -p all -j ACCEPT
这边开启的信任包括: 办公室指定 ip,idc 内网 ip, 其他机房的 ip
(6)允许业务访问的端口开启
- iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- iptables -A INPUT -p icmp --icmp-type any -j ACCEPT(可以聚聚 ping 的)
(7)允许关联的状态包通过(web 服务不要使用 FTP 服务)
- iptables -A INPUT -m state --state ESTABLISHED,RELEATED -j ACCEPT
- iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
使用 nmap 测试开启的端口
nmap IP -p 1-65535
(8)永久保存配置
/etc/init.d/iptables save
(9)企业面试规则
自定义链, 处理 syn 攻击
- iptables -N syn-flood
- iptables -A INPUT -i eth0 -syn -j syn-flood
- iptabls -A syn-flood -m limit --limit 5000/s --limit-burst 200 -j RETURN
- iptables -A syn-flood DROP
自动封 IP 脚本(计划任务结合执行)
- #!/bin/sh
- /bin/netstat -na | grep ESTABLISHED | awk {print $5} |awk -F: '{print $1}' |sort |uniq -c |sort -rn | head -10| grep -v -E '192.168|127.0' |awk '{if ($2!=null && $1>4) {print $2}}' > /home/shell/dropip
- for i in $(cat /home/shell/dropip)
- do
- /sbin/iptables -I INPUT -s $i -j DROP
- echo "$i kill at `date`" >> /var/log/ddos.txt
- done
常用服务的 iptables 设置
- ##nagios 监控
- iptables -A INPUT -s 172.1.1.0/24 -p tcp --dport 5666 -j ACCEPT
- ##MySQL
- iptables -A INPUT -s 172.1.1.0/24 -p tcp --dport 3306 -j ACCEPT
- iptables -A INPUT -s 172.1.1.0/24 -p tcp --dport 3307 -j ACCEPT
- ###snmp
- iptables -A INPUT -s 172.1.1.0/24 -p UDP --dport 161 -j ACCEPT
- ##rsync
- iptables -A INPUT -s 171.0.0.1/24 -p tcp -m tcp --dport 873 -j ACCEPT
- ##nfs2049,portmap 111
- iptables -A INPUT -s 172.1.1.0/24 -p udp -m multiport --dport 111,892,2049 -j ACCEPT
- iptables -A INPUT -s 172.1.1.0/24 -p tcp -m multiport --dport 111,892,2049 -j ACCEPT
- ##icmp
- iptables -A INPUT -s 172.1.1.0/24 -p icmp -m icmp --icmp-type any -j ACCEPT
网关服务器配置:
需要具备的条件
(1), 物理条件是具备双网卡(eth0 和外网的网关要有, eth1 是内网且不具备网关)
(2), 网关服务器要能上网
(3), 开启转发功能. 修改 / etc/sysctl.conf 下的 net.ipv4.ip_forward = 1, 之后再 sysctrl -p 使得配置生效
(4),iptables 的 forward 链允许转发[iptables -P INPUT ACCEPT]
(5), 清空防火墙规则 iptables -F;iptables -P FORWARD ACCEPT
(6), 载入模块
先查看 lsmod |egrep ^ip
在导入
- modprobe ip_contrack
- modprobe ip_nat_ftp
- modprobe ipt_state
- modprobe ip_contrack_ftp
- modprobe iptable_filter
(7), 然后再网关服务器上执行
iptables -t nat -A POSTROUTING -s 172.1.1.0/24 -o eth0 -j SNAT --to-source 外网 IP(路由器内网 ip)
iptables -t nat -A POSTROUTING -s 172.1.1.0/24 -j MASQUERADE
(8), 访问外网映射到内网的服务器上
iptables -t nat -A PREROUTING -d 服务器内网 IP -p tcp --dport 80 -j DNAT --to-destination 内网 IP: 端口
iptables 的企业案例:
(1),Linux 主机防火墙(filter)
(2), 共享上网(nat postrouting)
(3),Web 地址和端口映射
(4),ip 的一对一映射
企业应用: 实现外网 ip(124.42.34.112)一对一映射到内网的 server(10.0.0.8)上
网关 ipeth0:124.42.60.109 eth1:10.0.0.254
首先在路由网关上绑定 124.42.34.112, 可以用别名的方式:
- iptables -t nat -A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8
- iptables -t nat -A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to-source 124.42.34.112
- iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -d 124.24.34.112 -j SNAT --to-source 10.0.0.254
映射多个外网 ip 上网:
- iptables -t nat -A POSTROUTING -s 10.0.0.0/255.255.255.0 -o eth0 -j SNAT 124.42.60.11 -124.42.60.16
- iptables -t NAT -A POSTROUTING -s 172.0.0.0/255.255.255.0 -o eth0 -j SNAT 124.42.60.103-124.42.60.106
来源: http://www.bubuko.com/infodetail-3097925.html