一、概要
1. 防火墙分类
- 包过滤防火墙(pack filtering)在网络层对数据包进行选择过滤,采用访问控制列表(Access control table-ACL)检查数据流的源地址,目的地址,源和目的端口,IP等信息。
- 代理服务器型防火墙
2. iptables基础
- 规则(rules):网络管理员预定义的条件
- 链(chains): 是数据包传播的路径
- 表(tables):内置4个表filter表,nat表,mangle表,raw表分别用于实现包过滤,网络地址转换,包重构和连接追踪机制的功能
二、指令及参数含义
1. iptables命令格式
iptables [-t 表] -命令 匹配 动作 (大小写敏感)
iptables [-t 表名] <-A|I|D|R|L> 链名 [规则编号] [-i|o 网卡名称] [-p 协议类型] [-s 源ip|源子网] [--sport 源端口号] [-d 目的IP|目标子网] [--dport 目标端口号] [-j 动作]
2. 常用命令
-A
增加(append)
范例 iptables -A INPUT ...
说明 新增规则(追加方式)到某个规则链(这里是INPUT规则链)中,该规则将会成为规则链中的最后一条规则。
-I
插入(insert)
范例 iptables -I INPUT 1 --dport 80 -j ACCEPT
说明 插入一条规则,原本该位置(这里是位置1)上的规则将会往后移动一个顺位。
-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
说明 取代现行规则,规则被取代后并不会改变顺序。(1是位置)
-L
查看(list)
范例 iptables -L INPUT
说明 列出某规则链中的所有规则。
-F
刷新(flush)
范例 iptables -F INPUT
说明 删除某规则链(这里是INPUT规则链)中的所有规则。
3. 常用动作
ACCEPT
接收数据包
iptables -p OUTPUT -j ACCEPT
DROP
丢弃数据包
iptalbes -p INPUT -j DROP
REJECT
拒绝数据包通过
-A INPUT -j REJECT
REDIRECT
将数据包重新转向到本机或另一台主机的某一个端口,通常功能实现透明代理或对外开放内网的某些服务
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT
SNAT
源地址转换
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT
DNAT
目的地址转换
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT
MASQUERADE
IP伪装
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE
LOG
日志功能
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"
4. 匹配规则
-s
源端口(source)
iptables -t filter -I OUTPUT -s 192.168.1.111,192.168.1.118 -j DROP
-d
目的端口(destination)
iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROP
-p
协议(protocol)
iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPT
-i
入口网卡(in-interface)
iptables -t filter -I INPUT -p icmp -i eth0 -j DROP
-o
出口网卡(out-interface)
iptables -t filter -I INPUT -p icmp -o eth4 -j DROP
5. 拓展匹配条件(-m 指定拓展模块名称)
tcp
# 用于匹配tcp协议报文的源端口,可以使用冒号指定一个连续的端口范围
-p tcp -m tcp --sport
----
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECT
----
# 用于匹配tcp协议报文的目标端口,可以使用冒号指定一个连续的端口范围
-p tcp -m tcp --dport
----
iptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECT
----
# 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
-p tcp -m multiport --sports
----
iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECT
----
# 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用"逗号"隔开
-p udp -m multiport --dports
----
iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECT
----
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied:" --log-level 7
state
NEW
连接中的第一个包ESTABLISHED
连接已建立RELATED
关系INVALID
这个包没有任何状态UNTRACKED
报文未被追踪
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
三、基础配置
*filter
# allow all connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# allow out traffic
-A OUTPUT -j ACCEPT
# allow http https
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
# allow ssh port login
-A INPUT -p tcp -m state --state NEW --dport 39999 -j ACCEPT
# ping
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
# log denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied:" --log-level 7
# drop incoming sensitive connections
-A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
-A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 150 -j DROP
# reject all other inbound
-A INPUT -j REJECT
-A FORWARD -j REJECT
COMMIT
参考