Краткое изложение проблемы: несмотря на то, что
Код: Выделить всё
[root@vpnserver /]# sysctl -a | grep forwarding
net.inet.ip.forwarding: 1
Краткая схема сети:
Клиент, с 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
Код: Выделить всё
[root@vpnserver /]# pkg_info | grep vpn
openvpn-2.2.1 Secure IP/Ethernet tunnel daemon
Код: Выделить всё
[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