____________________________ ____________________________
| Host | | Client |
| Public IP: 66.66.66.66 | | |
| Internal IP: 10.0.3.1 | <---------> | Internal IP: 10.0.3.192 |
---------------------------- ----------------------------
veth
сетевой параметр, на котором работает веб-сервер.ufw
и соответствующие порты открываются и перенаправляются клиенту, это работает.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