我的电脑提供一个 Wifi AP,用于共享其 eth 互联网连接。它的工作无痛。
我决定将我的计算机连接到我的 VPN 服务器(我的eth
<=> VPN 远程服务器),以便我的“WifiAP 客户端”在通过我的 VPN 建立隧道后能够上网。而且它并不能完全发挥作用。
有什么作用:我的电脑可以上网并ipecho.net/plain
渲染出远端VPN服务器IP。好的。 WifiAP 客户端可以 ping 远端 VPN 服务器 IP。
什么失败了:WifiAP 客户端无法 ping 任何其他内容,并且绝对没有域(无法到达 8.8.8.8 GDNS ip...没有域解析)。
简而言之,无需VPN,任何人先生都可以加入wifi并上网冲浪。有了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
答案1
问题是什么
因此,您需要的是网络地址传输(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
GENMASK 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
答案2
您的 VPN 和防火墙规则配置没有任何问题。您缺少的是这样一个事实:您只有一个网关 192.168.0.1,并且只能通过 eth0 访问它,当然不能通过 wlan0 访问它,只需检查您的路由表即可。
这种行为是普通的:在所有操作系统中只能有一个接口链接到网关,因为内核必须明确知道如何路由数据包。
在所有操作系统中...除了 Linux 之外,您可以添加第二个(以及第三个、第四个...)路由表,前提是您还添加了告诉内核何时明确使用每个路由表的规则。这就是您需要做的:设置一个第二路由表,然后添加一条规则,规定来自 tun0 子网的所有数据包必须通过第二个路由表进行路由。
这称为策略路由。您可以按如下方式进行操作:为新表选择一个名称,然后
echo 200 <NAME1> >> /etc/iproute2/rt_tables
ip route add <NET1> dev <DEV1> src <SRC1> table <NAME1>
(这里DEV1是wlan0,NET1和SRC1是wlan0已有的网络和IP地址),
ip route add default via <IP1> table <NAME1>
(IP1是你的局域网的网关),最后
ip rule add from <IP1> table <NAME1>
这里IP1是接口tun0的子网。
这就是全部。