使用 OpenVPN 连接 EC2 VPC 时所有路由流量均会丢失

使用 OpenVPN 连接 EC2 VPC 时所有路由流量均会丢失

我正在尝试使用 Amazon Linux 上的 OpenVPN 将本地 LAN 连接到 EC2 上的 VPC。我有从 OpenVPN 实例流向 LAN 上任何计算机的流量,但 VPC 上的其他计算机看不到来自 LAN 的流量。

以下是该网络的精简版本:

       Local network          /        EC2 VPC, 10.2.0.*/255.255.255.0
  10.1.0.*/               ,'
     255.255.255.0     ,'
                      .'
                      |
 +---------------+   |             
 | OpenVPN on    |   |             
 |   firewall    XXX |   +---------------+
 | 10.1.0.1      |  XXXX | OpenVPN server|
 +------`.-------+   \  XX  10.2.0.10  `-.    +-------------+
          \          '.  +---------------+  `-. Second server
  +--------`.---+     |                       | 10.2.0.12   |
  |Local server |      \                      +-------------+
  | 10.1.0.3    |       \
  +-------------+        \

从 EC2 OpenVPN 服务器:

[root@ip-10-2-0-10 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.2.0.1        0.0.0.0         UG    0      0        0 eth0
10.1.0.0        10.1.2.5        255.255.255.0   UG    0      0        0 tun0
10.1.2.0        10.1.2.5        255.255.255.0   UG    0      0        0 tun0
10.1.2.5        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.2.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth0

[root@ip-10-2-0-10 ~]# ping -c 2 10.1.0.3
PING 10.1.0.3 (10.1.0.3) 56(84) bytes of data.
64 bytes from 10.1.0.3: icmp_seq=1 ttl=127 time=488 ms
64 bytes from 10.1.0.3: icmp_seq=2 ttl=127 time=54.9 ms

--- 10.1.0.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1056ms
rtt min/avg/max/mdev = 54.925/271.767/488.609/216.842 ms

从 LAN 防火墙:

root@firewall:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         xxx.xxx.xxx.xxx 0.0.0.0         UG    0      0        0 eth0.2
10.1.0.0        0.0.0.0         255.255.255.0   U     0      0        0 br-lan
10.1.2.0        10.1.2.2        255.255.255.0   UG    0      0        0 tun0
10.1.2.2        0.0.0.0         255.255.255.255 UH    0      0        0 tun0
10.2.0.0        10.1.2.2        255.255.255.0   UG    0      0        0 tun0

从 EC2 上的第二台服务器:

[root@ip-10-2-0-12 ~]# ping -c 3 10.1.0.3
PING 10.1.0.3 (10.1.0.3) 56(84) bytes of data.

--- 10.1.0.3 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 12014ms

然而,问题就在这里。在 EC2 OpenVPN 服务器上执行 tcpdump 会显示所有流量都按预期流动:

[root@ip-10-2-0-10 ~]# tcpdump -i eth0 -n host 10.1.0.3
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
13:46:58.779826 IP 10.2.0.12 > 10.1.0.3: ICMP echo request, id 21846, seq 1, length 64
13:46:58.852756 IP 10.1.0.3 > 10.2.0.12: ICMP echo reply, id 21846, seq 1, length 64
13:46:59.787467 IP 10.2.0.12 > 10.1.0.3: ICMP echo request, id 21846, seq 2, length 64
13:46:59.847424 IP 10.1.0.3 > 10.2.0.12: ICMP echo reply, id 21846, seq 2, length 64

EC2 上的第二台服务器上的 Tcpdump 仅显示回显请求,而没有显示回复。

  • 所有 EC2 实例上的 IPtables 防火墙均被禁用。
  • OpenVPN 服务器上已启用 IP 转发。
  • OpenVPN 服务器和第二服务器的 EC2 安全组都设置为允许来自 10.0.0.0/8 的所有流量,并且网络 ACL 完全开放。

看起来,无论安全组设置如何,源自 VPC 之外的流量似乎都被 Amazon 丢弃了。

我遗漏了什么会导致流量丢失吗?

答案1

事实证明 EC2 阻止了来自 OpenVPN 服务器的转发数据包。

EC2 仪表板上的网络和安全 -> 网络接口 -> 操作 -> 更改源/目标下有一个设置。检查。

当我在所有实例上禁用此功能时,通过 VPN 的流量按预期流动。

希望这能够帮助其他人。

答案2

您已经抢先给出了自己的答案,因此我将稍微扩展一下...

如果您需要将其构建到实例引导脚本中,则可以将以下内容添加到用户数据块中(启动实例时,位于步骤 3,配置实例详细信息...展开页面底部的高级详细信息部分)...更新第 3 行以获取正确的区域:

#!/bin/bash
export my_instance=`curl http://169.254.169.254/latest/meta-data/instance-id`
export AWS_DEFAULT_REGION=us-east-1
aws ec2 modify-instance-attribute --instance-id $my_instance --no-source-dest-check

...如果是用于 NAT 实例,您可以通过添加此行来修改您的路由表(将路由表 ID 更新为您的 VPC 使用的路由表 ID):

aws ec2 replace-route --route-table-id rtb-01234567 --destination-cidr-block 0.0.0.0/0 --instance-id $my_instance

为了使其正常工作,您的实例将需要更新属性和替换路由的权限...您可以使用具有以下策略声明的 EC2 角色来实现这一点,然后在 IAM 角色框中指定策略名称(也可以在 EC2 向导的步骤 3,配置实例详细信息中):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1413415456000",
      "Effect": "Allow",
      "Action": [
        "ec2:ModifyInstanceAttribute",
        "ec2:ReplaceRoute"
      ],
      "Resource": "*"
    }
  ]
}

相关内容