我有一台 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 自己的教程(每个人都在分享)的解决方案存在问题,即从子网转发的数据包永远不会到达input
或output
挂钩,而是经过prerouting
,forward
和postrouting
。以下是一个漂亮的图表这对我帮助很大。
我的机器上有 Ubuntu,所以这里的语法是nftables
而不是iptables
。
如果您是第一次设置,您可能需要取消注释最后一行。在我的例子中,我已经启用了 IP 转发。
不幸的是,每当我关闭 mullvad 然后再打开时,添加到 mullvad 表的任何内容都会消失。在这种情况下,我需要再次手动添加规则(或将其放在单独的脚本中)。我找不到自动化的方法。