什么是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表。然后使用以下的选项:

  1. 对规则的操作

加入(append) 一个新规则到一个链 (-A)的最后。

在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。

在链内某个位置替换(replace) 一条规则 (-R)。

在链内某个位置删除(delete) 一条规则 (-D)。

删除(delete) 链内第一条规则 (-D)。

  1. 指定源地址和目的地址

通过–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。

  1. 指定网络接口

可以使用–in-interface/-i或–out-interface/-o来指定网络接口。从NAT的原理可以看出,对于PREROUTING链,我们只能用-i指定进来的网络接口;而对于POSTROUTING和OUTPUT我们只能用-o指定出去的网络接口。

  1. 指定协议及端口

可以通过–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 ..可以显示更详细的信息