我正在尝试使用静态 IP AWS VPN 将我的网络连接到 AWS VPC。我已按照 AWS 的说明正确配置了我的 MikroTik 路由器,并且可以 ping 我在此 VPC 中连接的 Ubuntu 实例。由于我的 MikroTik 中有 2 个 ISP,因此我在 AWS 中配置了另一个 VPN,并决定在我的 Ubuntu AWS 实例上使用不同子网中的两个接口:
$ ifconfig
eth0 Link encap:Ethernet HWaddr 0A:72:28:AF:C7:CE
inet addr:192.168.254.4 Bcast:192.168.254.15 Mask:255.255.255.240
inet6 addr: fe80::872:28ff:feaf:c7ce/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:24297 errors:0 dropped:0 overruns:0 frame:0
TX packets:21627 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:7074474 (6.7 MiB) TX bytes:2362441 (2.2 MiB)
eth1 Link encap:Ethernet HWaddr 0A:A2:0F:7C:75:FC
inet addr:192.168.254.20 Bcast:192.168.254.31 Mask:255.255.255.240
inet6 addr: fe80::8a2:fff:fe7c:75fc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:9001 Metric:1
RX packets:24996 errors:0 dropped:0 overruns:0 frame:0
TX packets:25227 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2307467 (2.2 MiB) TX bytes:5382812 (5.1 MiB)
现在,即使我在启动端正确配置了两个 VPN,一次也只有一个 VPN 有效。例如:假设名为aws-main配置为使用 192.168.254.0/28 子网和 VPNaws-备份配置为与 192.168.254.16/28 子网一起工作,如果我想 ping ip 192.168.254.4,我需要禁用路由 #2,如果我想 ping ip 192.168.254.20,我需要禁用路由 #1
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
1 A S ;;; ISP 1
0.0.0.0/0 yyy.yyy.yyy.yyy 1
2 S ;;; ISP 2
0.0.0.0/0 zzz.zzz.zzz.zzz 1
4 ADC yyy.yyy.yyy.0/24 y.y.y.y ether3 0
6 ADC zzz.zzz.zzz.0/30 z.z.z.z ether2 0
9 ADC 192.168.15.0/24 192.168.15.254 ether5 0
如果我在路由 #1 和 #2 都启用的情况下尝试 ping 192.168.254.20,我可以在日志中看到以下消息:
backup-out srcnat in:(unknown 0) out:ether3, src-mac xxx, proto ICMP(type 8,code 0), 192.168.15.31 ->192.168.254.20, len 84
Mikrotik 将数据包路由到 ether3,而不是 ether2(VPN 的正确网关aws-备份),我认为这是问题所在,但我不知道如何强制它纠正界面。
/ip firewall nat> print
0 chain=srcnat action=accept src-address=192.168.15.0/24
dst-address=192.168.254.0/28 log=yes log-prefix="main-out"
1 chain=srcnat action=accept src-address=192.168.15.0/24
dst-address=192.168.254.16/28 log=yes log-prefix="backup-out"
2 chain=srcnat action=accept src-address=192.168.254.0/28
dst-address=192.168.15.0/24 log=yes log-prefix="main-in"
3 chain=srcnat action=accept src-address=192.168.254.16/28
dst-address=192.168.15.0/24 log=yes log-prefix="backup-in"
4 chain=srcnat action=masquerade log=no log-prefix="masquerade"
这些是政策:
0 A ;;; AWS Tunnel 2 - BACKUP
src-address=0.0.0.0/0 src-port=any dst-address=192.168.254.16/28
dst-port=any protocol=all action=encrypt level=require
ipsec-protocols=esp tunnel=yes sa-src-address=zzz.zzz.zzz.zzz
sa-dst-address=x.x.x.x proposal=AWS ph2-count=9
2 A ;;; AWS Tunnel 1 - MAIN
src-address=0.0.0.0/0 src-port=any dst-address=192.168.254.0/28
dst-port=any protocol=all action=encrypt level=require
ipsec-protocols=esp tunnel=yes sa-src-address=yyy.yyy.yyy.yyy
sa-dst-address=K.K.K.K proposal=AWS ph2-count=8
至少对我来说,mikrotik 没有使用正确的子网将 VPN 数据包路由到正确的网关。这是问题吗?我该如何解决这个问题?
答案1
我认为您不需要 BGP,正如评论中所建议的那样,因为子网是独立的。
您需要的是 Mikrotik 中的源路由(又名基于策略的路由):
https://wiki.mikrotik.com/wiki/Policy_Base_Routing
原则上你必须:
- 在 PREROUTING 链中创建一个 mangle 规则,该规则与发往某个子网的数据包匹配
- 使用唯一的路由标记
- 为所有匹配该路由标记的数据包添加一条路由,以使用相应的 VPN 作为网关
对第二个子网+VPN 重复该过程。