Привет!
Возникла непонятная ситуация, над которой я сломал уже всю голову и, скорее всего, судя по отсутствию результата, не замечаю чего-то очевидного, посему прошу коллективный разум о помощи.
Есть сервер с двумя сетевыми картами, на нём стоит proxmox, в proxmox в kvm-виртуалку проброшены бриджи: vmbr0, который на хосте является eth0, и имеет внутренний адрес сети и vmbr1(eth1), для которого адрес не настроен и который предполагается использовать для внешнего адреса в proxmox:
[root@proxmox ~]# brctl show
bridge name bridge id STP enabled interfaces
vmbr0 8000.0cc47a40c1f8 no eth0
tap101i1
vmbr1 8000.0cc47a40c1f9 no eth1
tap101i0
[root@proxmox ~]# cat /etc/network/interfaces
# network interface settings
auto lo
iface lo inet loopback
iface eth0 inet manual
iface eth1 inet manual
auto vmbr0
iface vmbr0 inet static
address 10.0.70.4
netmask 255.255.255.0
# gateway 10.0.70.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
auto vmbr1
iface vmbr1 inet manual
bridge_ports eth1
bridge_stp off
bridge_fd 0
В KVM для сетевых карт используются драйверы vitio, конфигурация имеет следующий вид:
[2.2-RELEASE][root@pfSense.localdomain]/root: ifconfig
vtnet0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=6c00bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
ether ea:17:c5:2e:7b:dc
inet6 fe80::e817:c5ff:fe2e:7bdc%vtnet0 prefixlen 64 scopeid 0x1
inet XXX.XXX.XX2 netmask 0xfffffff8 broadcast XXX.XXX.XX7
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
media: Ethernet 10Gbase-T <full-duplex>
status: active
vtnet1: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
options=6c00bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,VLAN_HWTSO,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
ether 22:ea:8a:16:73:0f
inet6 fe80::20ea:8aff:fe16:730f%vtnet1 prefixlen 64 scopeid 0x2
inet 10.0.70.3 netmask 0xffffff00 broadcast 10.0.70.255
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
media: Ethernet 10Gbase-T <full-duplex>
status: active
pflog0: flags=100<PROMISC> metric 0 mtu 33172
pfsync0: flags=0<> metric 0 mtu 1500
syncpeer: 224.0.0.240 maxupd: 128 defer: on
syncok: 1
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
options=600003<RXCSUM,TXCSUM,RXCSUM_IPV6,TXCSUM_IPV6>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
enc0: flags=0<> metric 0 mtu 1536
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
Вообще, то что я организовываю, практически 1 в 1 совпадает со схемой в https://forum.pfsense.org/index.php?topic=50013.0
Pfsense как роутер работает без проблем, но возникло дикое непонимание того, как там устроен NAT. Для начала давайте попробуем разобраться в некоторых простых ситуациях. Во всех них есть proxmox-хост (PM) с адресом 10.0.70.4, pfsense (PF) в нём, с внутренним интерфейсом 10.0.70.3 и внешним интерфейсом XXX.XXX.XXX.XXX и компьютер в локальной сети(userhost) с адресом 10.0.70.118. Настройки PF практически из-коробки, только отключён ipv6, на всякий случай отключены блокировки bogon networks и private networks
Маршруты на PM:
[root@proxmox ~]# ip r
10.0.70.0/24 dev vmbr0 proto kernel scope link src 10.0.70.4
на PF:
[2.2-RELEASE][root@pfSense.localdomain]/root: netstat -r
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default XXX.XXX.XXX UGS vtnet0
10.0.70.0 link#2 U vtnet1
pfSense link#2 UHS lo0
localhost link#5 UH lo0
XXX.XXX.XX0/29 link#1 U vtnet0
XXX.XXX.XX2 link#1 UHS lo0
на userhost:
$ ip r
default via 10.0.70.3 dev eth0
10.0.70.0/24 dev eth0 proto kernel scope link src 10.0.70.118 metric 1
Таблицы файрволлов на PM и userhost пусты.
1. Я хочу пробросить порт 22 с userhost на внутренний адрес шлюза, на такой же порт, pfctl эта запись выглядит так:
nat on vtnet1 inet proto tcp from 10.0.70.0/24 to 10.0.70.118 port = ssh -> (vtnet1) round-robin
Всё хорошо, nmap показывает, что порт открыт, подключение работает.
Теперь я хочу пробросить 22 порт с userhost на порт шлюза 4022:
http://i.imgur.com/aNLxG6m.png
nat on vtnet1 inet proto tcp from 10.0.70.0/24 to 10.0.70.118 port = 4022 -> (vtnet1) round-robin rdr on vtnet1 inet proto tcp from any to any port = 4022 -> 10.0.70.118 port 22
И вот первая фигня: 4022 порт не виден, не открывается. В pfsense есть умолчательно правило, разрешающее всё на всё внутри локальной сети, отдельное правило было добавлено автоматом при создании перенаправления:
http://i.imgur.com/9KfHNia.png
Что делать?
2. Но вообще-то надо пробросить порт на внешний интерфейс, делаю всё то же самое, но теперь для WAN:
http://i.imgur.com/eqMdhYJ.png
Не работает.
Со словами “может я совсем дурак?” отдельно открываю ssh на WAN:
http://i.imgur.com/iIfWxmx.png
Не работает.
Психанув, создаю ещё правило, разрешающее на WAN всё:
http://i.imgur.com/H10d2Sn.png
Работает.
Меняю на WAN пробрашиваемый порт с 22 на 4022 - работает.
Пробую сделать подобное для LAN (22-4022) - не работает.
Извиняюсь за много букв, но пока писал и проверял всё для этой темы, смог структурировать проблемы и понять, что они по всеё вероятности на стороне файрволла, не на уровне физических сетевух или бриджей.
В итоге получается два вопроса:
- Что нужно чтобы перенаправить порты (22-4022) внутри локалки?
- Как правильно сделать перенаправление на WAN не открывая жопу всему миру всех портов?
ЗЫ: Поведедение повторяется на pfsense 2.1.5 и 2.2
casr val-amart за тему Виртуальный роутер под KVM - как настроить сеть? (комментарий)
Окосевая иду спать.