1- 概述

___ netfilter/iptables: IP 信息包过滤系统,实际由两个组件netfilter和iptable组成。可以对流入和流出服务器的数据包进行很惊喜的控制。主要工作在OSI七层的二、三、四层,也可以支持七层控制(squid代理+iptables).

安全优化建议:

  1. 尽可能不给服务器配外网IP,可以通过代理转发。
  2. 大并发情况写不能开iptables,影响性能,使用硬件防火墙。

1.1- netfiler/iptables关系:

  1. netfilter组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包和过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
  2. iptables组件试试一种工具,也称为用户空间(userspace),它使插入、喜欢和除去信息包过滤表中的规则变得容易。

1.2- iptables链表

___ iptables是基于内核的防火墙,功能非常强大。内置了filter,nat和mangle,raw四张表。所有规则配置后,立即生效,不需要重启服务。

  1. filter负责过滤数据包,包括规则链有:input, output,forward。 主要和主机自身有关,真正负责主机防火墙的功能。
  2. natS涉及网络地址转换,包括规则链有: prerouting,postrouting和output
  3. mangle主要应用在修改数据包内容上,用来做流量整形,给数据包打标识,规则链有: input,output,nat,postrouting,prerouting
  4. raw 用于处理异常,一般使用不到,包括规则链有:prerouting,output。

1.3- 五个链

  1. input: 匹配目标ip是本机的数据包
  2. output: 出口数据包,一般不在此链上做配置
  3. forward: 匹配流经本机的数据包
  4. prerouting:用来修改目的的地址,用来做DNAT。如:把内网中的80端口映射到路由器外网端口上
  5. postrouting:用来修改源地址用来做SNAT。 如: 内网通过路由器NAT转换功能实现通过一个公网地址上网

1.4- 总结

iptables四张表,五链,结构如下:

iptables技术入门-LMLPHP

1.5- 流量包经过顺序

iptables技术入门-LMLPHP

总结:整体数据包分为两类:

  1. 发给防火墙本身的数据包
  2. 需要经过防火墙的软件包

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

注意:

  1. 不指定表名时,默认表示filter表
  2. 不指定链名时,默认表示该表内所有链
  3. 除非设计链规则的缺省策略,否则需要知道匹配条件

1.4- 语法总结

iptables技术入门-LMLPHP

2- 案例

2.1- 追加规则

-A <链名>  APPEND, 追加一条规则(放到最后)
iptables -t filter -A INPUT -j DROP #拒绝所有人访问服务器,在filter表的INPUT链里追加一条规则【作为最后一条规则】
##匹配所有访问本机IP的数据包,匹配到的丢弃 iptables -D INPUT 1 #按号码匹配(删除filter表INPUT链的第一条规则)

注意:

  1. 若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
  2. 按号码匹配删除时,确保规则号码<= 已有规则数,否则报错
  3. 按内容匹配删除时,确保规则存在,否则报错。

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- 总结

  1. 命令行执行规则:仅仅在内存里临时生效。 iptables save [保存配置]

  2. 基本处理行为: 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
05-21 17:34