iptables是一个命令行工具,位于用户空间。
iptables可以看成一个客户端代理,用户通过这个代理将用户的安全设定执行到对应的“安全框架”中。这个安全框架就是防火墙,名叫netfilter。netfilter位于内核空间。
iptables按规则办事,规则一般定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中。
1.链
iptables的链结构如下图所示:
共有五条链:prerouting、input、output、forward和postrouting。每条链都放置了一串规则,也就是说规则必须属于某条链。
2.表
把具有相同功能的规则的集合叫做“表”。iptables为我们提供四张表:
(1)filter表:负责过滤功能,防火墙。内核模块为iptables_filter。
(2)nat表:network address translation,网络地址转换功能,iptables_net。
(3)mangle表:拆解报文,做出修改,并重新封装的功能,iptables_mangle。
(4)raw表:关闭nat表上启用的连接追踪机制,提升性能,iptables_raw。
3.规则执行顺序
针对不同的链,规则执行顺序不同。
(1)prerouting:raw->mangle->nat
(2)input:mangle->filter->nat
(3)forward:mangle->filter
(4)output:raw->mangle->nat->filter
(5)postrouting:mangle->nat
4.规则语法
命令行格式为:
iptables [-t table] COMMAND chain CRETIRIA -j ACTION
其中:table指定表,可选择的;chain指定链;COMMAND定义如何对规则进行管理;CRETIRIA指定匹配标准;ACTION指定如何进行处理。
4.1.COMMAND
有以下使用场景
4.1.1.链管理命令,立即生效
-P:设置默认策略
-F:清空链中规则
-N:支持用户新建链
-X:删除用户自定义空链
-E:给用户自定义链重命名
-Z:清空链及链中默认规则的计数器
4.1.2.规则管理命令
-A:附加,在当前链的最后新增一个规则
-I num:把当前规则插入第num条,从1开始
-R num:替换/修改第num条规则,从1开始
-D num:删除第num条规则,从1开始
4.1.3.查看管理命令“iptables -L”
-n:IP显示为数字,不加则显示为主机名
-v:显示详细信息
-vvv:v越多,越详细
-x:在计数器上显示精确值,不做单位换算
--line-number:显示规则行号
-t table:指定表
4.2.CRETIRIA
可用以下配置
4.2.1.通用匹配,即源地址和目标地址匹配
-s:匹配源地址IP,不能是主机名,可以是地址范围,也可以用“!”标识取反。
-d:匹配目标地址IP
-p:匹配协议,通常是TCP、UDP或ICMP
-i eth0:从这块网卡流入的数据
-o eth0:从这块网卡流出的数据
4.2.2.扩展匹配
-p tcp --dport XX-XX:指定单个或连续多个目的端口
-p tcp --sport XX-XX:指定单个或连续多个源端口
-p tcp --tcp-flags:TCP的标志位(SYN、ACK、FIN、PSH、RST、URG)
-p udp --dport XX-XX:目标端口
-p udp --sport XX-XX:源端口
-p icmp --icmp-type:请求回显,一般用8表示。
-m:启用多条件扩展。如limit、time、ttl、state、multiport、mark、mac。我们可用“-m multiport --dport 21,23,80”指定多个不连续端口。
4.3.ACTION
可用以下枚举值
(1)DROP:悄悄丢弃
(2)REJECT:明示拒绝
(3)ACCEPT:接受
(4)custom_chain:转向一个自定义的链
(5)SNAT:源地址转换
(6)DNAT:目标地址转换
(7)MASQUERADE:源地址伪装
(8)REDIRECT:重定向,主要用于端口重定向
(9)MARK:打防火墙标记的
(10)RETURN:返回。在自定义链执行完毕后使用返回,来返回原规则链。
4.3.1.SNAT基于源地址转换
许多内网用户通过一个外网的口上网时,我们需要将内网的地址转换为外网IP。
如将所有192.168.10.0网段的IP在经过的时候转换成172.16.100.1这个外网IP:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.100.1;
如果外网地址是动态的,可用如下命令:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE;
注意,地址伪装不具普适性。
4.3.2.DNAT基于目标地址转换
数据流向是从外向内的,外面是客户端,里面的是服务器端通过目标地址转换,我们可以让外面的IP通过我们对外的IP来访问我们内部的不同服务器。
如把对192.168.10.18:80的tcp访问转换到内部的172.16.100.2这台服务器:
iptables -t nat -A PREROUTING -d 192.168.10.18 -d tcp --dport -j DNAT --to-destination 172.16.100.2;
5.命令使用场景
有以下常用的使用场景
(1)查看所有规则
iptables -L -n
(2)开启端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT;
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT;
上述两条命令即可开启22端口,用于SSH远程登录。其他端口的开启类似,如:web服务器-80、邮件服务器-25和110、ftp服务器-21、dns服务器-53。
(3)允许ping,即允许icmp包通过
iptables -A OUTPUT -p icmp -j ACCEPT;
iptables -A INPUT -p icmp -j ACCEPT;
(4)允许loopback
iptables -A INPUT -i lo -p all -j ACCEPT;
iptables -A OUTPUT -i lo -p all -j ACCEPT;
(5)允许172.16.0.0/16网段的主机访问本机172.16.100.1的sshd服务
iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT;
iptables -t filter -A OUTPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT;
(6)允许本机ping通其他主机,不允许其他主机ping通本机
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT;
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT;
(7)保存当前规则
service iptables save;
iptables-save > /etc/sysconfig/iptables;
保存到/etc/sysconfig/iptables,开机时会自动加载这个文件。
(8)加载手动配置的规则文件
iptables-restore < /etc/sysconfig/iptables2;
加载自己写的配置文件/etc/sysconfig/iptables2。
6.iptables状态机制
iptables最大的优点是可配置有状态的防火墙。有状态的防火墙能够指定并记住为发生或接收信息包所建立的连接状态。有四种有效状态:
(1)ESTABLISHED:指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包,并且完全有效。
(2)INVALID:指出该信息包与任何已知的流或连接都不关联,可能包含错误的信息或头。
(3)NEW:意味着该信息包已经或即将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。
(4)RELATED:表示该信息包正在启动新连接,以及它与已建立的连接相关联。