Iptables使用
iptables的组成
iptables不是真正的防火墙,可以理解为一个客户端代理,用户通过iptables这个代理,将用户安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,这个框架是netfilter
netfilter才是防火墙的安全框架,netfilter位于内核空间。
iptables是一个命令行工具,来操作真正的框架,准确的来说iptables并没有一个守护进程,所以不能算是真正意思的服务,应该算是内核提供的功能
链(内置):
PREROUTING:路由前
INPUT:到达本机内部的报文必经之路
FORWARD:由本机转发的报文必经之路
OUTPUT:由本机发出的报文的必经之路
POSTROUTING:路由后
表(规则的功能):
filter: 过滤,定义是否允许通过防火墙
nat: 地址转换,启用connection_track
mangle: 拆解报文,作出修改,封装报文
raw: 目标是关闭nat表上启用的连接追踪功能;
各功能的分别实现:
filter: INPUT, FORWARD, OUTPUT
nat: PREROUTING(SNAT),POSTROUTING(DNAT),OUTPUT
mangle: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
raw: PREROUTING, OUTPUT
数据报文流程:
(1) 跟本机内部进程通信:
进入:PREROUTING --> INPUT
出去:OUTPUT --> POSTROUTING
(2) 由本机转发:
PREROUTING --> FORWARD --> POSTROUTING
(3) 数据报文的流向:
源IP和目标IP由流向决定;
注意:报文不会经过自定义链,只能在内置链上通过规则引用自定义链生效
iptables的基本用法
语法:iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
-t TABLE:
nat, mangle, raw, filter
默认为filter
COMMAND:
修改链:
-F:flush, 清空规则链;
-N:new, 建自定义的一条链
-X: delete, 删除一条自定义的空链
-Z:zero,计数器归零
-P:policy,设置默认策略,对filter表来讲,默认规则为ACCEPT或DROP;
语法:iptables [-t table] -P chain target
示例:iptables -P INPUT DROP #设置INPUT链默认为DROP
-E:重命名自定义链
链中的规则:
-A:将新规则追加与指定链的尾部
-I:将新规则插入至指定链的指定位置
语法:iptables [-t table] -I chain [rulenum] rule-specification
-D:删除指定链上的指定规则
语法:iptables [-t table] -D chain rulenum
示例:iptables -D INPUT 2 #删除第二条规则
-R:替换指定链上的指定规则
语法:iptables [-t table] -R chain rulenum rule-specification
查询:
-L:列出指定链上的所有规则
-n: 数字格式显示主机地址和端口;
-v: 详细格式,-vv, -vvv
--line-numbers: 显示规则编号
示列:
~]# iptables -L -n -v
pkts bytes target prot opt in out source destination
包数 字节数 目标 协议 流入的接口 流出的接口 源地址 目标地址
-x: exactly,不要对计数器的计数结果做单位换算,而显示其精确值
CHAIN:
INPUT
FORWARD
OUTPUT
PREROUTING
POSTROUTING
CRETIRIA:
匹配条件,下方详细解释
TARGET:
DROP 丢弃
REJECT 拒绝
ACCEPT 接受
RETURN 返回调用链
REDIRECT 端口重定向
LOG 记录日志
MARK 做防火墙标记
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址伪装
……
自定义的链
保存iptables规则
保存规则至指定文件
iptables-save > /PATH/TO/SOMEFILE
从指定文件重载规则
iptables-restore < /PATH/TO/SOMEFILE
Centos6:
service iptables save
相当于 iptables-save >/etc/sysconfig/iptables
service iptables restart
相当于iptables-restore < /etc/sysconfig/iptables
关于firewalld:
http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html
iptables的匹配条件
iptables [-t TABLE] -A 链名 匹配条件 -j TARGET
匹配条件:
1.通用匹配
-s 地址:指定报文源IP地址匹配的范围;可以是IP,也可以是网络地址;可使用!取反;
--src, --source
-d 地址:指定报文目标IP地址匹配的范围;
--dst, --destination
-p 协议:指定匹配报文的协议类型,一般有三种tcp, udp和icmp;
-i INTERFACE: 数据报文流入的接口;PREROUTING, INPUT, FORWARD
-o INTERFACE: 数据报文流出的接口;OUTPUT, FORWARD, POSTROUITING
2.扩展匹配
隐式扩展
当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项
-p tcp:
--sport PORT[-PORT]: 指定源端口
--dport PORT[-PORT]: 指定目标端口
--tcp-flags
-p udp:
--sport
--dport
-p icmp:
--icmp-type 0 #不允许别人ping自己
--icmp-type 8 #允许ping别人
显式扩展
必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项
multiport-多端口匹配
可用于匹配非连续或连续端口;最多指定15个端口;
专用选项:
--source-ports, --sports port[,port,port:port]
--destination-ports, --dports
--ports
例子:
~]# iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport --dports 22,80 -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange-匹配指定范围内的地址
匹配一段连续的地址而非整个网络时有用;
专用选项:
[!] --src-ragne IP[-IP]
[!] --dst-range
例子:
~]# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 23 -m iprange --src-range 172.16.100.1-172.16.100.100 -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 23 -m iprange --dst-range 172.16.100.1-172.16.100.100 -j ACCEPT
string-字符串匹配,能够检测报文应用层中的字符串
字符匹配检查高效算法
kmp, bm
专用选项:
--algo {kmp|bm}
--string "STRING"
--hex-string "HEX_STRING": HEX_STRING为编码成16进制格式的字串
例子:
~]# iptables -I OUTPUT -m string --algo kmp --string "sex" -j DROP
time-基于时间做访问控制
专用选项:
--datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
--datestop
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
--weekdays day[,day]
Mon, Tue,
例子:
~]# iptables -I INPUT -d 172.16.100.7 -p tcp --dport 80 -m time --timestart 08:20 --timestop 18:40 --weekdays Mon,Tue,Thu,Fri -j REJECT
connlimit-连接数限制,对每个IP所能够发起并发连接数做限制
专用选项:
[!] --connlimit-above [n]
例子:
~]# iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j DROP
limit-速率限制
专用选项:
--limit n[/second|/minute|/hour|/day]
--limit-burst n
例子:
~]# iptables -A INPUT -d 172.16.100.7 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 5 -j ACCEPT
state-状态检查
专用选项:
--state
调整连接追踪功能所能容纳的连接的最大数目:
/proc/sys/net/nf_conntrack_max
当前追踪的所有连接
/proc/net/nf_conntrack
不同协议或连接类型追踪时的属性:
/proc/sys/net/netfilter目录:
对于state模块而言,两台机器建立链接,其中的报文可以分为5种状态
连接追踪中的状态:
NEW: 新建立一个会话
ESTABLISHED:已建立的连接,再次建立通信
RELATED: 有关联关系的连接
INVALID: 无法识别的连接
例子:
~]# iptables -I INPUT -d 172.16.100.9 -p tcp --dport 22 -m state NEW,ESTABLISHED -j ACCEPT
~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp --dport 22 -m state ESTABLISHED -j ACCEPT
练习1
放行被动模式下的FTP服务:
ftp的数据进程,依赖于命令进程的报文,所以数据传输需要放开RELATED报文状态
1、装载模块/lib/modules/KERNEL_VERSION/kernel/net/netfilter/
模块:nf_conntrack_ftp
装载模块:modprobe nf_conntrack_ftp
2、放行请求报文:
(1) 放行NEW状态对21端口请求的报文;
(2) 放行ESTABLISHED以及RELATED状态的报文
~]# iptable -A INPUT -d localIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
~]# iptable -A INPUT -d localIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
3、放行响应报文:
(1) 放行ESTABLISHED(以及RELATED状态)的报文
~]# iptable -A OUTPUT -s localIP -p tcp -m state --state ESTABLISHED -j ACCEPT
练习2
用iptables模拟网络防火墙
内网机:192.168.20.2
网关:
192.168.20.1
172.100.10.9(外网)
外网机:172.100.12
把网关模拟网络防火墙
~]# iptables -P FORWARD DROP
~]# iptables -F
~]# iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
~]# iptables -A FORWARD -d 192.168.20.2 --dport 22,80 -m state --state NEW -j ACCEPT
iptables的NAT功能
nat:
SNAT:只修改请求报文的源地址
DNAT:只修改请求报文的目标地址
nat表:
PREROUTING:DNAT
OUTPUT
POSTROUTING:SNAT
如果想要NAT功能正常,需要开启linux主机的核心转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
SNAT相关操作
配置SNAT,可以隐藏网内主机的IP地址,可以共享公网IP访问互联网
~]# iptables -t nar -A POSTROUTING -s LocalNet -j SNAT --to-source 公网IP
如果公网IP是动态获取的,不是固定的,则可以使用MASQUERADE进行动态的SNAT操作
~]# iptables -t nar -A POSTROUTING -s LocalNet -o eth0 -j MASQUERADE
说明:LocalNet是内网IP段,ExtIP是网关的外网IP(固定IP)
DNAT相关操作
配置DNAT,可以通过公网IP访问局域网内的服务
~]# iptables -t nar -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-dsetination LocalNet[:PORT]
注释:如果测试不可以,在内网服务器加SNAT规则
本机端口映射
~]# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT 00TO-PORTS 8080
iptables的自定义链
创建自定义链并引用
~]# iptables -t filter -N IN_WEB
~]# iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB
修改自定义链名字
~]# iptables -E IN_WEB WEB
删除自定义链
~]# iptables -X WEB
浙公网安备 33010602011771号