У меня есть сеть с несколькими шлюзами, и один установлен в качестве шлюза по умолчанию на сервере. Я хочу, чтобы одна конкретная команда использовала отдельный шлюз для всего своего трафика. Как мне этого добиться?
К сожалению, использование IP-маршрута назначения невозможно, поскольку я не знаю IP-адреса, с которыми команда будет связываться заранее.
Что я действительно хочу сделать, так это отправить весь трафик через свой шлюз по умолчанию и использовать отдельный для сценария, который загружает некоторые данные в Amazon S3. Я добился этого, получив IP-адреса Amazon от https://ip-ranges.amazonaws.com/ip-ranges.json и периодически обновляю таблицу маршрутов с помощью шлюза, который я хочу для них, но это чертовски взломано.
Я понимаю, что нет возможности маршрутизировать трафик по доменному имени, могу ли я сделать это по-другому? Может с iptables или чем-то подобным?
Вот сценарий, который я создал для справки:
#!/usr/bin/env bash
set -eo pipefail
IFS=$'\n\t'
amazon_gateway='XXX.XXX.XXX.XXX'
amazon_ips_url='https://ip-ranges.amazonaws.com/ip-ranges.json'
route="$(which route)"
curl="$(which curl)"
jq="$(which jq)"
awk="$(which awk)"
netstat="$(which netstat)"
# taken from https://forums.gentoo.org/viewtopic-t-888736-start-0.html
mask2cdr ()
{
# Assumes there's no "255." after a non-255 byte in the mask
set -- 0^^^128^192^224^240^248^252^254^ ${#1} ${1##*255.}
set -- $(( ($2 - ${#3})*2 )) ${1%%${3%%.*}*}
echo $(( $1 + (${#2}/4) ))
}
# get amazon ips
amazon_ips=$("${curl}" "${amazon_ips_url}" | "${jq}" -r '.prefixes | map(select(.service == "AMAZON"))[].ip_prefix')
# get networks routed to requested gateway
routed_networks=$("${netstat}" -nr | "${awk}" '{ if ($2 == "'"${amazon_gateway}"'") print $1"/"$3 }')
# convert masks to cdrs
routed_networks=$(for network in ${routed_networks}; do echo "${network%\/*}/$(mask2cdr ${network#*\/})"; done)
# remove routes for all these networks
for network in ${routed_networks}; do "${route}" del -net "${network}" gw "${amazon_gateway}"; done
# add a route for each amazon ip
for amazon_ip in ${amazon_ips}; do "${route}" add -net "${amazon_ip}" gw "${amazon_gateway}"; done