网络新手。我在主机上有两个接口:eth0
以及tun0
我的 OpenVPN 客户端。IP 地址是:
eth0 192.168.1.22
tun0 10.1.0.8
问题 1
为了传出通过将目标地址更改为该地址来限制流量,tun0
是否会强制其使用 vpn?
不可以,但是使用 tun0 的网关地址可以。 已通过以下测试:
iptables -t nat -N VPN
iptables -t nat -I OUTPUT -j VPN
iptables -t nat -A VPN -p tcp -j DNAT --to-destination 10.1.0.170
10.1.0.170
VPN 的网关地址在哪里(使用 找到ip route
)。
- 上面的例子
-N
为 nat 表 (-t
) 创建了一个 NEW () 链。 - 跳转到 VPN 链来自
OUT
(紧接着本地应用程序)。使用插入(-I
)取代 OUT 中的其他规则。 - 这意味着来自任何源的流量都会将目的地更改为
tun0
设备网关。
问题 2(a)
对于出站流量,目标地址是接口的 IP 地址eth0
还是网关地址?假设eth0
是默认接口/网关。
问题 2(b)
对于本地应用程序生成的流量,源地址是什么?
问题 3
这个问题能仅通过 iptables 解决吗?还是我需要修改路由表?因为两个接口都在同一台主机上(即同一个 debian 机器)。
附加信息
我正在尝试理解这些原则,以便将其应用于我的情况。总共有三个 I 地址子网,第三个子网位于与另一个虚拟接口关联的 172.17.42.1/16 范围内docker0
。
本质上我想引导来自只是172.17.42.8 通过 VPN。
答案1
首先,ArchLinux wiki iptables 页面链接的优秀图表有助于识别通过各种iptables
链的数据包流(在答案的底部)。
备份
iptables-save > back.up.file
检查您的 Linux 发行版的风格,我需要添加,sudo
因为我不是 root。
问题 2(a)、2(b)
为了确定源地址和目标地址,我发现LOG
和TRACE
函数非常有用:
iptables -t filter -I OUTPUT -m limit --limit 5/m --limit-burst 10 -j LOG --log-prefix "ABC-LOG-PREFIX "
默认表是,filter
但我已经明确说明了,以便您可以看到语法,特别是如果您想探索其他表等mangle
。nat
我插入了规则,-I
因为我想在应用其他规则之前记录数据包。添加了速率限制,以便日志文件不会饱和-m limit --limit 5/m --limit-burst 10
。最后添加了前缀,以便可以轻松搜索日志文件--log-prefix
。例如,在 Linux Mint 上:
cat /var/log/kern.log | grep "ABC-LOG-PREFIX"
其次为了调试,该TRACE
命令将跟踪数据包的整个过程:
IPTABLES -t raw -A PREROUTING -p tcp -j TRACE
警告,这将追踪全部tcp 数据包,更多信息请参见柏林行政
问题 3
由于两个接口(eth0
和)都在同一台主机上,从下面的数据包过滤器图中可以看到,对于出站流量,它们从同一点开始。数据包采用的路由由默认网关及其关联接口决定,可以通过运行以下命令tun0
确定:iproute2
ip route
这将显示默认网关,哪些接口用于哪些地址范围。
数据包流图
答案2
据我所知,您正在谈论分割隧道(或者更确切地说,试图禁用它)。
看一下 OpenVPN 中的重定向网关指令:https://openvpn.net/index.php/open-source/documentation/howto.html#redirect
答案3
在以下示例中,vpn 设备名称为 tun0(OpenVPN),VPN 网关为 172.21.23.172
#1 - 在你的 Linux 路由器上安装 VPN(我使用的是 ipvanish w. openvpn)
#2 - 使用 iptables 路由流量
sudo iptables -t nat -A POSTROUTING -o [VPN dev] -j MASQUERADE
例子:
sudo iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
#3 - 配置路由表(确保所有流量都通过 VPN 路由)
sudo ip route add default via [VPN ipv4 address] dev [VPN dev]
例子:
sudo ip route add default via 172.21.23.172 dev tun0
#4 - 通过运行以下命令检查网络上的设备确实通过 VPN 进行路由:
Windows:tracert 1.1.1.1
Linux:traceroute 1.1.1.1
你完成了!