网络地址转换 - NAT
网络地址转换 (NAT) 使您的网络能够为内部流量使用一组 IP 地址,为外部流量使用第二组地址。
NAT 克服了因互联网爆炸式增长而产生的寻址问题。除了防止 IPv4 地址耗尽外,NAT 还使您能够在内部使用私有地址空间,同时仍然能够访问互联网。
Cumulus Linux 同时支持静态 NAT 和动态 NAT。静态 NAT 在一个私有 IP 地址和一个公共地址之间提供永久映射。动态 NAT 将私有 IP 地址映射到公共地址;这些公共 IP 地址来自一个池。Cumulus Linux 根据需要动态创建转换,以便大量私有地址可以共享较小的公共地址池。您可以同时启用静态 NAT 和动态 NAT。
静态和动态 NAT 均支持
- 基本 NAT,仅转换数据包中的 IP 地址:出站方向的源 IP 地址和入站方向的目标 IP 地址。
- 端口地址转换 (PAT),转换 IP 地址和第 4 层端口:出站方向的源 IP 地址和端口以及入站方向的目标 IP 地址和端口。
静态 NAT 支持双 NAT(也称为二次 NAT),其中交换机在数据包跨越地址域时转换源 IP 地址和目标 IP 地址。当专用网络中的地址空间与公共空间中的 IP 地址重叠时,您可以使用双 NAT。
下图显示了基本 NAT 配置。

- 带有 Spectrum-2 及更高版本的 NVIDIA 交换机支持 NAT。
- 您只能在物理和 Bond 接口上配置 NAT;环回接口、SVI 和子接口等逻辑接口不支持 NAT。
- 您只能在默认 VRF 中配置 NAT。
- 您无法将 IPv6 规则转换为 IPv4 规则。
- NAT 不支持组播流量。
静态 NAT
静态 NAT 在网络内部的私有 IP 地址和公共 IP 地址之间提供一对一映射。例如,如果您有一个私有 IP 地址为 10.0.0.10 的 Web 服务器,并且您希望远程主机使用 IP 地址 172.30.58.80 向 Web 服务器发出请求,则可以在这两个 IP 地址之间配置静态 NAT 映射。
静态 NAT 条目不会从转换表中超时。
Cumulus Linux 还支持 MAC 地址转换,它在第 2 层的以太网数据包上运行。有关更多信息,请参阅MAC 地址转换。
配置静态 NAT
- 对于静态 NAT,创建一条规则,匹配源 IP 地址或目标 IP 地址,并将 IP 地址转换为公共 IP 地址。
- 对于静态 PAT,创建一条规则,匹配源 IP 地址或目标 IP 地址以及第 4 层端口,并将 IP 地址和端口转换为公共 IP 地址和端口。您可以包含出站或入站接口。
NVUE 命令要求您为静态 NAT 规则配置入站或出站接口。但是,您在 /etc/cumulus/acl/policy.d/
目录中的规则文件中配置的规则不需要入站或出站接口。
以下规则匹配在接口 swp51 上进入的源 IP 地址为 10.0.0.1 的 TCP 数据包,并将 IP 地址转换为 172.30.58.80
cumulus@switch:~$ nv set acl acl_1 type ipv4
cumulus@switch:~$ nv set acl acl_1 rule 1 match ip protocol tcp
cumulus@switch:~$ nv set acl acl_1 rule 1 match ip source-ip 10.0.0.1
cumulus@switch:~$ nv set acl acl_1 rule 1 action source-nat translate-ip 172.30.58.80
cumulus@switch:~$ nv set interface swp51 acl acl_1 inbound
cumulus@switch:~$ nv config apply
以下规则匹配在接口 swp51 上进入的目标 IP 地址为 172.30.58.80 的 ICMP 数据包,并将 IP 地址转换为 10.0.0.1
cumulus@switch:~$ nv set acl acl_2 type ipv4
cumulus@switch:~$ nv set acl acl_2 rule 1 match ip protocol icmp
cumulus@switch:~$ nv set acl acl_2 rule 1 match ip dest-ip 172.30.58.80
cumulus@switch:~$ nv set acl acl_2 rule 1 action dest-nat translate-ip 10.0.0.1
cumulus@switch:~$ nv set interface swp51 acl acl_2 inbound
cumulus@switch:~$ nv config apply
以下规则匹配从 swp6 出站的源 IP 地址为 10.0.0.1 和源端口 5000 的 UDP 数据包,并将 IP 地址转换为 172.30.58.80,端口转换为 6000。
cumulus@switch:~$ nv set acl acl_3 type ipv4
cumulus@switch:~$ nv set acl acl_3 rule 1 match ip protocol udp
cumulus@switch:~$ nv set acl acl_3 rule 1 match ip source-ip 10.0.0.1
cumulus@switch:~$ nv set acl acl_3 rule 1 match ip udp source-port 5000
cumulus@switch:~$ nv set acl acl_3 rule 1 action source-nat translate-ip 172.30.58.80
cumulus@switch:~$ nv set acl acl_3 rule 1 action source-nat translate-port 6000
cumulus@switch:~$ nv set interface swp6 acl acl_3 outbound
cumulus@switch:~$ nv config apply
以下规则匹配在接口 swp51 上进入的目标 IP 地址为 172.30.58.80 和目标端口 6000 的 UDP 数据包,并将 IP 地址转换为 10.0.0.1,端口转换为 5000。
cumulus@switch:~$ nv set acl acl_4 type ipv4
cumulus@switch:~$ nv set acl acl_4 rule 1 match ip protocol udp
cumulus@switch:~$ nv set acl acl_4 rule 1 match ip dest-ip 172.30.58.80
cumulus@switch:~$ nv set acl acl_4 rule 1 match ip udp dest-port 6000
cumulus@switch:~$ nv set acl acl_4 rule 1 action dest-nat translate-ip 10.0.0.1
cumulus@switch:~$ nv set acl acl_4 rule 1 action dest-nat translate-port 5000
cumulus@switch:~$ nv set interface swp51 acl acl_4 inbound
cumulus@switch:~$ nv config apply
要创建规则,请使用 cl-acltool
。
要使用 cl-acltool
添加 NAT 规则,请编辑 /etc/cumulus/acl/policy.d
目录中的现有文件,并在 [iptables]
下添加规则,或者在 /etc/cumulus/acl/policy.d
目录中创建一个新文件,并在 [iptables]
部分下添加规则。例如
cumulus@switch:~$ sudo nano /etc/cumulus/acl/policy.d/60_nat.rules
[iptables]
#Add rule
示例规则
以下规则匹配源 IP 地址为 10.0.01 的 TCP 数据包,并将 IP 地址转换为 172.30.58.80
-t nat -A POSTROUTING -s 10.0.0.1 -p tcp -j SNAT --to-source 172.30.58.80
以下规则匹配接口 swp51 上目标 IP 地址为 172.30.58.80 的 ICMP 数据包,并将 IP 地址转换为 10.0.0.1
-t nat -A PREROUTING -d 172.30.58.80 -p icmp --in-interface swp51 -j DNAT --to-destination 10.0.0.1
以下规则匹配源 IP 地址为 10.0.0.1 和源端口 5000 的 UDP 数据包,并将 IP 地址转换为 172.30.58.80,端口转换为 6000。
-t nat -A POSTROUTING -s 10.0.0.1 -p udp --sport 5000 -j SNAT --to-source 172.30.58.80:6000
以下规则匹配接口 swp51 上目标 IP 地址为 172.30.58.80 和目标端口 6000 的 UDP 数据包,并将 IP 地址转换为 10.0.0.1,端口转换为 5000。
-t nat -A PREROUTING -d 172.30.58.80 -p udp --dport 6000 --in-interface swp51 -j DNAT --to-destination 10.0.0.1:5000
当您为出站流量配置静态 SNAT 规则时,还必须为反向流量配置静态 DNAT 规则,以便流量在两个方向上都流动。
删除静态 NAT 规则
要删除静态 NAT 规则
运行 nv unset acl <acl>
命令。
cumulus@switch:~$ nv unset acl acl_1
cumulus@switch:~$ nv config apply
/etc/cumulus/acl/policy.d
目录中的策略文件中删除规则,然后运行 sudo cl-acltool -i command
。动态 NAT
动态 NAT 将私有 IP 地址和端口映射到公共 IP 地址和端口范围,或公共 IP 地址范围和端口范围。Cumulus Linux 从地址池中动态分配 IP 地址。当交换机在一段时间不活动后释放条目时,它会将新的传入连接动态映射到释放的地址和端口。
启用动态 NAT
要使用动态 NAT,您必须启用动态模式。
cumulus@switch:~$ nv set system nat mode dynamic
编辑 /etc/cumulus/switchd.conf
文件,取消注释 nat.dynamic_enable = TRUE
选项,然后重启 switchd
cumulus@switch:~$ sudo nano /etc/cumulus/switchd.conf
...
# NAT configuration
# Enables NAT
nat.dynamic_enable = TRUE
...
cumulus@switch:~$ sudo systemctl restart switchd.service
重启 switchd
服务会导致所有网络端口重置,中断网络服务,此外还会重置交换机硬件配置。
可选动态 NAT 设置
您可以自定义以下动态 NAT 设置。
设置 | 描述 |
---|---|
age-poll-interval | Cumulus Linux 从转换表中释放 NAT 条目之前的不活动时间段(以分钟为单位)。您可以设置介于 1 到 1440 之间的值。默认值为 5。 |
translate-table-size | 转换表中动态 snat 和 dnat 条目的最大数量。您可以设置介于 1024 到 8192 之间的值。默认值为 1024。 |
rule-table-size | 允许的最大规则数。您可以设置介于 64 到 1024 之间的值。默认值为 64。 |
以下示例设置
- Cumulus Linux 从转换表中释放 NAT 条目之前的不活动时间段为 10。
- 转换表中动态
snat
和dnat
条目的最大数量为 2048。 - 允许的最大规则数为 100。
cumulus@switch:~$ nv set system nat age-poll-interval 10
cumulus@switch:~$ nv set system nat translate-table-size 2048
cumulus@switch:~$ nv set system nat rule-table-size 100
cumulus@switch:~$ nv config apply
/etc/cumulus/switchd.conf
文件包含以下动态 NAT 的配置选项。仅当您启用动态 NAT 时才更改这些选项。
设置 | 描述 |
---|---|
nat.age_poll_interval | switchd 从转换表中释放 NAT 条目之前的不活动时间段(以分钟为单位)。您可以设置介于 1 到 1440 之间的值。默认值为 5。 |
nat.table_size | 转换表中动态 snat 和 dnat 条目的最大数量。您可以设置介于 512 到 8192 之间的值。默认值为 1024。 |
nat.config_table_size | 允许的最大规则数。您可以设置介于 64 到 1024 之间的值。默认值为 64。 |
在您更改任何动态 NAT 配置选项后,重启 switchd
。
cumulus@switch:~$ sudo systemctl restart switchd.service
重启 switchd
服务会导致所有网络端口重置,中断网络服务,此外还会重置交换机硬件配置。
配置动态 NAT
对于动态 NAT,创建一条规则,匹配 CIDR 表示法中的 IP 地址,并将地址转换为公共 IP 地址或 IP 地址范围。
对于动态 PAT,创建一条规则,匹配 CIDR 表示法中的 IP 地址,并将地址转换为公共 IP 地址和端口范围,或 IP 地址范围和端口范围。您还可以匹配 CIDR 表示法中的 IP 地址和端口。
NVUE 命令要求您为动态 NAT 规则配置入站或出站接口。但是,您在 /etc/cumulus/acl/policy.d/
目录中的规则文件中配置的规则不需要入站或出站接口。
示例规则
以下规则匹配源 IP 地址在 10.0.0.0/24 范围内的 TCP 数据包,这些数据包从 swp5 出站,并将地址动态转换为 172.30.58.0-172.30.58.80 范围内的 IP 地址。
cumulus@switch:~$ nv set acl acl_1 type ipv4
cumulus@switch:~$ nv set acl acl_1 rule 1 match ip protocol tcp
cumulus@switch:~$ nv set acl acl_1 rule 1 match ip source-ip 10.0.0.0/24
cumulus@switch:~$ nv set acl acl_1 rule 1 action source-nat translate-ip 172.30.58.0 to 172.30.58.80
cumulus@switch:~$ nv set interface swp5 acl acl_1 outbound
cumulus@switch:~$ nv config apply
以下规则匹配源 IP 地址在 10.0.0.0/24 范围内的 UDP 数据包,这些数据包从 swp5 出站,并将地址动态转换为 IP 地址 172.30.58.80,第 4 层端口范围为 1024-1200
cumulus@switch:~$ nv set acl acl_2 type ipv4
cumulus@switch:~$ nv set acl acl_2 rule 1 match ip protocol udp
cumulus@switch:~$ nv set acl acl_2 rule 1 match ip source-ip 10.0.0.0/24
cumulus@switch:~$ nv set acl acl_2 rule 1 action source-nat translate-ip 172.30.58.80
cumulus@switch:~$ nv set acl acl_2 rule 1 action source-nat translate-port 1024-1200
cumulus@switch:~$ nv set interface swp5 acl acl_2 outbound
cumulus@switch:~$ nv config apply
以下规则匹配源 IP 地址在 10.0.0.0/24 范围内且源端口为 5000 的 UDP 数据包,这些数据包在 swp6 上入站,并将地址动态转换为 IP 地址 172.30.58.80,第 4 层端口范围为 1024-1200
cumulus@switch:~$ nv set acl acl_3 type ipv4
cumulus@switch:~$ nv set acl acl_3 rule 1 match ip protocol udp
cumulus@switch:~$ nv set acl acl_3 rule 1 match ip source-ip 10.0.0.0/24
cumulus@switch:~$ nv set acl acl_3 rule 1 match ip udp source-port 5000
cumulus@switch:~$ nv set acl acl_3 rule 1 action source-nat translate-ip 172.30.58.80
cumulus@switch:~$ nv set acl acl_3 rule 1 action source-nat translate-port 1024-1200
cumulus@switch:~$ nv set interface swp6 acl acl_3 inbound
cumulus@switch:~$ nv config apply
以下规则匹配目标 IP 地址在 10.1.0.0/24 范围内的 TCP 数据包,这些数据包在 swp6 上入站,并将地址动态转换为 IP 地址范围 172.30.58.0-172.30.58.80,第 4 层端口范围为 1024-1200
cumulus@switch:~$ nv set acl acl_4 type ipv4
cumulus@switch:~$ nv set acl acl_4 rule 1 match ip protocol tcp
cumulus@switch:~$ nv set acl acl_4 rule 1 match ip dest-ip 10.1.0.0/24
cumulus@switch:~$ nv set acl acl_4 rule 1 action dest-nat translate-ip 172.30.58.0 to 172.30.58.80
cumulus@switch:~$ nv set acl acl_4 rule 1 action dest-nat translate-port 1024-1200
cumulus@switch:~$ nv set interface swp6 acl acl_4 inbound
cumulus@switch:~$ nv config apply
以下规则匹配源 IP 地址在 10.0.0.0/24 范围内且目标 IP 地址在 10.1.0.0/24 范围内的 ICMP 数据包,这些数据包在 swp6 上入站。该规则将地址动态转换为 IP 地址范围 172.30.58.0-172.30.58.80,第 4 层端口范围为 1024-1200
cumulus@switch:~$ nv set acl acl_5 type ipv4
cumulus@switch:~$ nv set acl acl_5 rule 1 match ip protocol icmp
cumulus@switch:~$ nv set acl acl_5 rule 1 match ip source-ip 10.0.0.0/24
cumulus@switch:~$ nv set acl acl_5 rule 1 match ip dest-ip 10.1.0.0/24
cumulus@switch:~$ nv set acl acl_5 rule 1 action source-nat translate-ip 172.30.58.0 to 172.30.58.80
cumulus@switch:~$ nv set acl acl_5 rule 1 action source-nat translate-port 1024-1200
cumulus@switch:~$ nv set interface swp6 acl acl_5 inbound
cumulus@switch:~$ nv config apply
要使用 cl-acltool
添加 NAT 规则,请编辑 /etc/cumulus/acl/policy.d
目录中的现有文件,并在 [iptables]
下添加规则,或者在 /etc/cumulus/acl/policy.d
目录中创建一个新文件,并在 [iptables]
部分下添加规则。例如
cumulus@switch:~$ sudo nano /etc/cumulus/acl/policy.d/60_nat.rules
[iptables]
#Add rule
示例规则
以下规则匹配源 IP 地址在 10.0.0.0/24 范围内且出站接口为 swp5 的 TCP 数据包,并将地址动态转换为 172.30.58.0-172.30.58.80 范围内的 IP 地址。
-t nat -A POSTROUTING -s 10.0.0.0/24 --out-interface swp5 -p tcp -j SNAT --to-source 172.30.58.0-172.30.58.80
以下规则匹配源 IP 地址在 10.0.0.0/24 范围内的 UDP 数据包,并将地址动态转换为 IP 地址 172.30.58.80,第 4 层端口范围为 1024-1200
-t nat -A POSTROUTING -s 10.0.0.0/24 -p udp -j SNAT --to-source 172.30.58.80:1024-1200
以下规则匹配源 IP 地址在 10.0.0.0/24 范围内且源端口为 5000 的 UDP 数据包,并将地址动态转换为 IP 地址 172.30.58.80,第 4 层端口范围为 1024-1200
-t nat -A POSTROUTING -s 10.0.0.0/24 -p udp --sport 5000 -j SNAT --to-source 172.30.58.80:1024-1200
以下规则匹配目标 IP 地址在 10.1.0.0/24 范围内的 TCP 数据包,并将地址动态转换为 IP 地址范围 172.30.58.0-172.30.58.80,第 4 层端口范围为 1024-1200
-t nat -A PREROUTING -d 10.1.0.0/24 -p tcp -j DNAT --to-destination 172.30.58.0-172.30.58.80:1024-1200
以下规则匹配源 IP 地址在 10.0.0.0/24 范围内且目标 IP 地址在 10.1.0.0/24 范围内的 ICMP 数据包。该规则将地址动态转换为 IP 地址范围 172.30.58.0-172.30.58.80,第 4 层端口范围为 1024-1200
-t nat -A POSTROUTING -s 10.0.0.0/24 -d 10.1.0.0/24 -p icmp -j SNAT --to-source 172.30.58.0-172.30.58.80:1024-1200
删除动态 NAT 规则
要删除动态 NAT 规则
运行 nv unset acl <acl>
命令
cumulus@switch:~$ nv unset acl acl_1
cumulus@switch:~$ nv config apply
/etc/cumulus/acl/policy.d
目录中的策略文件中删除规则,然后运行 sudo cl-acltool -i
命令。显示配置的 NAT 规则
要查看交换机上配置的 NAT 规则,请运行 NVUE nv show acl <acl> --applied -o=json
命令,或 Linux sudo iptables -t nat -v -L
或 sudo cl-acltool -L ip -v
命令。例如
cumulus@switch:~$ nv show acl acl_5 --applied -o=json
{
"rule": {
"1": {
"action": {
"source-nat": {
"translate-ip": {
"172.30.58.0": {
"to": "172.30.58.80"
}
},
"translate-port": {
"1024-1200": {}
}
}
},
"match": {
"ip": {
"dest-ip": "10.1.0.0/24",
"protocol": "icmp",
"source-ip": "10.0.0.0/24"
}
}
}
},
"type": "ipv4"
}
cumulus@switch:~$ sudo iptables -t nat -v -L -n
...
pkts bytes target prot opt in out source destination
0 0 SNAT icmp -- * swp6 10.0.0.0/24 10.1.0.0/24 /* rule_id:1,acl_name:acl_5,dir:outbound,interface_id:swp6 */ to:172.30.58.0-172.30.58.80:1024-1200
显示 Conntrack 流
要查看活动连接跟踪 (conntrack) 流,请运行 sudo cat /proc/net/nf_conntrack
命令。硬件卸载的流在输出中包含 [OFFLOAD]
。
cumulus@switch:~$ sudo cat /proc/net/nf_conntrack
ipv4 2 udp 17 src=172.30.10.5 dst=10.0.0.2 sport=5001 dport=5000 src=10.0.0.2 dst=10.1.0.10 sport=6000 dport=1026 [OFFLOAD] mark=0 zone=0 use=2
注意事项
使用 NAT 时,当出现以下情况时,您必须为子网内 ARP 请求启用代理 ARP
- 您在静态 NAT 和源 NAT 池中定义的地址与入口接口位于同一子网中。
- 目标 NAT 规则中原始目标地址条目中的地址与入口接口位于同一子网中。
要为子网内 ARP 请求启用代理 ARP
编辑 /etc/network/interfaces
文件,将接口节中的 /proc/sys/net/ipv4/conf/<interface>/proxy_arp_pvlan
设置为 1
,然后运行 ifreload -a
命令。
cumulus@switch:~$ sudo nano /etc/network/interfaces
...
auto swp1
iface swp1
post-up echo 1 > /proc/sys/net/ipv4/conf/swp1/proxy_arp_pvlan
...
cumulus@switch:~$ sudo ifreload -a