| #!/bin/sh /etc/rc.common |
| # |
| # Copyright (c) 2022, The OpenThread Authors. |
| # All rights reserved. |
| # |
| # Redistribution and use in source and binary forms, with or without |
| # modification, are permitted provided that the following conditions are met: |
| # 1. Redistributions of source code must retain the above copyright |
| # notice, this list of conditions and the following disclaimer. |
| # 2. Redistributions in binary form must reproduce the above copyright |
| # notice, this list of conditions and the following disclaimer in the |
| # documentation and/or other materials provided with the distribution. |
| # 3. Neither the name of the copyright holder nor the |
| # names of its contributors may be used to endorse or promote products |
| # derived from this software without specific prior written permission. |
| # |
| # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| # POSSIBILITY OF SUCH DAMAGE. |
| # |
| |
| START=89 |
| |
| USE_PROCD=1 |
| |
| OTBR_FORWARD_INGRESS_CHAIN="OTBR_FORWARD_INGRESS" |
| THREAD_IF_BACKUP_FILE="/tmp/otbr-firewall" |
| |
| ipset_destroy_if_exist() |
| { |
| if ipset list "$1"; then |
| ipset destroy "$1" |
| fi |
| } |
| |
| stop_service() |
| { |
| if [ -f "$THREAD_IF_BACKUP_FILE" ]; then |
| THREAD_IF_NAME=$(cat $THREAD_IF_BACKUP_FILE) |
| |
| while ip6tables -C FORWARD -o $THREAD_IF_NAME -j $OTBR_FORWARD_INGRESS_CHAIN; do |
| ip6tables -D FORWARD -o $THREAD_IF_NAME -j $OTBR_FORWARD_INGRESS_CHAIN |
| done |
| |
| if ip6tables -L $OTBR_FORWARD_INGRESS_CHAIN; then |
| ip6tables -w -F $OTBR_FORWARD_INGRESS_CHAIN |
| ip6tables -w -X $OTBR_FORWARD_INGRESS_CHAIN |
| fi |
| |
| ipset_destroy_if_exist otbr-ingress-deny-src |
| ipset_destroy_if_exist otbr-ingress-deny-src-swap |
| ipset_destroy_if_exist otbr-ingress-allow-dst |
| ipset_destroy_if_exist otbr-ingress-allow-dst-swap |
| |
| rm $THREAD_IF_BACKUP_FILE |
| fi |
| } |
| |
| start_service() |
| { |
| THREAD_IF_NAME=$(uci -q get otbr-agent.service.thread_if_name) |
| echo "$THREAD_IF_NAME" > "$THREAD_IF_BACKUP_FILE" |
| |
| ipset create -exist otbr-ingress-deny-src hash:net family inet6 |
| ipset create -exist otbr-ingress-deny-src-swap hash:net family inet6 |
| ipset create -exist otbr-ingress-allow-dst hash:net family inet6 |
| ipset create -exist otbr-ingress-allow-dst-swap hash:net family inet6 |
| |
| ip6tables -N $OTBR_FORWARD_INGRESS_CHAIN |
| ip6tables -I FORWARD 1 -o $THREAD_IF_NAME -j $OTBR_FORWARD_INGRESS_CHAIN |
| |
| ip6tables -A $OTBR_FORWARD_INGRESS_CHAIN -m pkttype --pkt-type unicast -i $THREAD_IF_NAME -p ip -j DROP |
| ip6tables -A $OTBR_FORWARD_INGRESS_CHAIN -m set --match-set otbr-ingress-deny-src src -p ip -j DROP |
| ip6tables -A $OTBR_FORWARD_INGRESS_CHAIN -m set --match-set otbr-ingress-allow-dst dst -p ip -j ACCEPT |
| ip6tables -A $OTBR_FORWARD_INGRESS_CHAIN -m pkttype --pkt-type unicast -p ip -j DROP |
| ip6tables -A $OTBR_FORWARD_INGRESS_CHAIN -p ip -j ACCEPT |
| } |