路由配置情况如图,我希望 PC1 也能够正常访问:
有没有懂的,指点指点,不知道如何下手。
1
UnknownSky 2021-01-13 11:14:10 +08:00 via Android
你這 openvpn server 直接掛在 Openwrt 上不得了
|
2
UnknownSky 2021-01-13 11:15:24 +08:00 via Android
主路由什麼系統,建 server 也要 iptables NAT 規則。
|
3
zliea 2021-01-13 11:32:50 +08:00
openvpn 服务端需要虚拟出一个网络,需要 iptables 指定 source 为改网络的转发到物理网卡上。
iptables -t nat -A POSTROUTING -s x.x.x.x/x -o eth0 -j MASQURADE |
4
Jirajine 2021-01-13 11:41:23 +08:00 via Android
你这配的乱七八糟,旁路由上开 masquerade 是要搞什么?
盲猜 hairpin nat 的问题, 把 masquerade 去掉。 |
7
huangya 2021-01-13 13:56:40 +08:00
openvpn client 虚拟网卡拿到的 IP 也是 192.168.2.0/24 网段吗?
|
8
huangya 2021-01-13 14:00:22 +08:00
另外,在 openvpn client 虚拟网卡上抓下 ssh 或者 web 服务至少有没有三次握手的包。
|
10
huangya 2021-01-13 14:10:19 +08:00
@nozer
在 PC1 上添加一条到 10.8.0.0/24 的静态路由.linux 下的命令: sudo route add -net 10.8.0.0/24 gw 192.168.2.1 Windows 用管理员权限打开 cmd: route add mask 255.255.255.0 192.168.2.1 |
11
huangya 2021-01-13 14:12:37 +08:00
|
13
jasonyang9 2021-01-13 14:15:38 +08:00
瞎猜的,
PC1 的默认网关是 192.168.2.2 旁路由,所以对 10.8.0.0/24 发来的数据包它不知道如何返回就走默认网关; 旁路由收到后也不知道如何到 10.8.0.0/24,也走它的默认网关,192.168.2.1,且被 iptables 匹配到,做了 MASQ,也就是 SNAT,那么数据包的源地址就被替换为旁路由自己的 192.168.2.2 ; 而请求数据包的目标地址是 192.168.2.10 ( PC1 ),响应却是从 192.168.2.2 收到,就被丢掉了。。。 |
14
nozer OP |
15
huangya 2021-01-13 14:23:05 +08:00
@jasonyang9 yes, I think so. 楼主可以用 wireshark 检查下 icmp 包和 tcp 包的源地址。所以我提供的方案是 vpn 网段直接走 192.168.2.1
|
16
nozer OP 或许如 @Jirajine 所说,去掉 MASQ 就可以了,但是去掉 MASQ 似乎会导致数据包在 192.168.2.2 上循环导致无法正常上网了。
|
18
huangya 2021-01-13 14:31:38 +08:00
|
19
Lemeng 2021-01-13 14:33:41 +08:00
抓包了解走向,走到哪步,哪步出了问题
|
20
huangya 2021-01-13 14:35:44 +08:00
|
21
Jirajine 2021-01-13 16:49:47 +08:00 via Android
能 ping 通是因为 icmp 自带 redirect,不受 hairpin nat 的影响。
去掉 masquerade 不能上网说明你配的有问题,检查防火墙和内核 ip 转发开了没。 旁路由这种方式本来就是 ipv4 下的一种 trick,踩坑是很正常的,配成两级主干串起来才是正统方式。 |
22
nozer OP @huangya 很感谢。PC 上设置静态路由可以解决问题。 但是路由器上设置 iptables 规则没什么效果。 抓包我也抓了下,但是水平有限研究不出来啥。
|
23
huangya 2021-01-14 16:16:00 +08:00 3
@nozer
想了下,OpenWRT 上的这条命令还是有问题,当时脑抽了,改成以下估计就可以了。 iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT |
24
nozer OP @huangya 真的可以了,问题解决。原因应该是跟前面的猜测一致,但是我想请教下,现在的规则是这样的:
iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53 iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53 iptables -t nat -I POSTROUTING -j MASQUERADE iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT 就是说,发送到 10.8.0.0/24 的包采用的动作是 ACCEPT,但是这里并没有 return,为何就可以产生效果呢? iptables 规则的匹配不是从前到后依次匹配,除非无法匹配,或者 return 才会终止匹配后面的规则。 这个地方,ACCEPT 后,并没有 return,那不是最后还是会匹配到 MASQUERADE 上去,导致数据包源地址发生改变? |
25
huangya 2021-01-14 18:07:46 +08:00
不会,ACCEPT 后这个包就在 chain POSTROURING 不会继续跑了,不会到下一条 rule MASQUERADE 中.
ACCEPT 与 RETURN 的区别可以看: https://ipset.netfilter.org/iptables.man.html#:~:text=ACCEPT%20means%20to%20let%20the,the%20previous%20(calling)%20chain. >ACCEPT means to let the packet through. DROP means to drop the packet on the floor. RETURN means stop traversing this chain and resume at the next rule in the previous (calling) chain. If the end of a built-in chain is reached or a rule in a built-in chain with target RETURN is matched, the target specified by the chain policy determines the fate of the packet. 关键点有两个: 1.RETRUN 是返回到 calling chain.然后继续匹配下一条 rule. 2.ACCEPT 是直接接受了(在 build-in chain 或者子 chain ),那 build-in chain 和 build-in chain call 的子 chain 中的 rule 都不会匹配了。 另,调试 iptables 可以用-j LOG 看包是如何跑的。 |
27
WildCat 2021-04-15 15:00:37 +08:00
@huangya 感谢您的分享!
我也在尝试类似的方案,主路由华硕,旁路由 OpenWrt 。 目前的问题是可以连接内网和国内网络,国际网络无法走旁路由这个网关( 192.168.50.2 )。 我在 OpenVPN 配置里新增了: push "route 192.168.50.0 255.255.255.0 192.168.50.2" push "route 0.0.0.0 255.255.255.0 192.168.50.2" 但是似乎在客户端上没作用。看 log 是可以生效的。 不知有什么见解?调试这个问题不知如何入门?(个人不太熟悉网络) |
28
huangya 2021-04-15 18:23:03 +08:00
|
29
liferecord 2021-04-15 22:52:45 +08:00
@nozer 我主路由也是华硕 ac66ub1,旁路由是 n1,主路开了华硕自带的 ddns 和 openvpn,也将您上面的规则写入 n1 的防火墙中,可依然没法通过 openvpn 在外科学上网,希望能从您这了解下具体设置。谢谢!
|
30
huangya 2021-04-16 09:11:30 +08:00 1
@liferecord 这个问题比较复杂,首先要理解 openvpn 有两种模式,叫做 tap 和 tun 模式。其中 tap 模式是二层的,tun 模式是三层的。什么意思呢? tap 模式下你可以拿到的 IP 地址与你路由器是同一个网段的。假设你的路由器的网段是 192.168.1.0/24, 那么你拿到的 ip 地址就属于这个网段,比如 192.168.1.10. tun 模式拿到的不是同一个网段,是另外一个网段,比如 10.8.0.0/24 (以下以这个网段举例). windows 系统和 linux 系统(苹果 PC 系统不知)都支持两种模式,但在 Android 和 iOS 系统上,只支持 tun 模式。这个模式可以由配置文件决定,打开配置文件,如果你看到有“dev tap", 就表示使用 tap 模式。如果是"dev tun", 就表示 tun 模式。
如果你在 windows 和 linux 系统使用 openvpn 的 tap 模式,那就好比你的电脑在家中一样,这样只需要添加一条到旁路由的路由规则就可以科学上网了。 但是如果你用的是 Android 和 iOS 系统,那就比较复杂了。因为 openvpn client 拿到的地址与你的旁路由不在同一个网段。你在 openvpn client 这端是没办法添加路由规则的。*路由规则中的网关必须要与 openvpn client 在同一个网段*。那这个问题怎么解决呢? 1. 在华硕路由器这边做策略路由,通过在防火墙中打 mark 的方式,让来自于 10.8.0.0 的网段的包走旁路由。这个比较复杂,也不推荐。因为华硕路由器相当于一个黑盒。你的配置可能在有些情况下(比如重开机和重连)被覆盖掉。2. 在旁路由上安装 openvpn server,华硕路由器开启 ddns 和端口转发。这样你可以连到 n1 上的 openvpn server,直接科学上网。这种比较简单。 |
31
liferecord 2021-04-16 09:18:54 +08:00
感谢 @huangya 的指导,我主路由 IP 是 192.168.50.1,主路由设置的 openvpn server 网段是 10.8.0.0,现 主路由已经开启了 ddns 和 1194 端口转发
|
32
huangya 2021-04-16 09:30:37 +08:00
@liferecord
那就先测试 >如果你在 windows 和 linux 系统使用 openvpn 的 tap 模式,那就好比你的电脑在家中一样,这样只需要添加一条到旁路由的路由规则就可以科学上网了 和 >旁路由上安装 openvpn server,华硕路由器开启 ddns 和端口转发。这样你可以连到 n1 上的 openvpn server,直接科学上网。这种比较简单。 |
33
WildCat 2021-04-16 10:58:54 +08:00
@huangya
1. 是的 2. 10.8.0.0 255.255.255.0 旁路由也是否需要连接进 OpenVPN 子网? > 在旁路由上安装 openvpn server,华硕路由器开启 ddns 和端口转发。这样你可以连到 n1 上的 openvpn server,直接科学上网。这种比较简单。 我也有尝试这个,但是似乎无法访问华硕路由器的子网 (192.168.50.x 255.255.255.0) |
34
huangya 2021-04-16 11:15:41 +08:00
@WildCat
>我也有尝试这个,但是似乎无法访问华硕路由器的子网 (192.168.50.x 255.255.255.0) 1.首先确定采用这种方法你是否可以科学上网 2.在解决能科学上网之后,关于无法访问华硕路由器的子网问题,你把以下命令的结果发给我,结果如有科学上网的 IP 地址,你可以用”科学上网 IP 地址“代替,以保护隐私。然后我再给你一些命令来解决这个问题。 iptables -L-nv iptables -t mangle -L -nv iptables -t nat -L -nv |
35
liferecord 2021-04-16 14:28:36 +08:00
@huangya 大佬,能否给个邮箱,我把我这的设置详细罗列下,麻烦您再指教下,谢谢!
|
36
huangya 2021-04-16 14:46:07 +08:00
@liferecord 可以,但是问题解决了,希望你回帖总结下方法到此帖,这样可以帮助更多人。邮箱是 G 家的,我的 ID 号加 90
|
37
liferecord 2021-04-16 22:43:25 +08:00
@huangya ID 号加 90 是加前面还是后面?谢谢!我现在在尝试各种方法,现只有在旁路由端设置 softehter vpn 服务器后,再在手机等客户端上设置 ipsec 成功过(此时主路由网关指向旁路由,旁路由网关和 dns 都指向主路由)。现正在尝试主路由不设网关为旁路由 ip (也就是旁路由即使非人为断开也不影响主路由正常使用)
|
38
huangya 2021-04-16 23:57:24 +08:00
@liferecord 90 加在 ID 后面。
|
39
WildCat 2021-04-17 13:27:08 +08:00
@huangya 感谢您的帮助。我打出来我的 log 了,也发到您邮箱了。十分抱歉做伸手党了(这块实在是不熟悉)。方便时也希望您能推荐一些学习资料。
|
41
WildCat 2021-05-09 09:54:57 +08:00
特别感谢 @huangya 的帮助,太重要了!
简单总结如下: 1. 旁路由上要建立对应的 iptables 规则:旁路由 <-> 主路由,注意 MASQURADING 必须启用。关于这个选项: https://superuser.com/a/935988 2. 旁路由上配置 OpenVPN 服务。需要注意的是 OpenWrt 的 web UI 不足以满足这个需求,建议 ssh 进去 vim 配置。参考配置如下(关键地方都加了注释): https://gist.github.com/imWildCat/f1b2e38215d967f365d86db6db900956 3. 主路由上配置端口转发(上一步注释里有写) 4. 主路由上配置 LAN static route,参考华硕: https://www.asus.com/uk/support/FAQ/1011706/ (这一步似乎可以省略,如果 (1) 奏效的话) 附图 (1): |
42
yaow 2022-12-02 14:03:45 +08:00
@WildCat 你好,请教一下,我现在也是 ikuai 主+op 旁的组网,想通过 openvpn 连接并且流量过一下 op 网关,问下你最后是采用了楼主提供的方案 2 实现的吗
|
43
hs20073 257 天前
@huangya
iptables -t nat -I POSTROUTING 1 -d 10.8.0.0/24 -j ACCEPT 和楼主情况完全一样,做了这个策略,openvpn client 还是无法访问 PC1 ,请教还会是什么原因呢 其他策略如下 iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE #iptables -t nat -A PREROUTING -p udp--dport 53 -j REDIRECT --to-ports 53 #iptables -t nat -A PREROUTING -p tcp--dport 53 -j REDIRECT --to-ports 53 # ip6tables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-ports 53 # ip6tables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-ports 53 #iptables -I INPUT -p udp --destination-port 500 -j ACCEPT #iptables -I INPUT -p udp --destination-port 4500 -j ACCEPT #iptables -I INPUT -p udp --destination-port 1701 -j ACCEPT #iptables -I INPUT -p udp --dport 1194 -j ACCEPT #iptables -A INPUT -p udp -m udp --dport 500 -j ACCEPT #iptables -A INPUT -p udp -m udp --dport 4500 -j ACCEPT #iptables -A INPUT -p udp -m udp --dport 1701 -j ACCEPT |
46
wyh260595711 134 天前
@huangya 我根据 41 楼大哥总结成功在旁路由上设置成功了。他的是 tun 模式,想请教一下如果想用 tap 模式,要如何修改呢?我请教了 GPT 但是根据它的方法,最后重启旁路由后旁路由都没法 ping 通了,只能重新刷旁路由的系统。。。
旁路由的 IP 是 192.168.2.11 。 首先我修改了/etc/config/openvpn 文件 config openvpn 'myvpn' option port '1194' option dev 'tap' option server_bridge '192.168.2.11 255.255.255.0 192.168.2.100 192.168.2.150' option comp_lzo 'adaptive' option ca '/etc/openvpn/ca.crt' option dh '/etc/openvpn/dh.pem' option cert '/etc/openvpn/server.crt' option key '/etc/openvpn/server.key' option persist_key '1' option persist_tun '1' option user 'nobody' option group 'nogroup' option max_clients '10' option keepalive '10 120' option verb '3' option status '/var/log/openvpn_status.log' option script_security '2' option log '/tmp/openvpn.log' option proto 'udp4' option ddns '[your_ddns_domain]' #已经填写自己的域名 option mssfix '1420' option client_to_client '1' option enabled '1' list push 'dhcp-option DNS 192.168.2.11' list push 'redirect-gateway def1' 然后创建 tap0 接口 ip tuntap add dev tap0 mode tap 将 tap0 接口加入到 br-lan 中 brctl addif br-lan tap0 将 tap0 接口配置为 LAN 的桥接接口的一部分,在/etc/config/network 中添加 config interface 'vpn' option ifname 'tap0' option proto 'none' 然后在/etc/config/network 中将 tap0 接口添加到 LAN 桥接接口中 config interface 'lan' option type 'bridge' option ifname 'eth0.1 tap0' option proto 'static' option ipaddr '192.168.2.11' option netmask '255.255.255.0' 防火墙中原来对应的 iptables 规则 iptables -t nat -A POSTROUTING -o br-lan -j MASQUERADE 也去掉了 然后重启旁路由,然后 PING 不通了,,, |
47
wyh260595711 132 天前 via iPhone
@huangya 大神有空的话指导一下呗,谢谢啦
|
48
huangya 131 天前
@wyh260595711 你的意思是内网 192.168.2.xx 的 PC 也 ping 不通旁路由的 192.168.2.11 吗?
|
49
huangya 131 天前
@wyh260595711 另外,你为什么要重刷旁路由的系统,reset button 没有或者不起作用是吧?也没有串口,是吧?
|
50
wyh260595711 131 天前
@huangya 是的我电脑 192.168.2.X 的网段也 PING 不通路由了,更别说登录 OpenWrt 的后台了,应该还是设置里面有些问题。然后我这个旁路由是 N1 刷的 OpenWrt ,没有 Reset ,可以直接读 USB 里的 openwrt 再写入机器 eMMC ,直接刷机比较方便。
|
51
huangya 130 天前
@wyh260595711 你这个要 debug 是要搭建一个环境的。另外最好是要在有串口的环境下 debug 。你应该只有这台 N1 吧?没有其他带串口的机器了吧?如果没有,先回答一下下面的问题:
1. >option ifname 'eth0.1 tap0' 不把 tap0 加入到 bridge 中,能通吗? 2. >防火墙中原来对应的 iptables 规则 iptables -t nat -A POSTROUTING -o br-lan -j MASQUERADE 也去掉了 删除这条规则之前,有哪些规则? 下列命令打出来看看 iptables -t nat -L -nv iptables -L -nv iptables -t mangle -L -nv |