iptables 可以检测、修改、转发、重定向和丢弃 IPv4 数据包。过滤 IPv4 数据包的代码已经内置于内核中,并且按照不同的目的被组织成 表 的集合。表 由一组预先定义的 链 组成,链 包含遍历顺序规则。每一条规则包含一个谓词的潜在匹配和相应的动作(称为 目标),如果谓词为真,该动作会被执行。也就是说条件匹配。iptables 是用户工具,允许用户使用 链 和 规则。
表(Tables)
iptables 包含 5 张表(tables),常用的是前2种:
filter 是用于存放所有与防火墙相关操作的默认表。
nat 用于 网络地址转换(例如:端口转发)。
raw 用于配置数据包,raw 中的数据包不会被系统跟踪。
mangle 用于对特定数据包的修改(参考 损坏数据包)。
security 用于强制访问控制网络规则
下面介绍常见的2种:
filter (过滤器):主要跟进入 Linux 本机的封包有关,这个是预设的 table
INPUT:主要与想要进入我们 Linux 本机的封包有关;
OUTPUT:主要与我们 Linux 本机所要送出的封包有关;
FORWARD:这个咚咚与 Linux 本机比较没有关系, 他可以『转递封包』到后端的计算机中,与下列 nat table 相关性较高。
nat (地址转换):是 Network Address Translation 的缩写, 这个表格主要在进行来源与目的之 IP 或 port 的转换,与 Linux 本机较无关,主要与 Linux 主机后的局域网络内计算机较有相关。
PREROUTING:在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
POSTROUTING:在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)
OUTPUT:与发送出去的封包有关。
iptables的流程图
XXXXXXXXXXXXXXXXXX
XXX Network XXX
XXXXXXXXXXXXXXXXXX
+
|
v
+-------------+ +------------------+
|table: filter| <---+ | table: nat |
|chain: INPUT | | | chain: PREROUTING|
+-----+-------+ | +--------+---------+
| | |
v | v
[local process] | **************** +--------------+
| +---------+ Routing decision +------> |table: filter |
v **************** |chain: FORWARD|
**************** +------+-------+
Routing decision |
**************** |
| |
v **************** |
+-------------+ +------> Routing decision <---------------+
|table: nat | | ****************
|chain: OUTPUT| | +
+-----+-------+ | |
| | v
v | +-------------------+
+--------------+ | | table: nat |
|table: filter | +----+ | chain: POSTROUTING|
|chain: OUTPUT | +--------+----------+
+--------------+ |
v
XXXXXXXXXXXXXXXXXX
XXX Network XXX
常用命令
显示规则(默认filter表)
# iptables -L -n
显示nat 规则
# iptables -L -n -t nat
清空策略
# iptables -F清空计数
# iptables -Z
删除自定义规则链
# iptables -X
删除指定表
#iptables -t nat -X
开机启动
# chkconfig iptables on
# chkconfig iptables off
启停/保存
# /etc/init.d/iptables stop /start/restart/save
定义自己的链
#除了INPUT,FORWARD,OUTPUT链,可以定义自己的链
# iptables -N selfish #定义一个selfish链,相当于多了一扇门
# iptables -X selfish #删除selfish这条链
# iptables -F #删除前需要清空策略,否则链路删除不掉
查看规则文件
# vi /etc/sysconfig/iptables
此规则表示允许22接口ssh
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-m引用模块 state 后面接状态NEW-j 表示jump 后接动作
允许SSH连接
-A INPUT -p tcp -m tcp -i eth0 --dport 22 -j ACCEPT
允许DHCP
-A INPUT -p udp -m udp -i eth0 --dport 67:68 -j ACCEPT
允许eth0的日志记录行为,级别4
-A INPUT -i eth0 -j LOG --log-prefix "IPTABLES-LOG-INPUT-LAN:" --log-level 4
NAT表:网络地址转换(Network Address Translation)
包括三个动作
(1)DNAT:改变数据包的目的地址使包能重路由到某台机器(使公网能够访问局域网的服务器)
(2)SNAT: 改变数据包的源地址(使局域网能访问公网)
(3)MASQUERADE:和SNAT一样使局域网能访问公网,无固定IP使用PPP.PPPoE等拨号上网接入Internet
使用iptables nat实现端口转发
Nat表包含3条链:
(1)PREROUTING链 :数据包到达防火墙时改变包的目的地址。
(2)OUTPUT链:改变本地产生数据包的目标地址。
(3)POSTROUTING:在数据包离开防火墙时改变数据包的源地址。
举个栗子,比如mysql生产服务器经常会限制端口,只允许内网访问,那么可以在一台内网机器上配置nat转发
mysql服务器 192.168.79.129:3306
本地服务器 192.168.79.128 选择一个转发端口,如33306
如下配置可实现 192.168.79.128:33306-->192.168.79.129:3306
首先确定192.168.79.128有开启转发:
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
如更改后需执行sysctl -p
在192.168.79.128上执行:
Iptables 表名 链名 匹配条件 动作
# iptables -t nat -A PREROUTING -p tcp --dport 33306 -j DNAT --to-destination 192.168.79.129:3306
# iptables -t nat -A POSTROUTING -d 192.168.79.129 -p tcp --dport 3306 -j SNAT --to 192.168.79.128
# service iptables save
DNAT将128对33306访问转为129的3306;
SNAT将到129的3306的source定义为128;
之后便可以直接连接192.168.79.128:33306来访问mysql服务器
参考
https://wiki.archlinux.org/index.php/Iptables_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
http://cn.linux.vbird.org/linux_server/0250simple_firewall.php