IPNAT

Столкнулся (достаточно давно) с проблемой - ipnat во FreeBSD хреново работает.

Ну, копался я достаточно долго и прочитал достаточно много материала по данной теме.

Вылилось это вот прямо сюда.

Итак.

###
### Author: Nadz Goldman
###
### Site: http://arviol.ru/
###

uname -a

FreeBSD srv-nat-03.company.ru 6.2-RELEASE FreeBSD 6.2-RELEASE #4: Mon Nov 28 11:44:41 UTC 2011
login@srv-nat-03.company.ru:/usr/src/sys/amd64/compile/NAT amd64


cat /usr/src/sys/amd64/conf/NAT

machine amd64
cpu HAMMER
ident NAT
options IPFIREWALL
options IPFIREWALL_DEFAULT_TO_ACCEPT
options DUMMYNET
options IPFILTER

Правка исходника IPNAT-а вот до такого состояния:


 cat ip_nat.h

...
#undef LARGE_NAT /* define this if you're setting up a system to NAT
* LARGE numbers of networks/hosts - i.e. in the
* hundreds or thousands. In such a case, you should
* also change the RDR_SIZE and NAT_SIZE below to more
* appropriate sizes. The figures below were used for
* a setup with 1000-2000 networks to NAT.
*/
#ifndef NAT_SIZE
# ifdef LARGE_NAT
# define NAT_SIZE 4093
# else
# define NAT_SIZE 4093
# endif
#endif
#ifndef RDR_SIZE
# ifdef LARGE_NAT
# define RDR_SIZE 4093
# else
# define RDR_SIZE 4093
# endif
#endif
#ifndef HOSTMAP_SIZE
# ifdef LARGE_NAT
# define HOSTMAP_SIZE 16383
# else
# define HOSTMAP_SIZE 16383
# endif
#endif
#ifndef NAT_TABLE_MAX
/*
* This is newly introduced and for the sake of "least surprise", the numbers
* present aren't what we'd normally use for creating a proper hash table.
*/
# ifdef LARGE_NAT
# define NAT_TABLE_MAX 300000
# else
# define NAT_TABLE_MAX 300000
# endif
#endif
#ifndef NAT_TABLE_SZ
# ifdef LARGE_NAT
# define NAT_TABLE_SZ 524288
# else
# define NAT_TABLE_SZ 524288
# endif
#endif
#ifndef APR_LABELLEN
#define APR_LABELLEN 16
#endif
#define NAT_HW_CKSUM 0x80000000

#define DEF_NAT_AGE 300 /* 10 minutes (600 seconds) */
...

Собираю ядро, ставлю, но пока не ребутаюсь.

 
cat /etc/rc.conf

defaultrouter="89.223.89.102"
hostname="srv-nat-03.company.ru"
ifconfig_bce0="inet 89.223.89.101 netmask 255.255.255.252"
ifconfig_bce1="inet 10.54.254.10 netmask 255.255.255.252"

background_fsck="YES"
fsck_y_enable="YES"
gateway_enable="YES"


ipnat_enable="YES"
ipnat_program="/sbin/ipnat"
ipnat_rules="/etc/ipnat.rules"
ipnat_flags=""

ipmon_enable="NO"
pf_enable="NO"
pflog_enable="NO"

named_enable="NO"
sendmail_enable="NONE"

background_fsck="YES" - что бы fsck запускался в бэкграунде, а не приходилось бы ждать пока он проверит всё.

ipnat_rules="/etc/ipnat.rules" - где лежат правила для IPNAT-а.



  cat /boot/loader.conf

net.inet.tcp.syncache.hashsize=1024
net.inet.tcp.syncache.bucketlimit=512
net.inet.tcp.tcbhashsize=4096
kern.ipc.nsfbufs=10240





cat /etc/rc.local

/sbin/sysctl net.inet.ip.fw.one_pass=0
/sbin/sysctl -e net.inet.ip.dummynet.hash_size=8192
/sbin/sysctl -e net.inet.ip.fw.dyn_max=16384
/sbin/sysctl -e net.inet.ip.fw.dyn_buckets=16536
/sbin/sysctl kern.ipc.nmbclusters=65536
/sbin/sysctl net.inet.icmp.bmcastecho=0
/sbin/sysctl net.inet.tcp.blackhole=2
/sbin/sysctl net.inet.udp.blackhole=2
/sbin/sysctl net.inet.tcp.nolocaltimewait=1
/sbin/sysctl net.inet.tcp.maxtcptw=40960
/sbin/route add -net 10.0.0.0/8 10.54.254.9

/sbin/ipfw -f flush
/sbin/ipnat -F
/sbin/ipnat -C

/sbin/ipf -D
/sbin/ipf -T ipf_nattable_sz=524288
/sbin/ipf -T fr_tcptimeout=180
/sbin/ipf -T fr_tcpclosewait=60
/sbin/ipf -T fr_tcphalfclosed=7200
/sbin/ipf -T fr_tcpidletimeout=172800
/sbin/ipf -E

/sbin/ipnat -f /etc/ipnat.rules

Как бы всё просто и со вкусом.
Отправляю сервер в ребут и имею счастье.

 arviol.ru, 2006

Докер -- Сильно. Выгодно. Надежно