42 lines
1 KiB
Go
42 lines
1 KiB
Go
package iptables
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
)
|
|
|
|
func addRule(args ...string) error {
|
|
return exec.Command("iptables", append([]string{"-t", "nat", "-A"}, args...)...).Run()
|
|
}
|
|
|
|
func deleteRule(args ...string) error {
|
|
return exec.Command("iptables", append([]string{"-t", "nat", "-D"}, args...)...).Run()
|
|
}
|
|
|
|
func AddMetadataRedirect(vmIP, gatewayIP, metadataPort string) error {
|
|
if err := addRule("PREROUTING",
|
|
"-s", vmIP+"/32",
|
|
"-d", "169.254.169.254/32",
|
|
"-p", "tcp", "-m", "tcp",
|
|
"--dport", "80",
|
|
"-j", "DNAT",
|
|
"--to-destination", gatewayIP+":"+metadataPort,
|
|
); err != nil {
|
|
return fmt.Errorf("iptables metadata redirect: %w", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func DeleteMetadataRedirect(vmIP, gatewayIP, metadataPort string) error {
|
|
if err := deleteRule("PREROUTING",
|
|
"-s", vmIP+"/32",
|
|
"-d", "169.254.169.254/32",
|
|
"-p", "tcp", "-m", "tcp",
|
|
"--dport", "80",
|
|
"-j", "DNAT",
|
|
"--to-destination", gatewayIP+":"+metadataPort,
|
|
); err != nil {
|
|
return fmt.Errorf("iptables delete metadata redirect: %w", err)
|
|
}
|
|
return nil
|
|
}
|