Bash
通過“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 地址;我們無權訪問。為此,我想知道是否可以通過您的 MAC 進行轉發而不是通過您的 IP 地址。
我試圖做類似的事情,但它不起作用:
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
規則定期發佈時,它們就會重複。有沒有辦法在再次編寫這些規則之前檢查它們是否存在?還是先刪除它們?
有沒有辦法在再次編寫這些規則之前檢查它們是否存在?還是先刪除它們?
您可以對 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