iptables 將特定 TCP/UDP 埠重定向到 VPN (tun1)
我有一個基於 linux 的路由器,並設置了一個 vpn 客戶端以通過 vpn 和 isp per iptables 命令路由流量我試圖僅通過 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
有人告訴我,我可能還需要使用 INPUT OUTPUT 和 FORWARD 選項,但是儘管閱讀了我似乎無法讓埠正確路由,我的腳本要麼最終掛起並導致路由器崩潰,要麼我最終沒有流量通過 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進行通信
理解這一點的一個關鍵是,進出路由器主機的數據包與通過路由器的數據包採用不同的路徑
iptables
。您可以 googleiptables-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
以便引導本地到遠端的流量。