公司网络与家庭网络组建局域网,使用xl2tp拨号。
网络结构
网络端 | 内网段 | 路由器 | 内网IP | 公网IP | xl2tp端类型 |
---|---|---|---|---|---|
家庭网络A | 192.168.0.0/24 | 磊科NBR100 | 192.168.0.2 | 有 | 服务端 |
公司网络B | 192.168.10.0/24 | 磊科B39 | 192.168.10.1 | 无 | 客户端 |
成功建立连接后,分配IP如下:
A服务端 | B客户端 |
---|---|
10.0.2.1 | 10.0.2.2 |
存在问题
B端内网能ping通A端内网IP,但A端无法ping通B端内网。
由于之前在B端用的是磊科B6路由器,组网没有任何问题,因此问题定位在B39(刚换的设备)。
连接B39路由器控制台:
bash
ssh 192.168.10.1
进去后发现系统是openwrt 21。
经过多番查找,问题定位在防火墙配置:
bash
vi /etc/config/firewall
...
config zone
option name 'wan'
list network 'wan1'
list network 'wan1_ipv6'
list network 'wan2'
list network 'vpn0' # 1. vpn0被加入了wan
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
list masq_src '192.168.10.0/24'
...
config zone 'vpn0'
option name 'vpn0'
list network 'vpn0'
option input 'REJECT' # 3. 入站拒绝
option output 'ACCEPT'
option forward 'REJECT' # 2. 转发被拒绝
option masq '1'
option mtu_fix '1'
注意两处注释:
-
- vpn0被加入了wan,导致从A过来的数据到达vpn0时被拒绝
-
- vpn0默认也是拒绝转发
从这里可以看出,B39的虚拟网络拨号功能并不是为跨域组网设计,翻墙倒是可以用,但翻墙策略也没地方设置,这就有点鸡肋了。
修改方案
首先将1注释掉,再将2改为ACCEPT
,重启防火墙:
bash
service firewall restart
从A内网ping B内网成功!
但这里需要注意的是,直接ping B路由器的内网IP是不通的(ping 192.168.10.1或ping 10.0.2.2),因为上面注释的第3条拒绝导致。如果需要能ping通,第3条改为'ACCEPT'即可。不过实际应用中这里不需要开启,拒绝A网访问B网的路由器设备是合理的。
新的问题
B内网ping A内网不通了!!!
这是由于上面的第1条被删除,导致vpn0不在wan口区域内,来自B内网的数据包无法转发出去。
事实上,从B控制台ping A子网IP是通的,所以其实加一条路由就能通过。不过这样需要把A子网网段硬编码到路由规则中,时间久了如果出问题难以定位。
如果恢复第1条又会导致A ping B 不通。这样则需要为vpn0添加一条转发规则:
bash
config forwarding
option src 'vpn0'
option dest 'lan'
解决方案
bash
...
config zone
option name 'wan'
list network 'wan1'
list network 'wan1_ipv6'
list network 'wan2'
list network 'vpn0' # 1. 这里保留,不要注释
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
list masq_src '192.168.10.0/24'
...
config zone 'vpn0'
option name 'vpn0'
list network 'vpn0'
option input 'REJECT'
option output 'ACCEPT'
option forward 'ACCEPT' # 2. 这里改为ACCEPT
option masq '1'
option mtu_fix '1'
# 添加一条vpn0转发规则
config forwarding
option src 'vpn0'
option dest 'lan'
重启服务后,两端内网都能ping通了。
遗留问题
在B路由器重启后,A仍然能ping通B内网,但返回过来就不行了。登录B控制台查看/etc/config/firewall,配置并未被还原。于是重启防火墙,发现又正常了。但总不能每次重启路由器都要进控制台操作一次吧。
这个问题有一个折衷方案:在B管理页面添加一条静态路由, 192.168.0.0/24 走 10.0.2.1,这样就正常了。
为什么重启防火墙就正常了呢?重启路由器后,在重启防火墙前后我查看了ip route路由表并无变化,这是什么原因。有没有懂的朋友指点下。