<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>ip分流 on 華鳥風月</title>
    <link>https://blog.9-ch.com/tags/ip%E5%88%86%E6%B5%81/</link>
    <description>Recent content in ip分流 on 華鳥風月</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <lastBuildDate>Thu, 09 Mar 2023 15:31:37 +0800</lastBuildDate><atom:link href="https://blog.9-ch.com/tags/ip%E5%88%86%E6%B5%81/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>RouterOS 通过 OSPF IP分流非CN流量</title>
      <link>https://blog.9-ch.com/post/homelab-no-cn-routes/</link>
      <pubDate>Thu, 09 Mar 2023 15:31:37 +0800</pubDate>
      
      <guid>https://blog.9-ch.com/post/homelab-no-cn-routes/</guid>
      <description>ROS ip 分流方案</description>
      <content:encoded><![CDATA[<p>主要适用于不想折腾PS/XBOX/Switch设备网关配置,又不希望出口网关为卵漏油/AIB的,或者怕折腾网络时家里断网影响家人的场景</p>
<h3 id="更新">更新</h3>
<ul>
<li>2022-06-18: 高版本ROS建立邻居困难问题建议尝试PTP/PTMP模式,并且对齐两侧参数(hello、dead count等),并检查224.0.0.0组播地址范围有无防火墙/路由规则影响导致的不可达问题</li>
<li>2023-01-28: 更新探针脚本, 调整文档结构</li>
</ul>
<h3 id="相关硬件">相关硬件</h3>
<ul>
<li>
<p>Mikrotik AC^2 (ros stable 7.2.3*)</p>
</li>
<li>
<p>NUC5i5MYBE (debian 11)</p>
<p>*<em>该版本OSPF似乎有bug,测试邻居离线时出现过一次不能自动删除路由,建议还是LT版本</em></p>
</li>
</ul>
<h3 id="网络结构">网络结构</h3>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span><span class="lnt">7
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">AC^2--ETH1(192.168.0.254)--(192.168.0.1)光猫--Internet
</span></span><span class="line"><span class="cl">    |
</span></span><span class="line"><span class="cl">    |-ETH2-| birdge:lan
</span></span><span class="line"><span class="cl">    |-ETH3-| ip:192.168.1.1
</span></span><span class="line"><span class="cl">    |-ETH4-|----&gt; 192.168.1.0/24 SW
</span></span><span class="line"><span class="cl">    |
</span></span><span class="line"><span class="cl">    |-ETH5(192.168.255.1)--(192.168.255.254)NUC
</span></span></code></pre></td></tr></table>
</div>
</div><p>相关网段划分:</p>
<ul>
<li>192.168.0.0/24 &ndash;光猫/WAN口网段</li>
<li>192.168.1.0/24 &ndash;普通设备网段</li>
<li>192.168.255.0/24 &ndash;NUC网段</li>
</ul>
<h3 id="基础防火墙配置">基础防火墙配置</h3>
<p>不建议无脑抄,大部分配置有comment,建议按需添加</p>
<p>LAN包含lan桥ether5,WAN包括pppoe-out</p>
<details>
  <summary>ROS IPV4防火墙(较长已折叠)</summary>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span><span class="lnt">33
</span><span class="lnt">34
</span><span class="lnt">35
</span><span class="lnt">36
</span><span class="lnt">37
</span><span class="lnt">38
</span><span class="lnt">39
</span><span class="lnt">40
</span><span class="lnt">41
</span><span class="lnt">42
</span><span class="lnt">43
</span><span class="lnt">44
</span><span class="lnt">45
</span><span class="lnt">46
</span><span class="lnt">47
</span><span class="lnt">48
</span><span class="lnt">49
</span><span class="lnt">50
</span><span class="lnt">51
</span><span class="lnt">52
</span><span class="lnt">53
</span><span class="lnt">54
</span><span class="lnt">55
</span><span class="lnt">56
</span><span class="lnt">57
</span><span class="lnt">58
</span><span class="lnt">59
</span><span class="lnt">60
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">/ip firewall address-list
</span></span><span class="line"><span class="cl">add address=0.0.0.0/8 comment=&#34;defconf: RFC6890&#34; list=no_forward_ipv4
</span></span><span class="line"><span class="cl">add address=169.254.0.0/16 comment=&#34;defconf: RFC6890&#34; list=no_forward_ipv4
</span></span><span class="line"><span class="cl">add address=224.0.0.0/4 comment=&#34;defconf: multicast&#34; list=no_forward_ipv4
</span></span><span class="line"><span class="cl">add address=255.255.255.255 comment=&#34;defconf: RFC6890&#34; list=no_forward_ipv4
</span></span><span class="line"><span class="cl">add address=192.168.233.233 list=BOT
</span></span><span class="line"><span class="cl">add address=192.168.0.0/16 list=private
</span></span><span class="line"><span class="cl">add address=10.0.0.0/8 list=private
</span></span><span class="line"><span class="cl">add address=172.16.0.0/12 list=private
</span></span><span class="line"><span class="cl">/ip firewall filter
</span></span><span class="line"><span class="cl">add action=drop chain=input comment=ANTI-BOT disabled=yes src-address-list=\
</span></span><span class="line"><span class="cl">    BOT
</span></span><span class="line"><span class="cl">add action=accept chain=input comment=Accept-OSPF protocol=ospf
</span></span><span class="line"><span class="cl">add action=accept chain=input comment=Accept-LAN-DNS dst-address=192.168.1.1 \
</span></span><span class="line"><span class="cl">    dst-port=53 protocol=udp
</span></span><span class="line"><span class="cl">add action=accept chain=input comment=Accept-NTP dst-port=123 protocol=udp
</span></span><span class="line"><span class="cl">add action=drop chain=input comment=BLOCK-DNS dst-port=53 in-interface-list=\
</span></span><span class="line"><span class="cl">    WAN protocol=udp
</span></span><span class="line"><span class="cl">add action=drop chain=input comment=BLOCK-DoT dst-port=53 in-interface-list=\
</span></span><span class="line"><span class="cl">    WAN protocol=tcp
</span></span><span class="line"><span class="cl">add action=drop chain=input comment=BLOCK-HTTP dst-port=80 in-interface-list=\
</span></span><span class="line"><span class="cl">    WAN protocol=tcp
</span></span><span class="line"><span class="cl">add action=drop chain=input comment=BLOCK-HTTPS dst-port=443 \
</span></span><span class="line"><span class="cl">    in-interface-list=WAN protocol=tcp
</span></span><span class="line"><span class="cl">add action=accept chain=input comment=\
</span></span><span class="line"><span class="cl">    &#34;defconf: accept established,related,untracked&#34; connection-state=\
</span></span><span class="line"><span class="cl">    established,related,untracked
</span></span><span class="line"><span class="cl">add action=drop chain=input comment=&#34;defconf: drop invalid&#34; connection-state=\
</span></span><span class="line"><span class="cl">    invalid
</span></span><span class="line"><span class="cl">add action=accept chain=input comment=&#34;defconf: accept ICMP&#34; log-prefix=\
</span></span><span class="line"><span class="cl">    IPv4-ping protocol=icmp
</span></span><span class="line"><span class="cl">add action=accept chain=input comment=\
</span></span><span class="line"><span class="cl">    &#34;defconf: accept to local loopback (for CAPsMAN)&#34; dst-address=127.0.0.1
</span></span><span class="line"><span class="cl">add action=drop chain=input comment=&#34;defconf: drop all not coming from LAN&#34; \
</span></span><span class="line"><span class="cl">    in-interface-list=!LAN
</span></span><span class="line"><span class="cl">add action=accept chain=forward comment=&#34;defconf: accept in ipsec policy&#34; \
</span></span><span class="line"><span class="cl">    ipsec-policy=in,ipsec
</span></span><span class="line"><span class="cl">add action=accept chain=forward comment=&#34;defconf: accept out ipsec policy&#34; \
</span></span><span class="line"><span class="cl">    ipsec-policy=out,ipsec
</span></span><span class="line"><span class="cl">add action=fasttrack-connection chain=forward comment=&#34;defconf: fasttrack&#34; \
</span></span><span class="line"><span class="cl">    connection-state=established,related hw-offload=yes
</span></span><span class="line"><span class="cl">add action=accept chain=forward comment=\
</span></span><span class="line"><span class="cl">    &#34;defconf: accept established,related, untracked&#34; connection-state=\
</span></span><span class="line"><span class="cl">    established,related,untracked
</span></span><span class="line"><span class="cl">add action=drop chain=forward comment=&#34;defconf: drop invalid&#34; \
</span></span><span class="line"><span class="cl">    connection-state=invalid
</span></span><span class="line"><span class="cl">add action=drop chain=forward comment=\
</span></span><span class="line"><span class="cl">    &#34;defconf: drop all from WAN not DSTNATed&#34; connection-nat-state=!dstnat \
</span></span><span class="line"><span class="cl">    connection-state=new in-interface-list=WAN
</span></span><span class="line"><span class="cl">add action=drop chain=forward comment=&#34;defconf: drop bad forward IPs&#34; \
</span></span><span class="line"><span class="cl">    src-address-list=no_forward_ipv4
</span></span><span class="line"><span class="cl">add action=drop chain=forward comment=&#34;defconf: drop bad forward IPs&#34; \
</span></span><span class="line"><span class="cl">    dst-address-list=no_forward_ipv4
</span></span><span class="line"><span class="cl">/ip firewall nat
</span></span><span class="line"><span class="cl">add action=masquerade chain=srcnat comment=&#34;Hairpin NAT&#34; dst-address=\
</span></span><span class="line"><span class="cl">    192.168.1.0/24 out-interface=lan src-address=192.168.1.0/24
</span></span><span class="line"><span class="cl">add action=masquerade chain=srcnat comment=ONU dst-address=192.168.0.0/24 \
</span></span><span class="line"><span class="cl">    src-address=192.168.1.0/24
</span></span><span class="line"><span class="cl">add action=masquerade chain=srcnat comment=&#34;defconf: masquerade&#34; \
</span></span><span class="line"><span class="cl">    ipsec-policy=out,none out-interface-list=WAN
</span></span></code></pre></td></tr></table>
</div>
</div></details>
<h3 id="dns解析">DNS解析</h3>
<h4 id="ros配置">ROS配置</h4>
<p>使用netwatch检查NUC状态,离线时自动将dns切换为公共dns</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">/system script
</span></span><span class="line"><span class="cl">add dont-require-permissions=yes name=use-default-dns owner=admin policy=\
</span></span><span class="line"><span class="cl">    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=&#34;/\
</span></span><span class="line"><span class="cl">    ip/dns/set allow-remote-requests=yes cache-size=4096KiB servers=119.29.29.\
</span></span><span class="line"><span class="cl">    29,223.5.5.5 \r\
</span></span><span class="line"><span class="cl">    \n/ip dns cache flush&#34;
</span></span><span class="line"><span class="cl">add dont-require-permissions=yes name=use-sgw-dns owner=admin policy=\
</span></span><span class="line"><span class="cl">    ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=&#34;/\
</span></span><span class="line"><span class="cl">    ip/dns/set allow-remote-requests=yes cache-size=4096KiB servers=192.168.25\
</span></span><span class="line"><span class="cl">    5.254\r\
</span></span><span class="line"><span class="cl">    \n/ip dns cache flush&#34;
</span></span><span class="line"><span class="cl">/tool netwatch
</span></span><span class="line"><span class="cl">add down-script=use-default-dns host=192.168.255.254 interval=30s up-script=use-sgw-dns
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="可选1921681024网段dns劫持">(可选)192.168.1.0/24网段dns劫持</h4>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">/ip firewall nat
</span></span><span class="line"><span class="cl">add action=dst-nat chain=dstnat comment=&#34;Hijacking for DNS&#34; dst-port=53 \
</span></span><span class="line"><span class="cl">    protocol=udp src-address=192.168.1.0/24 to-addresses=192.168.1.1 \
</span></span><span class="line"><span class="cl">    to-ports=53
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="debian配置">Debian配置</h4>
<p>SmartDNS分流解析</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt install smartdns
</span></span></code></pre></td></tr></table>
</div>
</div><p>配置/etc/smartdns/smartdns.conf 如下</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">bind</span> :53
</span></span><span class="line"><span class="cl">cache-size <span class="m">0</span>
</span></span><span class="line"><span class="cl">prefetch-domain no
</span></span><span class="line"><span class="cl">serve-expired no
</span></span><span class="line"><span class="cl">speed-check-mode ping,tcp:80
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">log-level info
</span></span><span class="line"><span class="cl">log-file /var/log/smartdns.log
</span></span><span class="line"><span class="cl">server 223.5.5.5:53
</span></span><span class="line"><span class="cl">server 119.29.29.29:53
</span></span><span class="line"><span class="cl">server-https https://dns.google/dns-query -check-edns -blacklist-ip -group GFW -exclude-default-group
</span></span><span class="line"><span class="cl">server-https https://1.1.1.1/dns-query -blacklist-ip -group GFW -exclude-default-group
</span></span><span class="line"><span class="cl">server-https https://cloudflare-dns.com/dns-query -blacklist-ip -group GFW -exclude-default-group
</span></span><span class="line"><span class="cl">conf-file /etc/smartdns/gfw.conf
</span></span></code></pre></td></tr></table>
</div>
</div><p>/etc/smartdns/gfw.conf 使用crontab更新</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">0</span> <span class="m">2</span> * * * curl -s https://raw.githubusercontents.com/RyoLee/gfwlist2smartdns/master/run.sh <span class="p">|</span> bash -s -- -o /etc/smartdns/gfw.conf <span class="o">&amp;&amp;</span> /etc/init.d/smartdns reload
</span></span></code></pre></td></tr></table>
</div>
</div><p>最终效果list内走223.5.5.5/119.29.29.29,list外走DoH</p>
<h3 id="ospf路由">OSPF路由</h3>
<h4 id="ros配置-1">ROS配置</h4>
<p>添加防火墙放行</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">/ip firewall mangle
</span></span><span class="line"><span class="cl">add action=mark-routing chain=prerouting new-routing-mark=main passthrough=\
</span></span><span class="line"><span class="cl">    yes protocol=ospf
</span></span><span class="line"><span class="cl">add action=mark-routing chain=prerouting dst-address-list=!private \
</span></span><span class="line"><span class="cl">    in-interface=ether5 new-routing-mark=bypass passthrough=yes
</span></span></code></pre></td></tr></table>
</div>
</div><p>Bypass路由表 &amp; OSPF</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">/routing ospf instance
</span></span><span class="line"><span class="cl">add disabled=no name=sgw router-id=192.168.255.1 routing-table=main
</span></span><span class="line"><span class="cl">/routing ospf area
</span></span><span class="line"><span class="cl">add disabled=no instance=sgw name=sgw
</span></span><span class="line"><span class="cl">/routing table
</span></span><span class="line"><span class="cl">add disabled=no fib name=bypass
</span></span><span class="line"><span class="cl">/ip route
</span></span><span class="line"><span class="cl">add comment=&#34;BYPASS&#34; disabled=no distance=1 dst-address=0.0.0.0/0 \
</span></span><span class="line"><span class="cl">    gateway=pppoe-out pref-src=0.0.0.0 routing-table=bypass scope=30 \
</span></span><span class="line"><span class="cl">    suppress-hw-offload=no target-scope=10
</span></span><span class="line"><span class="cl">/routing ospf interface-template
</span></span><span class="line"><span class="cl">add area=sgw disabled=no interfaces=ether5
</span></span><span class="line"><span class="cl">/routing rule
</span></span><span class="line"><span class="cl">add action=lookup disabled=no routing-mark=bypass table=bypass
</span></span><span class="line"><span class="cl">add action=lookup disabled=no table=main
</span></span></code></pre></td></tr></table>
</div>
</div><h4 id="debian配置-1">Debian配置</h4>
<p>安装bird2</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">apt install bird2
</span></span></code></pre></td></tr></table>
</div>
</div><p>配置/etc/bird/bird.conf (网卡为enp0s25)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span><span class="lnt">30
</span><span class="lnt">31
</span><span class="lnt">32
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">log syslog all;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">router id 192.168.255.254;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">protocol device {
</span></span><span class="line"><span class="cl">	scan time 60;
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">protocol kernel {
</span></span><span class="line"><span class="cl">	ipv4 {
</span></span><span class="line"><span class="cl">	      import none;
</span></span><span class="line"><span class="cl">	      export all;
</span></span><span class="line"><span class="cl">	};
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">protocol static {
</span></span><span class="line"><span class="cl">	ipv4;
</span></span><span class="line"><span class="cl">	include &#34;routes4.conf&#34;;
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">protocol ospf v2 {
</span></span><span class="line"><span class="cl">    ecmp no;
</span></span><span class="line"><span class="cl">  	ipv4 {
</span></span><span class="line"><span class="cl">		export all;
</span></span><span class="line"><span class="cl">	};
</span></span><span class="line"><span class="cl">	area 0.0.0.0 {
</span></span><span class="line"><span class="cl">		interface &#34;enp0s25&#34; {
</span></span><span class="line"><span class="cl">			type broadcast;
</span></span><span class="line"><span class="cl">		};
</span></span><span class="line"><span class="cl">	};
</span></span><span class="line"><span class="cl">}
</span></span></code></pre></td></tr></table>
</div>
</div><p>非CN流量出口为虚拟设备为utun,若使用TProxy则配置为对应的以太网网卡(如本例中enp0s25)</p>
<p><code>/etc/bird/routes4.conf</code> 使用crontab更新</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="m">0</span> <span class="m">2</span> * * * curl -s https://api.9-ch.com/ncr?device<span class="o">=</span>utun  -o /etc/bird/routes4.conf
</span></span><span class="line"><span class="cl"><span class="m">0</span> <span class="m">3</span> */1 * * /etc/init.d/bird reload
</span></span></code></pre></td></tr></table>
</div>
</div><p>心跳检查,若google 204服务检查失败则停止bird触发回落</p>
<p>探针脚本路径 <code>/opt/check/tun.sh</code> (已删除bark推送部分, 可自行按需添加)</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span><span class="lnt">14
</span><span class="lnt">15
</span><span class="lnt">16
</span><span class="lnt">17
</span><span class="lnt">18
</span><span class="lnt">19
</span><span class="lnt">20
</span><span class="lnt">21
</span><span class="lnt">22
</span><span class="lnt">23
</span><span class="lnt">24
</span><span class="lnt">25
</span><span class="lnt">26
</span><span class="lnt">27
</span><span class="lnt">28
</span><span class="lnt">29
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/bash
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="nv">COUNT</span><span class="o">=</span><span class="m">0</span>
</span></span><span class="line"><span class="cl"><span class="nv">MAX_COUNT</span><span class="o">=</span><span class="m">6</span>
</span></span><span class="line"><span class="cl"><span class="k">while</span> <span class="o">[</span> <span class="nv">$COUNT</span> -lt <span class="nv">$MAX_COUNT</span> <span class="o">]</span>
</span></span><span class="line"><span class="cl"><span class="k">do</span>
</span></span><span class="line"><span class="cl">    <span class="nv">SER</span><span class="o">=</span><span class="m">0</span>
</span></span><span class="line"><span class="cl">    <span class="nv">NET</span><span class="o">=</span><span class="m">0</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="k">$(</span>curl --connect-timeout <span class="m">10</span> --interface utun -w <span class="s2">&#34;%{http_code}&#34;</span> -s https://www.google.com/generate_204<span class="k">)</span> -eq <span class="m">204</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nv">NET</span><span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> /etc/init.d/bird status<span class="p">|</span>grep Active<span class="p">|</span>grep -q running<span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nv">SER</span><span class="o">=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="nv">$NET</span> -eq <span class="m">1</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="o">[</span> <span class="nv">$SER</span> -eq <span class="m">0</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">        /etc/init.d/bird start
</span></span><span class="line"><span class="cl">        <span class="c1"># curl -X &#34;POST&#34; &#34;https://******/push&#34; -H &#39;Content-Type: application/json; charset=utf-8&#39; -d $&#39;{&#34;body&#34;: &#34;***隧道已上线&#34;,&#34;device_key&#34;: &#34;******&#34;,&#34;level&#34;: &#34;passive&#34;,&#34;title&#34;: &#34;网络探针&#34;}&#39;</span>
</span></span><span class="line"><span class="cl">        <span class="nb">exit</span> <span class="m">0</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="o">[</span> <span class="nv">$NET</span> -eq <span class="m">0</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="o">[</span> <span class="nv">$SER</span> -eq <span class="m">1</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">        <span class="nb">let</span> <span class="nv">COUNT</span><span class="o">+=</span><span class="m">1</span>
</span></span><span class="line"><span class="cl">        <span class="k">if</span> <span class="o">[</span> <span class="nv">$COUNT</span> -eq <span class="nv">$MAX_COUNT</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
</span></span><span class="line"><span class="cl">            /etc/init.d/bird stop
</span></span><span class="line"><span class="cl">            <span class="c1"># curl -X &#34;POST&#34; &#34;https://******/push&#34; -H &#39;Content-Type: application/json; charset=utf-8&#39; -d $&#39;{&#34;body&#34;: &#34;***隧道已离线&#34;,&#34;device_key&#34;: &#34;******&#34;,&#34;level&#34;: &#34;passive&#34;,&#34;title&#34;: &#34;网络探针&#34;}&#39;</span>
</span></span><span class="line"><span class="cl">            <span class="nb">exit</span> <span class="m">0</span>
</span></span><span class="line"><span class="cl">        <span class="k">fi</span>
</span></span><span class="line"><span class="cl">        <span class="k">continue</span>
</span></span><span class="line"><span class="cl">    <span class="k">fi</span>
</span></span><span class="line"><span class="cl">    <span class="nb">exit</span> <span class="m">0</span>
</span></span><span class="line"><span class="cl"><span class="k">done</span>
</span></span></code></pre></td></tr></table>
</div>
</div><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">* * * * * bash /opt/check/tun.sh
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="ros-ddns失效问题">ROS DDNS失效问题</h3>
<p>见前文<a href="https://blog.9-ch.com/post/homelab-ros-ospf/#ros-ddns%e5%a4%b1%e6%95%88">ros-ddns失效</a></p>
<h3 id="参考信息">参考信息</h3>
<h4 id="同网段分流openwrt方案">同网段分流openwrt方案</h4>
<p>见前文<a href="https://blog.9-ch.com/post/homelab-ros-ospf/">RouterOS 通过 OSPF IP分流至 OpenWrt</a></p>
<p>零散问题比较多, 本方案为基于以上测试经验改进出新方案,非CN IP流量出口改为使用运行debian的一台NUC</p>
]]></content:encoded>
    </item>
    
    <item>
      <title>RouterOS 通过 OSPF IP分流至 OpenWrt</title>
      <link>https://blog.9-ch.com/post/homelab-ros-ospf/</link>
      <pubDate>Wed, 20 Apr 2022 17:59:11 +0800</pubDate>
      
      <guid>https://blog.9-ch.com/post/homelab-ros-ospf/</guid>
      <description>ROS ip 分流方案</description>
      <content:encoded><![CDATA[<h3 id="更新">更新</h3>
<ul>
<li>2022-05-17 修改后的方案(带配置) <a href="https://blog.9-ch.com/post/homelab-no-cn-routes/">RouterOS 通过 OSPF IP分流非CN流量</a></li>
</ul>
<h3 id="组网参考">组网参考</h3>
<p>Reflist:</p>
<ul>
<li><a href="https://www.truenasscale.com/2021/12/13/195.html">使用RouterOS，OSPF 和OpenWRT给国内外 IP 分流</a></li>
<li><a href="https://www.kn1f4.com/news/767.html">RouterOS路由OSPF协议+树莓派分流国外流量</a></li>
</ul>
<p>主要适用于不想折腾PS/XBOX/Switch设备网关配置,又不希望出口网关为卵漏油/AIB的,或者怕折腾网络时家里断网影响家人的</p>
<p>遇到一些问题记录一下</p>
<h3 id="ros-ddns失效">ROS DDNS失效</h3>
<p>表现: 域名解析ip不正确</p>
<p>原因: 分流后ROS内置ip cloud(DDNS)流量同样会被指向OpenWrt导致错误,尝试打标签bypass对应udp流量未成功,因为有公网IP所以直接改为通过域名服务商API更新对应解析为PPPOE接口地址</p>
<p>解决: 修改以下脚本中&quot;CloudFlare variables&quot;段内容即可.原始脚本见<a href="https://github.com/mike6715b/Mikrotik_CF_DDNS">Mikrotik_CF_DDNS</a></p>
<details>
  <summary>Cloudflare DDNS ROS脚本(IPV4)</summary>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">  1
</span><span class="lnt">  2
</span><span class="lnt">  3
</span><span class="lnt">  4
</span><span class="lnt">  5
</span><span class="lnt">  6
</span><span class="lnt">  7
</span><span class="lnt">  8
</span><span class="lnt">  9
</span><span class="lnt"> 10
</span><span class="lnt"> 11
</span><span class="lnt"> 12
</span><span class="lnt"> 13
</span><span class="lnt"> 14
</span><span class="lnt"> 15
</span><span class="lnt"> 16
</span><span class="lnt"> 17
</span><span class="lnt"> 18
</span><span class="lnt"> 19
</span><span class="lnt"> 20
</span><span class="lnt"> 21
</span><span class="lnt"> 22
</span><span class="lnt"> 23
</span><span class="lnt"> 24
</span><span class="lnt"> 25
</span><span class="lnt"> 26
</span><span class="lnt"> 27
</span><span class="lnt"> 28
</span><span class="lnt"> 29
</span><span class="lnt"> 30
</span><span class="lnt"> 31
</span><span class="lnt"> 32
</span><span class="lnt"> 33
</span><span class="lnt"> 34
</span><span class="lnt"> 35
</span><span class="lnt"> 36
</span><span class="lnt"> 37
</span><span class="lnt"> 38
</span><span class="lnt"> 39
</span><span class="lnt"> 40
</span><span class="lnt"> 41
</span><span class="lnt"> 42
</span><span class="lnt"> 43
</span><span class="lnt"> 44
</span><span class="lnt"> 45
</span><span class="lnt"> 46
</span><span class="lnt"> 47
</span><span class="lnt"> 48
</span><span class="lnt"> 49
</span><span class="lnt"> 50
</span><span class="lnt"> 51
</span><span class="lnt"> 52
</span><span class="lnt"> 53
</span><span class="lnt"> 54
</span><span class="lnt"> 55
</span><span class="lnt"> 56
</span><span class="lnt"> 57
</span><span class="lnt"> 58
</span><span class="lnt"> 59
</span><span class="lnt"> 60
</span><span class="lnt"> 61
</span><span class="lnt"> 62
</span><span class="lnt"> 63
</span><span class="lnt"> 64
</span><span class="lnt"> 65
</span><span class="lnt"> 66
</span><span class="lnt"> 67
</span><span class="lnt"> 68
</span><span class="lnt"> 69
</span><span class="lnt"> 70
</span><span class="lnt"> 71
</span><span class="lnt"> 72
</span><span class="lnt"> 73
</span><span class="lnt"> 74
</span><span class="lnt"> 75
</span><span class="lnt"> 76
</span><span class="lnt"> 77
</span><span class="lnt"> 78
</span><span class="lnt"> 79
</span><span class="lnt"> 80
</span><span class="lnt"> 81
</span><span class="lnt"> 82
</span><span class="lnt"> 83
</span><span class="lnt"> 84
</span><span class="lnt"> 85
</span><span class="lnt"> 86
</span><span class="lnt"> 87
</span><span class="lnt"> 88
</span><span class="lnt"> 89
</span><span class="lnt"> 90
</span><span class="lnt"> 91
</span><span class="lnt"> 92
</span><span class="lnt"> 93
</span><span class="lnt"> 94
</span><span class="lnt"> 95
</span><span class="lnt"> 96
</span><span class="lnt"> 97
</span><span class="lnt"> 98
</span><span class="lnt"> 99
</span><span class="lnt">100
</span><span class="lnt">101
</span><span class="lnt">102
</span><span class="lnt">103
</span><span class="lnt">104
</span><span class="lnt">105
</span><span class="lnt">106
</span><span class="lnt">107
</span><span class="lnt">108
</span><span class="lnt">109
</span><span class="lnt">110
</span><span class="lnt">111
</span><span class="lnt">112
</span><span class="lnt">113
</span><span class="lnt">114
</span><span class="lnt">115
</span><span class="lnt">116
</span><span class="lnt">117
</span><span class="lnt">118
</span><span class="lnt">119
</span><span class="lnt">120
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">#########################################################################
</span></span><span class="line"><span class="cl">#         ==================================================            #
</span></span><span class="line"><span class="cl">#         $ Mikrotik RouterOS update script for CloudFlare $            #
</span></span><span class="line"><span class="cl">#         ==================================================            #
</span></span><span class="line"><span class="cl">#                                                                       #
</span></span><span class="line"><span class="cl"># - You need a CloudFlare account &amp; api key (look under settings),      #
</span></span><span class="line"><span class="cl">#   a zone and A record in it                                           #
</span></span><span class="line"><span class="cl"># - All variables in first section are obvious,                         #
</span></span><span class="line"><span class="cl">#   except CFid and CFzoneid                                            #
</span></span><span class="line"><span class="cl"># - Obtain CFzoneid from Cloudflare Dashboard,                          #
</span></span><span class="line"><span class="cl">#   on Overview tab scroll down                                         # 
</span></span><span class="line"><span class="cl">#   To obtain CFid use following command in any unix shell:             #
</span></span><span class="line"><span class="cl">#    curl -X GET &#34;https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records?name=YOUR_DOMAIN&#34; -H &#34;Authorization:Bearer $CFtkn&#34; -H &#34;Content-Type: application/json&#34; | python -mjson.tool
</span></span><span class="line"><span class="cl"># - You can use my Postman script to get those variables                #
</span></span><span class="line"><span class="cl"># - Enable CFDebug if needed - it&#39;ll print some info to logs            #
</span></span><span class="line"><span class="cl"># - Enable CFcloud if you don&#39;t get a public IP on interface            #
</span></span><span class="line"><span class="cl"># - Put script under /system scripts giving &#34;read,write,ftp&#34; policy access.       #
</span></span><span class="line"><span class="cl">#   For 6.29 and older &#34;test&#34; policy is also needed.                    #
</span></span><span class="line"><span class="cl"># - Add script to /system scheduler using it&#39;s name in &#34;on-event&#34;       #
</span></span><span class="line"><span class="cl"># - Requires at least RouterOS 6.44beta75 for multiple header support   #
</span></span><span class="line"><span class="cl">#                                                                       #
</span></span><span class="line"><span class="cl">#              Credits for Samuel Tegenfeldt, CC BY-SA 3.0              #
</span></span><span class="line"><span class="cl">#                        Modified by kiler129                           #
</span></span><span class="line"><span class="cl">#                        Modified by viritt                             #
</span></span><span class="line"><span class="cl">#                        Modified by asuna                              #
</span></span><span class="line"><span class="cl">#                        Modified by mike6715b                          #
</span></span><span class="line"><span class="cl">#                                                                       #
</span></span><span class="line"><span class="cl">#               Tested and working as of February 22, 2021              #
</span></span><span class="line"><span class="cl">#########################################################################
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">################# CloudFlare variables #################
</span></span><span class="line"><span class="cl">:local CFDebug &#34;false&#34;
</span></span><span class="line"><span class="cl">:local CFcloud &#34;false&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:global WANInterface &#34;[YOUR_WAN_INTERFACE_NAME]&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:local CFdomain &#34;[YOUR_DOMAIN]&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:local CFtkn &#34;[YOUR_CF_TOKEN]&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:local CFzoneid &#34;[YOUR_CF_ZONE_ID]&#34;
</span></span><span class="line"><span class="cl">:local CFid &#34;[YOUR_CF_ID]&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:local CFrecordType &#34;&#34;
</span></span><span class="line"><span class="cl">:set CFrecordType &#34;A&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:local CFrecordTTL &#34;&#34;
</span></span><span class="line"><span class="cl">:set CFrecordTTL &#34;60&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">#########################################################################
</span></span><span class="line"><span class="cl">########################  DO NOT EDIT BELOW  ############################
</span></span><span class="line"><span class="cl">#########################################################################
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:log info &#34;Updating $CFDomain ...&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">################# Internal variables #################
</span></span><span class="line"><span class="cl">:local previousIP &#34;&#34;
</span></span><span class="line"><span class="cl">:global WANip &#34;&#34;
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">################# Build CF API Url (v4) #################
</span></span><span class="line"><span class="cl">:local CFurl &#34;https://api.cloudflare.com/client/v4/zones/&#34;
</span></span><span class="line"><span class="cl">:set CFurl ($CFurl . &#34;$CFzoneid/dns_records/$CFid&#34;);
</span></span><span class="line"><span class="cl"> 
</span></span><span class="line"><span class="cl">################# Get or set previous IP-variables #################
</span></span><span class="line"><span class="cl">:if ($CFcloud = &#34;true&#34;) do={
</span></span><span class="line"><span class="cl">    :set WANip [/ip cloud get public-address]
</span></span><span class="line"><span class="cl">};
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:if ($CFcloud = &#34;false&#34;) do={
</span></span><span class="line"><span class="cl">    :local currentIP [/ip address get [/ip address find interface=$WANInterface ] address];
</span></span><span class="line"><span class="cl">    :set WANip [:pick $currentIP 0 [:find $currentIP &#34;/&#34;]];
</span></span><span class="line"><span class="cl">};
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">:if ([/file find name=ddns.tmp.txt] = &#34;&#34;) do={
</span></span><span class="line"><span class="cl">    :log error &#34;No previous ip address file found, createing...&#34;
</span></span><span class="line"><span class="cl">    :set previousIP $WANip;
</span></span><span class="line"><span class="cl">    :execute script=&#34;:put $WANip&#34; file=&#34;ddns.tmp&#34;;
</span></span><span class="line"><span class="cl">    :log info (&#34;CF: Updating CF, setting $CFDomain = $WANip&#34;)
</span></span><span class="line"><span class="cl">    /tool fetch http-method=put mode=https output=none url=&#34;$CFurl&#34; http-header-field=&#34;Authorization:Bearer $CFtkn,content-type:application/json&#34; http-data=&#34;{\&#34;type\&#34;:\&#34;$CFrecordType\&#34;,\&#34;name\&#34;:\&#34;$CFdomain\&#34;,\&#34;ttl\&#34;:$CFrecordTTL,\&#34;content\&#34;:\&#34;$WANip\&#34;}&#34;
</span></span><span class="line"><span class="cl">    :error message=&#34;No previous ip address file found.&#34;
</span></span><span class="line"><span class="cl">} else={
</span></span><span class="line"><span class="cl">    :if ( [/file get [/file find name=ddns.tmp.txt] size] &gt; 0 ) do={ 
</span></span><span class="line"><span class="cl">    :global content [/file get [/file find name=&#34;ddns.tmp.txt&#34;] contents] ;
</span></span><span class="line"><span class="cl">    :global contentLen [ :len $content ] ;  
</span></span><span class="line"><span class="cl">    :global lineEnd 0;
</span></span><span class="line"><span class="cl">    :global line &#34;&#34;;
</span></span><span class="line"><span class="cl">    :global lastEnd 0;   
</span></span><span class="line"><span class="cl">            :set lineEnd [:find $content &#34;\n&#34; $lastEnd ] ;
</span></span><span class="line"><span class="cl">            :set line [:pick $content $lastEnd $lineEnd] ;
</span></span><span class="line"><span class="cl">            :set lastEnd ( $lineEnd + 1 ) ;   
</span></span><span class="line"><span class="cl">            :if ( [:pick $line 0 1] != &#34;#&#34; ) do={   
</span></span><span class="line"><span class="cl">                #:local previousIP [:pick $line 0 $lineEnd ]
</span></span><span class="line"><span class="cl">                :set previousIP [:pick $line 0 $lineEnd ];
</span></span><span class="line"><span class="cl">                :set previousIP [:pick $previousIP 0 [:find $previousIP &#34;\r&#34;]];
</span></span><span class="line"><span class="cl">            }
</span></span><span class="line"><span class="cl">    }
</span></span><span class="line"><span class="cl">}
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl">######## Write debug info to log #################
</span></span><span class="line"><span class="cl">:if ($CFDebug = &#34;true&#34;) do={
</span></span><span class="line"><span class="cl"> :log info (&#34;CF: hostname = $CFdomain&#34;)
</span></span><span class="line"><span class="cl"> :log info (&#34;CF: previousIP = $previousIP&#34;)
</span></span><span class="line"><span class="cl"> :log info (&#34;CF: currentIP = $currentIP&#34;)
</span></span><span class="line"><span class="cl"> :log info (&#34;CF: WANip = $WANip&#34;)
</span></span><span class="line"><span class="cl"> :log info (&#34;CF: CFurl = $CFurl&amp;content=$WANip&#34;)
</span></span><span class="line"><span class="cl"> :log info (&#34;CF: Command = \&#34;/tool fetch http-method=put mode=https url=\&#34;$CFurl\&#34; http-header-field=&#34;Authorization:Bearer $CFtkn,content-type:application/json&#34; output=none http-data=\&#34;{\&#34;type\&#34;:\&#34;$CFrecordType\&#34;,\&#34;name\&#34;:\&#34;$CFdomain\&#34;,\&#34;ttl\&#34;:$CFrecordTTL,\&#34;content\&#34;:\&#34;$WANip\&#34;}\&#34;&#34;)
</span></span><span class="line"><span class="cl">};
</span></span><span class="line"><span class="cl">  
</span></span><span class="line"><span class="cl">######## Compare and update CF if necessary #####
</span></span><span class="line"><span class="cl">:if ($previousIP != $WANip) do={
</span></span><span class="line"><span class="cl"> :log info (&#34;CF: Updating CF, setting $CFDomain = $WANip&#34;)
</span></span><span class="line"><span class="cl"> /tool fetch http-method=put mode=https url=&#34;$CFurl&#34; http-header-field=&#34;Authorization:Bearer $CFtkn,content-type:application/json&#34; output=none http-data=&#34;{\&#34;type\&#34;:\&#34;$CFrecordType\&#34;,\&#34;name\&#34;:\&#34;$CFdomain\&#34;,\&#34;ttl\&#34;:$CFrecordTTL,\&#34;content\&#34;:\&#34;$WANip\&#34;}&#34;
</span></span><span class="line"><span class="cl"> /ip dns cache flush
</span></span><span class="line"><span class="cl">    :if ( [/file get [/file find name=ddns.tmp.txt] size] &gt; 0 ) do={
</span></span><span class="line"><span class="cl">        /file remove ddns.tmp.txt
</span></span><span class="line"><span class="cl">        :execute script=&#34;:put $WANip&#34; file=&#34;ddns.tmp&#34;
</span></span><span class="line"><span class="cl">    }
</span></span><span class="line"><span class="cl">} else={
</span></span><span class="line"><span class="cl"> :log info &#34;CF: No Update Needed!&#34;
</span></span><span class="line"><span class="cl">}
</span></span></code></pre></td></tr></table>
</div>
</div></details>
<h3 id="tcp流量握手缓慢">TCP流量握手缓慢</h3>
<p>表现: 访问网站时打开缓慢,F12查看SSL阶段时间长度接近甚至超过10秒</p>
<p>原因: OP与ROS在同一网段,进出流量路由不对称,触发ROS防火墙动作</p>
<p>解决: 禁用ROS防火墙drop invalid规则(位于ip-firewall-filter rules)</p>
<h3 id="icmpping异常">ICMP(Ping)异常</h3>
<p>表现: ping 被分流网段ip时黑洞</p>
<p>原因: 出口Op通过TProxy只能处理TCP/UDP流量</p>
<p>解决:</p>
<ul>
<li>A: Op添加 ICMP劫持(假响应,可规避一些软件的报错)</li>
<li>B: ROS给ICMP流量打上bypass的route标签,再创建一个bypass路由表,该表不包含OSPF宣告的分流规则,所以如果没有被ISP之类的劫持就是裸连的真响应</li>
</ul>
<h3 id="openwrt无法与被分流网段通信循环">Openwrt无法与被分流网段通信(循环)</h3>
<p>表现: OpenWrt与被分流网段通信时不通</p>
<p>原因: ROS接到宣告的表后循环Op-&gt;ROS-&gt;Op-&gt;&hellip;</p>
<p>解决: 给Op流量打上标签,直接走bypass表</p>
<p>防火墙规则(Mangle)可参考</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">chain=prerouting action=mark-routing new-routing-mark=bypass passthrough=yes src-address=[BYPASS_DEVICE_IP] dst-address-list=!private log=no log-prefix=&#34;&#34;
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="dns-cdn优化">DNS CDN优化</h3>
<p>表现: 不需要分流区域域名CDN解析为分流区域</p>
<p>原因: Op全局流量隧道,DNS解析也被隧道处理,导致CDN失效</p>
<p>解决: dnsmasq-full分流list外走国内DNS服务,list内走DoH,Op故障时回落全国内DNS服务</p>
<h3 id="openwrt访问内网异常">OpenWrt访问内网异常</h3>
<p>表现: Op所在子网广播域外的其他子网访问Op时,无法正常响应</p>
<p>原因: Op走了bypass表,未添加其他子网路由,下一跳直接从pppoe-out出去了</p>
<p>解决: 防火墙匹配src address为op的ip,dst address为需要支持访问子网流量打上main标签走main路由表</p>
]]></content:encoded>
    </item>
    
  </channel>
</rss>
