iptables
是在 用户空间
控制 Netfilter
的工具,Netfilter
是 Linux内核
中的一个软件框架,用于管理网络数据包
。Netfilter/iptables
实现 Linux
平台下的包过滤防火墙功能。
理论
iptables
的核心是规则,它存储在内核空间的信息包过滤表,规则包括源地址、目的地址、传输协议(如:TCP/UDP/ICMP等)和应用层协议(如:HTTP/FTP/SMTP等)等。如果数据包符合规则
,就执行对应的动作。动作有:放行(accept)、拒绝(reject)和丢下(drop)。iptables
的控制这些规则的工具,Netfilter
负责实现响应功能。
链
iptables
链包括:
- PREROUTING
- FORWARD
- POSTROUTING
- INPUT
- OUTPUT
通过上图,报文流向说明如下:
到本机某进程的报文:网卡
-> PREROUTING
-> INPUT
-> 某个进程
从本机的某进程发出/响应的报文:某个进程
-> OUTPUT
-> POSTROUTING
-> 网卡
本机转发的报文:网卡
-> PREROUTING
-> FORWARD
-> POSTROUTING
-> 网卡
表
每个链
上都可以有一系列的规则,相同的规则的集合叫 表
。根据规则类型 iptables
将 表
定义为如下4类:
raw表
:关闭nat表
上启用的连接追踪机制,内核模块:iptable_raw
mangle表
:拆解报文,做出修改,并重新封装 的功能,内核模块:iptable_mangle
nat表
(network address translation
):网络地址转换功能,内核模块:iptable_nat
filter表
:负责过滤功能,防火墙,内核模块:iptables_filter
表优先级次序(由高而低):
raw
-> mangle
-> nat
-> filter
表和链的关系
raw表
支持的链
:PREROUTING
、OUTPUT
mangle表
支持的链
:PREROUTING
、INPUT
、FORWARD
、OUTPUT
、POSTROUTING
nat表
支持的链
:PREROUTING
、OUTPUT
、POSTROUTING
、INPUT
filter表
支持的链
:INPUT
、FORWARD
、OUTPUT
匹配条件
- Source IP 源地址
- Destination IP 目标地址
- Source Port 源端口
- Destination Port 目标端口
动作
- ACCEPT:允许数据包通过
- DROP:直接丢弃数据包
- REJECT:拒绝数据包通过
- SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
- DNAT:目标地址转换
- REDIRECT:本机做端口映射
- LOG:在
/var/log/messages
文件中记录日志信息,然后将数据包传递给下一条规则
使用
iptables是Linux上常用的防火墙软件,下面给大家说一下iptables的安装、清除iptables规则、iptables只开放指定端口、iptables屏蔽指定ip、ip段及解封、删除已添加的iptables规则等iptables的基本应用。
安装
yum install iptables -y
apt-get install iptables
# 相当于以前的chkconfig iptables on
systemctl enable iptables.service
# 开启服务
systemctl start iptables.service
# 查看状态
systemctl status iptables.service
查看规则
iptables -nvL
- v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
- x:在 v 的基础上,禁止自动单位换算(K、M)
- n:只显示IP地址和端口号,不将ip解析为域名
清除规则
# 1. 清空所有默认规则
iptables -F
# 2. 清空所有自定义规则
iptables -X
# 3. 所有计数器归0
iptables -Z
将所有iptables以序号标记显示,执行:
iptables -nL
iptables -nL --line-numbers
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8
开放指定的端口
# 1. 允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
# 2. 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 3. 允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
# 4. 允许访问22端口,如果22端口未加入允许规则,SSH链接会直接断开。
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 5. 允许访问80/443端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 6. 允许FTP服务的21和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# 7. 禁止其他未允许的规则访问
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT
# 8. 屏蔽单个IP的命令
iptables -I INPUT -s 123.45.6.7 -j DROP
# 9. 封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
# 10. 先允许所有,不然有可能会杯具
iptables -P INPUT ACCEPT
# 11. 允许ping
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 12. 允许接受本机请求之后的返回数据 RELATED,是为FTP设置的
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 13. 其他入站一律丢弃
iptables -P INPUT DROP
# 14. 所有出站一律绿灯
iptables -P OUTPUT ACCEPT
# 15. 所有转发一律丢弃
iptables -P FORWARD DROP
保存规则设定
保存上述规则
service iptables save
实战
解决vsftpd在iptables问题
vsftpd无法使用被动模式的问题解决方式:
- 首先在/etc/sysconfig/iptables-config中修改或者添加以下内容
#添加以下内容,注意顺序不能调换
IPTABLES_MODULES="ip_conntrack_ftp"
IPTABLES_MODULES="ip_nat_ftp"
- 重新设置iptables设置
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
以下为完整设置脚本
#!/bin/sh
iptables -P INPUT ACCEPT
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
service iptables save
systemctl restart iptables.service