iptables

iptables

简介

防火墙,其目的是实现Linux系统访问控制能力,分为软件防火墙(寄生于操作系统)与硬件防火墙(具有独立芯片,软硬件结合实现);常见的有3/4层网络防火墙以及7层代理防火墙,iptables所处的位置便是位于tcp/ip网络层,是典型的包过滤防火墙,亦属于软件防火墙.

iptables与netfilter

iptables

  • Iptables为管理工具,位于/sbin/iptables, 通过命令实现对netfilter下发防火墙策略,从而实现对包的控制;
  • 其保存的策略会放在/etc/iptables文件中

netfilter

网络过滤器,其在内核中共有五个tcp/ip协议栈位置,也可以叫五个规则链或是五个函数,作用就是将进入、出去或是转发的包进行检查,并与所设置的规则相对比,从而进行下一步动作.

数据流

  1. 所有进入网卡的包首先会进入PREROUTING链,检查是转发包还是进入本机用户的包
  2. 若是转发包,则直接经过FORWARD链而后经过POSTROUTING链出本机
  3. 若是本机用户处理或是服务的包,则会经过INPUT链进入本机用户层,在经过OUTPUT链出本机用户层,最后从POSTROUTING出本机

注:所有入本机的包都会首先会经过PREROUTING链,出本机的包最后经过POSTROUTING链

命令详解

整体框架

常用命令

iptables -t filter -vnl 查看已配置规则(注:-t filter可不加,iptables默认表为filter,若配置其他表则要加上此参数)

说明: 在添加规则时优先使用-I参数
原因: 规则是由上至下去读取的,若第一条规则已经拒绝某个ip访问,则使用-A参数时来自此ip  的包还没到新加的规则之前已经被拒绝了.

  1. 拒绝来自192.168.1.1访问本机的22端口(在filter表最后一条规则后面添加新规则)
    iptables -A INPUT -s 192.168.1.1 -p tcp --dport 22 -j REJECT
  2. 只接受来自192.168.1.1访问本机非的22端口(在filter表第一条规则之前插入规则),num参数若不加默认插入至第一行
    iptables -I INPUT [num] ! -s 192.168.1.1 -p tcp --dport ! 22 -j REJECT
  3. 将第二条规则的ACCEPT换为DROP
    iptables -R INPUT 2 -j DROP
  4. 删除第二条规则
    iptables -D INPUT 2
  5. 设置默认规则,若数据没有被链中任何规则匹配到时,默认使用此规则
    iptables -P INPUT DROP

-m
  1. 指定多个端口
    iptables -I INPUT -p tcp -m multiport --dport 23,22,21 -j ACCEPT
    iptables -I INPUT -p tcp -m multiport --dport 21:23 -j ACCEPT
  2. 匹配物理地址
    iptables -I INPUT -m mac --mac xx:xx:xx:xx:xx:xx [-p tcp --dport] -j DROP
  3. 指定单位时间内允许通过的数据包个数
    iptables -I INPUT -m limit 100/hour
  4. 指定阈值(设置来自ip1的ping三次之后将数据包拒绝,burst表打破)
    iptables -I INPUT -m limit --limit-burst 3 -s ip1 -p icmp --icmp-type 8 -j ACCEPT
  5. 匹配uid|gid|pid
    iptables -I INPUT -m owner --uid-owner[–gid-owner|–pid-owner] id

自建链

Q: 为什么要有自建链?

A: 自建链作用是将某一类服务或者用户的火墙规则全部设置在自建链中,最后统一设置action,主要是为了统一化管理,管理方便.

  1. 添加自建链
    iptables -N chain_name
  2. 删除自建链
    iptables -X chain_name
  3. 重命名自建链
    iptables -E old_name new_name
  4. 其他操作和系统链相同

举例说明:

现有web服务使用80端口,有ip1、ip2不允许访问本服务
	iptables -N web_rule
	iptables -I web_rule -s ip1 -j DROP
	iptables -I web_rule -s ip2 -j DROP
	iptables -I INPUT -p tcp --dport 80 -j web_rule

若有n个ip可用此方法设置,配置完之后只需管理INPUT链中规则即可同时管理自定义链中的所有规则

更多命令

iptables [-t filter]

[-AI INPUT,OUTPUT,FORWARD]
			 [-io interface]
			 [-p tcp,udp.icmp,all]
			 [-s ip/nerwork] [--sport ports]
			 [-d ip/network] [--dport ports]
			 [-j ACCEPT DROP REJECT REDIRECT MASQUERADE LOG DNAT SNAT MIRROR QUEUE RETURN MARK]

链操作

iptables -vnL显示详细信息
iptables -A INPUT -s 192.168.0.4 -p tcp --dport 23 -j REJECT访问拒绝,有返回
iptables -A INPUT -s 192.168.0.4 -p tcp --dport 23 -j DROP访问拒绝,无任何提示
iptables -I INPUT 2 -p tcp --dport 23 -j DROP插入到第二条策略
iptables -E allowed disallowed修改规则链名称
iptables -D INPUT 3删除filter表中的第三条规则
iptables -D INPUT -s 192.168.0.1 -j DROP按内容删除
iptables -R INPUT 3 -j ACCEPT将原来编号为3的规则内容替换为-j ACCEPT
iptables -P INPUT DROP设置filter表INPUT链的默认规则,当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理
iptables -t nat -F清空nat策略,-F仅仅是清空链中规则,并不影响-P设置的默认规则
iptables -t nat -nL查看nat策略
iptables -t nat -L PREROUTING查看nat表PREROUTING链的规则
iptables -N redhat添加自定义链名
iptables -D redhat 1删除自定义链下的策略
iptables -X redhat删除自定义链

参数

-i eth0匹配从网络接口 eth0 进来
-o eth0匹配从网络接口 eth0 出去
-s 192.168.0.1匹配来自192.168.0.1的数据包
-s 192.168.1.0/24匹配来自 192.168.1.0/24 网络的数据包
-d 202.106.0.20匹配去往 202.106.0.20 的数据包
-d 202.106.0.0/16匹配去往 202.106.0.0/16 网络的数据包
-d www.abc.com匹配去往域名 www.abc.com
-p tcp,udp连接方式
-p icmp --icmp-type 8(ping)传输控制报
–sport 1000匹配源端口是1000的数据包
–sport :3000匹配源端口是3000以下的数据包(含3000)
–sport 1000:匹配源端口是1000以上的数据包(含1000)

示例

iptables -A INPUT -s 192.168.0.1 -d www.abc.com -p tcp --dport 80匹配来自192.168.0.1,去www.abc.com的80端口的TCP协议数据包
iptables -A OUTPUT -m owner --uid-owner 500匹配特定使用者的包
iptables -A OUTPUT -m owner --gid-owner 501匹配特定组程序包
iptables -A OUTPUT -m owner --pid-owner 50匹配特定pid程序包
iptables -A OUTPUT -m owner --sid-owner 5是否为某特定联机(session id)的封包
iptables -A FORWARD -m mac --mac xx:xx:xx:xx:xx:xx -j DROP阻断来自某MAC地址的数据包,通过本机
iptables -A INPUT -m mac --mac 00:19:D1:63:AC:15 -p tcp --dport 21 -j DROP禁止访问本机的ftp
iptables -A INPUT -s !192.168.0.4 -p tcp --dport 23 -j REJECT只有192.168.0.4可以连接23端口

-j参数

ACCEPT DROP REJECT REDIRECT MASQUERADE LOG DNAT SNAT MIRROR QUEUE RETURN MARK

POSTROUTING可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则.
SNAT改变转发数据包的源地址 --to-source
PREROUTING(外部访问内部)可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT
DNAT改变转发数据包的目的地址 --to-dest
MASQUERADE使用拨号方式,公有地址不固定(地址伪装)
INBOUND进入
OUTBOUD输出,带有端口重定向
MASQUERADE地址伪装
MIRROR镜射封包,也就是将来源IP与目的地IP对调后,将封包送回,进行完此处理动作后,将会中断过滤程序
QUEUE中断过滤程序,将封包放入队列,交给其它程序处理.透过自行开发的处理程序,可以进行其它应用,例如:计算联机费…等.
RETURN结束在目前规则炼中的过滤程序,返回主规则炼继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中.
MARK将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则

示例

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-dest 192.168.0.10
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-dest 192.168.0.100:3128
iptables -t nat -A POSTROUTING -j SNAT --to-source 190.14.1.2
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -p tcp --dport 22 -j MARK --set-mark 2
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE --to-ports 1024-31000将源地址是192.168.0.0/24的包的地址改写为防火墙的NIC ip,并指定端口范围
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 1.1.1.1:1024-3100将内网 192.168.0.0/24 的原地址修改为1.1.1.1,指定端口范围,用于NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 1.1.1.1-1.1.1.10同上,只不过修改成一个地址池里的IP
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-dest 192.168.0.1-192.168.0.20:80-100把从eth0进来的要访问TCP/80的数据包目的地址改为地址池中的

基于状态的匹配扩展(连接跟踪)

每个网络连接包括以下信息:源地址、目标地址、源端口、目的端口,称为套接字对(socket pairs);协议类型、连接状态(TCP协议)和超时时间等。防火墙把这些信息称为状态(stateful).状态包过滤防火墙能在内存中维护一个跟踪状态的表,比简单包过滤防火墙具备更大的安全性,命令格式如下:
iptables -m state --state

NEW该包想要开始一个新的连接(重新连接或连接重定向)
RELATED该包是属于某个已建立的连接所建立的新连接.举例:FTP的数据传输连接和控制连接之间就是RELATED关系.
ESTABLISHED该包属于某个已建立的连接。
INVALID该包不匹配于任何连接,通常这些包被DROP.

例如:
1.在INPUT链添加一条规则,匹配已建立的连接或由已建立的连接所建立的新连接.即匹配任何的TCP回应包。

iptables -A INPUT -m state --state RELATED,ESTABLISHED

2.在INPUT链链添加一条规则,匹配任何从非eth0接口来的连接请求包。

iptables -A INPUT -m state --state NEW -i !eth0

对于ftp连接能够使用下面的连接跟踪:
1.被动(Passive)ftp连接模式。

被动模式

client                                    server

xxxx |—|----------|—>|     21

yyyy |—|----------|—>|     zzzz

FW1                                       FW2

iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state –-state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state -–state ESTABLISHED,RELATED -j ACCEPT

2.主动(Active)ftp连接模式

主动模式

client                                   server

xxxx |—|----------|–>|     21

yyyy |<–|----------|—|     20

FW1                                     FW2

iptables -A INNPUT -m state –-state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp –dport 20 -m state --state ESTABLISHED -j ACCEPT

limit速率匹配扩展

1.指定单位时间内允许通过的数据包个数

iptables –A INPUT –m limit --limit 300/hour表示限制每小时允许通过300个数据包

2.指定触发事件的阀值(默认值是5)

iptables –A INPUT –m limit --limit-burst 10表示一次涌入的封包超过10个将被直接丢弃

3.同时指定速率限制和触发阀值

iptables –A INPUT –p icmp –m limit –limit 3/m –limit-burst 3

指定TCP匹配扩展

通过使用–tcp-flags选项可以根据TCP包的标志位进行过滤,第一个参数为要检查的标志位;第二个参数是标志位为1的标志

iptables –A INPUT –p tcp --tcp-flags SYN,FIN,ACK SYNNone
iptables –p tcp --syn表示SYN、ACK、FIN的标志都要检查,但是只有设置了SYN的才匹配
iptables –A INPUT –p tcp --tcp-flags ALL SYN,ACK表示ALL(SYN,ACK,FIN,RST,USG,PSH)的标志都要检查,但是只有设置了SYN和ACK的才匹配
iptables -A INPUT -p tcp -m multiport --ports 21,22,25,80,110 -j ACCEPT多端口匹配

服务器策略

#!/bin/bash

iptables -F

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT

iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT

iptables -A INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT

iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT

iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT

iptables -A INPUT -p tcp -m multiport --ports 80,53,21,22 -j ACCEPT

iptables -A INPUT -m state --state NEW -j REJECT

iptables -P INPUT DROP

网关策略配置:(内网主机地址为10.0.0.9)

iptables -t nat -FNone
vi /etc/sysctl.confet.ipv4.ip_forward = 1
echo “1” > /proc/sys/net/ipv4/ip_forwardNone
modprobe ip_nat_ftp因ftp除使用21端口外,还要使用关联的22端口,因此需要加载ftp模块
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 192.168.0.10内部网络访问外部时使用192.168.0.10,即公网地址
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-dest 10.0.0.9外部网络可以访问内部的http服务器
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to-dest 10.0.0.9:80端口映射
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 21 -j DNAT --to-dest 10.0.0.9外部网络可以访问内部的ftp服务器

限制内网用户

iptables -A FORWARD -s 192.168.1.4 -j DROP
iptables -A FORWARD -m mac --mac 00:19:D1:63:AC:15 -j DROP
iptables -A FORWARD -d www.163.com -j REJECT

其他

1.星期一到星期六的8:00-12:30禁止qq通信

iptables -I FORWARD -p udp --dport 53 -m string --string “tencent” -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
iptables -I FORWARD -p udp --dport 53 -m string --string “TENCENT” -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

2.星期一到星期六的8:00-12:30禁止qq网页

iptables -I FORWARD -s 192.168.0.0/24 -m string --string “qq.com” -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP

3.禁止宽频影院,色情,广告网页连接

iptables -I FORWARD -d 192.168.0.0/24 -m string --string “宽频影院” -j DROP
iptables -I FORWARD -s 192.168.0.0/24 -m string --string “色情” -j DROP
iptables -I FORWARD -p tcp --sport 80 -m string --string “广告” -j DROP

4.禁止BT连接

iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP

5.限制并发连接数

iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP

6.打开主机的22号端口,允许远程管理

iptables -A INPUT -i eth0 -s 192.168.1.104 -d 192.168.1.111 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -o eth0 -d 192.168.1.111 -s 192.168.1.104 -p tcp --sport 22 -j ACCEPT

其他

iptables-save > /etc/iptables.up.rules保存至文件
iptables-restore > /etc/iptables.up.rules恢复至文件
iptables -A INPUT -i lo -j ACCEPTNone
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTNone
iptables -A INPUT -p tcp -i eth0 --dport 22 -j ACCEPTNone
iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPTNone
iptables -A INPUT -j DROPNone
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7将被丢弃的报文记录到syslog中(每分钟通过5个数据包)
序言 1.1. 为什么要写这个指南 1.2. 指南是如何写的 1.3. 文中出现的术语 2. 准备阶段 2.1. 哪里能取得iptables 2.2. 内核配置 2.3. 编译与安装 2.3.1. 编译 2.3.2. 在Red Hat 7.1上安装 3. 表和链 3.1. 概述 3.2. mangle 表 3.3. nat 表 3.4. Filter 表 4. 状态机制 4.1. 概述 4.2. conntrack记录 4.3. 数据包在用户空间的状态 4.4. TCP 连接 4.5. UDP 连接 4.6. ICMP 连接 4.7. 缺省的连接操作 4.8. 复杂协议和连接跟踪 5. 保存和恢复数据管理规则 5.1. 速度 5.2. restore的不足之处 5.3. iptables-save 5.4. iptables-restore 6. 规则是如何练成的 6.1. 基础 6.2. Tables 6.3. Commands 6.4. Matches 6.4.1. 通用匹配 6.4.2. 隐含匹配 6.4.3. 显式匹配 6.4.4. 针对非正常包的匹配 6.5. Targets/Jumps 6.5.1. ACCEPT target 6.5.2. DNAT target 6.5.3. DROP target 6.5.4. LOG target 6.5.5. MARK target 6.5.6. MASQUERADE target 6.5.7. MIRROR target 6.5.8. QUEUE target 6.5.9. REDIRECT target 6.5.10. REJECT target 6.5.11. RETURN target 6.5.12. SNAT target 6.5.13. TOS target 6.5.14. TTL target 6.5.15. ULOG target 7. 防火墙配置实例 rc.firewall 7.1. 关于rc.firewall 7.2. rc.firewall详解 7.2.1. 参数配置 7.2.2. 外部模块的装载 7.2.3. proc的设置 7.2.4. 规则位置的优化 7.2.5. 缺省策略的设置 7.2.6. 自定义链的设置 7.2.7. INPUT链 7.2.8. FORWARD链 7.2.9. OUTPUT链 7.2.10. PREROUTING链 7.2.11. POSTROUTING链 8. 例子简介 8.1. rc.firewall.txt脚本的结构 8.1.1. 脚本结构 8.2. rc.firewall.txt 8.3. rc.DMZ.firewall.txt 8.4. rc.DHCP.firewall.txt 8.5. rc.UTIN.firewall.txt 8.6. rc.test-iptables.txt 8.7. rc.flush-iptables.txt 8.8. Limit-match.txt 8.9. Pid-owner.txt 8.10. Sid-owner.txt 8.11. Ttl-inc.txt 8.12. Iptables-save ruleset A. 常用命令详解 A.1. 查看当前规则集的命令 A.2. 修正和清空iptables的命令 B. 常见问题于与解答 B.1. 模块装载问题 B.2. 未设置SYN的NEW状态包 B.3. NEW状态的SYN/ACK包 B.4. 使用私有IP地址的ISP B.5. 放行DHCP数据 B.6. 关于mIRC DCC的问题 C. ICMP类型 D. 其他资源和链接 E. 鸣谢 F. History G. GNU Free Documentation License 0. PREAMBLE 1. APPLICABILITY AND DEFINITIONS 2. VERBATIM COPYING 3. COPYING IN QUANTITY 4. MODIFICATIONS 5. COMBINING DOCUMENTS 6. COLLECTIONS OF DOCUMENTS 7. AGGREGATION WITH INDEPENDENT WORKS 8. TRANSLATION 9. TERMINATION 10. FUTURE REVISIONS OF THIS LICENSE How to use this License for your documents H. GNU General Public License 0. Preamble 1. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 2. How to Apply These Terms to Your New Programs I. 示例脚本的代码 I.1. rc.firewall脚本代码 I.2. rc.DMZ.firewall脚本代码 I.3. rc.UTIN.firewall脚本代码 I.4. rc.DHCP.firewall脚本代码 I.5. rc.flush-iptables脚本代码 I.6. rc.test-iptables脚本代码 List of Tables 3-1. 以本地为目标(就是我们自己的机子了)的包 3-2. 以本地为源的包 3-3. 被转发的包 4-1. 数据包在用户空间的状态 4-2. 内部状态 6-1. Tables 6-2. Commands 6-3. Options 6-4. Generic matches 6-5. TCP matches 6-6. UDP matches 6-7. ICMP matches 6-8. Limit match options 6-9. MAC match options 6-10. Mark match options 6-11. Multiport match options 6-12. Owner match options 6-13. State matches 6-14. TOS matches 6-15. TTL matches 6-16. DNAT target 6-17. LOG target options 6-18. MARK target options 6-19. MASQUERADE target 6-20. REDIRECT target 6-21. REJECT target 6-22. SNAT target 6-23. TOS target 6-24. TTL target 6-25. ULOG target C-1. ICMP类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值