"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 MASQUERADE.iptables: 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

관련 정보