Я применил решение с сайта superuser.com. Мне помогло
Все кредиты Алексею Дегтяреву
Спасибо сетевой команде Hetzner за то, что они указали на решение, но я пошел в неправильном направлении, пытаясь создать второй xenbr в той же сети и назначить ему VIF. Но это не работает, потому что после перезапуска виртуальной машины номер VIF восстанавливается.
В Hetzner у вас есть два типа дополнительных IP-адресов -, которые вы можете использовать с выделенным сервером :одиночный IPv4 и подсеть IPv4. Для каждого отдельного IP-адреса вы получаете MAC-адрес -, и вы должны использовать этот MAC-адрес на сетевом интерфейсе нового экземпляра виртуальной машины. Для каждой дополнительной подсети необходимо настроить новую сеть и настроить маршрутизацию между этой сетью и сетью по умолчанию (, связанной с eth0 )сервера.
В XenServer это можно сделать с помощью консоли Linux:
xe network-create name-label="Additional network" name-description="46.xx.yy.zz/28"
Совет 1 :Мост xapi0 не отображался на хосте, пока я не назначил одну из виртуальных машин новой сети в Xen Center. Просто совет, который может сэкономить время, если это случится с кем-то еще.
Это создаст новую сеть, подключенную к новому мосту (xapi0 по умолчанию )в XenServer. Затем назначьте этому мосту:
первый пригодный для использования IP-адрес -сети (в соответствии с его сетевой маской ).
ip addr add 46.xx.yy.1/28 dev xapi0
Теперь вы можете добавлять новые виртуальные машины с автоматически сгенерированными MAC-адресами, подключенными к вновь созданной сети вместо сети по умолчанию. Трафик будет коммутироваться и маршрутизироваться внутри XenServer.
После такой настройки я получил подтверждение от сетевой команды Hetzner, что на коммутаторном порту видны только разрешенные MAC-адреса.
Подсказка 2. :Вы можете убедиться, что на eth0 больше нет вредоносного трафика с вашей стороны на хосте:
tcpdump -i eth0 -en|egrep -i 'mac1|mac2'
Вместо этого все должно отображаться на xapi0
tcpdump -i xapi0 -en|egrep -i 'mac1|mac2'
Где mac1,mac2 -MAC-адреса, указанные Hetzner как запрещенные.
В идеале вы должны изменить запрос к базе данных, чтобы выводить данные в нужном вам формате.
$ awk -v OFS=',' '{ $1 = $1; print }' file
1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING
При этом используется awk
для переформатирования данных, разделенных пробелом -или -вкладкой -в виде запятой -. Установив OFS
в качестве разделителя выходных полей запятую, а затем изменив значение поля в каждой входной записи, awk
воссоздаст запись с новым выходным разделителем. Печать даст желаемый результат.
awk
также игнорирует любые начальные или конечные пробелы в каждой строке при их чтении по умолчанию.
Если вы хотите сделать это с sed
, то сначала удалите все начальные пробелы, а затем замените первый оставшийся пробел на запятую:
$ sed -e 's/^[[:blank:]]*//' -e 's/[[:blank:]]/,/' file
1,KALI,REGISTERED
2,KALI,PROCESSING
3,KALI,RECEIVED
1,KALI,SUBMITTED
7,KALI,SUCCEEDED
4,WEKA,PROCESSING
Шаблон [[:blank:]]
соответствует пробелу или табуляции (точно так же, как \s
в регулярных выражениях Perl ). Я использую его по привычке, но вместо этого вы можете использовать один литеральный пробел, если вы на самом деле не имеете дело с вкладками (это неясно в вопросе ). Вы также можете написать два выражения sed
в одном аргументе:
sed 's/^ *//; s/ /,/' file