Linux:桥接两个 NIC,并通过 VPN 隧道路由流量(特定目的地和端口除外)

Linux:桥接两个 NIC,并通过 VPN 隧道路由流量(特定目的地和端口除外)

我有一台 Linux PC(Debian Wheezy),配有两个以太网适配器。适配器eth0已连接到互联网(调制解调器/路由器/DHCP/防火墙)并且eth1连接到 WiFi 接入点。所有其他计算机都使用 WiFi 并连接到该 AP。

我想配置网络,以便来自 AP 后面的客户端的所有流量都通过 OpenVPN 隧道传输tun0。但是,我需要端口 587 和 IP 范围 192.168.0.0/16 和 10.0.0.0/24 始终通过eth0

我尝试使用 iptables 构建一些东西,但收效甚微。出于某种原因,任何地方都没有记录任何内容,所以我不知道如何开始调试。说实话,我甚至不确定自己在做什么。英语也不是我的母语,所以阅读文档很困难。

以下是我现在的情况。有好心人能告诉我我做错了什么吗?这是一种错误的方法吗?

sysctl -w net.ipv4.conf.tun0.rp_filter=2
iptables -F
iptables -X LOGDROP
iptables -t mangle -F

iptables -N LOGDROP
iptables -A LOGDROP -m limit --limit 5/m --limit-burst 10 -j LOG
iptables -A LOGDROP -j DROP

iptables -A PREROUTING -t mangle -i eth0 -d 192.168.0.0/16 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth0 -d 10.0.0.0/24 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 587 -j MARK --set-mark 1
iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 2

iptables -I FORWARD -m state --state INVALID -j LOGDROP
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A FORWARD -m mark --mark 1 --in-interface eth1 --out-interface eth0 -j ACCEPT
iptables -A FORWARD -m mark --mark 2 --in-interface eth1 --out-interface tun0 -j ACCEPT

iptables -A FORWARD --in-interface eth0 --out-interface eth1 -d 192.168.0.0/16 -j ACCEPT
iptables -A FORWARD --in-interface eth0 --out-interface eth1 -d 10.0.0.0/24 -j ACCEPT

iptables -A FORWARD -j LOGDROP

答案1

您关于使用防火墙标记数据包的说法是正确的,但您不应该在该级别对它们进行路由 - 请使用多个路由表。

首先,设置主路由表,以便它通过以下方式路由eth0

ip route add default via XXXX dev eth0

隧道建立后,设置通过以下方式路由的辅助路由表tun0

ip route add default via YYYY dev tun0 table 42

现在标记发往以下目的地的数据包tun0

iptables -t mange -A PREROUTING ... --set-mark 54

并设置路由规则,以便标记的数据包通过表 42:

ip rule add priority 100 fwmark 54 table 42

为了确保eth0隧道关闭时数据包不会通过,您可以选择添加较低优先级的规则,以丢弃任何无法通过表 42 路由的标记数据包:

ip rule add priority 110 fwmark 54 table default

相关内容