Я пытаюсь реализовать следующий сценарий: один виртуальный хост, несколько гостевые ВМ, каждый получает свой собственный IP-адрес (и домен).
Наш сервер имеет только один физический интерфейс, поэтому его предполагаемое использование - добавление виртуальные интерфейсы на eth0. Чтобы усложнить нашу ситуацию, провайдер использует безопасность порта на их коммутаторах, поэтому я не могу запустить гостевые интерфейсы в мостовом режиме, потому что тогда коммутатор обнаруживает «поддельный» MAC-адрес и убивает интерфейс (навсегда, заставляя меня позвонить в службу поддержки, которая, я уверен, получит их немного рассердили в третий раз;)).
Мое первое предположение заключалось в использовании iptables и NAT для пересылки всех пакетов с одного виртуального интерфейса на другой, но iptables, похоже, не любит виртуальные интерфейсы (по крайней мере, я не могу заставить его работать должным образом). Второе предположение - использовать исходный IP-адрес пакетов в общедоступном интерфейсе.
Предположим, libvirt создает сеть virbr0 с адресом 192.168.100.0/24, а гость использует 192.168.100.2 в качестве IP-адреса.
Вот что я пытался использовать: iptables -t nat -I PREROUTING --src public_ip_on_eth0:0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:80
Это тоже не дает ожидаемых результатов (время ожидания доступа к серверу истекло).
Есть ли способ сделать то, что я пытаюсь сделать, или даже направить весь трафик на определенный IP-адрес виртуального интерфейса к устройству виртуальной машины?
С ответами Кристоф Древе и Герцог лев Мне удалось получить желаемую конфигурацию.
Я отвечу сам, объясняя свое решение. Пожалуйста, не стесняйтесь комментировать это, так как я не занимался сетевыми вещами несколько лет и вполне мог пропустить что-то очень важное.
Приведенная ниже конфигурация работает идеально и позволяет добавлять дополнительные виртуальные машины, каждая из которых использует свой общедоступный IP-адрес (IP-адреса из 172.16.0.0, используемые здесь, являются «общедоступными»).
VM-Host, eth0 -> 172.16.0.1
VM-Host, eth0:0 -> 172.16.0.2
VM-Host, br0 -> 192.168.10.1
Virt. machine, eth0 -> 192.168.10.2 (added to br0)
gateway: 172.16.0.2
Отслеживание подключений:
iptables -I FORWARD -m conntrack -d 192.168.10.0/24 --ctstate NEW,RELATED,ESTABLISHED -j ACCEPT
DNAT для веб-сервера на нашей виртуальной машине:
iptables -t nat -A PREROUTING -p tcp -d 172.16.0.2 --dport 80 -j DNAT --to-destination 192.168.10.2:80
SNAT для нашей виртуальной машины для выхода во внешний мир:
iptables -t nat -I POSTROUTING -j SNAT --src 192.168.10.2 --to-source 172.16.0.2
Заблокируйте все остальные порты на виртуальной машине:
iptables -A INPUT -d 172.16.0.2 -j REJECT --reject-with icmp-port-unreachable
У меня была аналогичная конфигурация сети, и я использовал эту конфигурацию:
localnetwork (192.168.0.0/24) <-> host eth0 (192.168.0.10)
host tun0 (192.168.1.150) <-> vm1 eth0 (192.168.1.200) gw 192.168.1.150
<-> vm2 eth0 (192.168.1.201) gw 192.168.1.150
Все мои виртуальные машины могут пинговать друг друга и иметь доступ к внешней сети с помощью этого правила iptable:
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.1.0/24 0.0.0.0/0 to:192.168.0.10
Внешняя сеть может получить доступ к службам на моих виртуальных машинах с помощью следующих правил:
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:22200 to:192.168.1.200:22
DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:22201 to:192.168.1.201:22
DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:3389 to:192.168.1.202:3389
DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:443 to:192.168.1.206:443
DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:80 to:192.168.1.206:80
Я настроил интерфейс tun0 с этими строками на debian в файле / etc / network / interfaces:
auto tun0
iface tun0 inet static
address 192.168.1.150
netmask 255.255.255.0
pre-up tunctl -g uml-net -t tun0
post-down tunctl -d tun0
чтобы использовать DNAT таким образом, вам необходимо, чтобы ваши гостевые системы имели виртуальный хост в качестве шлюза по умолчанию.