红联Linux门户
Linux帮助

Openwrt端口映射到路由器自己的问题解决

发布时间:2016-11-09 14:58:27来源:blog.csdn.net/lvshaorong作者:lvshaorong
在使用Openwrt路由器的时候,有时候我并不把它当作一个路由器来上网用,而是把装有Openwrt系统的路由器当成一个低功耗的Linux的嵌入式系统使用。Openwrt的官网给了很多很多软件的预编译包,其数量之多几乎可以与Ubuntu的官方源媲美,比如我们可以在Openwrt上搭建apache的网页服务,代理,NAS服务器等很多功能,要比开启一台Linux笔记本电脑省电的多。
如果要把Openwrt当成服务器来使用,一个很重要的节点是端口映射,必须把我的公网IP的端口映射到Openwrt路由器上去,我的路由器才能收到公网发来的请求,并将结果返回到公网。
 
然而Openwrt相比Ubuntu有很坑的地方,让我折腾了才弄明白。
1、Openwrt默认拒绝公网发来的未建立连接的请求,所以端口映射的再多也没有用
2、Openwrt里的服务监听端口必须是路由器的WAN口地址,才能被端口映射后访问
 
首先来解释一下第一点
在Openwrt默认配置下luci的界面上,找到“网络”-“防火墙”可以看到来自WAN口的请求是被REJECT的,如下图
Openwrt端口映射到路由器自己的问题解决
如果你的防火墙的配置如上,那么恭喜你做再多的端口映射都没有用
所以我们可以通过luci界面修改或者修改配置文件的方式支持WAN口的请求接入
Openwrt端口映射到路由器自己的问题解决
或修改/etc/config/firewall
Openwrt端口映射到路由器自己的问题解决
注意,这两种方式修改完毕后都需要重启路由器才能生效
 
下面开始配置端口转发,我们可以先把路由器后台luci界面的端口80给映射出去,然后就可以在外网进路由器后台控制了。
Openwrt端口映射到路由器自己的问题解决
如果你没有添加别的防火墙机制,现在应该已经可以在外网访问路由器的管理界面了
而且现在可以像普通路由器一样对内网的其他电脑进行端口映射,此时router->client的映射没有什么问题,但是能不能对路由器自己进行映射呢,也就是router->router的映射。
那么我们来试试其他的服务,这里以HTTP代理服务Privoxy为例,让Privoxy监听在192.168.1.1也就是路由器的内网地址
 
首先编辑Privoxy的配置文件如下
### AUTO-GENERATED CONFIGURATION  
### USED BY PRIVOXY  
### DO NOT EDIT  
### SEE /etc/config/privoxy INSTEAD
confdir /etc/privoxy  
logdir  /var/log  
logfile privoxy.log  
filterfile  default.filter  
actionsfile match-all.action  
actionsfile default.action  
listen-address  192.168.1.1:9999  
toggle  1  
enable-remote-toggle1  
enable-remote-http-toggle   0  
enable-edit-actions 1  
enforce-blocks  0  
buffer-limit4096  
forwarded-connect-retries   0  
accept-intercepted-requests 0  
allow-cgi-request-crunching 0  
split-large-forms   0  
keep-alive-timeout  300  
socket-timeout  300  
#permit-access  192.168.1.0/16 不做IP连入的限制  
forward-socks5   /   192.168.1.1:1080 .  
debug   512  
debug   4096  
debug   8192
 
然后配置端口转发,注意我转发的内部地址是192.168.1.1,路由器的公网地址是10.42.1.52
Openwrt端口映射到路由器自己的问题解决
此时,路由器自身访问192.168.1.1:9999是没有问题的,连接在路由器上的设备如192.168.1.2访问192.168.1.1:9999也是没有问题的,但是使用外网访问就不通,但此时路由器后台是能从外网进的,SSH也可从外网连,内网设备的端口映射也是正常,唯独Privoxy这个服务不能用。这是为什么呢,明明已经把外网的请求转发到了192.168.1.1:9999呀,于是我把监听端口改成0.0.0.0(也就是让该程序在路由器的所有网卡所有网段上进行监听)如下
listen-address  0.0.0.0:9999  
这样内网用户访问192.168.1.1:9999是可以的,路由器自己访问192.168.1.1:9999或者路由器公网地址如10.42.1.52:9999也是可以的,现在外网访问这个地址成功了,那么刚才为什么不行呢.于是我把privoxy监听的端口改为公网地址10.42.1.52:9999
listen-address  10.42.1.52:9999  
 
此时内网访问192.168.1.1:9999是不行的,但是公网是可以访问9999的,于是现在可以得出结论
1、在Openwrt配置端口转发时配置目标内网地址为路由器地址时(假设192.168.1.1)监听在192.168.1.1的程序并不会受到端口转发的数据
所以路由器上的程序必须监听在0.0.0.0或者路由器的公网地址。
2、如果程序监听在路由器公网地址,那么内网用户就会不能访问,但是公网用户可以,如果想要内网公网用户可以同时访问,可以监听在0.0.0.0也就是所有网卡的所有网段上,或者针对内网和公网用户使用两个进程。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/25863.html