Назад | Перейти на главную страницу

Как получить доступ к виртуализированному серверу с NAT (LXC) через общедоступный IP-адрес от самого клиента в мостовой сети?

Настроить

    ____________________________             ____________________________ 
    | Host                     |             | Client                   |
    | Public IP:   66.66.66.66 |             |                          |
    | Internal IP: 10.0.3.1    | <---------> | Internal IP: 10.0.3.192  |
    ----------------------------             ----------------------------

iptables экспедирование портов в /etc/ufw/before.rules:

# nat Table rules
*nat
:PREROUTING ACCEPT [0:0]

-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.192:80
-A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.192:443
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT

/etc/network/interfaces на хосте:

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
    address 66.66.66.66
    netmask 255.255.255.0
    network 66.66.66.0
    broadcast 66.66.66.255
    gateway 66.66.66.1
    # dns-* options are implemented by the resolvconf package, if installed
    dns-nameservers 8.8.8.8

/etc/network/interfaces на клиенте:

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 10.0.3.192
    netmask 255.255.255.0
    gateway 10.0.3.1
    broadcast 10.0.3.255

Сканирование портов от клиента

Starting Nmap 5.21 ( http://nmap.org ) at 2014-04-18 18:46 CEST
Nmap scan report for 66.66.66.66
Host is up (0.00011s latency).
PORT    STATE  SERVICE
80/tcp  closed http
443/tcp closed https

Сканирование портов "извне"

Starting Nmap 6.40 ( http://nmap.org ) at 2014-04-18 19:54 CEST
Nmap scan report for 66.66.66.66
Host is up (0.41s latency).
PORT    STATE SERVICE
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 1.28 seconds

Конфигурация iptables:

$ iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:10.0.3.192:80
DNAT       tcp  --  anywhere             anywhere             tcp dpt:https to:10.0.3.192:443
DNAT       tcp  --  anywhere             anywhere             tcp dpt:43211 to:10.0.3.192:22
DNAT       tcp  --  anywhere             anywhere             tcp dpt:http-alt to:10.0.3.192:8080

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  tcp  --  anywhere             10.0.3.192           tcp dpt:http
MASQUERADE  tcp  --  anywhere             10.0.3.192           tcp dpt:https
MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24

Версии


Желаемый результат

Я хочу получить доступ к веб-серверу через порт 80 на клиенте от самого клиента через публичный IP, например

$ curl http://66.66.66.66
curl: (7) couldn't connect to host

должен дать тот же результат, что и

$ curl http://10.0.3.192
<html>.....

Как ни странно $ ping 66.66.66.66 от клиента внутри частной сети работает хотя.


Что я пробовал

Я вижу, что эта проблема во многом связана с так называемым Шпилька NAT / Loopback NAT, хотя мне не удалось настроить маскировку по следующим правилам, чтобы она работала (в /etc/ufw/before.rules после PREROUTING записи):

# nat Table rules
*nat
:POSTROUTING ACCEPT [0:0]

-A POSTROUTING -o eth0 -d 10.0.3.192 -p tcp --dport 80 -j MASQUERADE
-A POSTROUTING -o eth0 -d 10.0.3.192 -p tcp --dport 443 -j MASQUERADE

# don't delete the 'COMMIT' line or these nat table rules won't be processed
COMMIT

Я предполагаю, что решение заключается в том, что проблема заключается в мостовой сети или просто в моей неспособности правильно адаптировать правило MASQUERADE к моей настройке. Любые предложения и комментарии, в том числе по настройке в целом, приветствуются.

Связанные вопросы или статьи, но не помогающие

(Сначала я написал, что это маршрутизируемая сеть, а не мостовая. Теперь я вижу, что она использует LXC, поэтому я действительно не знаю. Но если PREROUTING уже работает, я очень надеюсь, что то, что я написал ниже, сработает)

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

Таким образом, вы также дублируете правила DNAT в цепочку (-t nat) OUTPUT с некоторыми изменениями: OUTPUT не требует входного интерфейса. Вы заменяете -i eth0 с участием -o lo ! -s 127.0.0.0/8 или просто -d 66.66.66.66 или что-то еще, но вам нужно какое-то ограничение, иначе любой веб-запрос в любом месте будет идти в Клиент. Первый пример не зависит от ХостIP-адрес, второй короче, как хотите. Это не опечатка, если вы подключаетесь к 66.66.66.66 от него самого, это локальный пакет, поэтому он проходит через lo интерфейс. Но затем, поскольку пункты назначения, подобные 127.0.0.1, не могут быть перенаправлены ( curl http://127.0.0.1/ будет тайм-аут вместо сообщения о невозможности подключения) 127.0.0.0/8 ставится как исключение.

И это все. Все остальное, как обычно, берет на себя conntrack. Вам следует удалить 2 правила MASQUERADE для конкретных портов. Они не нужны и могут даже мешать (я думаю, если они сработают, то в результате Клиент всегда буду видеть Хост в качестве источника на веб-сервере)

Итак, краткий ответ (используя -t nat):

-A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.192
-A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.192
-A OUTPUT -o lo ! -s 127.0.0.0/8 -p tcp --dport 80 -j DNAT --to-destination 10.0.3.192
-A OUTPUT -o lo ! -s 127.0.0.0/8 -p tcp --dport 443 -j DNAT --to-destination 10.0.3.192