iptables入门及基本命令使用
规则的功能:
四个表
filter
nat
mangle
raw
五个内置链:
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
规则的属性:
1、网络层协议属性:
ip
2、传输层协议属性:
tcp
udp
icmp
iptables
大写字母选项:子命令
小写字母选项:用来匹配标准及其它;
-t {filter|nat|mangle|raw}
-L: list
-n: 数字格式显示IP和PORT;
-v: 详细信息, -vv, -vvv其中后面的选项比前面的显示的更详细
--line-numbers: 显示链中规则的行号;
-x: 显示精确值,不要做单位换算;
规则和默认策略都有两个计数器:
packets:
bytes:
表和链的对应关系:
filter | INPUT, FORWARD, OUTPUT |
nat | PREROUTING, POSTROUTING, OUTPUT |
mangle | PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING |
raw | PREROUTING, OUTPUT |
每个链都有其默认策略:policy ACCEPT
通常只需要修改filter表的默认策略
其它子命令:
管理链:
-F: 清空链
iptables -F 表示清空所有链
-P: 设定默认策略
iptables -t filter -P INPUT {DROP|ACCEPT}
-N: 新建一条自定义链;
iptables -N FILTER_WEB
-X: 删除自定义的空链;
-Z: 计算器清零;
iptables -Z
-E: 重命名自定义链
管理规则:
-A: append :在链的最后追加一条规则
-I [n]: 插入为第n条规则
-D [n]: 删除第n条规则
-R [n]: 替换第n条规则
编写规则语法:
iptables [-t 表] 大写选项子命令 [规则号] 链名 匹配标准 -j 目标
目标:
DROP: 丢弃
REJECT:拒绝
ACCEPT:允许
RETURN:返回跳转
REDIRECT: 端口重定向
DNAT:目标地址转换
SNAT:源地址转换
LOG:记录日志
MARK:打标记
自定义链
匹配标准:
通用匹配
-s|--src|--source [!] IP/NETWORK
-d|--dst|--destination [!] IP/NETWORK
#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -j ACCEPT
-i incoming_interface: 指定数据报文流入接口; INPUT, PREROUTING, FORWARD
-o outing_interface: 指定数据报文流出接口;OUTPUT, POSTROUTING, FORWARD
-p {tcp|udp|icmp}
扩展匹配: 要使用"-m 扩展名称"来引用,而每个扩展模块一般都会有自己特有的专用选项; 这些选项中,有些是必备的;
隐含扩展
-p tcp
--sport 指定源端口
--dport 指定目标端口
--tcp-flags 要检查的标志 必须为1标记
--tcp-flags SYN,ACK,RST,FIN SYN 表示:tcp三次握手的第一次
ALL:所有标志位
NONE:没有标志位
--tcp-flags ALL SYN,FIN非法报文
--syn
练习:放行对web服务的访问:
#iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -j ACCEPT
#iptables -A OUTPUT -s 172.16.100.1 -p tcp --sport 80 -j ACCEPT
因为报文在接收和发送时都要经过防火墙,所以我们需要设定INPUT和OUTPUT两个方面的访问控制
--sport
--dport
例如:本机DNS服务器,要为本地客户端做递归查询;iptables的INPUT, OUTPUT默认为DROP;本机地址:172.16.100.1
# iptables -A INPUT -d 172.16.100.1 -p udp --dport 53 -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.1 -p udp --sport 53 -j ACCEPT
# iptables -A OUTPUT -s 172.16.100.1 -p udp --dport 53 -j ACCEPT
# iptables -A INPUT -d 172.16.100.1 -p udp --sport 53 -j ACCEPT
-p icmp
--icmp-type
请求:8
响应:0
例子:本机172.16.100.1,能ping 172.16.0.0/16中的所有主机;
显式扩展:
-m state --state
NEW, ESTABLISHED, RELATED, INVALID
ftp服务需要装载:nf_conntrack_ftp模块, 可以使用modprobe命令,也可编辑/etc/sysconfig/iptables-config文件实现。
-m mulitport: 可以指定15个以内的离散端口;比如,21-23,80
--source-ports 源端口
--destination-ports 目标端口
--ports
-m iprange: 指定匹配的IP地址范围,如172.16.100.1-172.16.109.254
-m iprange
--src-range源ip地址
--dst-range 目标ip地址
-m limit
--limit 20/min 限制每分钟最多允许请求的次数
--limit-burst 2 搜集多少个令牌桶
-m string
--string "" 引号里面填写需要匹配的字符串
--algo {bm|kmp}
-m time
--datestart
--datestop
--timestart
--timestop
--weekdays
--monthdays
保存规则:
#service iptables save
保存至/etc/sysconfig/iptables
#iptables-save > /path/to/iptables.rules
生效规则文件中的规则:
#iptables-restore < /path/to/ipables.rules
子命令:
链:-N, -X, -Z, -F, -P, -E
规则:-A, -I, -D, -R
练习:INPUT和OUTPUT默认策略为DROP;
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
# iptables -I INPUT 1 -m state --state ESTABLISHED -j ACCEPT
# iptables -A INPUT -d 172.16.100.1 -p tcp --dport 80 -m time --weekdays Tue,Wed,Thu,Fri,Sat,Sun
-m limit --limit 100/sec -m string --algo kmp ! --string "admim" -m state --state NEW -j ACCEPT
其中对于周一不允许访问还可以表达为 -m time !--weekdays Mon
# iptables -I OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 21 -m time --weekdays Mon,Tue,Wed,Thu,Fri --timestart 08:30:00 --timestop 18:00:00 -j ACCEPT
# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
# iptables -A INPUT -m iprange --src-range 172.16.100.1-172.16.100.100 -m limit --limit 2/min -p tcp --dport 22 -d 172.16.100.1 -i eth0 -m state --state NEW -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
# iptables -N clean_in
# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
# iptables -A clean_in -d 172.16.100.1 -j RETURN
# iptables -I INPUT 1 -d 172.16.100.1 -j clean_in
5、允许本机ping别的主机;但不开放别的主机ping本机;
# iptables -A OUTPUT -s 172.16.100.1 -p icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT