На шлюзе поднят ng_nat. Работает без вопросов. Возникла необходимость пробросить порт на серый IP-шник. Исходя из man:NGM_NAT_REDIRECT_PORT (redirectport )
Redirect incoming connections arriving to given port(s) to another host and port(s). The following Vt struct ng_nat_redirect_port must be supplied as argument.#define NG_NAT_DESC_LENGTH 64
struct ng_nat_redirect_port {
struct in_addr local_addr;
struct in_addr alias_addr;
struct in_addr remote_addr;
uint16_t local_port;
uint16_t alias_port;
uint16_t remote_port;
uint8_t proto;
char description[NG_NAT_DESC_LENGTH];
};Redirection is assigned an unique ID which is returned as response to this message, and information about redirection added to list of static redirects which later can be retrieved by NGM_NAT_LIST_REDIRECTS message.
пытаюсь сделать следующее:
ngctl msg nat0: redirectport { local_addr=xx.xx.xx.xx alias_addr=xx.xx.xx.xx remote_addr=xx.xx.xx.xx local_port=18884 alias_port=18884 remote_port=18884 proto=tcp descripton="test" }Результат: ngctl: send msg: Function not implemented.
Ради интереса даю: ngctl msg nat0: listredirects
Результат тот же: ngctl: send msg: Function not implemented.
Тогда пробую:
>ngctl msg nat0: nodeinfoRec'd response "nodeinfo" (805306374) from "[11]:":
Args: { name="nat0" type="nat" id=0x11 hooks=2 }Т.е. именно функции специфичные для nat_ng по какой-то причине не доступны. Может кто подскажет, где собака зарыта???
>kldstat
Id Refs Address Size Name
1 15 0xc0400000 90687c kernel
2 1 0xc0d07000 1a04 ng_nat.ko
3 8 0xc0d09000 d3a0 netgraph.ko
4 2 0xc0d17000 9a54 libalias.ko
5 1 0xc0d21000 280c ng_ipfw.ko
6 2 0xc0d24000 ea78 ipfw.ko
7 1 0xc0d33000 6a32c acpi.ko
8 1 0xc1ee2000 4000 logo_saver.ko
9 1 0xc1f15000 5000 ng_netflow.ko
10 1 0xc1f39000 4000 ng_ether.ko
11 1 0xc1f3d000 2000 ng_split.ko
12 1 0xc1f40000 4000 ng_socket.ko
13 1 0xc2247000 5000 ng_ksocket.ko>ngctl list
There are 9 total nodes:
Name: ngctl1468 Type: socket ID: 00000038 Num hooks: 0
Name: nat0 Type: nat ID: 00000011 Num hooks: 2
Name: <unnamed> Type: ksocket ID: 0000000c Num hooks: 1
Name: split0 Type: split ID: 00000009 Num hooks: 3
Name: netflow0 Type: netflow ID: 00000006 Num hooks: 7
Name: ral0 Type: ether ID: 00000004 Num hooks: 0
Name: vr1 Type: ether ID: 00000003 Num hooks: 0
Name: vr0 Type: ether ID: 00000002 Num hooks: 0
Name: ipfw Type: ipfw ID: 00000001 Num hooks: 5
Странно, решил на этой машинке глянуть ман по ng_nat, а там про эту функцию ни слова, да и функций всего три упоминается (setaliasaddr, setmode, settarget). Фря седьмая.
7.0-RELEASE-p6 FreeBSD 7.0-RELEASE-p6 #1: Sun Mar 15 18:33:45 EET 2009
А вроде в седьмой фре в nat_ng форвардинг портов идет сходу, ничего патчить не нужно.... Странно...
Мир что-ли собрать?
Итак, судя по содержимому моего ng_nat.c - ng_nat имеет только 3 мессейджа (никакого форвардинга и близко нет):[/usr/src/sys/netgraph]>vi ng_nat.c
/* List of commands and how to convert arguments to/from ASCII. */
static const struct ng_cmdlist ng_nat_cmdlist[] = {
{
NGM_NAT_COOKIE,
NGM_NAT_SET_IPADDR,
"setaliasaddr",
&ng_parse_ipaddr_type,
NULL
},
{
NGM_NAT_COOKIE,
NGM_NAT_SET_MODE,
"setmode",
&ng_nat_mode_type,
NULL
},
{
NGM_NAT_COOKIE,
NGM_NAT_SET_TARGET,
"settarget",
&ng_parse_ipaddr_type,
NULL
},
{ 0 }
};Вопрос - как заполучить более функциональный nat_ng? Неужели придется перестраивать весь мир??? Ужжасно не хочетя этого делать, т.к. машинка слабая и процесс этот займет уйму времени.
>Вопрос - как заполучить более функциональный nat_ng? Неужели придется перестраивать весь мир???
>Ужжасно не хочетя этого делать, т.к. машинка слабая и процесс этот
>займет уйму времени.Оригинальный патч находится здесь: http://www.antigreen.org/vadim/freebsd/ng_nat, с марта 2008 он с небольшими изменениями закомменчен в 6 и 7 ветки, так что если ядро у тебя более старое - можешь собрать модуль и подсунуть его, но лучше полноценно обновиться.
>лучше полноценно обновиться.Обновил мир. ситуация все та-же.
>uname -a
FreeBSD freepaulshost1.localdomain 7.0-RELEASE-p11 FreeBSD 7.0-RELEASE-p11 #0: Sat Apr 11 10:29:16 EEST 2009 root@freepaulshost1.localdomain:/usr/obj/usr/src/sys/mycore_003 i386
>ngctl msg nat0: listredirects
ngctl: send msg: Function not implemented
бредддд.
Ура! Обновился до FreeBSD 7.1-RELEASE-p4 и portredirect в ng_nat уже присутсвует.
Пишем следующее:
ngctl msg nat0: redirectport { local_addr=xx.xx.xx.xx alias_addr=xx.xx.xx.xx remote_addr=xx.xx.xx.xx local_port=18884 alias_port=18884 remote_port=18884 proto=tcp description="test" }
получаем ошибку о неверном аргументе. Может где-то кавычек доставить? Или...?
Разобрался...Посмотреть активные редиректы (где nat0 - имя ноды типа nat):
ngctl msg nat0: listredirectsУдалить редирект (параметр - id редиректа(в моем случае удаляется редирект с id==8)):
ngctl msg nat0: redirectdelete 8Перенаправить tcp-порт (tcp, т.к. proto==6; local_addr - IP-адрес хоста с серым IP на который необходимо перенаправить; alias_addr - IP-адрес внешний, в который все серые адреса маскарадятся; local_port и alias_port - соответсвенные порты.):
ngctl msg nat0: redirectport { local_addr='192.168.1.1' alias_addr='x.x.x.x' local_port='18884' alias_port='18884' proto=6 }Можно еще указать remote_port и remote_addr, если необходимо форвардить пакеты только от определенного хоста или с определенного порта.
>[оверквотинг удален]
>
>ngctl msg nat0: redirectdelete 8
>
>Перенаправить tcp-порт (tcp, т.к. proto==6; local_addr - IP-адрес хоста с серым IP
>на который необходимо перенаправить; alias_addr - IP-адрес внешний, в который все
>серые адреса маскарадятся; local_port и alias_port - соответсвенные порты.):
>ngctl msg nat0: redirectport { local_addr='192.168.1.1' alias_addr='x.x.x.x' local_port='18884' alias_port='18884' proto=6 }
>
>Можно еще указать remote_port и remote_addr, если необходимо форвардить пакеты только от
>определенного хоста или с определенного порта.А не подскажите как description указывать?
У меня тоже не получается. Хотя адреса и порты без заключения в кавычки принимает.