简而言之,问题是:如何使用路由器后面的 NAT 获取内部网络上的主机的流量,以使用在路由器上设置的 VPN 连接?
我有一台 FreeBSD 9 路由器,有 4 个网络接口。一个外部接口连接到我的 ISP,其他接口连接到内部子网。内部接口使用 NAT(由 pf 提供)连接到外部世界。
现在,我想让来自某个子网上的主机的所有流量都使用在 FreeBSD 机器上设置的 PPTP VPN 连接。最终结果是内部网络上的主机使用 VPN,而无需在主机本身上使用 VPN 客户端。
我已成功使用 mpd5 设置 VPN 客户端。使用 mpd5 从路由器连接到 VPN 服务器后,我获得了一个带有 IP 地址的新网络接口 — ng0。
我的问题是我不知道接下来该去哪里。这里只有一个带 IP 地址的接口 (ng0)。如何让来自内部 NATed 网络的流量使用 VPN 连接?
如果您想回答或为我指明正确的方向,您可以先假设我对 VPN、路由、NAT 或 pf 一无所知或不了解——显然我几乎不了解。(从哪里到哪里添加路由?添加 pf 规则对传入和传出数据包做什么?等等)
配置
这是从路由器连接到 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
答案1
这里的关键问题是“您尝试过 VPN 了吗?”一切似乎都很好。如果您的 FreeBSD 盒已经可以路由到 VPN 的远程端,那么您的工作就差不多完成了。这意味着连接有效,并且它知道到远程网络的路由。
路由器后面的主机不需要任何更改即可“通过 VPN”进行通信。如果将路由器设置为默认网关,则所有到远程网络(包括 VPN 另一端)的流量都应通过路由器,正如我们所说,路由器已经知道适当的路由。如果您想非常明确,请在相关主机的路由表中添加静态路由,以确保它知道到 VPN 远端的正确路由。
答案2
要检查您的 VPN 是否按预期工作,您可以先从 FreeBSD 盒中 ping 一下 VPN 隧道的另一端。
ping 98.158.118.1
确定 VPN 没问题后,主要问题就是将来自内部接口的所有流量“路由”到 gn0 接口,并在此接口上执行 NAT。您不能通过简单地修改默认路由器来做到这一点,否则您会自食其果,因为 VPN 需要其数据包通过您的 ISP 进行路由 ;)
这里的单词是“转移“,但据我所知(见“PF 是否支持像 IPFW 那样的转移?“),目前的 FreeBSD “pf” 端口不支持此功能(此端口始终比 OpenBSD “pf” 旧,因为它是原始端口)。也许将来……
这里有一些提示寻找一个解决方案,这意味着你从“pf”更改为“防火墙“ 支持 ”转移“:
- 阅读FreeBSD 官方 ipfw 文档,因为这是下一步的一个良好开端。
- 使用“ipfw”和“divert”启用重建内核(“ipfw”文档第 31.6.2 章)
启用“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”守护进程配置非常简单,主要用于设置端口转发。
我没有检查所有内容,特别是您有 3 个 NAT 接口,但我使用“ipfw”作为我自己的 FreeBSD 路由盒,并且过去我做过一些 VPN 转移。
享受 !
答案3
我不知道 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