У меня есть сервер с собственной публичной / 28 IPv4-сетью.
На этом сервере у меня есть несколько vServers, выполненных с помощью KVM / libvirt. Эти vServer подключены к виртуальной сети, подключенной к Интернету через NAT. Каждый vServer имеет частный адрес (192.168.x.y / 24), и не каждый vServer должен получать общедоступный IP-адрес.
Хост направляет общедоступные IP-адреса на свой конкретный vServer, который отлично работает с входящими подключениями.
Моя проблема: при исходящих соединениях с vServers они получают IP-адрес отправителя с хоста, а не его общедоступный. Есть ли способ установить общедоступный IP-адрес отправителя для vServer в libvirt?
Я уже искал ServerFault, но ничего не нашел. Но я должен признать, что, возможно, я не знаю лучших поисковых запросов для этого.
Чтобы настроить NAT в вашей виртуальной сети libvirt
добавляет некоторые правила iptables, которые выглядят примерно так:
$ iptables -t nat -S
[...]
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.1.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
[...]
Действия MASQUERADE в этих правилах переводят внутренний IP-адрес на внешний IP-адрес вашей сетевой карты. Есть еще одно действие, называемое SNAT, которое делает то же самое, но использует определенный исходный IP-адрес, который вы установили сами. Итак, что вы можете сделать, это вставить несколько правил SNAT перед вашим MASQUERADE
такие правила:
$ iptables -t nat -I POSTROUTING -s 192.168.1.x ! -d 192.168.1.0/24 -j SNAT --to-source <public ip>
$ iptables -t nat -I POSTROUTING -s 192.168.1.x ! -d 192.168.1.0/24 -p udp -j SNAT --to-source <public ip>:1024-65535
$ iptables -t nat -I POSTROUTING -s 192.168.1.x ! -d 192.168.1.0/24 -p tcp -j SNAT --to-source <public ip>:1024-65535
Теперь исходящий трафик из 192.168.1.x получит IP-адрес источника <public ip>.