我有一台家用 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 规则进行 NATwg0
lan0
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
。
确保您只有一条默认路由,通过 ppp0。
创建第二个路由表,并通过 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
创建策略路由规则来选择该表:
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”(即无-d
或ip daddr
)。
但是,不要忘记也添加针对 IPv6 的等效规则 -ip6 saddr
匹配 nftables,或者ip6tables
为 iptables 添加完全独立的命令。