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四张表,五链,结构如下:

1.5- 流量包经过顺序



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

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

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

iptables技术入门的更多相关文章

  1. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  2. 赞一个 kindle电子书有最新的计算机图书可买了【Docker技术入门与实战】

    最近对docker这个比较感兴趣,找一个比较完整的书籍看看,在z.cn上找到了电子书,jd dangdang看来要加油啊 Docker技术入门与实战 [Kindle电子书] ~ 杨保华 戴王剑 曹亚仑 ...

  3. 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的基本架构和工作机理

    [Zigbee技术入门教程-02]一图读懂ZStack协议栈的基本架构和工作机理 广东职业技术学院  欧浩源  ohy3686@foxmail.com Z-Stack协议栈是一个基于任务轮询方式的操作 ...

  4. 【Zigbee技术入门教程-号外】基于Z-Stack协议栈的抢答系统

    [Zigbee技术入门教程-号外]基于Z-Stack协议栈的抢答系统 广东职业技术学院  欧浩源 一.引言    2017年全国职业院校技能大赛"物联网技术应用"赛项中任务三题2的 ...

  5. 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线

    [Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院  欧浩源 一.引言    在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...

  6. Docker技术入门与实战 第二版-学习笔记-10-Docker Machine 项目-2-driver

    1>使用的driver 1〉generic 使用带有SSH的现有VM/主机创建机器. 如果你使用的是机器不直接支持的provider,或者希望导入现有主机以允许Docker Machine进行管 ...

  7. 【Zigbee技术入门教程-02】一图读懂ZStack协议栈的核心思想与工作机理

    [Zigbee技术入门教程-02]一图读懂ZStack协议栈的核心思想与工作机理 广东职业技术学院  欧浩源   Z-Stack协议栈是一个基于任务轮询方式的操作系统,其任务调度和资源分配由操作系统抽 ...

  8. iptables 从入门到应用

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://powermichael.blog.51cto.com/12450987/1952 ...

  9. docker技术入门(2)

    接上一篇文章 [容器技术]Docker容器技术入门(一) 今天接着上次聊一聊有关Docker网络.数据存储相关的技术点 Docker网络模式 01 Dokcer 通过使用 Linux 桥接提供容器之间 ...

随机推荐

  1. React报错Failed prop type: Invalid prop `component` of type `object` supplied to `Route`, expected `function`

    引言 最近在忙毕业设计,博客也很久没更新了,毕业设计使用vue做了一个校园寻物网站,现在开始学Raect,记录一下自己遇到问题,react-redux的connect方法使得组件与Redux建立了联系 ...

  2. C#中? 和 ??的区别

    背景 最近在调试C#项目的时候,发现一个比较关于??的特殊用法,当时把我给惊到了,所以特意用这篇短短的笔记来记录一下我的解惑过程: 示例代码: showsomething(isNameNull ?? ...

  3. Codeforces_708_A

    http://codeforces.com/problemset/problem/708/A 贪心,先把前面连续的一串'a'排除,再向后知道找到第一个'a',注意特殊情况. #include<i ...

  4. 输入url地址到展示主页的过程

    过程 1.DNS解析 2.TCP连接 3.发送HTTP请求 4.服务器处理请求并返回HTTP报文 5.浏览器解析渲染页面 6.连接结束

  5. Liunx 上安装java

    linux系统的基本指令 http://www.cnblogs.com/sxdcgaq8080/p/7470796.html ===================================== ...

  6. 入侵检测基本准则(Basic principles of intrusion detection)【v1.0】

    所谓“入侵检测”,顾名思义,就是对入侵行为的发觉.他通过对计算机网络或计算机系统中若干关键点收集信息并对其进行分析,从中发现网络或系统中是否有违反安全策略的行为和被攻击的迹象.” 但实际上,所谓的“违 ...

  7. Apache缓存相关配置

    小编今天来总结下 apache的缓存模块相关信息 硬盘缓存:mod_disk_cache,依赖 mod_cache 模块 内存缓存:mod_mem_cache,依赖 mod_cache 模块 文件缓存 ...

  8. pytorch之 bulid_nn_with_2_method

    import torch import torch.nn.functional as F # replace following class code with an easy sequential ...

  9. Visual C# 2015调用SnmpSharpNet库实现简单的SNMP元素查询

    一开始调研发现有几个SNMP的库, 一个是net-SNMP,这个好像是linux用的多 一个是微软自己的WinSNMP,这个没有例子,不太好操作 一个是SnmpSharpNet,这个有些例子比较好, ...

  10. Linux系统下常见的数据盘分区丢失的问题以及对应的处理方法

    在修复数据前,您必须先对分区丢失的数据盘创建快照,在快照创建完成后再尝试修复.如果在修复过程中出现问题,您可以通过快照回滚将数据盘还原到修复之前的状态. 前提条件 在修复数据前,您必须先对分区丢失的数 ...