什么是NAT
在传统的标准的TCP/IP通信过程中,所有的路由器仅仅是充当一个中间人的角色,也就是通常所说的存储转发,路由器并不会对转发的数据包进行修改,更为确切的说,除了将源MAC地址换成自己的MAC地址以外,路由器不会对转发的数据包做任何修改。NAT(Network Address Translation网络地址翻译)恰恰是出于某种特殊需要而对数据包的源ip地址、目的ip地址、源端口、目的端口进行改写的操作。
iptables使用nat转发原理
netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。因为系统缺省的表是"filter",所以在使用filter功能时,我们没有必要显式的指明"-t filter"。
同filter表一样,nat表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:
- PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT;
- POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。
- OUTPUT:定义对本地产生的数据包的目的NAT规则。
操作语法
如前所述,在使用iptables的NAT功能时,我们必须在每一条规则中使用"-t nat"显示的指明使用nat表。然后使用以下的选项:
- 对规则的操作
加入(append) 一个新规则到一个链 (-A)的最后。
在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。
在链内某个位置替换(replace) 一条规则 (-R)。
在链内某个位置删除(delete) 一条规则 (-D)。
删除(delete) 链内第一条规则 (-D)。
- 指定源地址和目的地址
通过–source/–src/-s来指定源地址(这里的/表示或者的意思,下同),通过–destination/–dst/-s来指定目的地址。可以使用以下四中方法来指定ip地址:
a. 使用完整的域名,如“www.linuxaid.com.cn”;
b. 使用ip地址,如“192.168.1.1”;
c. 用x.x.x.x/x.x.x.x指定一个网络地址,如“192.168.1.0/255.255.255.0”;
d. 用x.x.x.x/x指定一个网络地址,如“192.168.1.0/24”这里的24表明了子网掩码的有效位数,这是 UNIX环境中通常使用的表示方法。
缺省的子网掩码数是32,也就是说指定192.168.1.1等效于192.168.1.1/32。
- 指定网络接口
可以使用–in-interface/-i或–out-interface/-o来指定网络接口。从NAT的原理可以看出,对于PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。
- 指定协议及端口
可以通过–protocol/-p选项来指定协议,如果是udp和tcp协议,还可–source-port/–sport和 --destination-port/–dport来指明端口。
使用实例
#允许防火墙转发
echo 1 > /proc/sys/net/ipv4/ip_forward
#清除iptables nat
iptables -t nat -F
#查看现用所有iptables规则
iptables -t nat -L -n --line-number
#添加端口转发规则
#规则解释:在forward表里添加规则,允许转发向6379端口转发的tcp连接数据
iptables -I FORWARD -p tcp --dport 6379 -j ACCEPT
iptables -t nat -I PREROUTING -p tcp --dport 6378 -j DNAT --to 212.129.134.145:6379
iptables -t nat -I POSTROUTING -p tcp --dport 6379 -j MASQUERADE
#保存并重启iptables使规则生效
service iptables save
service iptables restart
iptables命令解释
-L :list 列表
-n :数字格式显示ip和端口
--line-numbers:显示行号
-x : 显示精确值,不要做单位换算
-t : 指定表
-t{fillter|nat|mangle|raw}
-v : 显示详细信息 -v -vvv -vvvv ..可以显示更详细的信息
管理链:
-F :清空链
清空nat表中的input链,格式如下:
#iptables-t nat -F INPUT
#清空fllter表所有链:
#iptables-F
-P : 设定默认策略,为指定链设置默认策略,格式如下:
#设置fllter表input链的默认规则为丢弃
iptables-t fllter -P INPUT DROP
-N : 新建一条自定义链(内置链不能删除,如果太多,可以自定义链)
#自定义连只能被调用才可以发挥作用
iptables-N fillter_web
-X : 删除自定义空链,如果链内有规则,则无法删除
-Z :计算器清零
iptables-Z
-E :重命名自定义链
iptables管理规则:
-A :append附加规则,将新增的规则添加到链的尾部
-I[n] :插入为第n条规则
-D : 删除第n条规则
-R[n] : 替换第N条
表和链的对应关系:
fillter :INPUT FORWORD OUTPUT
nat : PREROUTING POSTROUTING OUTPUT
使用-t指定表来查看指定表内的规则:
#iptables-t nat -L -n
raw : prerouting output
iptables-t raw -L -n
mangle: prerouting input forword output postrouting
-t : 指定表
-t{fillter|nat|mangle|raw}
-v : 显示详细信息 -v -vvv -vvvv ..可以显示更详细的信息