问题简介:如何从内部networking上的主机(使用路由器后面的NAT)获取stream量来使用路由器上build立的VPN连接?
我有一个带有4个networking接口的FreeBSD 9路由器。 一个外部连接到我的ISP,其他连接到内部子网。 内部接口使用NAT(通过pf)连接到外部世界。
现在,我希望来自其中一个子网的主机的所有stream量都使用在FreeBSD机器上build立的PPTP VPN连接。 最终的结果是内部networking上的主机使用VPN,而不必在主机上使用VPN客户端。
我设法用mpd5设置了VPN客户端。 使用mpd5从路由器连接到VPN服务器,我得到一个新的networking接口 – ng0 – 带有一个IP地址。
我的问题是,我不知道从哪里去。 只有一个接口(ng0)和一个IP地址。 如何使来自内部的NAT,networking使用VPN连接的stream量?
如果你正在试图回答或指引我正确的方向,你可以从假设我不知道或了解任何关于VPN,路由,NAT或pf的事情开始 – 这显然几乎没有。 (添加一个从哪里到哪里的路由?添加pf规则,对input和输出的数据包做什么等等)
这是从路由器连接到VPN服务器之后。

我的/etc/pf.conf:
ext_if = "em0" local_if = "em1" wifi_if = "em2" misc_if = "em3" localnet = "{" $local_if:network $wifi_if:network $misc_if:network "}" nat on $ext_if from $localnet to any -> ($ext_if) pass in all pass out all keep state
路由表:
Destination Gateway Flags Refs Use Netif Expire default 188.60.52.1 UGS 0 998893 em0 10.0.1.0/24 link#10 U 0 159240 em1 10.0.1.1 link#10 UHS 0 358 lo0 10.0.2.0/24 link#11 U 0 503719 em2 10.0.2.1 link#11 UHS 0 0 lo0 10.0.3.0/24 link#12 U 0 3773731 em3 10.0.3.1 link#12 UHS 0 0 lo0 98.158.118.1 link#15 UH 0 0 ng0 98.158.118.63 link#15 UHS 0 0 lo0 127.0.0.1 link#13 UH 0 0 lo0 188.60.52.0/22 link#9 U 0 0 em0 188.60.55.17 link#9 UHS 0 0 lo0
要连接到VPN服务器,我在/usr/local/etc/mpd/mpd.conf中有这个:
strongvpn: create bundle static B1 set bundle yes compression set ipcp ranges 0.0.0.0/0 0.0.0.0/0 set ccp yes mppc set mppc yes e128 set mppc yes stateless # Not using these yet, as I don't know what to put in them ... #set iface up-script /usr/local/etc/mpd5/ip-up.sh #set iface down-script /usr/local/etc/mpd5/ip-down.sh create link static L1 pptp set link action bundle B1 set auth authname XXXXXXXXX set auth password XXXXXXXXX set link max-redial 0 set link mtu 1460 set link keep-alive 20 75 set pptp peer 98.158.112.17 set pptp disable windowing open
这里的关键问题是,“您是否尝试过VPN? 一切似乎都很好。 如果你的FreeBSD服务器已经可以连接到VPN的远端,那你的工作已经快完成了。 这意味着连接是有效的并且知道到远程networking的路由。
路由器后面的主机根本不需要任何改变来“通过VPN”进行通信。 如果将路由器设置为其默认网关,那么到远程networking(包括VPN的另一侧)的所有通信应该通过路由器,正如我们所述,路由器已经知道适当的路由。 如果你想要非常明确的话,可以在有问题的主机的路由表中添加一条静态路由,以确保它知道到VPN远程端的正确路由。
要检查您的VPN是否按预期工作,您可以从您的FreeBSD框中ping通VPN隧道的另一端。
ping 98.158.118.1
一旦你确定你的VPN是好的,主要的问题是把所有来自内部接口的stream量“路由”到gn0接口,并在这个接口上做NAT。 你不能通过简单地修改默认路由器来完成这项工作,否则你就会把你甩在脚下,因为VPN要求它的数据包通过你的ISP路由;)
这里的词是“ 转移 ”,但据我所知(参见“ PF支持是否转换为IPFW? ”),目前FreeBSD的“pf”端口不支持这个端口(这个端口总是比OpenBSD更早)“pf “,原来是这样)。 也许在将来 …
下面是一些解决scheme的提示 ,暗示你从“pf”改为“ ipfw ”,它支持“ 转移 ”:
启用“ipfw”并从“/etc/rc.conf”文件中设置“natd”输出接口:
firewall_enable="YES" firewall_script="/etc/rc.firewall-myown" natd_enable="YES" natd_flags="-f /etc/natd.conf" natd_interface="ng0"
编写你自己的“/etc/rc.firewall-myown”(你可以使用默认的“/etc/rc.firewall”作为起点):
ipfw -f flush ipfw add 10002 divert natd all from any to any via em2 ipfw add 10003 divert natd all from any to any via em3 ipfw add 10004 divert natd all from any to any via em4
“natd”守护进程configuration非常简单,主要用于设置端口转发。
我没有检查所有的东西,特别是你有3个NAT接口的事实,但是我使用“ipfw”作为我自己的FreeBSD路由select框,而且我过去做了一些VPN转移。
请享用 !
我不知道FreeBSD是否有ip命令,但是最喜欢的是类似的东西来完成这个。
# create special routing table echo 7 special >> /etc/iproute2/rt_tables # add default route for special table ip route add table special default via 98.158.118.1 # see special table ip route show table special # add source based routing rule ip rule add from 10.0.1.10/32 table special # + add your nat rules unless the other end knows how to route back # to your 10.0.1.0/24 network
@see ip层networkingpipe理员指南(linux)