Моя настройка представляет собой хост виртуальной машины с двумя сетевыми интерфейсами, один из которых я хочу использовать как частный/внутренний, а другой — как публичный (который получит публичный адрес на хосте), где и будет происходить вся магия NAT для гостевых машин.
Два интерфейса означают два шлюза (один via eth0, 10.0.0.1
и поддельный адрес on eth1, 2.0.0.1
).
Если я правильно понял маршрутизацию, мне нужно настроить таблицу маршрутизации для 2.0.0.1
сети с собственным шлюзом по умолчанию. К сожалению, трафик гостя не может быть маршрутизирован, если я не добавлю шлюз по умолчанию в таблицу по умолчанию на хосте. Я хочу, чтобы хост использовал его 10.0.0.1
в качестве своего шлюза по умолчанию, но я понятия не имею, как это сделать.
Подробности:
В частности, я хотел бы избавиться от default via 2.0.0.1 dev eth1
на хосте, но если я его удалю, то он tcpdump -i vbr0
будет выглядеть не очень хорошо (попытка поиска serverfault.com из гостевой системы в примере ниже):
IP 192.168.10.2.32804 > 8.8.4.4.domain: 41116+ A? serverfault.com. (24)
IP 192.168.10.1 > 192.168.10.2: ICMP net 8.8.4.4 unreachable, length 60
Тем не менее, гость может достичь 192.168.10.1
(своего шлюза) и 2.0.0.1
. Более того, использование 2.0.0.1
для поиска адреса (у этого маршрутизатора также есть служба DNS) из гостя работает, так что локальная маршрутизация, похоже, работает, «только» часть шлюза по умолчанию, похоже, каким-то образом испорчена.
Разве весь трафик с гостевой ОС (или vb0) не должен использовать шлюз по умолчанию 2.0.0.1
, как определено в таблице маршрутизации «public»?
Настраивать:
# ip route
default via 2.0.0.1 dev eth1
10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.15
2.0.0.0/24 dev eth1 proto kernel scope link src 2.0.0.55
192.168.10.0/24 dev vbr0 proto kernel scope link src 192.168.10.1
# ip route show public
default via 2.0.0.1 dev eth1
2.0.0.0/24 dev eth1 scope link src 2.0.0.55
192.168.10.0/24 dev vbr0 scope link src 192.168.10.1
# ip rule
0: from all lookup local
32761: from 192.168.10.1 lookup public
32762: from all to 192.168.10.1 lookup public
32763: from all to 2.0.0.55 lookup public
32765: from 2.0.0.55 lookup public
32766: from all lookup main
32767: from all lookup default
# iptables -vnL
Chain INPUT (policy ACCEPT 1222 packets, 91256 bytes)
pkts bytes target prot opt in out source destination
13 648 REJECT all -- * * 0.0.0.0/0 2.0.0.55 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT 193 packets, 297K bytes)
pkts bytes target prot opt in out source destination
266 51860 ACCEPT all -- * * 0.0.0.0/0 192.168.10.0/24 ctstate NEW,RELATED,ESTABLISHED
Chain OUTPUT (policy ACCEPT 1157 packets, 149K bytes)
pkts bytes target prot opt in out source destination
Chain LOGDROP (0 references)
pkts bytes target prot opt in out source destination
# iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 49 packets, 5494 bytes)
pkts bytes target prot opt in out source destination
6 360 DNAT tcp -- * * 0.0.0.0/0 2.0.0.55 tcp dpt:80 to:192.168.10.2:80
0 0 DNAT tcp -- * * 0.0.0.0/0 2.0.0.55 tcp dpt:443 to:192.168.10.2:443
1 60 DNAT tcp -- * * 0.0.0.0/0 2.0.0.55 tcp dpt:22022 to:192.168.10.2:22
Chain INPUT (policy ACCEPT 24 packets, 3414 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 5 packets, 317 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 12 packets, 737 bytes)
pkts bytes target prot opt in out source destination
5 318 SNAT all -- * * 192.168.10.2 0.0.0.0/0 to:2.0.0.55