EC2 Windows Server 2022 配置 RRAS 做 NAT 网关
EC2 Windows Server 2022 配置 RRAS 做 NAT 网关
私有子网的 EC2 没有公网 IP,又不想用 AWS 托管 NAT Gateway(贵)。可以用一台 Windows Server 2022 实例配置 RRAS NAT 来做出网,本文记录完整的配置过程和踩坑。
架构
NAT-GW 实例两张 ENI:
- ENI1(Public):公有子网,有 IGW 路由,绑定 EIP
- ENI2(Private):私有子网,接收 Client 的出网流量
流量路径:Client → VPC 路由表 → ENI2(Private)→ RRAS NAT(SNAT 为 EIP)→ ENI1(Public)→ IGW → Internet
前提条件
- NAT-GW 的两个 ENI 都关闭源/目标检查(Source/Dest Check)
- 私有子网路由表添加
0.0.0.0/0 → NAT-GW 的 ENI2 - 安全组放通 Client 子网到 NAT-GW 的流量
操作步骤
1. 创建双 ENI 实例
# 公有子网创建实例,自动分配公网 IP
aws ec2 run-instances --image-id ami-0668ff427a68f0066 `
--instance-type t3.medium `
--subnet-id subnet-public `
--iam-instance-profile Name=EC2SSM `
--associate-public-ip-address `
--tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=NAT-GW}]"
# 关闭源/目标检查
aws ec2 modify-instance-attribute --instance-id i-xxxxxxxxx --no-source-dest-check
# 创建第二张 ENI(私有子网)
aws ec2 create-network-interface --subnet-id subnet-private `
--groups sg-xxxxxx --description "NAT-GW internal ENI"
# 挂载到实例
aws ec2 attach-network-interface --network-interface-id eni-xxxxxxxxx `
--instance-id i-xxxxxxxxx --device-index 1
# 第二张 ENI 也关闭源/目标检查
aws ec2 modify-network-interface-attribute `
--network-interface-id eni-xxxxxxxxx --no-source-dest-check2. 配置私有子网路由表
aws ec2 create-route --route-table-id rtb-xxxxxxxxx `
--destination-cidr-block 0.0.0.0/0 `
--network-interface-id eni-xxxxxxxxx3. 安装 RRAS 角色
管理员 PowerShell:
Install-WindowsFeature -Name Routing -IncludeManagementTools
Install-RemoteAccess -VpnType RoutingOnly
Get-Service RemoteAccess
# Status: Running4. 重命名网卡并删除内网默认路由
Rename-NetAdapter -Name 'Ethernet 3' -NewName 'Public'
Rename-NetAdapter -Name 'Ethernet 4' -NewName 'Private'
# 删除 Private 网卡的默认路由
Remove-NetRoute -InterfaceAlias 'Private' -DestinationPrefix '0.0.0.0/0' -Confirm:$false
# 注册表防止 DHCP 续租恢复默认网关
$adapter = Get-NetAdapter -Name 'Private'
$guid = $adapter.InterfaceGuid
$regPath = "HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\$guid"
Set-ItemProperty -Path $regPath -Name 'DhcpDefaultGateway' -Value @('') -Type MultiString不做注册表修改的话,DHCP 每小时续租会把默认路由加回来,和 Public 网卡的默认路由冲突,出网随机丢包。
5. 停止 ICS 服务
netsh routing ip nat install 如果检测到 SharedAccess 服务在运行会拒绝安装。只需停 ICS,防火墙不用关:
Stop-Service SharedAccess -Force -ErrorAction SilentlyContinue
Set-Service SharedAccess -StartupType DisabledNAT 配置完成后,Windows 防火墙三个 Profile 全部开启不影响 NAT 转发——RRAS NAT 走内核 ipnat.sys 驱动,不经过 WFP 规则链。
6. 启用 IP 转发
Set-ItemProperty -Path 'HKLM:\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters' `
-Name IPEnableRouter -Value 1
Set-NetIPInterface -InterfaceAlias 'Public' -Forwarding Enabled
Set-NetIPInterface -InterfaceAlias 'Private' -Forwarding Enabled
Restart-Service RemoteAccess -Force
Start-Sleep -Seconds 5
ipconfig /all | Select-String 'IP Routing'
# IP Routing Enabled. . . . . . . . : Yes7. 配置 RRAS NAT
netsh routing ip nat install
# Public 接口做 NAT 出口(full = 地址和端口转换)
netsh routing ip nat add interface name="Public" mode=full
# Private 接口做内网口(private = 仅转发)
netsh routing ip nat add interface name="Private" mode=private
netsh routing ip nat show interface8. 验证
在 Client 实例上测试:
curl.exe -s http://checkip.amazonaws.com
# 出口 IP 应为 NAT-GW 的 EIP
ping 1.1.1.1
ping www.baidu.com踩坑
双默认路由(最常见故障)
第二张 ENI 通过 DHCP 获得默认路由,metric 和主网卡一样(都是 20)。Windows 做等价路由负载均衡,出网流量有一半走 Private 网卡——私有子网没有 IGW 路由,包直接丢。表现:ping/curl 时好时坏,TCP 偶发超时。
修复:删除 Private 网卡的默认路由 + 注册表清空 DhcpDefaultGateway,或设置 Private 网卡 InterfaceMetric 为极高值(如 1000)。
New-NetNat 对物理网卡无效
New-NetNat 只适用于 Hyper-V Internal Virtual Switch。EC2 网卡上创建虽然显示 Active=True,但不会对转发流量做 SNAT。
ICS 会篡改 IP 地址
ICS 启用后自动把 Private 接口 IP 改为 192.168.137.1,覆盖 DHCP 分配的 VPC 地址,包 IP 不匹配直接丢弃。
热挂 ENI 后 RRAS 不识别
挂上第二张 ENI 后需要 Restart-Service RemoteAccess,否则 netsh routing ip show interface 看不到新网卡。
