1- 概述
___ netfilter/iptables: IP 信息包过滤系统,实际由两个组件netfilter和iptable组成。可以对流入和流出服务器的数据包进行很惊喜的控制。主要工作在OSI七层的二、三、四层,也可以支持七层控制(squid代理+iptables).
安全优化建议:
- 尽可能不给服务器配外网IP,可以通过代理转发。
- 大并发情况写不能开iptables,影响性能,使用硬件防火墙。
1.1- netfiler/iptables关系:
- netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包和过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
- iptables组件试试一种工具,也称为用户空间(userspace),它使插入、喜欢和除去信息包过滤表中的规则变得容易。
1.2- iptables链表
___ iptables是基于内核的防火墙,功能非常强大。内置了filter,nat和mangle,raw四张表。所有规则配置后,立即生效,不需要重启服务。
- filter负责过滤数据包,包括规则链有:input, output,forward。 主要和主机自身有关,真正负责主机防火墙的功能。
- natS涉及网络地址转换,包括规则链有: prerouting,postrouting和output
- mangle主要应用在修改数据包内容上,用来做流量整形,给数据包打标识,规则链有: input,output,nat,postrouting,prerouting
- raw 用于处理异常,一般使用不到,包括规则链有:prerouting,output。
1.3- 五个链
- input: 匹配目标ip是本机的数据包
- output: 出口数据包,一般不在此链上做配置
- forward: 匹配流经本机的数据包
- prerouting:用来修改目的的地址,用来做DNAT。如:把内网中的80端口映射到路由器外网端口上
- postrouting:用来修改源地址用来做SNAT。 如: 内网通过路由器NAT转换功能实现通过一个公网地址上网
1.4- 总结
iptables四张表,五链,结构如下:
1.5- 流量包经过顺序
总结:整体数据包分为两类:
- 发给防火墙本身的数据包
- 需要经过防火墙的软件包
1.6- 顺序
表间是优先顺序:
raw > mangle > nat > filter
链间的匹配顺序:
入站顺序:PREROUTING , INPUT
出站顺序:OUTPUT POSTROUTING
转发数据:PREROUTING , FORWARD , POSTROUTING
链内的匹配顺序:
1. 自上而下按顺序依次进行检查,找到相匹配的规则即停止(log选项表示记录相关日志)
2. 若在该链内找不到相匹配的规则,则该链的默认策略处理(未修改情况下,默认策略为允许)
2- 配置
1.1- 配置文件
配置文件位置:
ls /etc/sysconfig/iptables
/etc/sysconfig/iptables
1.2- 启动服务:
/etc/init.d/iptables start
chkconfig --list iptables ##开机启动
1.3- 命令语法格式
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
使用方法:
iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配到后的动作]
操作命令:
-A 、 -I 、 -D 、 -P 、 -F
查看命令:
-[vnx]L
注意:
- 不指定表名时,默认表示filter表
- 不指定链名时,默认表示该表内所有链
- 除非设计链规则的缺省策略,否则需要知道匹配条件
1.4- 语法总结
2- 案例
2.1- 追加规则
-A <链名> APPEND, 追加一条规则(放到最后)
iptables -t filter -A INPUT -j DROP #拒绝所有人访问服务器,在filter表的INPUT链里追加一条规则【作为最后一条规则】
##匹配所有访问本机IP的数据包,匹配到的丢弃
iptables -D INPUT 1 #按号码匹配(删除filter表INPUT链的第一条规则)
注意:
- 若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
- 按号码匹配删除时,确保规则号码<= 已有规则数,否则报错
- 按内容匹配删除时,确保规则存在,否则报错。
2.2- 设置默认规则
-P <链名> <动作> POLICY, 设置某个链的默认规则
iptables -P INPUT DROP #设置filter链的默认规则是DROP
2.3- 清空规则
-F [链名] # FLUSH, 清空规则 或者:
iptables -F INPUT #清除INPUT链上的规则
iptables -F #清除filter表中所有链的规则
iptables --flush
iptables -X #删除用户自定义的链 【iptables --detele-chain】
iptables -Z #链的记数器清零。 【iptables --zero 】
注意:
-F 仅仅清空链中的规则,并不影响-P 设置的默认规则。
-P 设置了DROP后,使用-F 要小心
2.4- 查看规则
-L [链名] # LIST,列出规则
v: 显示详细信息,包括每条规则的匹配包数量和匹配字节数
x: 在v的基础上,禁止自动单位换算(K,M)
n: 只显示IP地址和端口,不显示域名和服务名称
例如:
iptables -L #粗略列出filter表所有链及所有规则
iptables -t nat -vnL # 详细列出nat表所有链的所有规则,只显示ip和端口
iptables -t nat -vnxL PREROUTING #详细列出nat表PREROUTING 链所有规则以及详细数字
PS: 【 -Ln 会报错, 应该写 -nL 】
2.5- 匹配条件
1. 流入、流出端口(-i、-o)
2. 源、目的地址 (-s, -d )
3. 协议类型 (-p)
4. 源、目的端口( --sport、 --dport) [ 可以是个别端口,或者端口范围 ]
例如:
-i eth0 #匹配从eth0接口进来
-i ppp0 #匹配从ppp0 进来
-o eth0 #匹配数据从eth0流出
-o ppp0 #匹配数据从eth0流出
案例: iptables -t nat -o eth0 <条件> <动作>
-p <匹配协议类型> [ TCP ,UDP,ICMP等,或者空]
-p tcp
-p udp
-p icmp --icmp-type 8 [ ping: 8 pong: 0 ]
--sport 1000 #源端口是1000的数据包
--sport 1000:3000 #源端口是1000到3000的数据包【含1000,3000】
--sport :3000 #源端口是3000以下的数据包 【含3000】
--sport 1000: #源端口是1000以上的数据包 【含1000】
--dport 80 #目的端口是80的数据包
--dport 6000:8000 #目端口是6000-8000的数据包
--dport :3000 #目的端口是3000以下的数据包【含3000】
--dport 1000: #目的端口是1000以下的数据包
注意: --sport 和 --dport 必须配合-p参数使用
-p udp --dport 53 #匹配网络中目的端口是53的UDP协议数据包
-s 10.0.0.0/24 -d 192.168.10.0/16 #匹配来自10.0.0.0/24 去往192.168.10.0/16的所有数据包
-s 192.168.1.1 -d www.demo.com -p tcp --dport 80 #匹配来自192.168.1.1 ,去往www.demo.com的80端口的TCP协议数据包
2.6- 目标动作
ACCETP #接收
DROP #丢弃,不给对端任何回应
REJECT #拒绝,拒绝后,给对端一个回应
SNAT #源地址转换
DNAT #目的地址转换
MASQUERADE #伪装一个IP地址
用法:
-j SNAT --to IP [-IP][:端口-端口] (nat表的POSTROUTING链)
# 源地址转换,支持转换为单ip,也支持转换ip为地址池(一组连续的ip地址)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 10.0.0.1-10.0.0.10
-j DNAT --to IP [-IP][:端口-端口] (nat表的PREROUTING链)
# 目的地址转换,支持转换为单IP,或者ip地址池
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.1.1
#把从eth0进来的要访问TCP 80端口的数据包目的地址改为192.168.1.1
-j MASQUERADE #动态源地址转换(动态ip的情况下使用)
iptables -t nat -A POSTROUING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
#将源地址是192.168.0.0/24的数据进行地址伪装,转换成eth0的ip地址。eth0为路由器外网出口IP地址
附加模块:
state #按包状态匹配
mac #按来源mac匹配
limit #按包速率匹配
multiport #多端口匹配
-m state --state <状态>
#状态: NEW : 有别于tcp的syn
RELATED : 衍生态,与conntrack关联(ftp)
ESTABLISHED : 连接态
INVALID : 不能识别属于哪个连接或者没有任何状态。
-m mac --mac-source MAC #匹配某个MAC地址
例如:
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
#阻断来自某mac地址的数据包通过本机
【注意: 报文经过路由器后,数据包源的mac信息会被替换,所以在路由后的iptables中使用mac模块没有意义。
-m limit --limit <速率> [--burst 缓冲数量] #用一定速率匹配数据包
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
# 50/s表示1秒转发50个数据,后面要配合一条DROP规则
-m multiport <--sports|-dports|--ports> 端口1[,端口2,……,端口n]
#一次性匹配多个端口,可以区分源端口,目的端口或者不确定端口,必须与-p 参数一起使用
例如:
iptables -A INPUT -p tcp -m multiport --dports 21,22,23,80 -j ACCEPT
3- 高级用法
3.1- 总结
命令行执行规则:仅仅在内存里临时生效。 iptables save [保存配置]
基本处理行为: ACCEPT DROP REJECT 【 DROP 好于 REJECT 】
-A : 添加规则到指定链的结尾,最后一条
-I : 添加规则到指定链的开头,第一条
3.2- 用法
iptables -D INPUT -i ethO -s 10.0.0.0/24 -j DROP #完整策略规则删除)
iptables -D INPUT 1 (根据策略中链的序号删除)
iptables -t filter -A INPUT -i eth0 -s !10.0.0.1 -j DROP
# 禁止不是10.0.0.1进入的访问
iptables -t filter -I INPUT -i eth0 -s !10.0.0.0/24 -j DROP
# 禁止不是10.0.0.0/24网段进入的访问
iptables -p tcp --dport !22 # 22之外的端口
iptables -A INPUT -p icmp --icpm-type any -j ACCEPT
允许关联状态包:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3.3- 配置一个企业防火墙
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp --dport 52113 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -o lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables save #或者 iptables-save < /etc/sysconfig/iptables
[cat /etc/sysconfig/iptables]
3.4- 生产维护
vim /etc/sysconfig/iptables
加入: -A INPUT -p tcp -m --dport 873 -j ACCEPT
/etc/init.d/iptables reload
3.5- SNAT案例
局域网共享上网:
linux 网关B执行:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.19
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
3.6- DNAT
iptables -t nat -A PREROUTING -d 10.0.0.1 -p tcp --dport -j DNAT --to-destination 192.168.1.10:9000
#把访问10.0.0.1:80转换为实际192.168.1.10:9000.
3.7- 内外网ip一对一映射
环境:
网关ip: eth0: 10.0.0.1 eth1: 192.168.0.1
外网路由: 10.0.0.10 <---->内网客户端 192.168.0.10
配置:
-A PREROUTING -d 10.0.0.10 -j DNAT --to -destination 192.168.0.10 #外网访问10.0.0.10 修改为访问192.168.0.10
-A POSTROUTING -s 192.168.0.10 -o eth0 -j SNAT --to-source 10.0.0.10 # 192.168.0.10访问外部修改改为由10.0.0.10访问
3.8- 内核优化
vim /etc/sysctl.conf
net.ipv4.tcp_keepalive_time = 600
net.ipv4.ip_local_port_range = 4000 65000
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.route.gc_timeout = 100
net.ipv4.tcp_syn_retires = 1
net.ipv4.tcp_synack_retrices = 1
sysctl -p
3.9- 故障
___ dmesg提示ip_conntrack: table full, dropping packet的错误提示
以下参数是对iptables的优化,防火墙不开会提示,可以忽略。
net.ipv4.ip_conntrack_max = 250000
net.ipv4.netfilter.ip_conntrack_max = 250000
net.ipv4.netfilter.ip_connectrack_tcp_timeout_established = 180
net.ipv4.netfilter.ip_connectrack_tcp_timeout_wait = 120
net.ipv4.netfilter.ip_connectrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_connectrack_tcp_timeout_fin_wait = 120
3.10- 需要模块
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ip_nat_state
检查:
lsmod |egrep "nat|filter"
nf_nat_ftp 3507 0
nf_conntrack_ftp 12913 1 nf_nat_ftp
iptable_nat 6158 0