Как создать требуемый маршрут(ы) для передачи интернет-трафика к/от назначенных клиенту публичных IPv4 на моем сервере L2TP?

Как создать требуемый маршрут(ы) для передачи интернет-трафика к/от назначенных клиенту публичных IPv4 на моем сервере L2TP?

У меня есть сервер под управлением Ubuntu Server 20.04, который имеет два интерфейса Ethernet и размещает сервер L2TP (используя accel-ppp).

«eno1» имеет один назначенный публичный адрес IPv4.

'eno2' имеет доступ к публичному блоку IPv4 /26, который я хотел бы использовать из другого места через сервер L2TP. Подробности ниже.

Теперь я пытаюсь сделать так, чтобы мой маршрутизатор в другом месте мог подключаться к серверу L2TP и иметь публичный IPv4, а также публичный IPv4 /27, направляемый на него из разделения публичного IPv4 /26, упомянутого ранее. Например, xx161.64/27.

Хотя я могу пропинговать IP-адрес маршрутизатора, подключенного к серверу L2TP, с сервера L2TP, а также любой IPv4 /27, назначенный мной через локальную сеть маршрутизатора, я не могу понять, как получить маршрут в Интернет или за его пределы, предположительно, за пределы собственного IP-адреса шлюза сервера L2TP (xx161.122).

ено1

IP address:  x.x.176.62 (public IPv4)
Subnet mask: 255.255.255.0
Gateway IP:  x.x.176.254

ено2

IP address:  x.x.161.125 (public IPv4)
Subnet mask: 255.255.255.252 (split from what is actually a /26)
Gateway IP:  x.x.161.126

Мой маршрутизатор назначил IP-адреса, которые подключаются к серверу L2TP, но в настоящее время не могут получить доступ к Интернету или выйти за пределы xx161.122 (IP-адрес шлюза сервера L2TP, как я полагаю).

x.x.161.121/30
x.x.161.64/27

На этом сервере Ubuntu у меня установлен accel-ppp и настроен как L2TP-сервер. У /etc/accel-ppp.confменя есть следующее:

[modules]
log_file

pptp
l2tp

auth_mschap_v2
auth_mschap_v1
auth_pap

chap-secrets

ippool

pppd_compat

[core]
log-error=/var/log/accel-ppp/core.log
thread-count=4

[common]
single-session=replace

[ppp]
verbose=1
min-mtu=1280
mtu=1400
mru=1400
ipv4=require
ipv6=deny
ipv6-intf-id=0:0:0:1
ipv6-peer-intf-id=0:0:0:2
ipv6-accept-peer-intf-id=1
lcp-echo-interval=1
lcp-echo-failure=5
lcp-echo-timeout=120
unit-cache=1

[pptp]
verbose=1
#echo-interval=30
#ip-pool=pptp
#ipv6-pool=pptp
#ipv6-pool-delegate=pptp
ifname=pptp%d

[l2tp]
verbose=1
ifname=l2tp%d

[dns]
dns1=8.8.8.8
dns2=8.8.4.4

[client-ip-range]
disable

[ip-pool]
gw-ip-address=x.x.161.122
attr=Framed-Pool
x.x.161.121/30

[log]
log-file=/var/log/accel-ppp/accel-ppp.log
log-emerg=/var/log/accel-ppp/emerg.log
log-fail-file=/var/log/accel-ppp/auth-fail.log
copy=1
level=3

[pppd-compat]
verbose=1

[chap-secrets]
chap-secrets=/etc/ppp/chap-secrets

Текущий IP-маршрут:

default via x.x.161.126 dev eno2 proto static
default via x.x.176.254 dev eno1 proto dhcp src x.x.176.62 metric 100
x.x.176.0/24 dev eno1 proto kernel scope link src x.x.176.62
x.x.176.254 dev eno1 proto dhcp scope link src x.x.176.62 metric 100
x.x.161.64/27 via x.x.161.121 dev l2tp0
x.x.161.121 dev l2tp0 proto kernel scope link src x.x.161.122
x.x.161.124/30 dev eno2 proto kernel scope link src x.x.161.125

Текущий маршрут:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         x.x.161.126     0.0.0.0         UG    0      0        0 eno2
default         x.x.176.254     0.0.0.0         UG    100    0        0 eno1
x.x.176.0       0.0.0.0         255.255.255.0   U     0      0        0 eno1
x.x.176.254     0.0.0.0         255.255.255.255 UH    100    0        0 eno1
x.x.161.64      x.x.161.121     255.255.255.224 UG    0      0        0 l2tp0
x.x.161.121     0.0.0.0         255.255.255.255 UH    0      0        0 l2tp0
x.x.161.124     0.0.0.0         255.255.255.252 U     0      0        0 eno2

Текущая конфигурация ifconfig:

eno1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet x.x.176.62  netmask 255.255.255.0  broadcast x.x.176.255
        inet6 x:x:x:x::  prefixlen 56  scopeid 0x0<global>
        inet6 fe80::d250:99ff:feda:91b6  prefixlen 64  scopeid 0x20<link>
        ether d0:50:99:da:91:b6  txqueuelen 1000  (Ethernet)

eno2: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet x.x.161.125  netmask 255.255.255.252  broadcast x.x.161.127
        inet6 fe80::d250:99ff:feda:91b5  prefixlen 64  scopeid 0x20<link>
        ether d0:50:99:da:91:b5  txqueuelen 1000  (Ethernet)

l2tp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1400
        inet 198.244.161.122  netmask 255.255.255.255  destination x.x.161.121
        ppp  txqueuelen 3  (Point-to-Point Protocol)

Как бы мне сделать так, чтобы, например, IP-адрес маршрутизатора xx161.121 мог выйти в интернет и быть доступным из интернета? Предположительно, ему нужно было бы как-то иметь маршрут к xx161.126, IP-адресу шлюза всего исходного блока IPv4 /26.

Если есть более простой или другой подход, который мне следует использовать, пожалуйста, скажите. Я не хочу делать NAT, так как, как я полагаю, это сводит на нет то, что я пытаюсь сделать.

Надеюсь, я достаточно ясно выразился и предоставил достаточно подробностей, если вам нужны дополнительные подробности, пожалуйста, спрашивайте. Я пытаюсь разобраться в этом уже почти два дня. Игра с изменением маршрутов для меня немного в новинку. Заранее спасибо за любую помощь!

EDIT: Не похоже, что я получу здесь ответ, поэтому мне, возможно, придется поискать эксперта, который сможет нанять меня для этой задачи, если только расценки не будут смехотворно дорогими. Если кто-то прочтет этот вопрос и знает ответ, то я был бы очень благодарен услышать ваше решение! Спасибо.

решение1

После дальнейших экспериментов, я думаю, что начал понимать важность и полезность маршрутизации на основе политик, хотя и немного поздно. Хорошей новостью является то, что теперь у меня есть то, что я хочу, работающее полностью, но каким-то окольным путем.

Я использую CentOS с SoftEther VPN Server (L2TP). С этим у меня сейчас настроено 32 соединения/логина, на Firebrick у каждого из них своя таблица маршрутизации. У каждого из них также есть уникальный публичный адрес IPv4. SoftEther был единственным способом, с помощью которого мне удалось успешно получить интернет-соединение без NAT, я полагаю, потому что он создает виртуальный сетевой интерфейс (скрытый для ОС), который соединяет соединения L2TP и интерфейс Ethernet (например, eth1/eno2) на уровне Ethernet.

С помощью этого я дал указание брандмауэру Firebrick (моему маршрутизатору) с помощью десятков правил переключаться между различными таблицами маршрутизации для каждого соединения L2TP и таблицей маршрутизации, которая есть у порта моей локальной сети, и наоборот. Интерфейс локальной сети по-прежнему использует мой публичный IPv4 /26, но на самом деле он не подключен напрямую к IP-адресам, выделенным для моих соединений с сервером L2TP. Первый IP этого публичного блока IPv4 /26 на самом деле не является публичным, он используется только как IP-шлюз для моего порта локальной сети, и этот IP-адрес недоступен из Интернета. Это работает, хотя, как я уже сказал, это окольный путь. У меня все еще есть запасные IP-адреса, поэтому позже я смогу добавить больше логинов.

Это, конечно, не самое лучшее решение, оно немного некрасивое, но, похоже, работает.

Связанный контент