我們經常會在路由器上面配置端口轉發的規則,用來訪問內網機器的某個端口,openwrt上面有很多中實現端口轉發的方式。
1、端口轉發
比如我想用wan口的IP,192.168.2.180,遠程連接lan口內網192.168.18.235的ubuntu,如何實現:
- 建立一個端口轉發規則,將
2222端口,訪問路由器內網192.168.18.235ubuntu的22端口,
在防火牆下面添加如下規則cat /etc/config/firewall
config redirect
option enabled '1'
option proto 'tcp'
option comment 'ubuntu'
option src_dport '2222'
option dest_ip '192.168.18.235'
option dest_port '22'
option src 'wan'
option target 'DNAT'
option dest 'lan'
實際實現在iptable的nat表下面添加了如下規則
root@openwrt:/# iptables -t nat -nvL | grep 235
307 23589 zone_lan_prerouting all -- br-lan * 0.0.0.0/0 0.0.0.0/0
0 0 SNAT tcp -- * * 192.168.18.0/24 192.168.18.235 tcp dpt:22 /* @redirect[0] (reflection) */ to:192.168.18.1
307 23589 prerouting_lan_rule all -- * * 0.0.0.0/0 0.0.0.0/0 /* user chain for prerouting */
0 0 DNAT tcp -- * * 192.168.18.0/24 192.168.2.180 tcp dpt:2222 /* @redirect[0] (reflection) */ to:192.168.18.235:22
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:2222 /* @redirect[0] */ to:192.168.18.235:22
這樣通過wan ip加src_dport就可以訪問到內網機器的ssh端口了。
2、DMZ
dmz就是加強版的端口轉發,比如你內網IP裏面有22端口給ssh用,也有80端口給web用,也有23端口給telnet用。如果用端口轉發的話,你需要建立三條端口轉發的規則。用dmz的話一下子就都可以了。
在防火牆下面添加如下規則cat /etc/config/firewall
config redirect 'dmz'
option name 'dmz'
option src 'wan'
option proto 'tcp'
option target 'DNAT'
option dest_ip '192.168.18.235'
option enabled '1'
config redirect 'dmzudp'
option name 'dmzudp'
option src_port '!67'
option src 'wan'
option proto 'udp'
option target 'DNAT'
option dest_ip '192.168.18.235'
option enabled '1'
實際實現在iptable的nat表下面添加了如下規則
root@openwrt:/# iptables -t nat -nvL | grep 235
0 0 SNAT tcp -- * * 192.168.18.0/24 192.168.18.235 /* dmz (reflection) */ to:192.168.18.1
0 0 SNAT udp -- * * 192.168.18.0/24 192.168.18.235 /* dmzudp (reflection) */ to:192.168.18.1
0 0 DNAT tcp -- * * 192.168.18.0/24 192.168.2.180 /* dmz (reflection) */ to:192.168.18.235
0 0 DNAT udp -- * * 192.168.18.0/24 192.168.2.180 /* dmzudp (reflection) */ to:192.168.18.235
5 405 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 /* dmz */ to:192.168.18.235
26 2270 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp spt:!67 /* dmzudp */ to:192.168.18.23
3、Upnp
openwrt上面使用miniupnpd服務來實現upnp服務
root@zihome:# ps | grep mini
25503 root 1076 S /usr/sbin/miniupnpd -f /var/etc/miniupnpd.conf
28450 root 1520 S grep mini
/etc/config/upnpd裏面的log_output設置成1,可以在logread下查看交互日誌。
config upnpd 'config'
option enable_natpmp '1'
option enable_upnp '1'
option secure_mode '1'
option log_output '1'
開啓upnp的時候:
打開控制面板->網絡和 Internet->查看網絡計算機和設備,可以看到路由器
右鍵查看屬性可以看到路由器的信息
- 製造商
- 型號
- 設備網頁
- mac地址
- 唯一標識符
- IP地址
抓包可以看到路由器發送SSDP廣播包給239.255.255.250,NOTIFY消息內容包含上面信息。
關閉upnp的時候:
打開控制面板->網絡和 Internet->查看網絡計算機和設備,路由器丟失
抓包可以看到路由器發送SSDP廣播包給239.255.255.250,NOTIFY消息內容被byebye。
upnp實現端口映射
upnp可以通過另一種方式實現端口映射,就是客戶端告訴路由器說,我想要通過哪個端口應該到哪個端口,然後路由器幫忙建立端口轉發規則。
ubuntu安裝upnpc
sudo apt-get install -y miniupnpc
ubuntu的ssh添加2222端口,upnp默認只允許1024-65535端口的映射
config perm_rule
option action 'allow'
option ext_ports '1024-65535'
option int_addr '0.0.0.0/0'
option int_ports '1024-65535'
option comment 'Allow high ports
sudo vim /etc/ssh/sshd_config
Port 22
Port 2222
sudo /etc/init.d/ssh restart
ubuntu 通過upnpc請求添加端口映射,2222內部端口,9000外部端口
upnpc -a 192.168.17.233 2222 9000 TCP
這時候在upnp.leases下面就會添加一條信息,iptable -t nat下面添加一條規則。完成端口映射
root@openwrt:/# cat /var/upnp.leases
TCP:9000:192.168.17.233:2222:1655716845:libminiupnpc
ubuntu 通過upnpc請求刪除端口映射
upnpc -d 192.168.17.233 2222 9000 TCP
當開啓迅雷下載的時候
會有如下信息被upnpd捕獲到
root@openwrt:/# cat /var/upnp.leases
TCP:54366:192.168.17.151:53533:1655706396:PTL-000C29A6B88AGXGA
UDP:54366:192.168.17.151:54366:1655706396:PTL-000C29A6B88AGXGA
TCP:53532:192.168.17.151:53532:1655706396:PTL-000C29A6B88AGXGA
root@openwrt:/# iptables -t nat -nvL
Chain MINIUPNPD (1 references)
pkts bytes target prot opt in out source destination
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:63016 to:192.168.17.151:53866
0 0 DNAT udp -- * * 0.0.0.0/0 0.0.0.0/0 udp dpt:63016 to:192.168.17.151:63016
0 0 DNAT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53864 to:192.168.17.151:53864