「MAC」アドレスに「iptables」ルールを変更する

「MAC」アドレスに「iptables」ルールを変更する

私はVPNに接続されたゲートウェイを使用して産業用LAN要素のポートを転送します。

ブラウザで iptables を使用してゲートウェイの 80/443 ポートへのアクセスを転送し、プロジェクトの 80/443 ポートの内容を表示します。

iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.37 --dport 80 -j MASQUERADE 

iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.37 --dport 443 -j MASQUERADE 

iptables -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j DNAT --to 192.168.1.37:80 

iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j DNAT --to 192.168.1.37:80 

問題は、この要素がルーターを再起動するか、DHCPサーバーを介して期限切れになり、ローカルIPアドレスを変更することがあることです。これを行うために、IPアドレスの代わりにMACを介した転送が可能かどうかを知りたいです。

次の操作を試しましたが、機能しませんiptables -t nat -A POSTROUTING -p tcp -m mac --mac-source AA:BB:CC:DD:EE:FF --dport 80 -j MASQUERADEiptables: Invalid argument. Run 'dmesg' for more information.

スクリプトを使用した更新

bashこの問題を解決するために、MACアドレスを確認し、対応するIPアドレスを返してiptablesルールを作成するスクリプトを開発しました。主なアイデアは、時々起動スクリプトを使用することですcrontab

スクリプトは次のとおりです。

#!/bin/bash

vpnip=10.2.10.1
subred=192.168.1.0/24
mac=aa:bb:cc:11:22:33 # lowercase
ip=$(nmap -sP $subred >/dev/null && arp -an | grep $mac | awk '{print $2}' | sed 's/[()]//g')


if [  $ip  ]; then
    echo "IP address found: $ip"
    iptables -t nat -A POSTROUTING -p tcp -d $ip --dport 80 -j MASQUERADE 
    iptables -t nat -A POSTROUTING -p tcp -d $ip --dport 443 -j MASQUERADE 
    iptables -t nat -A PREROUTING -i br0 -p tcp --dport 80 -j DNAT --to $ip:80 
    iptables -t nat -A PREROUTING -i br0 -p tcp --dport 443 -j DNAT --to $ip:443
    iptables -t nat -A PREROUTING -d $vpnip -p tcp -m multiport --dports 80,443 -j DNAT --to-destination $ip:80
    iptables --table nat --list 
else
    echo "IP not found"
fi

スクリプトが正常に実行されます。ただし、iptables規則が定期的に公開されると繰り返しになります。

ルールを書き換える前にこれらのルールが存在するかどうかを確認する方法はありますか?それとも最初に削除しますか?

答え1

ルールを書き換える前にこれらのルールが存在するかどうかを確認する方法はありますか?それとも最初に削除しますか?

iptablesに-Cオプションを使用できます。追加man iptables情報。ルールを含む配列を作成し、ルールをチェーンに追加する前にルールが存在することを確認するのがきちんとしたアプローチだと思います。

スクリプト例:

#!/bin/bash

ip='1.1.1.1'
ip2='8.8.8.8'

rules=(
"INPUT -s $ip -j DROP"
"INPUT -s $ip2 -j DROP"
)

for rule in "${rules[@]}"; do
    if ! iptables -C $rule 2> /dev/null; then
        echo "Adding rule \"$rule\""
        iptables -A $rule
    fi
done

関連情報