Linux下netfilter/iptables使用(V3.0)

官方文档/usr/share/doc/iptables/html/NAT-HOWTO.html

参考http://os.51cto.com/art/201103/249046.htm

http://os.51cto.com/art/201103/249054_all.htm

http://www.server110.com/linux/201309/1417.html

1.概念

NAT网络地址转换,分为SNAT,DNAT,即源地址转换和目标地址转换,分别用于上行链路和下行链路。

netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组成。并且系统缺省的表是"filter"。但是在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用"-t nat"选项来显式地指明这一点。

nat表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:

PREROUTING:可以在这里定义进行目的NAT的规则,因为路由器进行路由时只检查数据包的目的ip地址,所以为了使数据包得以正确路由,我们必须在路由之前就进行目的NAT;

POSTROUTING:可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。

OUTPUT:定义对本地产生的数据包的目的NAT规则。

2.命令

一般语法如下:

iptables [-t table] command [match] [target]

-j MASQUERADE
用于外网口public地址是DHCP动态获取的(如ADSL)
3.处理流程

PREROUTING DNAT翻译——>再过滤(FORWARD)——>最后路由

路由——>再过滤(FORWARD)——>最后才进行POSTROUTING SNAT地址翻译

     _____                                     _____
     /     \                                   /     \
   PREROUTING -->[Routing ]----------------->POSTROUTING----->
     \D-NAT/     [Decision]                    \S-NAT/
                     |                            ^
                     |                            |
                     |                            |
                     |                            |
                     |                            |
                     |                            |
                     |                            |
                     --------> Local Process ------

4.linux下nat定义与网络协议中的nat/pat协议的对应关系为

静态NAT协议,一个内网ip对应一个外网ip。

动态NAT协议,若干个内网ip,对应一个外网IP。

5.命令举例

# 删除刷新缺省表如”filter”, 其它表如”nat”需清楚标明:
iptables --flush # 刷新所有过滤规则和NAT表.
iptables --table nat --flush
iptables --delete-chain

#删除所有非缺省的规则链和nat表
iptables --table nat --delete-chain

配置静态NAT协议

该ISP分配给A单位www服务器的ip为:

伪ip:192.168.1.100

真实ip:202.110.123.100

iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100

iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100

动态NAT协议

1.地址池建议参考http://www.server110.com/linux/201309/1417.html

上行

更改所有来自192.168.1.0/24(子网)的数据包的源ip地址为1.2.3.4-1.2.3.6(外网IP地址池)

# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4-1.2.3.6


下行

将所有目的地址为1.2.3.4-1.2.3.6的数据转发给192.168.1.0/24子网

iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 192.168.1.1-192.168.1.254


2.上联口为动态ip的情况(DHCP / PPPoE)

## Masquerade everything out ppp0.
# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

注意:

MASQUERADE只能用于postRouting链,那么下行的时候,数据该怎么办呢

另外,该选项如果增加对端口的要求,则只能适用与TCP或者UDP。


3.PAT

此协议是思科私有协议,中移动不要求。目前依靠IPtablse不能实现。因为针对端口的映射

iptablse命令为

## Change source addresses to 1.2.3.4, ports 1-1023
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to 1.2.3.4:1-1023

要求必须为UDP或者TCP协议。

但实际业务需求超出此范围,因此不实现。

你可能感兴趣的:(TCP/IP,linux,c语言)