我有一台 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