FreeBSD 8.2: OpenVPN + IPFW - отсутствует роутинг

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
asdf
проходил мимо
Сообщения: 4
Зарегистрирован: 2011-08-31 20:05:51

FreeBSD 8.2: OpenVPN + IPFW - отсутствует роутинг

Непрочитанное сообщение asdf » 2011-08-31 20:35:45

Доброго времени суток. Уже второй день пытаюсь корректно настроить OpenVPN, чтобы через него выходить в интернет.

Краткое изложение проблемы: несмотря на то, что

Код: Выделить всё

[root@vpnserver /]# sysctl -a | grep forwarding
net.inet.ip.forwarding: 1
могу только с клиента достучаться до сервера OpenVPN, но не до всего интернета за этим сервером.

Краткая схема сети:
Клиент, с IP 222.222.222.222 ( для примера ), т.е. не в одной сети с сервером и роутером
Роутер с внешним IP-адресом - 212.212.212.212 ( для примера )
Внутри этот роутер создает сеть 192.168.0.0/24 и в этой сети есть сервер с FreeBSD 8.2 с IP адресом 192.168.0.111, который имеет доступ в интернет, и у которого на 2000 UDP порту висит OpenVPN

Код: Выделить всё

[root@vpnserver /]# uname -a
FreeBSD vpnserver 8.2-RELEASE FreeBSD 8.2-RELEASE #1: Wed Aug 31 15:12:31 SAMST 2011     asdf@vpnserver:/usr/obj/usr/src/sys/VPN_KERNEL  i386
Конфиг ядра:

Код: Выделить всё

makeoptions     DEBUG=-g                # Build kernel with gdb(1) debug symbols

options         SCHED_ULE               # ULE scheduler
options         PREEMPTION              # Enable kernel thread preemption
options         INET                    # InterNETworking
options         INET6                   # IPv6 communications protocols
options         SCTP                    # Stream Control Transmission Protocol
options         FFS                     # Berkeley Fast Filesystem
options         SOFTUPDATES             # Enable FFS soft updates support
options         UFS_ACL                 # Support for access control lists
options         UFS_DIRHASH             # Improve performance on big directories
options         UFS_GJOURNAL            # Enable gjournal-based UFS journaling
options         MD_ROOT                 # MD is a potential root device
options         NFSCLIENT               # Network Filesystem Client
options         NFSSERVER               # Network Filesystem Server
options         NFSLOCKD                # Network Lock Manager
options         NFS_ROOT                # NFS usable as /, requires NFSCLIENT
options         MSDOSFS                 # MSDOS Filesystem
options         CD9660                  # ISO 9660 Filesystem
options         PROCFS                  # Process filesystem (requires PSEUDOFS)
options         PSEUDOFS                # Pseudo-filesystem framework
options         GEOM_PART_GPT           # GUID Partition Tables.
options         GEOM_LABEL              # Provides labelization
options         COMPAT_43TTY            # BSD 4.3 TTY compat (sgtty)
options         COMPAT_FREEBSD4         # Compatible with FreeBSD4
options         COMPAT_FREEBSD5         # Compatible with FreeBSD5
options         COMPAT_FREEBSD6         # Compatible with FreeBSD6
options         COMPAT_FREEBSD7         # Compatible with FreeBSD7
options         SCSI_DELAY=5000         # Delay (in ms) before probing SCSI
options         KTRACE                  # ktrace(1) support
options         STACK                   # stack(9) support
options         SYSVSHM                 # SYSV-style shared memory
options         SYSVMSG                 # SYSV-style message queues
options         SYSVSEM                 # SYSV-style semaphores
options         P1003_1B_SEMAPHORES     # POSIX-style semaphores
options         _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options         PRINTF_BUFR_SIZE=128    # Prevent printf output being interspersed.
options         KBD_INSTALL_CDEV        # install a CDEV entry in /dev
options         HWPMC_HOOKS             # Necessary kernel hooks for hwpmc(4)
options         AUDIT                   # Security event auditing
options         MAC                     # TrustedBSD MAC Framework
options         FLOWTABLE               # per-cpu routing cache
#options        KDTRACE_HOOKS           # Kernel DTrace hooks
options         INCLUDE_CONFIG_FILE     # Include this file in kernel

options         KDB                     # Kernel debugger related code
options         KDB_TRACE               # Print a stack trace for a panic

options IPFIREWALL
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options IPFIREWALL_FORWARD
options IPDIVERT
options DUMMYNET
options IPFIREWALL_DEFAULT_TO_ACCEPT

options         IPFIREWALL_NAT
options         LIBALIAS
options         ROUTETABLES=2
options         HZ="1000"

options         NETGRAPH
options         NETGRAPH_ETHER
options         NETGRAPH_SOCKET
options         NETGRAPH_TEE
#options         NETGRAPH_MPPC_ENCRYPTION
#options         NETGRAPH_MPPC_COMPRESSION
options         NETGRAPH_BPF
options         NETGRAPH_IFACE
options         NETGRAPH_KSOCKET
options         NETGRAPH_PPP
options         NETGRAPH_PPTPGRE
options         NETGRAPH_TCPMSS
options         NETGRAPH_VJC
options         NETGRAPH_ONE2MANY
options         NETGRAPH_RFC1490
options         NETGRAPH_TEE
options         NETGRAPH_TTY
options         NETGRAPH_UI

# To make an SMP kernel, the next two lines are needed
options         SMP                     # Symmetric MultiProcessor Kernel
Далее конфигурационные файлы общие:

Код: Выделить всё

[root@vpnserver /]# cat /etc/rc.conf
ifconfig_em0="inet 192.168.0.111 netmask 255.255.255.0 -rxcsum"
defaultrouter="192.168.0.1"
gateway_enable="YES"
hostname="vpnserver"
keymap="ru.koi8-r"
sshd_enable="YES"

openvpn_enable="YES" # YES or NO
openvpn_if="tun" # driver(s) to load, set to "tun", "tap" or "tun tap"
openvpn_configfile="/usr/local/etc/openvpn/openvpnserver.conf" # --config file
openvpn_dir="/usr/local/etc/openvpn" # --cd directory

firewall_enable="YES"
firewall_script="/etc/rc.ipfw"
firewall_type="OPEN"

dummynet_enable="YES"

natd_enable="YES"
natd_interface="em0"
natd_flags="-f /etc/natd.conf"

[root@vpnserver /]# cat /etc/rc.ipfw
#!/bin/sh
ipfw -q -f flush
cmd="ipfw -q add "
$cmd 00100 pass all from any to any

[root@vpnserver /]# cat /etc/natd.conf
same_ports yes
use_sockets yes
log
dynamic yes
verbose no
port natd
log_ipfw_denied no
proxy_only no
interface tun0
Далее информация по OpenVPN:

Код: Выделить всё

[root@vpnserver /]# pkg_info | grep vpn
openvpn-2.2.1       Secure IP/Ethernet tunnel daemon
И собственно сам конфигурационный файл OpenVPN:

Код: Выделить всё

[root@vpnserver /]# cat /usr/local/etc/openvpn/openvpnserver.conf
port 2000
proto udp
dev tun0
ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/openvpnserver.crt
key /usr/local/etc/openvpn/keys/openvpnserver.key
dh /usr/local/etc/openvpn/keys/dh1024.pem
server 10.10.201.0 255.255.255.0
push "route 10.10.201.0 255.255.255.0"
push "redirect-gateway"
#push "route-gateway 192.168.0.111"
push "dhcp-option DNS 8.8.8.8"

client-config-dir /usr/local/etc/openvpn/ccd
route 10.10.201.0 255.255.255.252
tls-server
tls-auth keys/ta.key 0
tls-timeout 120
auth MD5
cipher BF-CBC
keepalive 10 120
comp-lzo
max-clients 100
user nobody
group nobody
persist-key
persist-tun

status /var/log/openvpn/openvpn-status.log
log /var/log/openvpn/openvpn.log

verb 3

[root@vpnserver /]# cat /usr/local/etc/openvpn/ccd/c2
ifconfig-push 10.10.201.2 10.10.201.1
Конфиг клиента очевиден, и проблема не в клиенте, как мне кажется.

Собственно теперь и описание проблемы:
К OpenVPN подключается клиент успешно, получает свой адрес 10.10.201.2 и видит как и 10.10.201.1 так и 192.168.0.111, при этом он не видит уже 192.168.0.1

При пинге любого внешнего Ip с клиента на сервер tcpdump показывает, что пакеты сервер получает

На клиенте(Windows 7) при подключении появляется правильный маршрут:

Код: Выделить всё

> print route 
.......
    IP            MASK          gateway          interface            metric
0.0.0.0     0.0.0.0      10.10.201.1     10.10.201.2              20
Т.е. клиент посылает свои пакеты серверу, но сервер не понимает что с ними делать и куда дальше перенаправлять, как это я вижу.
Собственно вопрос в том, как заставить сервер перебрасывать пакеты с tun0 на em0 и обратно.

Код: Выделить всё

[root@vpnserver /]# ifconfig
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=2098<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC>
        ether 00:30:48:2d:02:3a
        inet 192.168.0.111 netmask 0xffffff00 broadcast 192.168.0.255
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
em1: flags=8802<BROADCAST,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC>
        ether 00:30:48:2d:02:3b
        media: Ethernet autoselect
        status: no carrier
ipfw0: flags=8801<UP,SIMPLEX,MULTICAST> metric 0 mtu 65536
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=3<RXCSUM,TXCSUM>
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x4
        inet6 ::1 prefixlen 128
        inet 127.0.0.1 netmask 0xff000000
        nd6 options=3<PERFORMNUD,ACCEPT_RTADV>
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        inet 10.10.201.1 --> 10.10.201.2 netmask 0xffffffff
        Opened by PID 929
Прочитал кучу доки, но в голове это не прояснилось. Спасибо!

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

snorlov
подполковник
Сообщения: 3924
Зарегистрирован: 2008-09-04 11:51:25
Откуда: Санкт-Петербург

Re: FreeBSD 8.2: OpenVPN + IPFW - отсутствует роутинг

Непрочитанное сообщение snorlov » 2011-08-31 23:15:11

Для начала выберите что-нибудь одно или ядерный nat (options IPFIREWALL_NAT) или демон natd

asdf
проходил мимо
Сообщения: 4
Зарегистрирован: 2011-08-31 20:05:51

Re: FreeBSD 8.2: OpenVPN + IPFW - отсутствует роутинг

Непрочитанное сообщение asdf » 2011-09-01 11:26:29

Snorlov, спасибо большое.
Сначала пробовал чисто с ядерным, но проблема в том, что я концептуально не понимаю что именно не так настроено.
Т.е. на каком из этапов обработки пакета происходит ошибка :(

asdf
проходил мимо
Сообщения: 4
Зарегистрирован: 2011-08-31 20:05:51

Re: FreeBSD 8.2: OpenVPN + IPFW - отсутствует роутинг

Непрочитанное сообщение asdf » 2011-09-06 16:07:35

Подскажите, пожалуйста, где можно прочитать про такого рода настройки, когда надо пакеты с одного интерфейса форвардить на другой в FreeBSD, т.е. когда машина выступать как роутер.
ПС. net.inet.ip.forwarding: 1 - и это действительно так, но не работает, к сожалению :(
Спасибо!

asdf
проходил мимо
Сообщения: 4
Зарегистрирован: 2011-08-31 20:05:51

Re: FreeBSD 8.2: OpenVPN + IPFW - отсутствует роутинг

Непрочитанное сообщение asdf » 2011-09-08 13:30:00

В итоге снес IPFW + NAT и сделал всё через PF

Код: Выделить всё

[root@vpnserver ~]# cat /etc/pf.conf
nat pass on em0 from 10.10.201.0/24 to any -> 192.168.0.111
pass in all
pass out all
И этого полностью хватило для решения задачи.
Не подскажете, как на IPFW надо было ее решать?