Собственно сам запуск нескольких natd не представляет собой проблемы. Интересует restart отдельного natd демона. Устал вручную искать PID-демона, потом убивать его, ждать завершение процесса и снова запускать… Написал свой скрипт запуска.

Из-за плохого знания shell’а потратил первую половину рабочего времени, за то не зря :). Так что советую почитать о awk и grep.
Оказалось все очень просто. Читаем Основы написания rc.d скриптов в BSD и пишем свое. :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/sh


# PROVIDE: natd
# REQUIRE: DAEMON
# BEFORE: LOGIN
# KEYWORD: shutdown

. /etc/rc.subr
. /etc/network.subr

#name=$(basename "$0")
name='natd_inet'
rcvar=`set_rcvar`

eval "${rcvar}=${${rcvar}:-'NO'}"
command="/sbin/natd"
pidfile="/var/run/${name}.pid"
tmpfile="/tmp/${name}.tmp"


start_postcmd="natd_poststart"
stop_postcmd="natd_poststop"
load_rc_config $name

natd_poststart()
{
    `/bin/ps ax|/usr/bin/grep /sbin/natd|/usr/bin/grep ${name}.conf >${tmpfile}`
    `/usr/bin/awk '{printf  $1;}' ${tmpfile} > ${pidfile} `
    `/bin/unlink ${tmpfile}`
}
natd_poststop()
{
    `/bin/unlink ${pidfile}`
}

run_rc_command "$1"

Использование
Мне, например, нужно натить интернет и две сетки, которые заведены на мой сервер.
Создаю и редактирую под себя конфиги: natd_inet.conf, natd_lan1.conf,natd_lan2.conf
Добавляем в rc.conf

1
2
3
4
5
6
7
8
natd_inet_enable="YES"
natd_inet_flags="-f /usr/local/etc/natd/natd_inet.conf"

natd_lan1_enable="YES"
natd_lan1_flags="-f /usr/local/etc/natd/natd_lan1.conf"

natd_lan2_enable="YES"
natd_lan2_flags="-f /usr/local/etc/natd/natd_lan2.conf"

Далее копируем наш скрипт в /usr/local/etc/rc.d/ и выполняем следующее

1
2
3
4
# cd /usr/local/etc/rc.d/
# cp natd natd_inet
# cp natd natd_lan1
# cp natd natd_lan2

Редактируем переменную name для каждого скрипта запуска(пробовал сделать через name=$(basename “$0″), но почемуто ничего не получилось…). Для natd_lan1 в скрипте будет

1
2
3
...
name='nat_lan1'
...

Теперь для каждого NATD можно применить start,stop,restart, например

1
2
3
4
5
6
7
8
9
10
11
12
[root@admin /]# /usr/local/etc/rc.d/natd_lan1 restart
Stopping natd_lan1.
Waiting for PIDS: 21770, 21770, 21770, 21770, 21770.
Starting natd_lan1.
Loading /lib/libalias_cuseeme.so
Loading /lib/libalias_ftp.so
Loading /lib/libalias_irc.so
Loading /lib/libalias_nbt.so
Loading /lib/libalias_pptp.so
Loading /lib/libalias_skinny.so
Loading /lib/libalias_smedia.so
[root@admin /]#

Еще приведу пример конфига для НАТа

1
2
3
4
5
6
7
8
9
10
11
12
13
interface ng0 # название сетевого интерфейса
unregistered_only yes # Изменять только исходящие пакеты,
#с частными адресами источника. Частные IP-адреса
#определяются RFC 1918 и к ним относятся 10.0.0.0/8,
#172.16.0.0./12 и 192.168.0.0/16
same_ports
port 6889

# пример проброса порта(для торента например)
redirect_port tcp 192.168.0.100:27282 27282
redirect_port udp 192.168.0.100:27282 27282

dynamic

Нравится эта статья? Подпишитесь на RSS-ленту и получите еще больше классной информации!