50439488 发表于 2023-9-8 15:52

恳请大佬帮忙修改ROS自动获取修改端口映射命令

本人ROS小白。得到一个脚本,意思是每次ROS重启后,WAN口得到的外网IP地址都会改变,这个脚本的意思就是把内网192.168.1.8这个IP映射出去。在每次ROS路由重启后自动检测到WAN口的公网IP改变时,就更改NAT的映射规则。并且每分钟检测一次。而且我用的是V6.49.10的版本,好像粘帖后不会执行。感谢!

具体的肢本如下:



#!/bin/bash# 定义变量external_port=8080# 外部端口internal_ip=192.168.1.8# 内部IP地址internal_port=80# 内部端口current_external_ip=""# 当前外部IP地址# 获取当前外部IP地址get_external_ip() {current_external_ip=$(wget -qO- https://ipecho.net/plain)}# 更新端口映射配置update_port_mapping() {# 删除原有NAT规则/ip firewall nat remove # 创建NAT规则/ip firewall nat add chain=dstnat action=dst-nat protocol=tcp dst-address=0.0.0.0/0 dst-port="$external_port" to-addresses="$internal_ip" to-ports="$internal_port" comment="port-map"# 创建防火墙接受规则/ip firewall filter add chain=input action=accept protocol=tcp dst-port="$external_port" comment="port-map"}# 检查外部IP地址是否有变化check_ip_change() {get_external_ipif [[ "$current_external_ip" != "$stored_external_ip" ]]; then    stored_external_ip="$current_external_ip"      # 更新端口映射配置    update_port_mappingfi}# 主循环while true; docheck_ip_changesleep 60# 每隔60秒检查一次done


oh_Jhon 发表于 2023-9-8 16:29

啥玩意啊整的这么复杂。直接映射不就可以了吗
/ip firewall nat

add action=dst-nat chain=dstnat comment="12345" \
    dst-port=12345 in-interface=pppoe-out1 protocol=tcp to-addresses=\
    10.10.10.9 to-ports=12345

50439488 发表于 2023-9-8 17:05

oh_Jhon 发表于 2023-9-8 16:29
啥玩意啊整的这么复杂。直接映射不就可以了吗
/ip firewall nat



说明一下脚本意思啊大佬。12345代表什么?而10.10.10.9又是什么?

oh_Jhon 发表于 2023-9-8 17:14

50439488 发表于 2023-9-8 17:05
说明一下脚本意思啊大佬。12345代表什么?而10.10.10.9又是什么?

/ip firewall nat
add action=dst-nat chain=dstnat comment="你要备注的内容" \
    dst-port=你的外网端口 in-interface=你的外网接口 protocol=tcp to-addresses=\
    你的内网IP地址 to-ports=你的内网端口

50439488 发表于 2023-9-8 17:27

oh_Jhon 发表于 2023-9-8 17:14
/ip firewall nat
add action=dst-nat chain=dstnat comment="你要备注的内容" \
    dst-port=你的外网 ...

我没有固定的公网IP,路由每次重启后都得到一个不一样公网IP。你这个脚本会自动的更改映射NAT规则里的外网IP吗?谢谢

aming.ou 发表于 2023-9-8 18:49

一般路由器都有的功能,怎么这么复杂呢?难道没有虚拟服务器(端口映射)的插件?任意外网映射到内网固定地址,但外网地址变化了,你也是要用ddns动态域名才好访问吧

Masterchen666 发表于 2023-9-8 19:25

aming.ou 发表于 2023-9-8 18:49
一般路由器都有的功能,怎么这么复杂呢?难道没有虚拟服务器(端口映射)的插件?任意外网映射到内网固定地 ...

他就是这个意思

50439488 发表于 2023-9-9 11:16

aming.ou 发表于 2023-9-8 18:49
一般路由器都有的功能,怎么这么复杂呢?难道没有虚拟服务器(端口映射)的插件?任意外网映射到内网固定地 ...

我看懂你说的意思了,但你没有看懂我说的意思。我说的不是一般的硬路由,而是Routeros软路由系统。里面什么都没有设置的,100%手搓的。端口映射是不难,难的是在Routeros系统里设置WAN口分配到的新公网IP要自动填入映射规则里。

50439488 发表于 2023-9-9 11:17

Masterchen666 发表于 2023-9-8 19:25
他就是这个意思

为什么一定要这样。说白了吧。内网里挂了点心,还不是为什么赚点电费。

mantouboji 发表于 2023-9-9 14:56

50439488 发表于 2023-9-9 11:16
我看懂你说的意思了,但你没有看懂我说的意思。我说的不是一般的硬路由,而是Routeros软路由系统。里面什 ...

不难,写一个脚本挂在pppoe的profile里即可。

你一楼那个脚本也是可笑,RouterOS的脚本第一行不用写什么bash,这又不是普通Linux

50439488 发表于 2023-9-10 13:19

mantouboji 发表于 2023-9-9 14:56
不难,写一个脚本挂在pppoe的profile里即可。

你一楼那个脚本也是可笑,RouterOS的脚本第一行不用写什么 ...

感谢提示!搞好了,就是新建一个profile。然后再给一个命令一分钟检测一次,出现公网IP改变时自动更改端口映射规则里的IP。现在重启路由就可以自动更改了。哈哈真的可以,ROS玩懂了真的是好东西。

50439488 发表于 2023-9-10 13:25

思路就是这样的
添加 动作=目标网络地址转换 链=目标网络地址转换 注释=nat-235 目标地址=得到的公网IP \
    目标端口=xx 协议=TCP 目标地址=本地要映射的端口 目标端口=21
添加 动作=源地址伪装 链=源地址伪装 源地址=IP段/24


添加 动作=添加源地址到地址列表 地址列表=online 地址列表超时=非静态 链=prerouting 注释="ip calc" 目标地址类型="" \
    目标限制=1,5,目标地址/1m40s 限制=1,5:数据包 源地址=IP段/24 源地址类型="" 时间=0s-1d,sun,mon,tue,wed,thu,fri,sat

添加 不需要权限验证=否 名称=set-nat-global-ip 所有者=mmc 权限=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon 源代码=":\
    全局 ipaddr add\
    ress]\r\
    \n\r\
    \n:set ipaddr [:pick \$ipaddr 0 ( -3)]\r\
    \n:全局 oldip [/ip firewall nat get [/ip firewall nat find comment=\"nat\
    -235\"] dst-address]\r\
    \n\r\
    \n:如果 (\$ipaddr != \$oldip) do={\r\
    \n记录信息 消息=[/ip firewall nat set [/ip firewall nat find comment=\
    \"nat-235\"] dst-address=\$ipaddr]\r\
    \n}"
添加 不需要权限验证=否 名称=ip-number 所有者=mmc 权限=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon 源代码=":\
    本地 ipNumber 0\r\
    \n:本地 onlineIPList online\r\
    \n\r\
    \n:foreach i in= do={\
    \r\
    \n:set ipNumber (\$ipNumber+1)\r\
    \n}\r\
    \n记录警告 消息=(\"当前 \" . \$ipNumber . \" 个在线IP地址\")"

再加一个定时器
添加 间隔=1m 名称=global-ip-sync 事件=":执行 \"set-nat-global-ip\"" \
    权限=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    起始日期=oct/16/2018 起始时间=11:07:59
添加 间隔=1m 名称=ip-statistic 事件=":执行 \"ip-number\"" 权限=\
    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon \
    起始时间=startup

搞定

mantouboji 发表于 2023-9-10 15:03

冰雪聪明。不过不要搞这么蹩脚的汉语翻译,把代码放在论坛的“代码”块里

zsecsqawdx 发表于 2023-9-11 10:43

50439488 发表于 2023-9-8 17:27
我没有固定的公网IP,路由每次重启后都得到一个不一样公网IP。你这个脚本会自动的更改映射NAT规则里的外 ...

他就是告诉你“in-interface=你的外网接口”,这个设置就解决动态ip的问题,无需再填变动的WAN的IP地址,定义in-interface就行了。

Jnwei1202 发表于 2023-9-22 23:32

本帖最后由 Jnwei1202 于 2023-9-22 23:48 编辑

那有那么复杂要什么每分钟运行一次判断IP是否改变,只要拔号就改IP
1、建NAT规则,dstnat 的 dst. address,和 src-nat的 To Addresses 可以先随意填,主要是把 规则的 Comment 写上对就PPPOE的拔号名或自己指定。
比如 src-nat就用"SRCNAT-PPPOE-OUT1",dstnat就用"DSTNAT-PPPOE-OUT1"

2、在PPP里建一个PPPOE用的Profiles,在Profiles的Scripts 里写脚本。只要拔号就运行脚本修改,相关的NAT规则的IP。
#启用PPPoE线路SRCNAT
/ip firewall nat set [ find comment="SRCNAT-PPPOE-OUT1" ] to-addresses=$"local-address"
#启用PPPoE线路DSTNAT
/ip firewall nat set [ find comment="DSTNAT-PPPOE-OUT1" ] dst-address=$"local-address"


页: [1] 2
查看完整版本: 恳请大佬帮忙修改ROS自动获取修改端口映射命令