Linux 路由器的基于地址的路由策略?

Linux 路由器的基于地址的路由策略?

我有一台家用 Linux 路由器,它通过 IPv4/v6 连接到互联网,我在其上ppp0运行了 wireguard VPN 。它的内部 NIC 接口是(192.168.100.1/24,fd42:100::1/120),连接到家庭网络。我运行 dnsmasq (192.168.100.1:53) 作为 DHCP/DNS 服务器。我使用这些 iptables 规则进行 NATwg0lan0

iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i lan0 -o ppp0 -j ACCEPT
iptables -t mangle -A FORWARD -o ppp0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

现在我想将笔记本电脑(192.168.100.123,fd42:100::123)和 android(192.168.100.124,fd42:100::124)的所有网络流量转发到wg0,并将其他设备转发到ppp0,该怎么做? ipv4/v6。

另外,我想将 2 台设备的 DNS 请求从 192.168.100.1:53 重定向到 192.168.100.1:5300,其他设备仍转到 192.168.100.1:53。该怎么做?

甚至,我希望透明地将 2 台设备的所有 DNS 请求(udp 和 tcp 端口 53)重定向到任何 DNS 服务器,到 192.168.100.1:5300,因为有些应用程序自己会发出 DNS 请求。该怎么做?

答案1

现在我想将笔记本电脑(192.168.100.123,fd42:100::123)和 android(192.168.100.124,fd42:100::124)的所有网络流量转发到 wg0,并将其他设备转发到 ppp0,该怎么做? 两者都是 ipv4/v6。

对于 IPv4 和 IPv6 – 设置策略路由使用ip rule

  1. 确保您只有一条默认路由,通过 ppp0。

  2. 创建第二个路由表,并通过 wg0 拥有自己的默认路由。如果您使用 wg-quick 或 systemd-networkd,它们可以使用以下选项为您执行此Table=操作:

    [Interface]
    Table = 42
    
    [Peer]
    # wg-quick will generate routes from all peers' AllowedIPs
    Endpoint = <your_server>
    AllowedIPs = 0.0.0.0/0, ::/0
    

    手动操作如下(例如在 PostUp 中):

    ip -4 route add default dev wg0 table 42
    ip -6 route add default dev wg0 table 42
    
  3. 创建策略路由规则来选择该表:

    ip -4 rule add pref 500 from 192.168.100.123/31 lookup 42
    ip -6 rule add pref 500 from fd42:100::123/128 lookup 42
    

(您还可以创建与 TCP/UDP 端口或 iptables/nft 数据包标记匹配的策略规则。)

注意:如果您有多个 LAN 子网(“主”表中有一堆本地路由),请注意策略规则也会覆盖这些子网 - 阻止笔记本电脑访问其他 LAN 子网。要解决这个问题,您需要将所有路由复制到新表中,或者使用更高优先级的规则来查找所有内容默认路由:

ip -4 rule add pref 100 to 192.168.0.0/24 lookup main
-or-
ip -4 rule add pref 100 lookup main suppress_prefixlength 0

另外,我想将 2 台设备的 DNS 请求从 192.168.100.1:53 重定向到 192.168.100.1:5300,其他设备仍转到 192.168.100.1:53。该怎么做?

创建 iptables 或 nft DNAT 规则(与其他地方记录的“端口转发”规则非常相似)。如果重定向到规则所在的同一系统,您也可以使用执行相同操作的 iptables REDIRECT 规则。

chain prerouting {
    ip saddr {192.168.100.123, 192.168.100.124} ip daddr 192.168.100.1 jump {
        tcp dport 53 dnat to 192.168.100.1:5300
        udp dport 53 dnat to 192.168.100.1:5300
    }
    # Repeat with: ip6 saddr ... ip6 daddr ...
}

iptables:

-s 192.168.100.123 -d 192.168.100.1 -p tcp --dport 53 -j REDIRECT ...
-s 192.168.100.123 -d 192.168.100.1 -p udp --dport 53 -j REDIRECT ...

(您需要 TCP 53 规则UDP 53,因为 DNS 两者都使用。)

甚至,我希望透明地将 2 台设备的所有 DNS 请求(udp 和 tcp 端口 53)重定向到任何 DNS 服务器,到 192.168.100.1:5300,因为有些应用程序自己会发出 DNS 请求。该怎么做?

与上面相同,但从规则中省略“目标 IP”(即无-dip daddr)。

但是,不要忘记也添加针对 IPv6 的等效规则 -ip6 saddr匹配 nftables,或者ip6tables为 iptables 添加完全独立的命令。

相关内容