一、简介
iptables是可以实现netfilter框架的一个命令,通过调用syscall使内核空间的防火墙规则和用户空间交互。
配置文件 /etc/sysconfig/iptables-config
/etc/sysconfig/iptables
二、四表五链模型
【结合不同的扩展】iptables可以针对OSI二、三、四、七层进行报文进行规则匹配
iptables四表:filter(default)、nat、mangle、raw
五链:INPUT OUTPUT FORWARD PREROUTING POSTROUTING.(亦可以自定义链)
四表处理优先级:raw > mangle > nat > filter
【各个表在链上的功能实现如图】
三、iptables命令简介
iptables [-t tables] COMMAND CHAIN [NUM] 匹配标准 -j 处理办法
-t 指定表类型
COMMAND:
1>.管理规则
-A 附加一条规则(默认添加在链的尾部)
-I CHAIN [NUM] 插入一条规则,插入到对应的第num条
-D CHAIN [NUM] 删除指定链中的第num条规则
-R CHAIN [NUM] 替换第num条规则
2>.管理链
-F [CHAIN] 清空指定规则链,若省略则清空表中所有链
-P CHAIN 设定指定连的默认策略(例1)
-N <CHAIN_NAME> 自定义一个新链
-X <CHAIN_NAME> 删除一个自定义空链
-Z 置零指定连中所有规则的计数器(计数器记录被匹配的报文个数个大小之和)
-E old_chain_name new_chain_name 重命名自定义链
3>.查看类
-L 显示指定表中的规则
-n 以数字格式显示主机地址和端口号
-v 显示详细的规则
匹配标准:
1>.通用匹配
-s --src 指定源IP
-d --dst 指定目的IP
-p {tcp|udp|icmp}
-i INTERFACE 指定数据报文流入的接口(例2)
可用于定义的链:PREROUTING,INPUT,FORWARD
-o INTERFACE 指定输入报文流入的接口
可用于定义的链:OUTPUT,POSTROUTING,FORWARD
2>.扩展匹配
-p tcp
--sport PORT[-PORT] 源端口(例3)
--dport PORT[-PORT] 目的端口
--tcp-flags mark comp 检查mark指定的标志位(例4)
-p icmp
--icmp-type(例5)
0: echo-reply
8: echo-request
-p udp
--sport
--dport
-m state --state 状态扩展(NEW,ESTABLIESHED,INVALID,RELATED)(例子6)
例11)
-m multiport 离散多端口匹配
--source-ports
--destination-ports
--portse(例子7)
-m iprange 范围
--src-range
--dst-range(例子8)
-m connlimit 连接数限定
--connlimit-ablove n (例子9)
-m limite
--limit RATE 控制单位时间内可连接的速度(没分钟提供3个连接)
--limit-burst num 每批连接只能进num个
例10)任何服务包含该字符串就屏蔽
--algo {kmp|bm}
--string "STRING"
处理办法:
-j TARGET
ACCEPT
DROP
REJECT
例13)
例14)
REDIRECT 重定向
MASQUERADE 地址伪装(例13)(相当于原地址转换,多用于地址是自动获取的地址)
例12)
MARK 为报文打标记
用到的命令
iptstate -t 显示连接个数
四、filter表上常用规则
例1:设置iptables默认策略为DROP
#iptables -P INPUT DROP
#iptables -P OUTPUT DROP
#iptables -P FORWARD DROP
例2:放行自己对环回口的ping报文
#iptables -I INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
#iptables -I OUTPUT -s 127.0.0.1 -d 127.0.0.1 -o lo -j ACCEPT
例3:放行192.168.0.0网段对192.168.1.11的ssh服务的访问
#iptables -t filter -A INPUT -s 192.168.0.0/16 -d 192.168.1.11 -p tcp --dport 22 -j ACCEPT
#iptables -t filter -A OUTPUT -s 192.168.1.11 -d 192.168.0.0/16 -p tcp --sport 22 -j ACCEPT
例4:放行所有的syn=1,ack=0,fin=0,rst=0的报文
#iptables -t filter -A INPUT -p tcp --sport --tcp-flags SYN,ACK,FIN,RST SYN -j ACCEPT
例5:允许自己ping其他主机,不允许别人ping自己
#iptables -t filter -A OUTPUT -s 192.168.1.11 -p icmp --icmp-type 8 -j ACCEPT
#iptables -t filter -A INPUT -d 192.168.1.11 -p icmp --icmp-type 0 -j ACCEPT
例6:防止反弹******web,禁止非响应式连接
iptables_conntrack(强烈建议关闭)
/proc/net/ip_conntrack 当前连接的保存位置使用iptstate -t可以查看
/proc/net/ipv4/ip_conntrack_max 最大的连接个数,如果连接个数超过限制条目,其他的请求一律被丢弃
#iptables -t filter -A INPUT -d 192.168.1.11 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -t filter -A OUTPUT -s 192.168.1.11 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
上一条也可以这样写
#iptables -t filter -I OUTPUT -s 192.168.1.11 -m state --state ESTABLISHED -j ACCEPT
例7:离散多端口匹配
#iptables -I INPUT 2 -d 192.168.1.11 -p tcp -m multiport --destination-ports 21,22,80 -m state --state NEW -j ACCEPT
例8:IP地址范围匹配
#iptables -t filter -A INPUT -p tcp -m iprange --src-range 192.168.1.5-192.168.1.15 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
例9:连接数限定(用于限定同一个客户端地址最多允许同时发起多少个请求的),表示不高于8个就允许,多于8个就禁止
#iptables -t filter -A INPUT -d 192.168.1.11 -p --dport 80 -m connlimit ! --connlimit-above 8 -j ACCEPT
例10:任何服务只要包含指定字符串就屏蔽该网页(此处应该注意数据包的流向,在客户端拒绝,拒绝的应该是来自服务器出去的报文)一定做到OUTPUT上
#iptables -t filter -I OUTPUT -s 192.168.1.11 -m string --algo kmp --string "Alex" -j REJECT
例11:允许FTP协议的链接。
对于ftp等双层协议来说,链接状态有控制链接和数据链接之分,ftp能够通过放行NEW,ESTABLISHED来和对端连接,但是不能够传输数据,必须使用RELATED状态标记该链接,表示允许(或禁止)相关联的数据链接,对此必须先加载ip_conntrack_ftp,和ip_nat_ftp模块。模块加载见:
#iptables -A INPUT -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允许已经行的请求,已建立和相关的数据包进入
允许已经建立和相关的数据包出去
五、nat表上常用规则(以下地址是192.168.10.X就简写为10.X)
打开主机的转发功能
echo 1 > /etc/sys/net/ipv4/ip_forward
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p 直接生效上面
例12:-j LOG 记录日志
#iptables -t filter -I INPUT 4 -d 192.168.1.11 -p icmp --icmp-type 8 -j LOG --log-prefix "--firewall on icmp-- "
(与DROP,ACCEPT,REJECT同用时,应放置与该操作的上面这里我置于第四条)只要每一个客户端ping我主机就记录该客户端的信息,并且打上"--Firewall on icmp--"标签
例13:-j SNAT --to-source 源地址转换
适用场景:(在POSTROUTING上做规则)
场景结构:左边10.8和10.9通过firewall共享互联网,且使用的是私有地址;中间防火墙两块网卡,一个(10.10)为内网IP,一个(100.7)为对外公网IP;右边是互联网。
假设10.9主机请求100.6,发往100.6,但是回来的时候100.6并不知道10.9在哪里,收不到回复请求。
目的:10.9能请求到100.6并且它能够回复给10.9
实现
#echo 1 > /etc/sys/net/ipv4/ip_forward
#iptbles -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.7
打开地址转发功能(也可以编辑/etc/sysctl.conf文件对转发选项置1),编写防火墙源地址转换规则,对所有来自192.168.10.0网段的地址实施源地址转换,转换为172.16.100.7。
注:源地址转换的返回时的目的地址转换是由firewall自动完成的,如果公网是固定IP就用SNAT,如果公网接口采用ppp0或者ppp1的ADSL拨号连接,则将SNAT转换为MASQUERADE即可
例14:-j DNAT --to-destination 目标地址转换
适用场景:(在PREROUTING上做规则)
场景结构:左边我的webserver想发布至公网,但是我只有一个私有地址。中间防火墙两块网卡,一个(10.10)为内网网关,一个(100.7)为对外公网IP,开启ip_forward功能;右边是互联网。
目的:所有对100.7的web访问都转发至内网的10.9的为webserver上。
实现:
#echo 1 > /etc/sys/nat/ipv4/ip_forward
#iptables -t nat -A PREROUTING -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.9
注:做目的地址转换的firewall对于某请求的响应报文,其源地址转换是自动完成的。
例15:iptables 命令的保存
#service iptables save
#iptables-save > /etc/iptables/iptables_20150725
#iptables-restore < /etc/iptables/iptables_20150725