Iptables

iptables 將特定 TCP/UDP 埠重定向到 VPN (tun1)

  • April 20, 2019

我有一個基於 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以便引導本地到遠端的流量。

引用自:https://unix.stackexchange.com/questions/290784