iptables
简介
防火墙,其目的是实现Linux系统访问控制能力,分为软件防火墙(寄生于操作系统)与硬件防火墙(具有独立芯片,软硬件结合实现);常见的有3/4层网络防火墙以及7层代理防火墙,iptables所处的位置便是位于tcp/ip网络层,是典型的包过滤防火墙,亦属于软件防火墙.
iptables与netfilter
iptables
- Iptables为管理工具,位于/sbin/iptables, 通过命令实现对netfilter下发防火墙策略,从而实现对包的控制;
- 其保存的策略会放在/etc/iptables文件中
netfilter
网络过滤器,其在内核中共有五个tcp/ip协议栈位置,也可以叫五个规则链或是五个函数,作用就是将进入、出去或是转发的包进行检查,并与所设置的规则相对比,从而进行下一步动作.
数据流
- 所有进入网卡的包首先会进入PREROUTING链,检查是转发包还是进入本机用户的包
- 若是转发包,则直接经过FORWARD链而后经过POSTROUTING链出本机
- 若是本机用户处理或是服务的包,则会经过INPUT链进入本机用户层,在经过OUTPUT链出本机用户层,最后从POSTROUTING出本机
注:所有入本机的包都会首先会经过PREROUTING链,出本机的包最后经过POSTROUTING链
命令详解
整体框架
常用命令
iptables -t filter -vnl 查看已配置规则(注:-t filter可不加,iptables默认表为filter,若配置其他表则要加上此参数)
说明: 在添加规则时优先使用-I参数
原因: 规则是由上至下去读取的,若第一条规则已经拒绝某个ip访问,则使用-A参数时来自此ip 的包还没到新加的规则之前已经被拒绝了.
- 拒绝来自192.168.1.1访问本机的22端口(在filter表最后一条规则后面添加新规则)
iptables -A INPUT -s 192.168.1.1 -p tcp --dport 22 -j REJECT - 只接受来自192.168.1.1访问本机非的22端口(在filter表第一条规则之前插入规则),num参数若不加默认插入至第一行
iptables -I INPUT [num] ! -s 192.168.1.1 -p tcp --dport ! 22 -j REJECT - 将第二条规则的ACCEPT换为DROP
iptables -R INPUT 2 -j DROP - 删除第二条规则
iptables -D INPUT 2 - 设置默认规则,若数据没有被链中任何规则匹配到时,默认使用此规则
iptables -P INPUT DROP
-m
- 指定多个端口
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 - 匹配物理地址
iptables -I INPUT -m mac --mac xx:xx:xx:xx:xx:xx [-p tcp --dport] -j DROP - 指定单位时间内允许通过的数据包个数
iptables -I INPUT -m limit 100/hour - 指定阈值(设置来自ip1的ping三次之后将数据包拒绝,burst表打破)
iptables -I INPUT -m limit --limit-burst 3 -s ip1 -p icmp --icmp-type 8 -j ACCEPT - 匹配uid|gid|pid
iptables -I INPUT -m owner --uid-owner[–gid-owner|–pid-owner] id
自建链
Q: 为什么要有自建链?
A: 自建链作用是将某一类服务或者用户的火墙规则全部设置在自建链中,最后统一设置action,主要是为了统一化管理,管理方便.
- 添加自建链
iptables -N chain_name - 删除自建链
iptables -X chain_name - 重命名自建链
iptables -E old_name new_name - 其他操作和系统链相同
举例说明:
现有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 SYN | None |
---|---|
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 -F | None |
---|---|
vi /etc/sysctl.conf | et.ipv4.ip_forward = 1 |
echo “1” > /proc/sys/net/ipv4/ip_forward | None |
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 ACCEPT | None |
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT | None |
iptables -A INPUT -p tcp -i eth0 --dport 22 -j ACCEPT | None |
iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT | None |
iptables -A INPUT -j DROP | None |
iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 | 将被丢弃的报文记录到syslog中(每分钟通过5个数据包) |