iptables 官方手册整理

本贴最后更新于 4177 天前,其中的信息可能已经事过境迁

目录:

1. 简介
2. 首先,什么是包过滤?
3. 快速入门指南
4. 数据包过滤流程
5. 具体如何使用Iptables命令实现过滤功能
6. 地址转换(NAT)
7. 排除建议
 
 
1. 简介
————————————————————————————————————————————————
读者们,大家好:
 
  在这里我们假设你已经有一定的IP地址、网络地址、子网掩码、路由、DNS基础知识。如果没有建议你先阅读一下官网的networking-concepts-HOWTO文档。官网地址为:www.netfilter.org
  当前我们的网络是不安全的。但问题是我们做网络限制,同时还需要提供快速、便利的网络通讯环境,而不是处于邪恶的目的。网络限制是一把双刃刀,但本文章并非解决这个问题。
  所以刀在手如何使用完全取决于你。我相信你会把这些工具用到合理的地方,并能很好地使用这些工具。而不是用于其他目的。
------------------------------------------------------------------------------------------------
 
2. 首先,什么是包过滤?
  包过滤是当一个数据包通过时,使用软件去查看包头信息并决定对该包的处理方式。你可以丢弃该数据包、接受该数据包亦或是其他更复杂的处理方式。
  在Linux中包过滤已经集成到内核中了,甚至还可以做一些数据包欺骗,但基本原则还是查看数据包头并决定处理方式。
------------------------------------------------------------------------------------------------
 
2.1 为什么我们需要包过滤?
  可控性、安全性、可监控性
  可控性:当你在局域网中使用Linux连接另一个网络时(如:互联网),你可以允许或拒绝特定类型的数据。例如:数据包都会包含目标地址,这样你就可以防止数据包进入某个特定的网络。再举个例子,我使用浏览器访问某个网站,在该网站上全是广告,此时浏览器会浪费我的时间去下载这些广告信息。这时我可以告知包过滤工具不允许该网站的数据包通过以解决这个问题。
  安全性:当你的Linux主机是复杂的互联网与有序的局域网之间的唯一主机时,你可以通过数据包限制让该Linux主机成为局域网与互联网之间的安全大门!比如:你可以会想允许所有的数据包进入互联网,但你会对从外网进来的死亡之ping感到忧虑。再如,你可能不希望有人可以telnet连接你的Linux主机,即使对方有密码也不可以。简单而言就是通过包过滤工具拒绝外网部分数据包进入本地。
  可监控性:当有些不正常的数据流量出现时,包过滤工具可以及时通知你是非常不错的注意!
------------------------------------------------------------------------------------------------
 
2.2 Linux系统如何过滤数据包
 
  Linux内核从1.1开始就已经有包过滤功能。第一代产品是1994年诞生于BSD系统的ipfw。Linux2.0增强了该功能;用户可以使用ipfwadm控制内核过滤规则。Linux2.2是用户工具变更为ipchains。最后在Linux2.4中用户工具被重写,新的工具为iptables。
  你需要一个支持netfilter架构的Linux内核:netfilter是在内核中的过滤架构,而且该架构可以使用插件动态加载。
  Linux防火墙主要包括两个部分:一部分为netfilter是内核过滤的基础架构,一部分为iptables是用户工具,用来编辑具体的过滤规则提供给内核netfilter。
  
  IPTABLES:该工具可以添加删除具体的过滤规则至内核包过滤表。这也意味着无论你如何设置防火墙规则,一旦机器重启所有的规则将丢失。
  永久保存规则:你设置的防火墙规则被保存在内核中,但重启会丢失。你可以使用iptables-save和iptables-restore脚本实现永久保存与恢复。
 
  备注:Linux防火墙所有的规则被保存在表中,默认Iptables防火墙有4个表:filter表(实现过滤功能),nat表(实现地址转换功能), mangle表(修改数据包的TOS、TTL等信息),raw表(实现数据包跟踪功能)
        
每个表中有多个数据链,而我们的具体规则被分门别类的链中。以下是每个表中的默认链:
filter表:INPUT链(入站数据过滤),FORWARD链(转发数据过滤),OUTPUT链(出站数据过滤)
nat表:PREROUTING链,POSTROUTING链,OUTPUT链
mangle表:PREROUTING链,POSTROUTING链,INPUT链,OUTPUT链,FORWARD链
raw表:OUTPUT链,PREROUTING链
------------------------------------------------------------------------------------------------
 
3. 快速入门指南
 
  很多朋友使用单线PPP(拨号)连接互联网,并且不希望任何人访问你的网络,防火墙可以做如下设置。
  首先加载过滤功能的模块:
#insmod  ip_conntrack
#insmod  ip_conntrack_ftp
以上两天命令也可以使用下面两天命令替换
#modprobe  ip_conntrack
#modprobe  ip_conntrack_ftp
 
  其次添加具体规则:
# iptables -N block 新建规则链
# iptables -A block -m state --state ESTABLISHED,RELATED -j ACCEPT 允许出站数据包的回应信息
# iptables -A block -m state --state NEW -i ! ppp0 -j ACCEPT 允许出站数据(自己可以访问外网)
# iptables -A block -j DROP 其余数据包全部丢弃
 
# iptables -A INPUT -j block 入站数据时读取block链中的过滤规则
# iptables -A FORWARD -j block 转发数据时读取block链中的过滤规则
------------------------------------------------------------------------------------------------
 
4. 数据包过滤流程
 
  内核的过滤表默认有三个链(链中具体存放过滤规则):INPUT,OUTPUT,FORWARD。
                          _____
 Incoming                /     \         Outgoing
       -->[Routing ]--->|FORWARD|------->
          [Decision]     \_____/        ^
               |                        |
               v                       ____
              ___                     /    \
             /   \                   |OUTPUT|
            |INPUT|                   \____/
             \___/                      ^
               |                        |
                ----> Local Process ----
 
  三个圈中表示上面的三个链,当数据包到达上图中的某个圈中时,链即刻根据规则判断数据包的处理方式,如果链中的某个规则说丢弃该包,该数据包将立即被丢弃;如果链中规则说接受,则数据包继续向后传输。
 
  每个链中包含有具体的规则,每个规则具体明确说明:什么数据包头信息做怎样的处理,如果你的数据包没有匹配第一个规则,则继续对比下一条规则。最后如果没有规则与你的数据包匹配,内核将读取链的默认规则。出于安全的考虑,默认规则一般会被设置为丢弃(DROP)。
 
  1.数据包过来时内核先查看目标地址:这一步被称为路由。
  2.如果该数据是发往本地的,则继续向下传递至INPUT链,当INPUT链允许该数据包,数据包进入本机等待程序接受数据。
  3.否则,如果内核未开启数据转发功能,被转发的数据包将被直接丢弃,如果内核开启了数据转发功能,该数据包将传递给FORWARD链以转发数据,数据进入目标网络接口(网卡接口);此时如果 FORWARD链允许数据包通过,该数据包继续向后传递。
  4.最后在本机的一个程序发送网络数据包时,数据包会立刻进入OUPUT链,根据具体规则决定允许或拒绝发送出去。
------------------------------------------------------------------------------------------------
 
5. 具体如何使用Iptables命令实现过滤功能
 
iptables有非常详尽的手册文档(man  iptalbes),以下是iptables可以实现的几种不同的操作,我们从filter过滤表开始。
 
  1. 创建新的自定义链 -N
  2. 删除自定义链 -X
  3. 改变默认策略 -P
  4. 显示链规则 -L
  5. 清空链中的规则 -F
  6. 将包过滤统计信息清零 -Z
 
如果在链中维护具体规则:
  1. 追加新的规则 -A
  2. 插入新的规则 -I
  3. 替换旧的规则 -R
  4. 删除旧的规则 -D
------------------------------------------------------------------------------------------------
 
5.1 操作单条规则
  这是最基本的包过滤操作。通常你需要使用-A或-D命令选项,有时你还会使用到-I与-R命令选项。
  每条规则需要指定匹配条件以及匹配后的处理方式(ACCEPT允许,DROP丢弃,REJECT拒绝,LOG日志等),如:你可能希望丢弃素有本地回环(127.0.0.1)的ICMP数据包,这样我们的匹配条件是:ICMP协议并且源地址是127.0.0.1 匹配后做DROP处理。
  127.0.0.1是本地回环接口,即使你没有物理网卡,该接口一样存在。你可以使用ping命令产生这类数据包。
 
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=21.9 ms
 
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 21.966/21.966/21.966/0.000 ms
 
 
# iptables -A INPUT -s 127.0.0.1 -p icmp -j DROP 添加一条规则
# ping -c 1 127.0.0.1
PING 127.0.0.1 (127.0.0.1): 56 data bytes
 
--- 127.0.0.1 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
 
  你可以看到第一次ping是成功的(-c  1 说明仅ping一次),然后我们追加了一条规则到INPUT链,该规则指定从127.0.0.1发送的ICMP协议的数据包将被丢弃。第二次再执行ping命令所有的数据100%丢失。
 
  我们有两种方式可以删除规则,首先我们知道INPUT链中只有一条规则,我们可以使用编号删除:
#iptables  -D  INPUT  1 删除INPUT链中的第一条规则
  第二种方法类似与-A选项,使用-D替换-A。当你的规则比较复杂并搞不清编号时可以使用这种方式:
#iptables  -D  INPUT  -s  127.0.0.1  -p  icmp  -j  DROP
------------------------------------------------------------------------------------------------
 
 
5.2 特定过滤规则
 
  上面我们已经看到可以使用-p指定协议,-s指定源地址,但还有很多可以用来过滤的条件匹配符。下面我们分别介绍:
 
  源地址与目标地址
  源地址(-s,--source或--src),目标地址(-d,--destination或--dst)有四种使用方式:最常用的是使用名称,比如"localhost"或者"http://www.kernel.org"。第二种方法是使用IP地址如"127.0.0.1"。第三四种方法可以匹配IP地址区域,如"199.95.207.0/24"或"199.95.207.0/255.255.255.0"。它们都可以匹配199.95.207.0到199.95.207地址可以使用0/0匹配所有地址。
# iptables -A INPUT -s 0/0 -j DROP 拒绝所有源地址访问本机
 
  取反匹配
  很多标签"-s","-d"等都可以在后面添加"!"以表示否定匹配,如"-s ! localhost"将匹配所有非本地源地址。
 
  协议匹配
  匹配协议可以使用-p标签,协议的指定可以使用数字编号(如果你知道协议的编号)或使用名称(如"TCP","UDP","ICMP"等)。协议名称前可以添加"!"如"-p  ! TCP"匹配所有非TCP协议数据包。
 
  接口匹配
  "-i(--in-interface)"和"-o(--out-interface)"匹配指定的接口。接口是真实的物理网卡接口,-i(数据包从哪个网卡进来的),-o(数据从哪个网卡出去的)。你可以使用ifconfig命令查看哪些接口是开启的。
 
  注意:在INPUT链不可以使用-o选项,因为入站的数据不走出站接口。所以在INPUT链中的-o规则将无法匹配任何数据。
        同理,在OUTPUT链中不可以使用-i选项。
 
  数据段匹配
  很多数据包因为太大无法一次完成数据的传输。此时数据包将被分割为数据片段再发送出去。接收端接受完数据后将把这些数据片段重新组合成完整的数据包。
  但问题在于当数据被分割后,只有前面的初始数据片段包含全部的数据头部信息(IP,TCP,UDP,ICMP等),后续的数据片段仅包含数据包头部信息的一部分信息。这时去再检查后续数据片段的头部信息是不可能的。
  当然,如果你想匹配第二个及后面被分片的数据,可以使用"-f"选项。
# iptables -A OUTPUT -f -d 192.168.1.1 -j DROP 丢弃发送至192.168.1.1的所有数据以及分片数据
 
  扩展iptables规则
  iptables有很好的可扩展性,也就是说内核架构与iptables工具都可以添加扩展功能。
  内核功能扩展一般放在内核模块子目录中:/lib/modules/2.6.32-220.el6.i686/kernel/net/netfilter(这里以CentOS6.2为例)。这些模块在你使用iptables时会自动加载。
  
  mac
  该模块需要使用"-m  mac"选项启用,这对应过滤进站数据包的源MAC地址很用帮助。
#iptables  -I  INPUT  -m  mac  --mac-source  00:60:08:91:CC:B7  -j  REJECT 拒绝MAC地址为00:60:08:91:CC:B7的数据包进入
 
  limit
  该模块需要使用"-m  limit"选项启用,该功能对限制网速很有效。
#iptables -A OUTPUT  -p  tcp  -m  limit  --limit  100/s  -j ACCEPT  每秒包个数100以内将允许发送
#iptables -P OUTPUT  REJECT 默认拒绝所有
  说明:以上两天可以实现,当每秒包个数大于100时,拒绝所有连接。
 
  应用实例
Syn-flood protection:
 
 # iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
Furtive port scanner:
 
 # iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
Ping of death:
 
 # iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
 
 
  状态匹配
  该模块需要使用"-m  state"选项启用,数据包的状态包括:NEW,ESTABLISHED,RELATED,INVALID
  NEW:创建连接的数据包
  ESTABLISHED:通过已经创建的连接通道传输的数据包
  RELATED:与已经创建的连接相关的数据包,如ICMP错误数据包
  INVALID:无法识别的数据包
#iptables -A  INPUT  -m  state  --state  NEW  -j  DROP   拒绝进站的连接请求(外网无法访问本机)
#iptables -A  INPUT  -m  state  --state  RESTABLISHED,RELATED  -j  ACCEPT   允许外网数据对本机的回应信息
#iptables -P  OUTPUT  ACCEPT 允许访问外网
------------------------------------------------------------------------------------------------
 
6. 地址转换(NAT)
 
[  ]
   |>>> [Internet]  >>>>  (www.google.com) 
         | [  ]
   v
                           v
 _______________________
[   eth0:202.106.22.31 ]
[         网关 ]
[____eth1:192.168.1.1___]
   |
   |
   v
   v
       [   ]  >>> (PC:192.168.1.200)
       [ 交换机 ]  >>> (PC:192.168.1.201)
       [ ]  >>> (PC:192.168.1.202)
 
  上图中局域网(192.168.1.0/24)通过交换机与公司网关连通在一起,网关与互联网可以实现通讯。现在我们使用iptables的SNAT功能实现内网所有主机上网。
  实现步骤:
  1. 开启网关路由功能(路由器就有该功能,如果是Linux软路由可以使用:#echo "1" > /proc/sys/net/ipv4/ip_forward命令开启)
  2. 设置iptables的SNAT功能:
#iptables  -t  nat  -A  POSTROUTING  -s  192.168.1.0/24  -o  eth0  -j  SNAT  --to-source  202.106.22.31
 
  上图中如果需要实现通过在外网任意主机通过访问公司网关IP地址:202.106.22.31,即可访问位于公司内部192.168.1.200上的Web服务器,我们可以使用iptables的DNAT功能实现。
  实现步骤:
  1. 开启网关路由功能
  2. 设置iptables的DNAT功能:
#iptables  -t  nat  -A  PREROUTING  -i  eth0  -d  202.106.22.31  --dport  80  -j  DNAT --to-destination  192.168.1.200
 
 
7. 排除建议
  1.注意过滤规则的顺序,如果规则的第一条拒绝所有tcp连接,第二条允许192.168.1.1访问本机的tcp连接,则第二条将无效。
#iptables  -A  INPUT  -p  tcp  -j  DROP
#iptables  -A  INPUT  -p  tcp  -s  192.168.1.1  -j  ACCEPT
  以上两条规则由于第一条规则已经丢弃所有的tcp数据包,所以不会再匹配第二条规则。
  2.设置完规则后未保存,导致重启后所有规则丢失。解决方法:可以使用iptables-save,或service  iptables  save实现永久保存
#iptables-save > /etc/sysconfig/iptables
#service iptables  save
  以上以CentOS为例,两天命令任选其一即可永久保存。
  3.无效的规则及时删除,否则影响效率。
  4.匹配端口号时必须指定协议,否则会报错。
  5.公司有FTP服务器时,提前加载ftp模块:#modprobe  ip_nat_ftp
转自:http://my.oschina.net/u/945017/blog/107791

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
An
这个人很懒,什么都没有留下。

推荐标签 标签

  • 安装

    你若安好,便是晴天。

    131 引用 • 1184 回帖 • 1 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖 • 2 关注
  • Google

    Google(Google Inc.,NASDAQ:GOOG)是一家美国上市公司(公有股份公司),于 1998 年 9 月 7 日以私有股份公司的形式创立,设计并管理一个互联网搜索引擎。Google 公司的总部称作“Googleplex”,它位于加利福尼亚山景城。Google 目前被公认为是全球规模最大的搜索引擎,它提供了简单易用的免费服务。不作恶(Don't be evil)是谷歌公司的一项非正式的公司口号。

    49 引用 • 192 回帖 • 1 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 526 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    7 引用 • 30 回帖 • 420 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    104 引用 • 126 回帖 • 434 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 202 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 31 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 401 关注
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 1 关注
  • Netty

    Netty 是一个基于 NIO 的客户端-服务器编程框架,使用 Netty 可以让你快速、简单地开发出一个可维护、高性能的网络应用,例如实现了某种协议的客户、服务端应用。

    49 引用 • 33 回帖 • 21 关注
  • HHKB

    HHKB 是富士通的 Happy Hacking 系列电容键盘。电容键盘即无接点静电电容式键盘(Capacitive Keyboard)。

    5 引用 • 74 回帖 • 445 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 458 关注
  • OnlyOffice
    4 引用 • 15 关注
  • 黑曜石

    黑曜石是一款强大的知识库工具,支持本地 Markdown 文件编辑,支持双向链接和关系图。

    A second brain, for you, forever.

    10 引用 • 88 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    942 引用 • 1459 回帖 • 96 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 617 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    180 引用 • 400 回帖
  • 反馈

    Communication channel for makers and users.

    123 引用 • 908 回帖 • 221 关注
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 364 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    20 引用 • 23 回帖 • 717 关注
  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 619 关注
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 605 关注