Я пытаюсь настроить конкретный NAT, но я немного застрял здесь.
Моя настройка выглядит следующим образом:
Виртуальные машины отлично могут подключаться к выделенным серверам и vps, и то же самое для выделенных и vps по отношению к виртуальной машине.
Выделенный 1: 10.100.0.10 Выделенный 1: 10.100.0.20 Выделенный 1: 10.100.0.30 ВМ 1: 10.100.2.3 ВМ 2: 10.100.2.4 ВМ 3: 10.100.2.5 VPS: 10.100.0.101
Все виртуальные машины используют IP-адрес VPS в качестве шлюза, это выглядит так:
root@test-ubuntu:~# ip a l dev ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:c1:fa:f5 brd ff:ff:ff:ff:ff:ff
inet 10.100.2.3/16 brd 10.100.255.255 scope global ens3
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fec1:faf5/64 scope link
valid_lft forever preferred_lft forever
root@test-ubuntu:~# ip r s dev ens3
default via 10.100.0.101
10.100.0.0/16 proto kernel scope link src 10.100.2.3
169.254.169.254 via 10.100.2.1
Проблема в том, что я хочу использовать весь публичный IP-адрес, который у меня есть на этом VPS, для прямого доступа к виртуальной машине. Я знаю, что мне нужно немного натренировать, но после нескольких часов тестирования различных подходов и чтения документации я признаю, что полностью застрял.
root@network1:~# ip a l dev ens3
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:86:e6:a1 brd ff:ff:ff:ff:ff:ff
inet 145.YYY.XXX.60/32 brd 145.YYY.XXX.60 scope global ens3
valid_lft forever preferred_lft forever
root@network1:~# ip a l dev ens6
3: ens6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether fa:16:3e:78:93:e1 brd ff:ff:ff:ff:ff:ff
inet 147.AAA.BBB.97/27 brd 147.AAA.BBB.127 scope global ens6
valid_lft forever preferred_lft forever
inet 147.AAA.BBB.98/27 brd 147.AAA.BBB.127 scope global secondary ens6:1
valid_lft forever preferred_lft forever
inet 147.AAA.BBB.99/27 brd 147.AAA.BBB.127 scope global secondary ens6:2
valid_lft forever preferred_lft forever
[....]
inet 147.AAA.BBB.124/27 brd 147.AAA.BBB.127 scope global secondary ens6:27
valid_lft forever preferred_lft forever
inet 147.AAA.BBB.125/27 brd 147.AAA.BBB.127 scope global secondary ens6:28
valid_lft forever preferred_lft forever
На данный момент мои правила пусты (я показываю только таблицу nat, но то же самое для общей таблицы):
root@haproxy-1:~# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 96 packets, 3096 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 96 packets, 3096 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Поскольку моя цель - перенаправить весь трафик, приходящий на один IP-адрес (скажем, 147.AAA.BBB.98), на виртуальную машину с IP-адресом 10.100.2.3, я придумал следующее:
Внешний по отношению к ВМ:
iptables -t nat -A PREROUTING -d 147.AAA.BBB.98 -j DNAT --to-destination 10.100.2.3
Vm на внешний:
iptables -t nat -I POSTROUTING -s 10.100.2.3 -j SNAT --to-source 147.AAA.BBB.98
Конечно, Ipforward включен на VPS.
Но не работает: /
если я делаю Tcpdump на VPS, я вижу, что пакет приходит извне, но на виртуальную машину ничего не идет. Если я пытаюсь выполнить эхо-запрос снаружи виртуальной машины, я вижу, что пакет входит в VPS, пакеты отправляются, но ничего не получено.
Однако, если я сделаю это с основным IP-адресом VPS (тем, что на ens3), все будет работать, как ожидалось.
Мне интересно, не может ли это быть тот факт, что tinc VPN работает на интерфейсе Ens3, и поэтому пакет должен быть перенаправлен с одного интерфейса на другой
Ты хоть представляешь, что я могу сделать, чтобы это исправить?
Изменить: IP-адрес второго интерфейса не находится в той же подсети, что и IP-адрес основного интерфейса, поэтому мне пришлось использовать другую таблицу маршрутов, вот как выглядит мой маршрут:
root@haproxy-1:~# ip r s
default via 145.XXX.YYY.1 dev ens3
10.100.0.0/16 dev prov proto kernel scope link src 10.100.0.101
145.XXX.YYY.1 dev ens3 scope link
147.AAA.BBB.96/27 dev ens6 proto kernel scope link src 147.AAA.BBB.97
root@haproxy-1:~# ip r s table 101
default via 147.AAA.BBB.126 dev ens6
Спасибо
Я отвечаю сам, потому что нашел решение (не уверен, что это будет лучшая мысль).
Поскольку оба интерфейса используют разные GW, я использовал таблицу маршрутизации, чтобы оба работали, никаких проблем с ними.
Правила были установлены правильно:
root@haproxy-1:~# ip rule show
0: from all lookup local
32765: from 147.AAA.BBB.96/27 lookup 101
32766: from all lookup main
32767: from all lookup default
Но чего я не знал, так это того факта, что мне также нужно правило, чтобы указать, что трафик, исходящий от 10.100.0.0/16, должен использовать таблицу 101.
Поэтому я добавил это правило:
ip rule add from 10.100.2.0/16 lookup 101
Моя таблица теперь выглядит так:
root@haproxy-1:~# ip rule show
0: from all lookup local
32764: from 10.100.2.0/16 lookup 101
32765: from 147.AAA.BBB.96/27 lookup 101
32766: from all lookup main
32767: from all lookup default
И трафик отлично направляется на виртуальную машину и от виртуальной машины наружу. Если я выполняю nmap для IP-адреса, перенаправленного на виртуальную машину (147.AAA.BBB.98), я вижу только открытый порт виртуальной машины, а не один из VPS.
Обратите внимание, что я использовал это объяснение для решения своей проблемы: http://www.rjsystems.nl/en/2100-adv-routing.php
В любом случае теперь работает как я хочу