在使用Openwrt路由器的时候,有时候我并不把它当作一个路由器来上网用,而是把装有Openwrt系统的路由器当成一个低功耗的Linux的嵌入式系统使用。Openwrt的官网给了很多很多软件的预编译包,其数量之多几乎可以与Ubuntu的官方源媲美,比如我们可以在Openwrt上搭建apache的网页服务,代理,NAS服务器等很多功能,要比开启一台Linux笔记本电脑省电的多。
如果要把Openwrt当成服务器来使用,一个很重要的节点是端口映射,必须把我的公网IP的端口映射到Openwrt路由器上去,我的路由器才能收到公网发来的请求,并将结果返回到公网。
然而Openwrt相比Ubuntu有很坑的地方,让我折腾了一晚上才弄明白
1、Openwrt默认拒绝公网发来的未建立连接的请求,所以端口映射的再多也没有用
2、Openwrt里的服务监听端口必须是路由器的WAN口地址,才能被端口映射后访问
首先来解释一下第一点
在Openwrt默认配置下luci的界面上,找到“网络”-“防火墙”可以看到来自WAN口的请求是被REJECT的,如下图
如果你的防火墙的配置如上,那么恭喜你做再多的端口映射都没有用
所以我们可以通过luci界面修改或者修改配置文件的方式支持WAN口的请求接入
或修改/etc/config/firewall
注意,这两种方式修改完毕后都需要重启路由器才能生效
下面开始配置端口转发,我们可以先把路由器后台luci界面的端口80给映射出去,然后就可以在外网进路由器后台控制了。
如果你没有添加别的防火墙机制,现在应该已经可以在外网访问路由器的管理界面了
而且现在可以像普通路由器一样对内网的其他电脑进行端口映射,此时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-toggle 1
enable-remote-http-toggle 0
enable-edit-actions 1
enforce-blocks 0
buffer-limit 4096
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
此时,路由器自身访问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
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也就是所有网卡的所有网段上,或者针对内网和公网用户使用两个进程。