第1章 NAT功能概述
1.1 什么是NAT
1.2 为什么要进行NAT
我们来看看再什么情况下我们需要做NAT。
因为只在应用层以下进行处理,不但可以获得很高的访问速度,而且可以无缝的支持任何新的服务或应用。
还有一个方面的应用就是重定向,也就是当接收到一个包后,不是转发这个包,而是将其重定向到系统上的某一个应用程序。最常见的应用就是和squid配合使用成为透明代理,在对http流量进行缓存的同时,可以提供对Internet的无缝访问。
另一种情况就是4G/5G的DUT,需要在私网和公网之间进行转换。
1.3 NAT的类型
第2章 IP Table概述
2.1 IP Table概述
Lnux系统中,防火墙(Firewall),网址转换(NAT),数据包(package)记录,流量统计,这些功能是由Netfilter子系统所提供的,而iptables是控制Netfilter的工具.
iptables将许多复杂的规则组织成成容易控制的方式,以便管理员可以进行分组测试,或关闭、启动某组规则。
iptable能够为Unix、Linux和BSD个人工作站创建一个防火墙,也可以为一个子网创建防火墙以保护其它的系统平台。iptable只读取数据包头,不会给信息流增加负担,也无需进行验证。
2.2. Iptable的链和表结构
2.3 五个链(chain)
PREROUTING: 在数据包进入防火墙之后、路由判断之前对数据包进行修改
INPUT: 在数据包被路由到本地之后,但在用户空间程序看到它之前对数据包进行修改
OUTPUT: 用户空间程序处理数据包后,由本地发出,再次被路由之前更改数据包
POSTROUTING: 在所有路由判断之后,对数据包进行修改
注意: 链 是每个数据包流需要经过的不同环节,你可以在不同的环节根据需要设置不同的过滤策略,每个链的默认策略都是Accept
2.4 四个表(table)
**Mangle表:**这个表主要用来mangle包,你可以使用mangle匹配来改变包的一些属性,比如 TOS(TYPE OF SERVICE),TTL (TIME TO LIVE),MARK(后续流量控制TC等)
Filter表:此表用来过滤数据包,我们可以在任何时候匹配包并过滤它们。 我们就是在这里根据包的内容对包做DROP或ACCEPT的. iptalbe中,要用 -t 参数指定要操作哪个表,如果没有 -t 参数,就默认对filter表操作.
Raw表: 优先级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
注意: 表 是规则的集合组,每个表中的规则条目是按顺序匹配的,你可以在数据包经过的不同环节设置规则,表的处理优先级:raw > mangle > nat > filter
2.5 详细的数据包流程
在上图中,NAT的功能发生在三个地方:
2.5 IP Table操作命令处理流程
在用户空间的IP table命令,会通过内核接口,操作内核的Ip_table规则表,并最终操作的是内核空间的Netfilter钩子函数。
第3章 IP Table对Nat的支持命令
3.1 IP Table对NAT的支持概述
netfilter是Linux 核心中一个通用架构,它提供了一系列的"表"(tables),每个表由若干"链"(chains)组成,而每条链中可以有一条或数条规则(rule)组 成。并且系统缺省的**表是"filter"。**因为系统缺省的表是"filter",所以在使用filter功能时,我们没有必要显式的指明"-t filter"。
但在使用NAT的时候,我们所使用的表不再是"filter",而是"nat"表,所以我们必须使用**"-t nat**"选项来显式地指明这一点。
同filter表一样,nat表也有三条缺省的"链"(chains),这三条链也是规则的容器,它们分别是:
**(2)POSTROUTING:**可以在这里定义进行源NAT的规则,系统在决定了数据包的路由以后在执行该链中的规则。
(3)OUTPUT:定义对本地产生的数据包的目的NAT规则。
3.1 对规则的操作
加入(append) 一个新规则到一个链 (-A)的最后。
在链内某个位置插入(insert) 一个新规则(-I),通常是插在最前面。
在链内某个位置替换(replace) 一条规则 (-R)。
在链内某个位置删除(delete) 一条规则 (-D)。
删除(delete) 链内第一条规则 (-D)。
3.3 通过命令指定具体的源地址和目的地址
使用完整的域名,如“www.linuxaid.com.cn”;
3.4 通过命令指定网络接口
可以使用–in-interface/-i或–out-interface/-o来指定网络接口。
3.5 指定协议及端口
可以通过–protocol/-p选项来指定协议,如果是udp和tcp协议,还可–source-port/–sport和 --destination-port/–dport来指明端口。
3.6 内核开关与编译
(1)编译
Linux内核对Nat的支持,是需要打开内核选项的。
编译内核,编译时选中以下选项:
Full NAT
MASQUERADE target support
REDIRECT target support
(2)加载ko
要使用NAT表时,必须首先载入相关模块:
modprobe ip_tables
modprobe ip_nat_ftp
iptable_nat 模块会在运行时自动载入。
第4章 实际操作案例解析
需要注意的时,大多数情况下,
而公网到私网的转换是1对多
4.1 源NAT(SNAT)
这里需要注意的是,系统在路由及过虑等处理直到数据包要被送出时才进行SNAT。
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
4.2 目的SNAT(DNAT)
这里需要注意的是,系统是先进行DNAT,然后才进行路由及过虑等操作。
第5章 综合例子
5.1 案例1:使用拨号局域网上网
小型企业、网吧等多使用拨号网络上网,通常可能使用代理,但是考虑到成本、对协议的支持等因素,建议使用ip欺骗方式带动区域网上网。
成功升级内核后安装iptables,然后执行以下脚本:
#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp
#进行ip伪装
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
5.2 案例2:ip映射
我们假设以下情景:
该ISP分配给A单位www服务器的ip为:
伪ip:192.168.1.100
真实ip:202.110.123.100
该ISP分配给B单位www服务器的ip为:
伪ip:192.168.1.200
真实ip:202.110.123.200
内网接口eth1:192.168.1.1
接口eth0:202.110.123.1
然后我们将分配给A、B单位的真实ip绑定到防火墙的接口,以root权限执行以下命令:
ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0
ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0
成功升级内核后安装iptables,然后执行以下脚本:
#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp
首先,对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT):
iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100
iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200
iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100
iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200
这样,所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和 192.168.1.200;而所有来自192.168.1.100和192.168.1.200的数据包都将分别被伪装成由 202.110.123.100和202.110.123.200,从而也就实现了ip映射.
附录:NAT、DNAT和MASQUERADE进一步比较