iptables 详解

来源:iptables基础,绝对的基础 作者:李忠宪 shane@mail.spps.tp.edu.tw

iptables 指令
语法:
iptables [-t table] command [match] [-j target/jump]

-t 参数用来指定规则表, 内建的规则有三个, 分别是: nat mangle 和 filter, 当未指
定规则表时, 则一律视为是 filter. 各个规则表的功能如下:

nat
    此规则表拥有 Prerouting 和 postrouting 两个规则链, 主要功能为进行一对一,
一对多, 多对多等网址转译工作( SNAT, DNAT ), 由于转译工作的特性, 需进行目的地网
址转译的封包, 就不需要进行来源网址转译, 反之亦然, 因此为了提升改写封包的效率,
在防火墙运作时, 每个封包只会经过这个规则表一次. 如果我们把封包过滤的规则定义在
这个数据表里, 将会造成无法对同一封包进行多次匹配, 因此这个规则表除了作网址转译
外, 请不要做其他用途.

[separator]


mangle
    此规则表拥有 Prerouting, FORWARD 和 postrouting 三个规则链. 除了进行网址转
译工作会改写封包外, 在某些特殊应用可能也必须去改写封包 ( TTL, TOS ) 或者是设定
MARK ( 将封包作记号, 以便进行后续的过滤 ), 这时就必须将这些工作定义在 mangle
规则表中, 但是这种情况不常使用.

filter
    此规则表是预设规则表, 拥有 INPUT, FORWARD 和 OUTPUT 三个规则链, 这个规则链
是用来进行封包过滤的处理动作 ( 例如: DROP, LOG, ACCEPT 或 REJECT ), 我们会将基
本规则都建立在此规则表中.

常用命令列表:
命令 -A, --append
范例 iptables -A INPUT ...
说明 新增规则到某个规则链中, 该规则将会成为规则链中的最后一条规则.

命令 -D, --delete
范例 iptables -D INPUT --dport 80 -j DROP
     iptables -D INPUT 1
说明 从某个规则链中删除一条规则, 可以输入完整规则, 或直接指定规则编号加以删除.

命令 -R, --replace
范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
说明 取代现行规则, 规则被取代后并不会改变顺序.

命令 -I, --insert
范例 iptables -I INPUT 1 --dport 80 -j ACCEPT
说明 插入一条规则, 原本该位置上的规则将会往后移动一个顺位.

命令 -L, --list
范例 iptables -L input
说明 列出某规则链中的所有规则.

命令 -F, -flush
范例 iptables -F INPUT
说明 删除某规则链中的所有规则.

命令 -Z, -zero
范例 iptables -Z INPUT
说明 将封包计数器归零. 封包计数器是用来计算同一封包出现次数, 是过滤阻断式攻击
     不可或缺的工具.

命令 -N, --new-chain
范例 iptables -N allowed
说明 定义新的规则链.

命令 -X, -delete-chain
范例 iptables -X allowed
说明 删除某个规则链.

命令 -P, --policy
范例 iptables -P INPUT DROP
说明 定义过滤政策. 也就是未符合过滤条件之封包, 预设的处理方式.

命令 -E, --rename-chani
范例 iptables -E allowed disallowed
说明 修改某自订规则链的名称.

<常用封包匹配参数>

参数 -p, --protocol
范例 iptables -A INPUT -P tcp
说明 指出要匹配的协议, 可以使用 ! 运算符进行反向匹配, 例如: -p ! tcp , 意思是
     匹配除 tcp 以外的其它类型, 包含 udp, icmp all ...等. 如果要匹配所有类型,
     则可以使用 all 关键词, 例如: -p all.

参数 -s, --src, --source
范例 iptables -A INPUT -s 192.168.1.1
说明 匹配源地址或地址范围, 以确定允许或拒绝封包通过过滤器, 可以匹配单机或网络,
     匹配网络时请用数字来屏蔽, 例如: -s 192.168.0.0/24 , 匹配 IP 时也可以使用
     ! 运算符进行反向匹配, 例如: -s ! 192.168.0.0/24 .

参数 -d, --dst, --destination
范例 iptables -A INPUT -d 192.168.1.1
说明 用来匹配封包的目的地 IP, 设定方式同上.

参数 -i, --in-interface
范例 iptables -A INPUT -i eth0
说明 用来匹配封包是从哪片网卡进入, 可以使用通配字符 + 来做大范围比对, 例如: -i
     eth+ 表示所有的 ethernet 网卡, 也可以使用 ! 运算符进行反向匹配, 例如: -i
     ! eth0. 指定一个目前不存在的接口是完全合法的. 规则直到此接口工作时才起作
     用,这种指定对于 PPP 及其类似的连接是非常有用的. 该选项只有对 INPUT FORWARD
     和 PREROUTING 链是合法的. 此参数忽略时, 默认符合所有接口.


参数 -o, --out-interface
范例 iptables -A FORWARD -o eth0
说明 用来匹配封包要从哪片网卡送出, 设定方式同上.

参数 --sport, --source-port
范例 iptables -A INPUT -p tcp --sport 22
说明 用来匹配封包的来源端口号, 可以匹配单一端口号, 或是一个范围, 例如:
     --sport 22:80 表示从 22 到 80 之间的端口号都算是符合条件, 如果要匹配不连
     续的多个端口号, 则必须使用 --multiport 参数, 匹配端口号时, 可以使用 ! 运
     算符进行反向匹配.

参数 --dport, --source-port
范例 iptables -A INPUT -p tcp --sport 22
说明 用来匹配封包的来源端口好, 设定方式同上.

参数 --tcp-flags
范例 iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
说明 匹配 TCP 封包的状态标志, 参数分为两个部分, 第一个部分列举出想匹配的标志,
     第二部分则列举前述标志中哪些被设定, 未被列举的标志必须是空的. TCP 状态标
     志包括 : SYN(同步), ACK(应答), FIN(结束), RST(重设), URG(紧急), PSH(强迫
     推送)等均可使用于参数中, 除此之外还可以使用关键词 ALL 和 NONE 进行匹配.
     匹配标志时, 可以使用 ! 运算符进行反向匹配.

参数 --syn
范例 iptables -p tcp --syn
说明 用来匹配仅设置了 SYN 位的 TCP 封包, 清除了 ACK, FIN 位的 TCP 封包. 这些封
     包表示请求初始化的 TCP 连接. 阻止从接口来的这样的包将会阻止外来的 TCP 连
     接请求. 但输出的 TCP 连接请求将不受影响. 这个参数仅仅当协议类型设置为 TCP
     时才能使用. 此参数前可以使用 ! 运算符匹配已存在连接的返回包. 一般用于限制
     网络流量, 即只允许现有的, 向外发送的连接所返回的包. 与 iptables -p tcp -
     -tcp-flags SYN,FIN,ACK SYN 的作用完全相同.

参数 -m multiport --source-port
范例 iptables -A INPUT -p tcp -m multiport --source-port 22,53,80,110
说明 用来匹配不连续的多个来源端口号, 一次最多可以匹配 15 个端口号, 可以使用 !
     运算符进行反向匹配.

参数 -m multiport --destination-port
范例 iptables -A INPUT -p tcp -m multiport --destination-port 22,53,80,110
说明 用来匹配不连续的多个目的地端口号, 设定方式同上.

参数 -m multiport --port
范例 iptables -A INPUT -p tcp -m multiport --port 22,53,80,110
说明 这个参数比较特殊, 用来匹配来源端口号和目的地端口号相同的封包, 设定方式同
     上. 注意: 在本范例中, 如果来源端口号为 80 但目的地端口号为 110, 这种封包
     并不算符合条件.

参数 --icmp-type
范例 iptables -A INPUT -p icmp --icmp-type 8
说明 用来匹配 ICMP 的类型编号,可以使用代码或数字编号来进行匹配。请打 iptables
     -p icmp --help 来查看有哪些代码可以用。

参数 -m limit --limit
范例 iptables -A INPUT -m limit --limit 3/hour
说明 用来匹配某段时间内封包的平均流量, 上面的例子是用来匹配:每小时平均流量是
     否超过一次 3 个封包. 除了每小时平均一次外, 也可以每秒钟, 每分钟或每天平
     均一次, 默认值为每小时平均一次, 参数如后: /second、 /minute、/day。除了
     进行封包数量的匹配外,设定这个参数也会在条件达成时,暂停封包的匹配动作,
     以避免因骇客使用洪水攻击法,导致服务被阻断。

参数 --limit-burst
范例 iptables -A INPUT -m limit --limit-burst 5
说明 用来匹配瞬间大量封包的数量,上面的例子是用来匹配一次同时涌入的封包是否超
     过 5 个(这是默认值),超过此上限的封包将被直接丢弃。使用效果同上.

参数 -m mac --mac-source
范例 iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01
说明 用来匹配封包来源网络接口的硬件地址,这个参数不能用在 OUTPUT 和 Postrouting
     规则链上,这是因为封包要送出到网卡后,才能由网卡驱动程序透过 ARP 通讯协议
     查出目的地的 MAC 地址,所以 iptables 在进行封包匹配时,并不知道封包会送到
     哪个网络接口去。

参数 --mark
范例 iptables -t mangle -A INPUT -m mark --mark 1
说明 用来匹配封包是否被表示某个号码,当封包被匹配成功时,我们可以透过 MARK 处
     理动作,将该封包标示一个号码,号码最大不可以超过 4294967296。

参数 -m owner --uid-owner
范例 iptables -A OUTPUT -m owner --uid-owner 500
说明 用来匹配来自本机的封包,是否为某特定使用者所产生的,这样可以避免服务器使
     用 root 或其它身分将敏感数据传送出去,可以降低系统被骇的损失。可惜这个功
     能无法匹配出来自其它主机的封包。

参数 -m owner --gid-owner
范例 iptables -A OUTPUT -m owner --gid-owner 0
说明 用来匹配来自本机的封包,是否为某特定使用者群组所产生的,使用时机同上。

参数 -m owner --pid-owner
范例 iptables -A OUTPUT -m owner --pid-owner 78
说明 用来匹配来自本机的封包,是否为某特定进程所产生的,使用时机同上。

参数 -m owner --sid-owner
范例 iptables -A OUTPUT -m owner --sid-owner 100
说明 用来匹配来自本机的封包,是否为某特定联机(Session ID)的响应封包,使用时
     机同上。

参数 -m state --state
范例 iptables -A INPUT -m state --state RELATED,ESTABLISHED
说明 用来匹配联机状态,联机状态共有四种:INVALID、ESTABLISHED、NEW 和 RELATED
     INVALID 表示该封包的联机编号(Session ID)无法辨识或编号不正确。
     ESTABLISHED 表示该封包属于某个已经建立的联机。
     NEW 表示该封包想要起始一个联机(重设联机或将联机重导向)。
     RELATED 表示该封包是属于某个已经建立的联机,所建立的新联机。例如:FTP-DATA
     联机必定是源自某个 FTP 联机。


<常用的处理动作>

-j 参数用来指定要进行的处理动作,常用的处理动作包括:ACCEPT、REJECT、DROP、
   REDIRECT、MASQUERADE、LOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、MARK,分别说
   明如下:

   ACCEPT 将封包放行,进行完此处理动作后,将不再匹配其它规则,直接跳往下一个规
          则链(nat:postrouting)。

   REJECT 拦阻该封包,并传送封包通知对方,可以传送的封包有几个选择:ICMP port-
          unreachable、ICMP echo-reply 或是 tcp-reset(这个封包会要求对方关闭
          联机),进行完此处理动作后,将不再匹配其它规则,直接中断过滤程序。

          范例如下:
          iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

   DROP   丢弃封包不予处理,进行完此处理动作后,将不再匹配其它规则,直接中断过
          滤程序。

   REDIRECT 将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续匹
          配其它规则。 这个功能可以用来实作通透式 porxy 或用来保护 web 服务器.

          例如:
          iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

   MASQUERADE 改写封包来源 IP 为防火墙 NIC IP,可以指定 port 对应的范围,进行
          完此处理动作后,直接跳往下一个规则链(mangle:postrouting). 这个功能
          与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从
          网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指
          派的,这个时候 MASQUERADE 特别有用。

          范例如下:
          iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

   LOG    将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 组
          态档,进行完此处理动作后,将会继续匹配其它规则。

          例如:
          iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

   SNAT   改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进
          行完此处理动作后,将直接跳往下一个规则链(mangle:postrouting)。

          范例如下:
          iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source
          194.236.50.155-194.236.50.160:1024-32000

   DNAT   改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,
          进行完此处理动作后,将会直接跳往下一个规则链(filter:input 或 filter
          :forward)。

          范例如下:
          iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j
          DNAT --to-destination 192.168.1.1-192.168.1.10:80-100

   MIRROR 镜射封包,也就是将来源 IP 与目的地 IP 对调后,将封包送回,进行完此处
          理动作后,将会中断过滤程序。

   QUEUE  中断过滤程序,将封包放入队列,交给其它程序处理。透过自行开发的处理程
          序,可以进行其它应用,例如:计算联机费用.......等。

   RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则链
          看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序
          中。

   MARK   将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理
          动作后,将会继续匹配其它规则。

          范例如下:
          iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值