Резюме:Я думаю, что мне не хватает некоторых маршрутов на моем сервере Ubuntu, подключающемся к AWS VPN с помощью Strongswan Ipsec. Есть идеи, какие маршруты мне нужны на моем сервере?
Я пытаюсь настроить VPN с маршрутизацией BGP с сервера на AWS. У меня это работало со статически маршрутизируемой VPN, поэтому я знаю, что моя сторона AWS-и ipsec верны. Однако BGP оказывается сложным.
Я использую Strongswan на Ubuntu в качестве «клиентской» стороны. Мои туннели ipsec работают (, что подтверждается ipsec status
и в консоли AWS). Проблема заключается в том, что мой клиент BGP (frr)не может подключиться к процессу BGP в AWS (и наоборот-наоборот).
Взяв один из двух туннелей, ip a
выглядит так:
5: tunnel1@NONE: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1419 qdisc noqueue state UNKNOWN group default qlen 1000
link/ipip 1.2.3.4 peer 2.3.4.5
inet 169.254.10.146 peer 169.254.10.145/30 scope global tunnel1
valid_lft forever preferred_lft forever
Интерфейс создан с помощью скрипта, называемого Strongswan, который выглядит так:
ip tunnel add ${VTI_INTERFACE} local ${PLUTO_ME} remote ${PLUTO_PEER} mode vti key ${PLUTO_MARK_IN_ARR[0]}
sysctl -w net.ipv4.conf.${VTI_INTERFACE}.disable_policy=1
sysctl -w net.ipv4.conf.${VTI_INTERFACE}.rp_filter=2 || sysctl -w net.ipv4.conf.${VTI_INTERFACE}.rp_filter=0
ip addr add ${VTI_LOCALADDR} remote ${VTI_REMOTEADDR} dev ${VTI_INTERFACE}
ip link set ${VTI_INTERFACE} up mtu ${MTU}
iptables -t mangle -I FORWARD -o ${VTI_INTERFACE} -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -t mangle -I INPUT -p esp -s ${PLUTO_PEER} -d ${PLUTO_ME} -j MARK --set-xmark ${PLUTO_MARK_IN}
У меня есть такой маршрут:
169.254.10.144/30 dev tunnel1 proto kernel scope link src 169.254.10.146
Я могу пропинговать свой локальный (клиент)конец (169.254.10.146), но проверка связи с удаленным концом говорит:
PING 169.254.10.145 (169.254.10.145) 56(84) bytes of data.
From 169.254.10.146 icmp_seq=1 Destination Host Unreachable
Несмотря на то, что он недоступен, я вижу пакет на туннельном интерфейсе, хотя не похоже, что это фактически отправлены по туннелю в AWS (, по крайней мере, статистика AWS Cloudwatch не показывает дополнительной активности).
Одним из шагов отладки BGP является попытка «телнета» к соседу (169.254.10.145)через порт 179 -, но это не удается с «нет маршрута к хосту». Любопытно, однако, что я вижу, как AWS пытается подключиться к моему BGP-клиенту в tcpdump на туннельном интерфейсе :
12:49:45.860899 IP 169.254.10.145.43731 > 169.254.10.146.179: Flags [S], seq 857645259, win 26880, options [mss 1375,sackOK,TS val 3261400514 ecr 0,nop,wscale 7], length 0
12:49:45.860931 IP 169.254.10.146.179 > 169.254.10.145.43731: Flags [S.], seq 2284055933, ack 857645260, win 64249, options [mss 1379,sackOK,TS val 936428713 ecr 3261400514,nop,wscale 7], length 0
. Похоже, мой сервер возвращает пакет ACK, но соединение так и не установлено. Если я остановлю службу BGP, мы начнем отправлять ответы RST :
12:52:02.055473 IP 169.254.10.145.43679 > 169.254.10.146.179: Flags [S], seq 2280717367, win 26880, options [mss 1375,sackOK,TS val 3261536708 ecr 0,nop,wscale 7], length 0
12:52:02.055498 IP 169.254.10.146.179 > 169.254.10.145.43679: Flags [R.], seq 0, ack 1, win 0, length 0
. Исходя из этого, я предполагаю, что пакет ACK ядра и мой пакет ping отправляются на туннельный интерфейс,но на самом деле не входят в ipsec или идут в AWS.
Похоже, мне нужно добавить какие-то дополнительные маршруты, но я не могу понять, что может потребоваться. Такое ощущение, что у меня уже все на месте. Я просмотрел бесчисленное количество примеров и инструкций, но лишь немногие из них показывают то, чего у меня нет, и еще меньше тех, кто подтверждает, что мне нужны именно те маршруты, которые, по моему мнению, мне нужны, или какие маршруты необходимы для работы BGP. Любая помощь очень ценится.
Оказывается, решение — дополнительная политика xfrm. Идея, стоящая за этим, заключается в том, что, пока пакеты попадают на интерфейс, трафик не «подхватывается» ipsec. Для решения проблемы, кажется, нам нужно пометить пакеты (так же, как мы это делаем в конфиге ipsec и iptables ), а также специально «активировать» xfrm политикой. В моем случае это было так:
ip xfrm policy add dst 169.254.10.144/30 src 169.254.10.144/30 dir out tmpl src 1.2.3.4 dst 2.3.4.5 proto esp spi 0xc0f93fba reqid 1 mode tunnel mark 0x64
Это делает политику, которая выглядит вот так:
src 169.254.10.144/30 dst 169.254.10.144/30
dir out priority 0
mark 0x64/0xffffffff
tmpl src 1.2.3.4 dst 2.3.4.5
proto esp spi 0xc0f93fba reqid 1 mode tunnel
Это содержит некоторую магию, которую, кажется, мы должны получить от существующей политики. Во-первых, это «число spi». Это устанавливается Strongswan, и я не думаю, что это предсказуемо и недоступно в среде, переданной в ipsec-vti.sh
. Вместо этого вам нужно выполнить команду grep и awk, чтобы извлечь его из вывода ip xfrm policy
. Точно так жеreqid
-этот набор с 1 для первого интерфейса и 2 для второго, который создается -, к сожалению, туннель1 не всегда является первым, поэтому вам также нужно будет извлечь это число.