.png)
我有一个基于 Linux 的路由器,并设置了一个 VPN 客户端,以根据 iptables 命令通过 VPN 和 isp 路由流量,我试图仅通过 VPN 路由特定的 tcp 和所有 udp 端口,并使用 tcpdump 进行验证,但我似乎无法得到它在这里工作是我一直在使用的代码
iptables -t mangle -A PREROUTING -i br0 -p tcp -m multiport --dport ! 20,21,22,80,81,443,8080 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -i br0 -p udp -j MARK --set-mark 2
其中“2”是 VPN 表(在我的例子中是表 10),“1”是 ISP 表(表 100)
该脚本具有其他与路由相关的功能,可以正常工作以将特定 IP 移动到 VPN 和终止开关
这个概念是我试图在路由器本身(内部“lan”192.168.1.1)上运行Torrent客户端,并且我希望上面未列出的所有udp和每个tcp端口都使用VPN,而其余的则通过isp
我被告知我可能还需要使用“输入输出”和“转发”选项,但尽管阅读了内容,我似乎无法正确路由端口,我的脚本要么最终挂起并使路由器崩溃,要么最终完全没有流量通过 VPN 或 ISP 连接到互联网
这是我的脚本,没有端口部分,因为我出于沮丧而将其删除
#!/bin/sh
main() {
for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do
echo 0 > $i
done
ip route flush table 100
ip rule del fwmark 1 table 100
ip route del default table 100
ip rule del fwmark 2 table 10
ip route flush cache
iptables -t mangle -F INPUT
iptables -t mangle -F OUTPUT
iptables -t mangle -F FORWARD
iptables -t mangle -F PREROUTING
iptables -t mangle -F POSTROUTING
iptables -t mangle -F
ip route show table main | grep ^default | grep -Ev tun1 \
| while read ROUTE ; do
ip route add table 100 $ROUTE
done
ip route add default table 100 via
$(nvram get wan_gateway)
ip rule add fwmark 1 table 100
ip rule add fwmark 2 table 10
ip route flush cache
}
int() {
iptables -t mangle -A PREROUTING -i "$1" -j MARK --set-mark 1
}
adr() {
iptables -t mangle -A PREROUTING -i br0 -s "$1" -j MARK --set-mark 2
}
kills() {
iptables -I FORWARD -s "$1" -o eth0 -j DROP
}
main
int br0
adr 192.168.1.115/32
adr 192.168.1.119/32
adr 192.168.1.147/32
kills 192.168.1.115/32
kills 192.168.1.119/32
kills 192.168.1.147/32
exit 0
我的路由器设置为默认通过 isp 而不是 vpn 进行流量传输
答案1
理解这一点的一个关键是,进出路由器主机的数据包采用的路径iptables
与经过路由器的数据包所经过的路径不同。您可以谷歌iptables-chains.png
并跟进一些图像,例如,http://jensd.be/wp-content/uploads/iptables_chains.png。
概览图片位于http://www.linuxjournal.com/files/linuxjournal.com/ufiles/imagecache/large-550px-centered/u1002061/10822f1.png对于制定规则也很有帮助iptables
。
具体来说,PREROUTING
该表的链表mangle
只适用于传入数据包,这适用于转发数据包(远程到远程),而您希望将传出数据包定向到路由器的本地到远程流量。因此,上面的初始规则设置应该针对OUTPUT
表链mangle
,以便引导本地到远程的流量。