简介
iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。
“四表”是指 iptables 的功能,默认的 iptable s规则表有 filter 表(过滤规则表)、nat 表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表):
1.filter 表:控制数据包是否允许进出及转发,可以控制的链路有 INPUT、FORWARD 和 OUTPUT。 2.nat 表:控制数据包中地址转换,可以控制的链路有 PREROUTING、INPUT、OUTPUT 和 POSTROUTING。 3.mangle:修改数据包中的原数据,可以控制的链路有 PREROUTING、INPUT、OUTPUT、FORWARD 和 POSTROUTING。 4.raw:控制 nat 表中连接追踪机制的启用状况,可以控制的链路有 PREROUTING、OUTPUT。
“五链”是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含多个数据链:INPUT(入站数据过滤)、OUTPUT(出站数据过滤)、FORWARD(转发数据过滤)、PREROUTING(路由前过滤)和POSTROUTING(路由后过滤),防火墙规则需要写入到这些具体的数据链中。
Linux 防火墙的过滤框架,如图 1 所示。
iptables语法格式
iptables 命令的基本语法格式如下:
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
各参数的含义为:
-
-t:指定需要维护的防火墙规则表 filter、nat、mangle或raw。在不使用 -t 时则默认使用 filter 表。
-
COMMAND:子命令,定义对规则的管理。
-
chain:指明链表。
-
CRETIRIA:匹配参数。
-
ACTION:触发动作。
iptables 命令常用的选项及各自的功能如表 2 所示
选 项 | 功 能 |
---|---|
-A | 添加防火墙规则 |
-D | 删除防火墙规则 |
-I | 插入防火墙规则 |
-F | 清空防火墙规则 |
-L | 列出添加防火墙规则 |
-R | 替换防火墙规则 |
-Z | 清空防火墙数据表统计信息 |
-P | 设置链默认规则 |
iptables 命令常用匹配参数及各自的功能如表 3 所示。
参 数 | 功 能 |
---|---|
[!]-p | 匹配协议,! 表示取反 |
[!]-s | 匹配源地址 |
[!]-d | 匹配目标地址 |
[!]-i | 匹配入站网卡接口 |
[!]-o | 匹配出站网卡接口 |
[!]--sport | 匹配源端口 |
[!]--dport | 匹配目标端口 |
[!]--src-range | 匹配源地址范围 |
[!]--dst-range | 匹配目标地址范围 |
[!]--limit | 匹配数据表速率 |
[!]--mac-source | 匹配源MAC地址 |
[!]--sports | 匹配源端口 |
[!]--dports | 匹配目标端口 |
[!]--stste | 匹配状态(INVALID、ESTABLISHED、NEW、RELATED) |
[!]--string | 匹配应用层字串 |
iptables 命令触发动作及各自的功能如表 4 所示。
触发动作 | 功 能 |
---|---|
ACCEPT | 允许数据包通过 |
DROP | 丢弃数据包 |
REJECT | 拒绝数据包通过 |
LOG | 将数据包信息记录 syslog 曰志 |
DNAT | 目标地址转换 |
SNAT | 源地址转换 |
MASQUERADE | 地址欺骗 |
REDIRECT | 重定向 |
永久生效
当你删除、添加规则后,这些更改并不能永久生效,这些规则很有可能在系统重启后恢复原样。如下配置让配置永久生效。
# 保存iptables规则 service iptables save # 重启iptables服务 service iptables stop service iptables start
查看当前规则:
cat /etc/sysconfig/iptables
防火墙的备份与还原
iptables-save命令
iptables-save > /etc/sysconfig/iptables
iptables-save > 文件名称
iptables-restore命令
iptables-restore < 文件名称
例子
iptables --list
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 RH-Firewall-1-INPUT all -- 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) num target prot opt source destination Chain RH-Firewall-1-INPUT (2 references) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmp type 255 3 ACCEPT esp -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT ah -- 0.0.0.0/0 0.0.0.0/0 5 ACCEPT udp -- 0.0.0.0/0 224.0.0.251 udp dpt:5353 6 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:631 7 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:631 8 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 9 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 10 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
以上输出包含下列字段:
-
num – 指定链中的规则编号
-
target – 前面提到的target的特殊值
-
prot – 协议:tcp, udp, icmp等
-
source – 数据包的源IP地址
-
destination – 数据包的目标IP地址
NAT规则实战举例:
需求
把本地的mysql 3306端口映射出去变成63306,外面连接的语句是
mysql -uroot -p'password' -h xxxxx -P 63306
注:当访问63306的时候,会自动去请求3306,然后返回数据。
实现
先允许数据包转发
echo 1 >/proc/sys/net/ipv4/ip_forward sysctl -w net.ipv4.conf.eth0.route_localnet=1 sysctl -w net.ipv4.conf.default.route_localnet=1
nat规则
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 63306 -j DNAT --to-destination 127.0.0.1:3306 iptables -t nat -A POSTROUTING -p tcp -m tcp --dport 63306 -j SNAT --to-source 127.0.0.1
注:这是允许所有外来的IP访问,慎用。
我们来做个ip限制,限制单个来源IP
iptables -t nat -R PREROUTING 4 -s 192.168.40.154 -p tcp -m tcp --dport 63306 -j DNAT --to-destination 127.0.0.1:3306 iptables -t nat -R POSTROUTING 4 -s 192.168.40.154 -p tcp -m tcp --dport 63306 -j SNAT --to-source 127.0.0.1
注:这是只给外网的192.168.40.154连接, 其他的都连不上,
修改规则(4代表编号, --line-number可查看对应编号, -s 指定来源IP)。
查看nat规则
iptables -L -t nat --line-number
删除nat规则
iptables -t nat -D POSTROUTING 1
-A 追加规则-->iptables -A INPUT
-D 删除规则-->iptables -D INPUT 1(编号)
-R 修改规则-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)
-I 插入规则-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位
-L 查看规则-->iptables -L INPUT 列出规则链中的所有规则
-N 新的规则-->iptables -N allowed 定义新的规则