為什麼 ip_forwarding=1 使用 VPN 失敗?
我的電腦提供了一個 Wifi AP,用於共享其 eth Internet 連接。它工作無痛。
我決定將我的電腦連接到我的 VPN 伺服器(我的
eth
<=> VPN 遠端伺服器),以便我的“WifiAP 客戶端”在通過我的 VPN 建立隧道後上網衝浪。而且它不能完全工作。有什麼作用:我的電腦可以上網並
ipecho.net/plain
呈現遠端 VPN 伺服器 IP。好的。WifiAP 客戶端可以 ping 遠端 VPN 伺服器 IP。失敗的原因:WifiAP 客戶端無法 ping 其他任何東西,並且絕對沒有域(無法達到 8.8.8.8 GDNS ip…沒有域解析)。
簡而言之,沒有 VPN,任何人都可以加入 wifi 並瀏覽 WWW。有了VPN,只有我的電腦可以做到。
是
ip_forwarding
不是為了隧道?怎麼了 ?我該如何解決?
____ VPN開啟時的路由:
Destination Passerelle Genmask Indic Metric Ref Use Iface default 10.8.0.77 128.0.0.0 UG 0 0 0 tun0 default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0 10.8.0.1 10.8.0.77 255.255.255.255 UGH 0 0 0 tun0 10.8.0.77 * 255.255.255.255 UH 0 0 0 tun0 13.37.42.0 * 255.255.255.0 U 0 0 0 wlan0 ns350510.ip-3-1 192.168.0.1 255.255.255.255 UGH 0 0 0 eth0 128.0.0.0 10.8.0.77 128.0.0.0 UG 0 0 0 tun0 link-local * 255.255.0.0 U 1000 0 0 eth0 192.168.0.0 * 255.255.254.0 U 0 0 0 eth0
___ VPN關閉時的路由
Destination Passerelle Genmask Indic Metric Ref Use Iface default 192.168.0.1 0.0.0.0 UG 0 0 0 eth0 13.37.42.0 * 255.255.255.0 U 0 0 0 wlan0 link-local * 255.255.0.0 U 1000 0 0 eth0 192.168.0.0 * 255.255.254.0 U 0 0 0 eth0
__電腦的IPtables(提供WIFI AP並連接到VPN伺服器):
# Generated by iptables-save v1.4.21 *mangle :PREROUTING ACCEPT [7471:1066114] :INPUT ACCEPT [5960:830272] :FORWARD ACCEPT [1339:216774] :OUTPUT ACCEPT [717:92366] :POSTROUTING ACCEPT [2116:318321] :internet - [0:0] -A PREROUTING -j internet -A internet -m mac --mac-source 60:F8:4D:BE:43:AE -j RETURN -A internet -j MARK --set-xmark 0x3e7/0xffffffff COMMIT # Completed # Generated by iptables-save v1.4.21 *nat :PREROUTING ACCEPT [1710:298954] :INPUT ACCEPT [1480:280336] :OUTPUT ACCEPT [28:4162] :POSTROUTING ACCEPT [86:6162] -A PREROUTING -i wlan0 -p tcp -m mark --mark 0x3e7 -m tcp --dport 80 -j DNAT --to-destination 13.37.42.1:80 -A PREROUTING -i wlan0 -p tcp -m mark --mark 0x3e7 -m tcp --dport 443 -m conntrack --ctstate NEW -j DNAT --to-destination 13.37.42.1:80 -A POSTROUTING -o eth0 -j MASQUERADE -A POSTROUTING -o wlan0 -j MASQUERADE COMMIT # Completed # Generated by iptables-save v1.4.21 *filter :INPUT ACCEPT [6041:840617] :FORWARD ACCEPT [380:110945] :OUTPUT ACCEPT [753:102159] -A FORWARD -i wlan0 -j ACCEPT COMMIT # Completed
____ 伺服器 OpenVPN 配置
port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh2048.pem server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "redirect-gateway def1 bypass-dhcp bypass-dns" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4" keepalive 10 120 comp-lzo max-clients 100 user nobody group nobody persist-key persist-tun status /etc/openvpn/logs/openvpn-status.log log-append /etc/openvpn/logs/openvpn.log verb 3
___ 客戶端 OpenVPN 會議
client ns-cert-type server remote www.example.com 1194 #route-nopull ca ca.crt cert client_1337.crt key client_1337.key dev tun proto udp resolv-retry infinite nobind persist-key persist-tun comp-lzo verb 3
___伺服器 iptables
*filter :INPUT ACCEPT [1623:213921] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [911:146048] :acctboth - [0:0] :cphulk - [0:0] -A INPUT -j cphulk -A INPUT -j acctboth -A INPUT -i eth0 -p udp -m state --state NEW -m udp --dport 1194 -j ACCEPT -A INPUT -i tun+ -j ACCEPT -A FORWARD -i tun+ -j ACCEPT -A FORWARD -i tun+ -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT -A FORWARD -i eth0 -o tun+ -m state --state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -j acctboth -A OUTPUT -o tun+ -j ACCEPT -A acctboth -s 3.1.170.110/32 ! -i lo -p tcp -m tcp --dport 80 -A acctboth -d 3.1.170.110/32 ! -i lo -p tcp -m tcp --sport 80 -A acctboth -s 3.1.170.110/32 ! -i lo -p tcp -m tcp --dport 25 -A acctboth -d 3.1.170.110/32 ! -i lo -p tcp -m tcp --sport 25 -A acctboth -s 3.1.170.110/32 ! -i lo -p tcp -m tcp --dport 110 -A acctboth -d 3.1.170.110/32 ! -i lo -p tcp -m tcp --sport 110 -A acctboth -s 3.1.170.110/32 ! -i lo -p icmp -A acctboth -d 3.1.170.110/32 ! -i lo -p icmp -A acctboth -s 3.1.170.110/32 ! -i lo -p tcp -A acctboth -d 3.1.170.110/32 ! -i lo -p tcp -A acctboth -s 3.1.170.110/32 ! -i lo -p udp -A acctboth -d 3.1.170.110/32 ! -i lo -p udp -A acctboth -s 3.1.170.110/32 ! -i lo -A acctboth -d 3.1.170.110/32 ! -i lo -A acctboth -s 10.8.0.1/32 ! -i lo -p tcp -m tcp --dport 80 -A acctboth -d 10.8.0.1/32 ! -i lo -p tcp -m tcp --sport 80 -A acctboth -s 10.8.0.1/32 ! -i lo -p tcp -m tcp --dport 25 -A acctboth -d 10.8.0.1/32 ! -i lo -p tcp -m tcp --sport 25 -A acctboth -s 10.8.0.1/32 ! -i lo -p tcp -m tcp --dport 110 -A acctboth -d 10.8.0.1/32 ! -i lo -p tcp -m tcp --sport 110 -A acctboth -s 10.8.0.1/32 ! -i lo -p icmp -A acctboth -d 10.8.0.1/32 ! -i lo -p icmp -A acctboth -s 10.8.0.1/32 ! -i lo -p tcp -A acctboth -d 10.8.0.1/32 ! -i lo -p tcp -A acctboth -s 10.8.0.1/32 ! -i lo -p udp -A acctboth -d 10.8.0.1/32 ! -i lo -p udp
問題是什麼
所以你想要的是讓網路地址傳輸正常工作(NAT)。我不假裝是
iptables
專家,但我可以根據您的這一部分看到iptables-save
:*nat :PREROUTING ACCEPT [1710:298954] :INPUT ACCEPT [1480:280336] :OUTPUT ACCEPT [28:4162] :POSTROUTING ACCEPT [86:6162] -A PREROUTING -i wlan0 -p tcp -m mark --mark 0x3e7 -m tcp --dport 80 -j DNAT --to-destination 13.37.42.1:80 -A PREROUTING -i wlan0 -p tcp -m mark --mark 0x3e7 -m tcp --dport 443 -m conntrack --ctstate NEW -j DNAT --to-destination 13.37.42.1:80 -A POSTROUTING -o eth0 -j MASQUERADE #####this line -A POSTROUTING -o wlan0 -j MASQUERADE
…這部分:
*filter :INPUT ACCEPT [6041:840617] :FORWARD ACCEPT [380:110945] :OUTPUT ACCEPT [753:102159] -A FORWARD -i wlan0 -j ACCEPT #####this line COMMIT
…你似乎正在轉發進來的東西
wlan0
,這是允許MASQUERADE
的eth0
。但是,您的路由表將通過您的介面引導所有一般流量tun0
,因為兩行中的一條GENMASK 128.0.0.0
將始終在default
目的地之前匹配eth0
withGENMASK 0.0.0.0
。這意味著您將傳入wlan0
數據包轉發到eth0
,但您的一般流量通過介面tun0
。您要將wlan0
數據包轉發到tun0
.可能的解決方案
您可以通過執行以下命令來解決此問題,而無需更改任何現有的
iptables
(同樣,我不是iptables
專家,而且您iptables
的比我的複雜得多):sudo iptables --table nat --append POSTROUTING --out-interface tun0 -j MASQUERADE
我如何進行 NAT
我寫了這個簡短的腳本來在我的電腦上設置 NAT,因為我永遠記不住這些命令。因此,在您的其餘部分不在的情況下
iptables
,您可以執行nat tun0 wlan0
以將網際網路連接傳遞tun0
給wlan0
.#!/bin/bash # I named this script "nat" if [ $# -lt 2 ] then echo usage: nat \<internet connection iface\> \<recieving iface\> exit 0 fi internetiface=$1; receivingiface=$2; sudo iptables --table nat --append POSTROUTING --out-interface $internetiface -j MASQUERADE sudo iptables --append FORWARD --in-interface $receivingiface -j ACCEPT echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward