Показаны сообщения с ярлыком net. Показать все сообщения
Показаны сообщения с ярлыком net. Показать все сообщения

среда, 17 августа 2016 г.

nDPI, DKMS и здоровый сон сисадмина

DKMS (Dynamic Kernel Module Support) — шикарное решение, если требуемый модуль для ядра нельзя поставить и обновлять штатными средствами, но зато есть его исходники. Не требуется следить за обновлениями ядра и оперативно пересобирать нужный модуль или вовсе блокировать обновления ядра, чтобы ничего не отвалилось после очередного обновления.

Сначала устанавливаем dkms и другие необходимые пакеты:

$ sudo apt-get install dkms build-essential autoconf automake autogen libpcap-dev libtool xtables-addons-dkms pkg-config xtables-addons-source
Скачиваем исходники nDPI:
$ wget https://github.com/vel21ripn/nDPI/archive/netfilter.zip
Распаковываем скачанный архив в /usr/src:
$ sudo unzip netfilter.zip -d /usr/src
Переименовываем распакованную папку в ndpi-x.y.z, где x.y.z — версия модуля:
$ sudo mv /usr/src/nDPI-netfilter /usr/src/ndpi-1.7.0
Создаем файл dkms.conf в этой папке:
$ sudo tee /usr/src/ndpi-1.7.0/dkms.conf << EOF
# Версия модуля 
PACKAGE_VERSION="1.7.0"
# Название модуля в /usr/src
PACKAGE_NAME="ndpi"
# Папка для компиляции
BDIR="\${dkms_tree}/\${PACKAGE_NAME}/\${PACKAGE_VERSION}/build"
# Аргументы для make 
ARGS="-C \${kernel_source_dir} SUBDIRS=\${BDIR} M=\${BDIR}/ndpi-netfilter/src"
# После компиляции созданный модуль перемещается туда, где DKMS может его найти
MAKE[0]="make \${ARGS} modules ; find \${BDIR} -name '*.ko' -exec mv -v {} \${BDIR} \;"
CLEAN="make \${ARGS} clean"
# Название модуля ядра
BUILT_MODULE_NAME[0]="xt_ndpi"
# Папка, где обычно устанавливается модуль в ядре
DEST_MODULE_LOCATION[0]="/extra/"
# Не пересобирать initrd ядра
REMAKE_INITRD="no"
# Установка модуля после компиляции
AUTOINSTALL="yes"
EOF
Теперь компилируем и устанавливаем библиотеку nDPI
$ cd /usr/src/ndpi-1.7.0
$ sudo ./autogen.sh
$ sudo sh -c './configure && make'
$ cd /usr/src/ndpi-1.7.0/ndpi-netfilter
$ sudo make install
После чего в DKMS добавляем запись о нашем модуле:
$ sudo dkms add -m ndpi -v 1.7.0
Собираем модуль из исходников:
$ sudo dkms build -m ndpi -v 1.7.0
Собранный модуль устанавливаем папке /dkms/:
$ sudo dkms install -m ndpi -v 1.7.0

вторник, 12 ноября 2013 г.

Переадресация некоторых портов в VoIP-шлюзе Audiocodes MP-202

Чтобы в VoIP-шлюзе Audiocodes MP-202 переадресовать порты 80, 8080 или 443 на сервер внутри локальной сети, кроме соответствующих настроек в разделе «Переадресация портов», в разделе «Системные настройки» требуется изменить совпадающие порты для удаленного управления.

понедельник, 5 декабря 2011 г.

Синтаксис команды route в Android

  • route add default dev DEVICE
  • route add default gw IP dev DEVICE
  • route add -net IP netmask NETMASK gw IP
Нашел здесь: zecke.blogspot.com

вторник, 1 декабря 2009 г.

Аналог reply-to из PF в IPFW

Нашел интересную статью с описанием работы межсетевого экрана IPFW. В частности, упомянута реализация действия, аналогичного reply-to из PF:
«
Тот факт, что на самом деле "перепрыгивание" выполняется на параметры действия, позволяет использовать это для интересных вещей. В частности, с использованием появившегося во FreeBSD 6.2 параметра tag на каждый пакет можно навешивать внутриядерный тег, что в применении со skipto позволяет сделать, к примеру, запоминание, с какого шлюза пришел входящий пакет на машине с каналами к двум разным провайдерам, и ответные пакеты отправлять в тот канал, откуда они пришли (допустим, у вашей машины только один IP-адрес, и сделать fwd на базе внешнего адреса не получится), т.е. реализовать аналог reply-to из PF:

ipfw add 100 skipto 300 tag 1 in recv $ext_if1 keep-state
ipfw add 200 skipto 300 tag 2 in recv $ext_if2 keep-state
ipfw add 300 allow { recv $ext_if1 or recv $ext_if2 } # входящие снаружи
ipfw add 400 allow in recv $int_if # разрешить ответы на внутреннем проходе
ipfw add 500 fwd $gw1 tagged 1 # остались ответы на внешнем интерфейсе,
ipfw add 600 fwd $gw2 tagged 2 # зарулим их куда надо
»

суббота, 28 ноября 2009 г.

Трансляция PPTP (GRE) на шлюзе с PF

Как известно, межсетевой экран PF, портированный в FreeBSD из OpenBSD, не может корректно транслировать (NAT) GRE-протокол и, к примеру, из локальной сети невозможно создать несколько одновременных соединений к внешнему серверу VPN PPTP.
Одним из способов решения проблемы является трансляция PPTP-соединений родным IPFW с «ядерным» NAT. При этом вовсе необязательно компилировать ядро. Все описанные действия проверены в FreeBSD версии 7.2. Но должно работать и в других версиях, где есть поддержка «ядерного» NAT для IPFW.

В «/etc/rc.conf» добавляем

#Включаем IPFW
firewall_enable="YES"
# Подгружаем модуль ядра ipfw_nat
firewall_nat_enable="YES"
# Указываем путь к скрипту загрузки правил
firewall_script="/etc/ipfw.script"
Создаем файл «/etc/ipfw.script»
#!/bin/sh

/sbin/ipfw -q /dev/stdin <<RULES
flush
#em0 - внешний интерфейс шлюза
nat 10 config if em0
#Правила для трансляции PPTP-соединения
add 10 nat 10 gre from any to any
add 11 nat 10 tcp from any to any dst-port pptp
add 12 nat 10 tcp from any pptp to any
# Разрешаем весь трафик
add allow all from any to any

RULES
Делаем скрипт исполняемым
# chmod +x /etc/ipfw.script
Добавляем в правила PF
# Запрещаем PF транслировать PPTP-соединения
no nat on $external_if proto gre all
no nat on $external_if proto tcp from any to any port = pptp
no nat on $external_if proto tcp from any port = pptp to any

... skip ...

# Пропускаем PPTP-соединения
pass quick on $external_if inet proto tcp from any to any port 1723
pass quick on $external_if inet proto tcp from any port 1723 to any
pass quick on $external_if inet proto gre from any to any
После всех сделанных изменений перезагружаемся.

суббота, 13 июня 2009 г.

Настройка DHCP клиента в Ubuntu

Дополнительная настройка DHCP-клиента может понадобится когда у вас есть локальный DNS-сервер или если DHCP-сервер провайдера работает с перебоями.

Пример файла конфигурации «/etc/dhcp3/dhclient.conf»

#
# dhcp3-client 3.1.1-5ubuntu8
#
# Сюда вписываем локальный адрес DNS-сервера
prepend domain-name-servers 127.0.0.1;

# Какие данные нужно затребовать с DHCP-сервера
request subnet-mask, broadcast-address, time-offset, routers,
# Комментируем, так как у нас локальный DNS-сервер
# domain-name, domain-name-servers, domain-search, host-name,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;

#
# dhclient будет использовать эти настройки, в то время,
# когда недоступен DHCP-сервер провайдера.
#
# Если не знаете что писать - загляните в файл
# /var/lib/dhcp3/dhclient.leases
#
lease {
interface "eth1";
fixed-address 72.xxx.xxx.xxx;
option subnet-mask 255.255.xxx.xxx;
option time-offset 32400;
# Если прописать адреса роутеров, dhclient проверит наличие
# первого роутера. В случае, если роутер не ответил
# на пинг, этот блок (lease) отбрасывается.
option routers 72.xxx.xxx.1;
option dhcp-lease-time 1800;
option dhcp-message-type 5;
option domain-name-servers 127.0.0.1;
option dhcp-server-identifier 72.xxx.xxx.xxx;
# По документации следующие строки должны быть
# в обязательном порядке. Время желательно
# выставить как можно большее, чтобы не стало
# просроченным.
renew 2 2037/01/12 00:00:00;
rebind 2 2037/01/12 00:00:00;
expire 2 2037/01/12 00:00:00;
}
Более подробно о других настройках можно прочитать в «man dhclient.conf»

пятница, 13 марта 2009 г.

Простая конфигурация Netflow для сбора данных о трафике в FreeBSD

Чтобы конфигурация netflow загружалась во время запуска системы добавляем в «/etc/rc.local» следующие строки

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

/usr/sbin/ngctl -f - << EOF

mkpeer if0: tee lower left
name if0:lower tee0
connect if0: if0:lower upper right
mkpeer tee0: one2many left2right many0
name tee0:left2right one2many0
connect tee0: one2many0: right2left many1
mkpeer one2many0: netflow one iface0
name one2many0:one netflow
mkpeer netflow: ksocket export inet/dgram/udp
msg netflow: setifindex { iface=0 index=0 }
msg netflow:export connect inet/127.0.0.1:7771

EOF
«if0» меняем на свой интерфейс. Если надо собирать данные с нескольких сетевых интерфейсов, множим блок «/usr/sbin/ngctl -f - << EOF ... EOF» и в каждом дополнительном блоке вместо «if0» вписываем нужный сетевой интерфейс. Так же меняем порядковые номера нодов и значение параметра «iface».
Чтобы загрузились необходимые модули добавляем в файл «/boot/loader.conf»
netgraph_load="YES"
ng_netflow_load="YES"
ng_socket_load="YES"
ng_tee_load="YES"
ng_iface_load="YES"
ng_one2many_load="YES"
ng_ksocket_load="YES"
ng_ether_load="YES"
Следующим шагом ставим коллектор netflow-трафика, прослушивающий порт «7771» по адресу «127.0.0.1».

суббота, 31 января 2009 г.

Настройка PPPoE (ADSL) в FreeBSD

Редактируем файл «/etc/ppp/ppp.conf»:

default:
set log Phase tun command
set ifaddr 10.0.0.1/0 10.0.0.2/0

disable ipv6cp
set speed sync
set mru 1492
set mtu 1492
set ctsrts off

# monitor line quality
enable lqr

adsl:
# Ниже вместо if0 ставим свой интерфейс (ethernet),
# по которому будем соединяться с провайдером.
set device PPPoE:if0
# Данные авторизации
set authname YOUR_NAME
set authkey YOUR_PASSWORD
set dial
set login
add default HISADDR
Проверяем написанное в интерактивном режиме
$ sudo ppp adsl
ppp on machine> set log +debug
ppp ON machine> dial
ppp ON machine>
Ppp ON machine>
PPp ON machine>
PPP ON machine>
При установке соединения с провайдером пользователь будет оповещаться о ходе подключения последовательным изменением регистра трёх букв «p» в консоли «ppp» со строчного на прописной.
Первая прописная буква оповещает о пройденном этапе проверки линии (LCP). Вторая буква — об успешной авторизации. Третья — вашей машине был присвоен IP адрес. Это означает что ваша машина успешно соединилась с сервером провайдера и теперь находится в сети.
Чтобы запустить ppp при загрузке системы необходимо добавить следующие строки в файл «/etc/rc.conf»:
ppp_enable="YES"
# Постоянное соединение. Восстанавливается после обрыва.
ppp_mode="dedicated"
# Если машина - шлюз в локальной сети.
ppp_nat="YES"
ppp_profile="adsl"
Если при попытке установки соединения выдается сообщение «Network is unreachable» закомментируйте приведенную ниже строку в «/etc/ppp/ppp.conf»
set dial
Другая причина ошибки может заключаться в неверном адресе шлюза провайдера.

пятница, 12 сентября 2008 г.

Доступ к серверу, прикрытому неподконтрольным брандмауером.

Вызвался настроить школьный сервер своему другу. В сельскую школу, где он работает, в рамках общероссийской программы провели интернет и там встал вопрос, как проконтролировать сетевую активность новоявленных интернет-пользователей (в лице школьников). Заодно привести в порядок локальную сеть школы.
Под сервер оперативно выделили компьютер. В выборе операционной системы остановились на Ubuntu. Но я, так как находился в километрах двухстах, нуждался в удаленном доступе. Проконсультировал через аську установку ОС и настройку удаленного доступа по ssh. Дальше меня ждал неприятный сюрприз – невозможность прямого соединения с сервером.
Решение было найдено в man-странице ssh. Спасением стали ключ «-R», создающий туннель c порта удаленной машины на локальный порт, и подконтрольный мне сервер («MY»), доступный со школы («SCHOOL»).

  • На «MY» создаем пользователя «user_my» и задаем ему пароль.
На сервере «SCHOOL»
  • Создаем пользователя «user_school» и добавляем его в список пользователей sudo.
  • Устанавливаем openssh-server и screen
    $ sudo aptitude install openssh-server screen
  • Запускаем сервер SSH
    $ sudo /etc/init.d/ssh start
  • В домашней папке нового пользователя создаем скрипт «~/bin/remote-access.sh»
    #!/bin/sh
    screen -d -m -S remote-access -- \
    sh -c 'while true; \
    do ssh -R 2222:localhost:22 -C \
    user_my@my.server.ru; done'
    Сделаем скрипт исполняемым
    $ chmod +x ~/bin/remote-access.sh
    Данный скрипт создаёт фоновую сессию screen и устанавливает ssh-соединение с «MY».
  • Создаем ключ беспарольной аутентификации. Пароль (passphrase) для ключа не задается. Нужен для скрипта «remote-access.sh»
    $ ssh-keygen -b 2048
    Копируем ключ с «SCHOOL» на «MY»
    $ ssh-copy-id user_my@my.server.ru
  • Добавляем задание для cron, чтобы соединение с «MY» устанавливалось сразу после включения «SCHOOL»
    $ crontab -e
    @reboot /home/user_school/bin/remote-access.sh
  • Запустим наш скрипт на «SCHOOL»
    $ /home/user_school/bin/remote-access.sh
    $ screen -ls
    There are screens on:
    5140.remote-access (Detached)
    1 Socket in /var/run/screen/S-user_school.
  • На стороне «MY» должен появиться новый порт
    $ netstat -tln | grep :2222
    tcp 0 0 127.0.0.1:2222 0.0.0.0:* LISTEN
  • Теперь мы можем соединиться с сервером «SCHOOL» по созданному туннелю
    $ ssh -p 2222 user_school@localhost

суббота, 6 сентября 2008 г.

Skystar3: Спутниковый интернет в Ubuntu (hardy)

Описывается настройка спутникового интернета провайдера «Радуга Интернет» через openvpn.

  • После установки спутниковой карты в свободный слот PCI и загрузки ОС создаем файл «/etc/modprobe.d/dvb_core.modprobe»
    options dvb_core dvb_shutdown_timeout=915360000
    Этим мы препятствуем «засыпанию» карты. В новых ядрах, в отличие от старых, установка параметра «dvb_shutdown_timeout» в «0» не помогает и потому надо выставлять заведомо большое значение таймаута (в секундах).
  • Перезагружаем компьютер.
  • Устанавливаем требуемые утилиты
    $ sudo aptitude install dvb-utils
  • Создаем файл «/etc/channels.conf»
    Raduga:11671:v:0:18200:0:0:0
    Здесь:
    • Raduga – название канала. Может быть любым.
    • 11671 – частота
    • v – поляризация. Может быть H – горизонтальная и V – вертикальная
    • 0 – FEC: 0 – Авто, 3 – 3/4,...
    • 18200 – Величина потока (Symbol rate)
    • 0 – Видео PID
    • 0 – Аудио PID
    • 0 – Program id
  • Пробуем залочиться на сигнал
    $ szap -c /etc/channels.conf -x -n 1
    reading channels from file '/etc/channels.conf'
    zapping to 1 'Raduga':
    sat 0, frequency = 11671 MHz V, symbolrate 18200000, vpid = 0, apid = 0

    using '/dev/dvb/adapter0/frontend0' and '/dev/dvb/adapter0/demux0'
    status 07 | signal 9797 | snr 3270 | ber 0000ff00 | unc 00000000 |
    status 1f | signal 9696 | snr d344 | ber 00001800 | unc 00000000 | FE_HAS_LOCK
    Ключевые значения: «status 1f» и «FE_HAS_LOCK». Остальные поля указывают уровень сигнала, количество ошибок и т.п. Когда устойчивый сигнал будет получен, szap завершит свою работу.
  • Теперь отключим rp_filter, фильтрующий пакеты которые не могут уйти через тот же интерфейс что и пришли. В нашем случае пакет приходит через один интерфейс, а уходит через другой
    $ sudo sh -c 'echo 0 > /proc/sys/net/ipv4/conf/dvb0_0/rp_filter'
  • Создаем сетевый интерфейс спутниковой карты
    $ sudo dvbnet -p 1234
    где «1234» - ваш PID. После выполнения команды должен появиться сетевой интерфейс «dvb0_0» (неактивный).
  • Настраиваем интерфейс
    $ sudo ifconfig dvb0_0 hw ether YOUR-MAC-ADDRESS YOUR-IP-ADDRESS netmask 255.255.255.0 up
    где «YOUR-MAC-ADDRESS» и «YOUR-IP-ADDRESS» соответственно MAC-адрес и IP-адрес вашей подписки.
  • Смотрим на наличие входящего трафика на интерфейсе «dvb0_0»
    $ sudo dvbtraffic
    -PID--FREQ-----BANDWIDTH-BANDWIDTH-
    0000 10 p/s 1 kb/s 15 kbit
    0010 0 p/s 0 kb/s 1 kbit
    0011 0 p/s 0 kb/s 1 kbit
    0014 0 p/s 0 kb/s 1 kbit
    0032 60 p/s 11 kb/s 90 kbit
    003c 10 p/s 1 kb/s 15 kbit
    003d 31 p/s 5 kb/s 47 kbit
    0064 13 p/s 2 kb/s 20 kbit
    Если программа ничего не выводит, то проблемы могут быть в неправильных параметрах или «заснула» спутниковая карта.
  • Правим конфигурационный файл «/etc/network/interfaces» и добавляем
    auto dvb0_0
    iface dvb0_0 inet manual
    pre-up sh -c '/usr/bin/dvbnet -a 0 -p 1234 > /dev/null'
    up ifconfig $IFACE hw ether YOUR-MAC-ADDRESS YOUR-IP-ADDRESS netmask 255.255.255.0 up
    up sh -c 'echo 0 > /proc/sys/net/ipv4/conf/dvb0_0/rp_filter'
    up sh -c '/usr/bin/szap -c /etc/channels.conf -n 1 -x'
    down ifconfig $IFACE down
    down /usr/bin/dvbnet -d 0
Теперь приступим к установке и настройке openvpn
  • Установим openvpn
    $ sudo aptitude install openvpn
  • Скачаем из личного кабинета архив с ключами для openvpn. Из архива распакуем файлы ca.crt, client.ovpn, i0xxxxxx.csr, i0xxxxxx.crt, i0xxxxxx.key.
  • Скопируем все эти файлы в директорию «/etc/openvpn».
  • Сменим права доступа к файлу «i0xxxxxx.key»
    $ sudo chmod 0400 /etc/openvpn/i0xxxxxx.key

  • Переименуем файл «client.ovpn» в «raduga.conf» и отредактируем его. В итоге должно получиться примерно такое содержание
    client
    dev tap
    # dev-node Raduga
    proto udp

    remote 80.81.208.66 55032

    resolv-retry infinite
    nobind
    persist-key
    persist-tun

    ca /etc/openvpn/ca.crt
    cert /etc/openvpn/i0xxxxxx.crt
    key /etc/openvpn/i0xxxxxx.key

    ns-cert-type server
    verb 3
    comp-lzo
    comp-noadapt

    auth-user-pass /etc/openvpn/password.txt
    route-up /etc/openvpn/tap0-route.sh
    Создаем файл «/etc/openvpn/password.txt» с именем и паролем подписки
    user
    password
    и делаем его доступным на чтение только владельцу
    $ sudo chmod 0400 /etc/openvpn/password.txt
  • Создаем скрипт «/etc/openvpn/tap0-route.sh», выполняемый после поднятия роутов.
    netstat -rn | \
    sed '1,2d' | \
    awk '{ \
    if ($1 == "0.0.0.0" \
    && $2 == "10.251.32.1" \
    && $3 == "0.0.0.0" \
    && $8 != "tap0") { \
    EX=sprintf("/sbin/route del -net 0.0.0.0/0 gw %s dev %s && /sbin/route add -net 0.0.0.0/0 gw %s dev tap0\n", $2, $8, $2); system(EX); } }'
    В моем случае openvpn дефолтовый маршрут постоянно вешал на интерфейс «dvb0_0» и пришлось прибегнуть к принудительной привязке скриптом роута к «tap0». Делаем скрипт исполняемым
    $ sudo chmod +x /etc/openvpn/tap0-route.sh

  • Редактируем файл «/etc/default/openvpn» и добавляем строку
    AUTOSTART="raduga"
  • Пробуем соединиться к провайдеру из консоли
    $ sudo openvpn /etc/openvpn/raduga.conf
    Если успешно соединились с сервером, закрываем соединение нажатием «ctrl+c».
  • Перезапускаем даемон
    $ sudo /etc/init.d/openvpn restart
Статья писалась по памяти и возможны неточности в описании. Буду признателен если сообщите мне о них.

среда, 3 сентября 2008 г.

Как отключить автоопределение типа сетевого подключения в Ubuntu

Например из-за плохого сетевого кабеля, который весьма затруднительно быстро поменять, после автоопределения типа подключения не удается добиться стабильной работы с сетью. В таких случаях обычно помогает принудительное указание типа.

  1. Узнаем подробности про сетевой интерфейс etho
    $ sudo ethtool eth0
    Settings for eth0:
    Supported ports: [ TP MII ]
    Supported link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 100Mb/s
    Duplex: Half
    Port: MII
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: on
    Supports Wake-on: pumbg
    Wake-on: d
    Current message level: 0x00000001 (1)
    Link detected: yes
  2. Теперь меняем скорость, дуплекс и автоопределение
    $ sudo ethtool -s eth0 speed 10 duplex full autoneg off
  3. Смотрим еще раз состояние eth0
    $ sudo ethtool eth0
    Settings for eth0:
    Supported ports: [ TP MII ]
    Supported link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Supports auto-negotiation: Yes
    Advertised link modes: 10baseT/Half 10baseT/Full
    100baseT/Half 100baseT/Full
    Advertised auto-negotiation: Yes
    Speed: 10Mb/s
    Duplex: Full
    Port: MII
    PHYAD: 1
    Transceiver: internal
    Auto-negotiation: off
    Supports Wake-on: pumbg
    Wake-on: d
    Current message level: 0x00000001 (1)
    Link detected: yes
  4. Если все устраивает редактируем файл конфигурации «/etc/network/interfaces»
    auto eth0
    iface eth0 inet static
    address 192.168.0.7
    netmask 255.255.255.0
    gateway 192.168.0.1
    up /usr/sbin/ethtool -s $IFACE speed 10 duplex full autoneg off
    В случае, если адрес берется по dhcp
    auto eth0
    iface eth0 inet dhcp
    up /usr/sbin/ethtool -s $IFACE speed 10 duplex full autoneg off
  5. Когда на машине используется Xen, сетевые интерфейсы «ethX» становятся виртуальными. Сами физические интерфейсы обозначаются как «pethX».
    Действия, описанные в пунктах 1-3, выполняем с интерфейсом peth0.

    В «/etc/network/interfaces» добавляем
    auto peth0
    iface peth0 inet manual
    up ifconfig $IFACE up
    up /usr/sbin/ethtool -s $IFACE speed 10 duplex full autoneg off

среда, 24 октября 2007 г.

ftp-proxy в freebsd

Дело было ранней зимой. Требовалось обеспечить доступ из интернета к ftp-серверу в локальной сети. Сперва решил тупо перенаправить на него порт 21 и порты выше 1025, но выглядело это не очень красиво.
В результате было решено поднять на шлюзе прокси-сервер для протокола ftp (ftp-proxy - портированный из openbsd вместе с pf) и настроить его для работы в обратную сторону.

Что нужно сделать:
1. Добавить в файл /etc/inetd.conf строку:
ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy -R <local-ftp-server> -S <local-net-if>

где
<local-ftp-server> - ip-адрес внутреннего ftp-сервера,
<local-net-if> - ip-адрес внутреннего интерфейса шлюза.
2. Настроить параметры запуска inetd в /etc/rc.conf:
inetd_enable="YES"
inetd_flags="-wW -c 60 -a 80.xx.yy.zz"

где 80.xx.yy.zz - внешний ip-адрес шлюза.
3. Настроить pf:
rdr on $ext_if proto tcp from any to $ext_ip port ftp tag TRAF_FTP -> 80.xx.yy.zz port 8021
< ... skip ... >
pass in on $ext_if reply-to proto tcp tagged TRAF_FTP flags S/SA keep state
pass out on $ext_if proto tcp from $ext_ip to any flags S/SA user proxy keep state
pass in on $ext_if proto tcp from any to $ext_ip flags S/SA user proxy keep state
pass out on $int_if proto tcp from $int_ip to any flags S/SA user proxy keep state
pass in on $int_if proto tcp from any to $int_ip flags S/SA user proxy keep state
где
$int_if - локальный интерфейс,
$int_ip - ip-адрес локального интерфейса,
$ext_if - внешний интерфейс,
$ext_ip - ip-адрес внешнего интерфейса,
proxy - имя пользователя ftp-proxy.
4. Запустить inetd.
# /etc/rc.d/inetd start

Прокси-сервер может работать в пассивном режиме. Работу в активном режиме не проверял.

P.S. Данные настройки действительны для семейства FreeBSD 6.x

понедельник, 22 октября 2007 г.

Особенности Qemu

День потратил чтобы соединиться из установленной в Qemu windows-машины к vpn-серверу на одноименной платформе. Долго пытался понять почему соединения отваливаются сразу после авторизации.
Оказалось до банального просто. Qemu я запускал от своего имени (не root) с параметром -net user и поэтому наружу могли идти только пакеты протоколов TCP и UDP, а все другие отбрасывались - в том числе пакеты icmp и gre протоколов.
Чтобы преодолеть данное препятствие qemu стал запускать с tap-интерфейсом:
qemu -hda windows-disk.img -cdrom Windows-image.iso \
-net nic,model=rtl8139 -net tap,ifname=tap0,script=qemu-if-1.sh


где qemu-if-1.sh - скрипт настройки tap-интерфейса
$ cat > qemu-if-1.sh
#!/bin/sh
/sbin/ifconfig tap0 inet 10.0.3.1 netmask 255.255.255.0

$ chmod +x qemu-if-1.sh

Qemu следует запускать от имени пользователя root, чтобы поднялся tap-интерфейс. И в нашем случае виртуальную машину надо вручную настроить на ip-адрес из диапазона 10.0.3.0/24, с шлюзом по адресу 10.0.3.1.

Как сетевой карте присвоить другой MAC-адрес?

Иногда над сетевым интерфейсом до его инициализации требуется сделать некоторые операции. Например - присвоить отличный от заводского MAC-адрес.
Поступаем следующим образом:
1. Создаем файл /etc/start_if.if0, где if0 - имя вашего сетевого интерфейса.
# cat >
/etc/start_if.if0
/sbin/ifconfig if0 ether zz:50:yy:x4:d9:xx

# chmod +x
/etc/start_if.if0
2. Перезагружаем машину.

Больше никаких дополнительных действий не требуется. Скрипт будет найден и исполнен без вашего участия.