我正在尝试使用 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": "*"
}
]
}