尝试排除 Mullvad vpn 特定接口上的流量

尝试排除 Mullvad vpn 特定接口上的流量

我有一台 ubuntu 机器,其中一个接口连接到互联网(通过 mullvad)。RPi 盒连接到我的 ubuntu 盒上的另一个以太网接口。如果 mullvad 关闭,连接就可以正常工作,所以现在我试图从 mullvad 排除从 RPi 到互联网的所有流量。

我尝试跟随本指南但到目前为止还没有运气。RPi 连接的接口有 ip 10.0.0.1。RPi 从 ubuntu 接收一个 10.0.0.0/8 范围内的 ip。这是我有的:

table inet excludeTraffic {
 chain allowIncoming {
    type filter hook input priority -100; policy accept;
    ip daddr 10.0.0.1 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
  }

  chain allowOutgoing {
    type route hook output priority -100; policy accept;
    ip saddr 10.0.0.1 ct mark set 0x00000f41 meta mark set 0x6d6f6c65;
  }
}

也许有人可以给我指明正确的方向。非常感谢!

答案1

您需要使用 IPTables 来执行此操作。这是一个示例脚本。

#!/bin/bash

# Define variables
RPi_IP="10.0.0.2"  # Replace with your RPi's IP
Primary_Interface="eth0"  # Replace with your primary internet-facing interface
VPN_Interface="tun0"  # Replace with your Mullvad VPN interface
Default_Gateway="YOUR_DEFAULT_GATEWAY"  # Replace with your default gateway

# Create an IP set for excluded IPs
ipset create exclude_ips hash:ip
ipset add exclude_ips "$RPi_IP"

# Mark outgoing packets from the IP set
iptables -t mangle -A OUTPUT -m set --match-set exclude_ips src -j MARK --set-mark 0x6d6f6c65

# Set up routing
ip rule add fwmark 0x6d6f6c65 table 100
ip route add default via "$Default_Gateway" table 100

# Configure SNAT to maintain connection
iptables -t nat -A POSTROUTING -o "$Primary_Interface" -j MASQUERADE

# Enable IP forwarding
echo "1" > /proc/sys/net/ipv4/ip_forward

# Flush existing rules (optional, use with caution)
# iptables -F
# ipset flush exclude_ips

echo "Excluded traffic from RPi to the internet from the Mullvad VPN."

答案2

对于遇到同样问题的人,这是我阅读了一整天后想出的解决方案:

#!/bin/bash

#define some variables
Primary_Interface="wlp4s0"  # Replace with your primary internet-facing interface
Secondary_Interface="enp0s31f6"  # Replace with your internal interface
Subnet="192.168.9.0/24"

# Configure SNAT to maintain connection
nft add rule ip nat POSTROUTING oifname "$Primary_Interface" counter  masquerade

nft add rule ip filter FORWARD iifname "$Primary_Interface" oifname "$Secondary_Interface" ct state related,established accept
nft add rule ip filter FORWARD iifname "$Secondary_Interface" oifname "$Primary_Interface" accept

#  add a rule to the mullvad's table to allow forwarding of my subnet's packets
nft insert rule inet mullvad forward ip saddr "$Subnet" accept

# set a special mark on packets from and to my subnet for mullvad
nft add rule ip nat PREROUTING ip saddr "$Subnet" ct mark set 0x00000f41 meta mark set 0x6d6f6c65
nft add rule ip nat PREROUTING ip daddr "$Subnet" ct mark set 0x00000f41 meta mark set 0x6d6f6c65

# Enable IP forwarding in kernel
#echo "1" > /proc/sys/net/ipv4/ip_forward

当然,这需要用 来执行sudo

基于 mullvad 自己的教程(每个人都在分享)的解决方案存在问题,即从子网转发的数据包永远不会到达inputoutput挂钩,而是经过preroutingforwardpostrouting。以下是一个漂亮的图表这对我帮助很大。

我的机器上有 Ubuntu,所以这里的语法是nftables而不是iptables

如果您是第一次设置,您可能需要取消注释最后一行。在我的例子中,我已经启用了 IP 转发。

不幸的是,每当我关闭 mullvad 然后再打开时,添加到 mullvad 表的任何内容都会消失。在这种情况下,我需要再次手动添加规则(或将其放在单独的脚本中)。我找不到自动化的方法。

相关内容