FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-03 12:46:16

Люди поскажите что я не так делаю. Уже всю голову сломал.
я не понимаю где косяк.
getaddrinfo использует весь софт. Поэтому ничего что лезет наружу из jail-а не работает.

# cat /etc/jail.conf

Код: Выделить всё

ds {
        host.hostname = "ds";                 # Hostname
        ip4.addr = "10.108.1.12";                      # IP address of the jail
        interface = "em1";
        exec.prestart = "";
        exec.poststop = "";
}

Вот рулы в ipfw:

Код: Выделить всё

[root:/usr/local/etc/nsd]# ipfw show
00100 39973561 35605298033 reass ip from any to any via em0
00200        0           0 check-state :default
00300 13716784 10052371772 allow ip from any to any via em1
00400        0           0 allow ip from any to any via em2
00500  4968218  3202489230 allow ip from any to any via em3
00600        0           0 allow ip from any to any via em4
00700 12791616  5343315940 allow ip from any to any via lo0
00800      112        5832 nat 100 ip from 10.108.1.12 to any via em0
00900        0           0 allow ip from any to any frag
01000        0           0 deny ip from any to any not verrevpath via em0
01100        0           0 deny ip from any to any not antispoof via em0
01200    16788      906534 allow icmp from any to any
01300     2633      153202 allow tcp from any to me 21 setup keep-state :default
01400  1227320  1111442340 allow tcp from any to me 40000-50000 setup keep-state :default
01500     1741      149167 allow tcp from any to me 5432 setup keep-state :default
01600        0           0 allow tcp from 10.0.0.0/8 to me 3306 setup keep-state :default
01700      880       52800 deny ip from me to any 25 setup keep-state :default
01800       46        2432 deny ip from any to me 25 via em0 keep-state :default
01900     4881     3105209 allow tcp from me to any 80,443 setup keep-state :default
02000      576       65547 allow tcp from any to any 53 setup keep-state :default
02100   113737    19113217 allow udp from any to any 53 keep-state :default
02200   762946   758564259 allow tcp from any to me 80 setup limit src-addr 108 :default
02300 19061274 20427211854 allow tcp from any to me 443 setup limit src-addr 108 :default
02400    18245    17777939 allow tcp from any to me 8888 setup limit src-addr 108 :default
02500      235       10552 allow tcp from any to me 108,22 setup keep-state :default
02600        0           0 allow udp from me to any 123 keep-state :default
02700        0           0 deny ip from any to 0.0.0.0/8 via em0
02800        0           0 deny ip from any to 169.254.0.0/16 via em0
02900        0           0 deny ip from any to 192.0.2.0/24 via em0
03000     2396      195755 deny ip from any to 224.0.0.0/4 via em0
03100    66773     9180409 deny ip from any to 240.0.0.0/4 via em0
03200        3         180 deny ip from table(0) to any
03300        0           0 deny log logamount 50 ip from me to table(1)
03400 18695308 13257454380 nat 100 ip from any to any via em0
03500        0           0 deny log logamount 100000 ip from any to any
65535      151       73173 allow ip from any to any
[root:/usr/local/etc/nsd]#
из джэйла:

не работает getaddrinfo.

Код: Выделить всё

➜  / getaddrinfo ya.ru
getaddrinfo: Name does not resolve
➜  / 
снаружи на lo0:

Код: Выделить всё

# tcpdump -ilo0 port 53
12:32:57.975594 IP 10.108.1.12.57977 > 10.108.1.12.domain: 12187+ A? ya.ru. (23)
12:32:58.054052 IP 10.108.1.12.domain > 10.108.1.12.57977: 12187 1/0/0 A 87.250.250.242 (39)
12:33:02.982464 IP 10.108.1.12.57977 > 10.108.1.12.domain: 12187+ A? ya.ru. (23)
12:33:02.982574 IP 10.108.1.12.domain > 10.108.1.12.57977: 12187 1/0/0 A 87.250.250.242 (39)
12:33:13.038802 IP 10.108.1.12.24044 > 10.108.1.12.domain: 35156+ AAAA? ya.ru. (23)
12:33:13.112982 IP 10.108.1.12.domain > 10.108.1.12.24044: 35156 1/0/0 AAAA 2a02:6b8::2:242 (51)
12:33:18.041204 IP 10.108.1.12.24044 > 10.108.1.12.domain: 35156+ AAAA? ya.ru. (23)
12:33:18.041312 IP 10.108.1.12.domain > 10.108.1.12.24044: 35156 1/0/0 AAAA 2a02:6b8::2:242 (51)
но работает drill в jail-e like a sharm

Код: Выделить всё

➜  / drill ya.ru
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 35596
;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;; ya.ru.       IN      A

;; ANSWER SECTION:
ya.ru.  485     IN      A       87.250.250.242

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 23 msec
;; SERVER: 127.0.0.1
;; WHEN: Thu Feb  3 12:06:14 2022
;; MSG SIZE  rcvd: 39
➜  /

[code]# tcpdump -ilo0 port 53
12:49:22.192933 IP 10.108.1.12.27080 > 10.108.1.12.domain: 38718+ A? ya.ru. (23)
12:49:22.193004 IP 10.108.1.12.domain > 10.108.1.12.27080: 38718 1/0/0 A 87.250.250.242 (39)


Всё слушается unbound-ом нормально на 10.108.1.12
DNS master:

Код: Выделить всё

[root:/usr/local/etc/nsd]# sockstat -l4 | grep 53
unbound  unbound    83079 3  udp4   10.108.1.1:53         *:*
unbound  unbound    83079 4  tcp4   10.108.1.1:53         *:*
unbound  unbound    83079 5  udp4   10.108.1.12:53        *:*
unbound  unbound    83079 6  tcp4   10.108.1.12:53        *:*
unbound  unbound    83079 7  udp4   10.108.2.1:53         *:*
unbound  unbound    83079 8  tcp4   10.108.2.1:53         *:*
unbound  unbound    83079 9  udp4   10.108.3.1:53         *:*
unbound  unbound    83079 10 tcp4   10.108.3.1:53         *:*
unbound  unbound    83079 15 udp4   127.0.0.1:53          *:*
unbound  unbound    83079 16 tcp4   127.0.0.1:53          *:*
unbound  unbound    83079 17 udp4   10.108.4.1:53         *:*
unbound  unbound    83079 18 tcp4   10.108.4.1:53         *:*
unbound  unbound    83079 20 tcp4   127.0.0.1:8953        *:*
nsd      nsd        82197 5  udp4   176.124.147.86:53     *:*
nsd      nsd        82197 6  tcp4   176.124.147.86:53     *:*
nsd      nsd        82196 5  udp4   176.124.147.86:53     *:*
nsd      nsd        82196 6  tcp4   176.124.147.86:53     *:*
nsd      nsd        60237 5  udp4   176.124.147.86:53     *:*
nsd      nsd        60237 6  tcp4   176.124.147.86:53     *:*
nsd      nsd        60236 5  udp4   176.124.147.86:53     *:*
nsd      nsd        60236 6  tcp4   176.124.147.86:53     *:*

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-03 20:23:53

трассировка getaddrinfo ya.ru
виден висяк на получении данных из сокета recvfrom

Код: Выделить всё

0.003748492 mmap(0x0,69632,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34366791680 (0x8006ba000)
0.003790758 socket(PF_INET,SOCK_DGRAM|SOCK_CLOEXEC,0) = 3 (0x3)
0.003823702 connect(3,{ AF_INET 127.0.0.1:53 },16) = 0 (0x0)
0.003870634 sendto(3,"\M-l"\^A\0\0\^A\0\0\0\0\0\0\^Bya"...,23,0,NULL,0) = 23 (0x17)
0.214132672 poll({ 3/POLLRDNORM },1,5000)        = 1 (0x1)
0.214170561 recvfrom(3,"\M-l"\M^A\M^@\0\^A\0\^A\0\0\0\0"...,65536,0,{ AF_INET 10.108.1.12:53 },0x7fffffffcb78) = 39 (0x27)
5.027590716 poll({ 3/POLLRDNORM },1,4789)        = 0 (0x0)
5.027711767 sendto(3,"\M-l"\^A\0\0\^A\0\0\0\0\0\0\^Bya"...,23,0,NULL,0) = 23 (0x17)
5.027788954 poll({ 3/POLLRDNORM },1,10000)       = 1 (0x1)
5.027819955 recvfrom(3,"\M-l"\M^A\M^@\0\^A\0\^A\0\0\0\0"...,65536,0,{ AF_INET 10.108.1.12:53 },0x7fffffffcb78) = 39 (0x27)
15.048610172 poll({ 3/POLLRDNORM },1,9999)       = 0 (0x0)
15.048707283 close(3)                            = 0 (0x0)
15.048752068 socket(PF_INET,SOCK_DGRAM|SOCK_CLOEXEC,0) = 3 (0x3)
15.048787800 connect(3,{ AF_INET 127.0.0.1:53 },16) = 0 (0x0)
15.048845592 sendto(3,"\M-a\M-s\^A\0\0\^A\0\0\0\0\0\0"...,23,0,NULL,0) = 23 (0x17)
15.057370310 poll({ 3/POLLRDNORM },1,5000)       = 1 (0x1)
15.057398968 recvfrom(3,"\M-a\M-s\M^A\M^@\0\^A\0\^A\0\0\0"...,65536,0,{ AF_INET 10.108.1.12:53 },0x7fffffffcb78) = 51 (0x33)
20.078299792 poll({ 3/POLLRDNORM },1,4991)       = 0 (0x0)
20.078428565 sendto(3,"\M-a\M-s\^A\0\0\^A\0\0\0\0\0\0"...,23,0,NULL,0) = 23 (0x17)
20.078507334 poll({ 3/POLLRDNORM },1,10000)      = 1 (0x1)
20.078537445 recvfrom(3,"\M-a\M-s\M^A\M^@\0\^A\0\^A\0\0\0"...,65536,0,{ AF_INET 10.108.1.12:53 },0x7fffffffcb78) = 51 (0x33)
30.096357048 poll({ 3/POLLRDNORM },1,9999)       = 0 (0x0)
30.096433347 close(3)                            = 0 (0x0)


трассировка drill ya.ru
тут всё пролетает на ура. я понимаю что по-другому сокет открывается и в getaddrinfo по модному и молодёжному делается. Но где косяк то?

Код: Выделить всё

0.006090504 mmap(0x0,4096,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34371297280 (0x800b06000)
0.006128069 socket(PF_INET,SOCK_DGRAM,IPPROTO_UDP) = 3 (0x3)
0.006180969 sendto(3,"I\M-J\^A\0\0\^A\0\0\0\0\0\0\^Bya"...,23,0,{ AF_INET 127.0.0.1:53 },16) = 23 (0x17)
0.027699108 poll({ 3/POLLIN|POLLERR },1,5000)    = 1 (0x1)
0.027728641 fcntl(3,F_GETFL,)                    = 2 (0x2)
0.027752929 fcntl(3,F_SETFL,O_RDWR|O_NONBLOCK)   = 0 (0x0)
0.027778431 mmap(0x0,69632,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34371301376 (0x800b07000)
0.027809207 recvfrom(3,"I\M-J\M^A\M^@\0\^A\0\^A\0\0\0\0"...,65535,0,NULL,0x0) = 39 (0x27)
0.027876694 close(3)                             = 0 (0x0)
0.027948126 mmap(0x0,69632,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34371371008 (0x800b18000)
0.027995761 access("/etc/localtime",R_OK)        = 0 (0x0)
0.028025320 open("/etc/localtime",O_RDONLY,011022134) = 3 (0x3)
0.028046004 fstat(3,{ mode=-r--r--r-- ,inode=3690184,size=1518,blksize=4096 }) = 0 (0x0)
0.028088605 read(3,"TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0"...,41448) = 1518 (0x5ee)
0.028133640 close(3)                             = 0 (0x0)
0.028163254 mmap(0x0,24576,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34371440640 (0x800b29000)
0.028186528 issetugid()                          = 0 (0x0)
0.028212318 open("/usr/share/zoneinfo/posixrules",O_RDONLY,00) = 3 (0x3)
0.028232102 fstat(3,{ mode=-r--r--r-- ,inode=3699347,size=3519,blksize=4096 }) = 0 (0x0)
0.028255601 mmap(0x0,53248,PROT_READ|PROT_WRITE,MAP_PRIVATE|MAP_ANON,-1,0x0) = 34371465216 (0x800b2f000)
0.028306604 read(3,"TZif2\0\0\0\0\0\0\0\0\0\0\0\0\0"...,41448) = 3519 (0xdbf)
0.028352460 close(3)                             = 0 (0x0)

guest
проходил мимо

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение guest » 2022-02-05 18:04:26

Но где косяк то?
на выбор:
- /etc/resolv.conf
- unbound -> allow query
- firewall keep-state

в getaddrinfo идет перебор nameserver из /etc/resolv.conf:
- сначала 127.0.0.1:53 - отлуп
- затем 10.108.1.12 - отлуп
и так несколько раз

в drill, судя по _кусочку_ трассировки, ответ приходит от 127.0.0.1
что странно сравнивая с getaddrinfo, который прост до безобразия
и ничего модного в нем нет, в отличие от drill.

IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-05 18:38:20

Код: Выделить всё

➜  / cat /etc/resolv.conf

nameserver 127.0.0.1
➜  /

Код: Выделить всё

firewall keep-state
так keep-state просто временный динамический in out рул создаёт для того чтобы потом не ходить по всем рулам. Не понимаю.

IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-05 18:54:00

unbound -> allow query
не понял.

IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-05 19:22:52

unbound все компы обслуживает в локале и все мобильные девайсы, которые висят тоже на em1 через WiFi роутер.

guest
проходил мимо

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение guest » 2022-02-06 23:37:25

IP » 2022-02-05 18:54:00
unbound -> allow query
не понял.
я тоже, unbound можно настроить как кеширующий и как primary+cache
с разрешением и запретом для локальных сетей, во втором случае
достаточно ньюансов в настройках.
Помню у меня unbound был как кеш и форвардил запросы в bind9,
получал отлуп пока dnssec не вырубил, тонкости не помню.

Что будет если в резолвере прописать первым: nameserver 8.8.8.8?
Если проблемы -> см ipfw

IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-07 0:18:33

Что будет если в резолвере прописать первым: nameserver 8.8.8.8?
Если проблемы -> см ipfw
всё работает нормально с 8.8.8.8. Косяк в настройках с unbound-ом или что-то в системе?
unbound у меня кэширующий. Бред какой-то. Все девайсы у этого unbound-а dns-ятся. Все его по DHCP получают. Никаких проблем нет. А jail то почему окочурился? С точки зрения хоста это просто алиасный адрес на интерфейсе.

guest
проходил мимо

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение guest » 2022-02-07 9:13:22

всё работает нормально с 8.8.8.8. Косяк в настройках с unbound-ом или что-то в системе?
unbound у меня кэширующий. Бред какой-то. Все девайсы у этого unbound-а dns-ятся. Все его по DHCP получают. Никаких проблем нет. А jail то почему окочурился? С точки зрения хоста это просто алиасный адрес на интерфейсе.
уже близко -> tcpdump, настройки unbound..., если проблема непонятна:
bind9 как кеширующий и попробуй его в jail как resolver, если
проблемы останутся -> ipfw


IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-07 22:01:59

поставил другой ресолвер на хосте вместо unbound.
В jail-е поведение такое же:
если nameserver 127.0.0.1 в /etc/resolv.conf- то getaddrinfo висит по 5-10 секунд при получении ответов
если nameserver 10.108.1.12 в /etc/resolv.conf - то getaddrinfo работает нормально

IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-07 22:55:25

и это ожидаемо. drill то нормально всегда работает.
И врядли это косяк с ipfw рулами иначе бы и drill тоже не работал.

мне вломак писать тест на сях чтобы позвать socket(PF_INET,SOCK_DGRAM|SOCK_CLOEXEC,0) из jail-а

guest
проходил мимо

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение guest » 2022-02-08 12:31:29

поставил другой ресолвер на хосте вместо unbound.
В jail-е поведение такое же:
если nameserver 127.0.0.1 в /etc/resolv.conf- то getaddrinfo висит по 5-10 секунд при получении ответов
если nameserver 10.108.1.12 в /etc/resolv.conf - то getaddrinfo работает нормально
имеем, jail с host'овым стеком tcp/ip?

в /etc/resolv.conf
nameserver 127.0.0.1

те в jail'е у Вас был поднят unbound (пробовали другой dns-кеш) на 127.0.0.1 - в результате
имеем timeout или вовсе нет ответа? Что в логах кеш-сервера?

Как только задаем внешний резолвер: на хосте или публичный, все работает.
На лицо проблема с loopback или кеширущим dns сервером в jail.

IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-08 12:56:01

guest писал(а):
2022-02-08 12:31:29
те в jail'е у Вас был поднят unbound (пробовали другой dns-кеш) на 127.0.0.1 - в результате
имеем timeout или вовсе нет ответа? Что в логах кеш-сервера?
нет. unbound на хосте. В jail-е ничего нет. jail обращается к хостовому ресолверу, точно также как из jail-а доступны все остальные сервисы хоста.

guest
проходил мимо

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение guest » 2022-02-08 17:26:08

О боже, Вы же пытаетесь обратиться к 127.0.0.1 - loopback, что в Jail без собственного
полноценного стека, просто так невозможно!
Шарить HOST'овый loopback device с адресом 127.0.0.1 с jail, обычным образом нельзя и невозможно!
Позор на мои седые волосы, забыл про TCP/IP стек FreeBSD и реализацию Jails. :(

https://docs.freebsd.org/44doc/papers/j ... #section10

В подобных случая клонируют lo0 -> lo1 -> lo2 ... etc и nat для jails

IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-08 20:35:14

ну вот и ответ

https://forums.freebsd.org/threads/jail ... ost-468396

Jails не нуждаются в интерфейсе lo(4). Они прекрасно будут работать и без него. Но имейте в виду, что в Jail-е нет 127.0.0.1 адреса, поэтому вам нужно специально привязать свои службы к IP-адресу Jail-а.

надо это записать в маны везде.

IP
рядовой
Сообщения: 11
Зарегистрирован: 2022-02-01 11:31:42

FreeBSD 12.2 ipfw + jail + nat + getaddrinfo ???

Непрочитанное сообщение IP » 2022-02-08 20:54:57

guest писал(а):
2022-02-08 17:26:08
В подобных случая клонируют lo0 -> lo1 -> lo2 ... etc и nat для jails
спасибо за наводку в каком направлении рыть.