运行 Ubuntu 14.04 LTS。我需要连接到非本地的 SMB 共享。我连接到它的唯一方法是通过 VPN。特定的 VPN 服务是 Juniper。连接到 VPN 很容易,而且已经完成了。它创建了一个隧道,显示在 中/etc/network/interfaces
。
那么,如何通过 VPN 仅将 SMB 流量发送到此特定服务器。 可以吗?
不幸的是,我无法实现任何其他协议,因为这超出了我的控制范围。
答案1
假设,对于您的 Linux 机器:
- SMB 客户端连接将从 Linux 机器本身启动(换句话说:你的 Linux 机器是不是充当本地 LAN 流量的路由器);
- VPN 接口是“tun0",使用本地 IP <本地VPNIP> 以及远程 P2P IP <远程 VPN P2P IP>;
- 通过 VPN 访问的远程 SMB 服务器是 <远程 SMB 服务器> (主机名或 IP);
通过 VPN 路由 SMB 流量(并且只有它......)的更好方法可能是:
a) 使用 netfilter/iptables 用标识符 (例如:1) “破坏”传出的 SMB 数据包;
b) 指示路由过程对 ID 为“1”的“mangled”数据包进行路由,使其与其他数据包不同,特别是通过 VPN。
以下命令应该可以给你一个想法(请注意,我在没有严格检查的情况下编写了它们):
# Let's MARK outgoing SMB traffic towards remote_SMB_SERVER with id: "1"
iptables -A OUTPUT -t mangle -d <remote_SMB_SERVER> --dport 137 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -d <remote_SMB_SERVER> --dport 138 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -d <remote_SMB_SERVER> --dport 139 -j MARK --set-mark 1
iptables -A OUTPUT -t mangle -d <remote_SMB_SERVER> --dport 445 -j MARK --set-mark 1
# Let's create a routing table to be used for above MARKed packets:
echo 201 smb.out >> /etc/iproute2/rt_tables
ip rule add fwmark 1 table smb.out
# Let's add a route entry to properly forward MARKed SMB packets through
# the smb.out routing table
/sbin/ip route add -host <remote_SMB_SERVER> via <remote_VPN_P2P_IP> dev tun0 table smb.out
如需进一步了解详细信息,请参阅详尽的 LARTC HOWTO [http://www.lartc.org/howto/lartc.netfilter.html
附注:
- 请注意,/etc/network/interfaces 文件包含网络接口的配置数据,并且不是当您的 VPN 连接定义/启动适当的接口时得到更新;
- 我想知道为什么您只想通过 VPN 路由 remote_SMB_SERVER 的“仅”SMB 流量……而不是其余的(例如:HTTP 或 SMTP,也路由到 remote_SMB_SERVER)。
(顺便说一句:请友善地回答这个问题,因为这是我在 ServerFault/StackExchange 领域的第二个答案)