golang简单直观的Linux服务器IPTables转发管理插件fwdctl的使用

fwdctl - Golang简单直观的Linux服务器IPTables转发管理插件

fwdctl

fwdctl是一个简单直观的CLI工具,用于管理Linux服务器中的端口转发规则。

工作原理

fwdctl本质上提供了一系列命令来管理端口转发,底层使用的是iptables。

举个例子:

假设你有一个hypervisor服务器,里面运行着一些虚拟机。如果你需要暴露其中一台虚拟机上的内部服务,你可以使用fwdctl从hypervisor上添加转发规则来暴露这个服务。

示例

要实现这个功能,你只需要输入以下简单命令:

sudo fwdctl create --destination-port 3000 --source-address 192.168.199.105 --source-port 80

安装方法

Linux x86_64

curl -s https://raw.githubusercontent.com/alegrey91/fwdctl/main/install | sudo sh

Seccomp (实验性功能)

最近添加了一个新功能,可以在测试流水线中追踪fwdctl使用的系统调用。

这是通过使用另一个项目harpoon实现的。

有了这个功能,在流水线结束时,我们会得到一个seccomp配置文件作为产物。你可以使用这个文件以更安全的方式运行fwdctl。

完整示例

以下是一个完整的Go代码示例,展示如何使用fwdctl的Go API来管理转发规则:

package main

import (
	"fmt"
	"github.com/alegrey91/fwdctl/pkg/forward"
)

func main() {
	// 创建一个新的转发规则
	fwd := forward.Forward{
		SourceAddress:  "192.168.199.105",
		SourcePort:     80,
		DestinationPort: 3000,
	}

	// 添加转发规则
	err := fwd.Create()
	if err != nil {
		fmt.Printf("创建转发规则失败: %v\n", err)
		return
	}
	fmt.Println("转发规则创建成功")

	// 列出所有转发规则
	forwards, err := forward.List()
	if err != nil {
		fmt.Printf("获取转发规则列表失败: %v\n", err)
		return
	}
	fmt.Println("当前转发规则:")
	for _, f := range forwards {
		fmt.Printf("%+v\n", f)
	}

	// 删除转发规则
	err = fwd.Delete()
	if err != nil {
		fmt.Printf("删除转发规则失败: %v\n", err)
		return
	}
	fmt.Println("转发规则删除成功")
}

使用说明

fwdctl提供了以下主要命令:

  • create: 创建新的转发规则
  • list: 列出所有转发规则
  • delete: 删除转发规则
  • flush: 清除所有转发规则

每个命令都有详细的帮助信息,可以通过--help参数查看:

fwdctl create --help

更多关于golang简单直观的Linux服务器IPTables转发管理插件fwdctl的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单直观的Linux服务器IPTables转发管理插件fwdctl的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


fwdctl - 简单直观的Linux服务器IPTables转发管理工具

fwdctl是一个用Go语言编写的轻量级工具,用于简化Linux服务器上的IPTables端口转发规则管理。它提供了直观的命令行界面,使得添加、删除和查看转发规则变得非常简单。

安装fwdctl

# 下载预编译二进制文件
wget https://github.com/example/fwdctl/releases/latest/download/fwdctl-linux-amd64 -O /usr/local/bin/fwdctl
chmod +x /usr/local/bin/fwdctl

# 或者从源码编译
go install github.com/example/fwdctl@latest

基本使用

1. 添加转发规则

# 将本机8080端口转发到192.168.1.100的80端口
fwdctl add 8080 192.168.1.100:80

2. 列出所有规则

fwdctl list

3. 删除转发规则

# 删除8080端口的转发规则
fwdctl del 8080

Go代码示例

以下是fwdctl核心功能的Go实现示例:

package main

import (
	"fmt"
	"os"
	"os/exec"
	"strings"
)

func addForward(localPort string, remoteAddr string) error {
	// 启用IP转发
	exec.Command("sysctl", "-w", "net.ipv4.ip_forward=1").Run()

	// 添加NAT规则
	cmd := exec.Command("iptables", "-t", "nat", "-A", "PREROUTING", 
		"-p", "tcp", "--dport", localPort, 
		"-j", "DNAT", "--to-destination", remoteAddr)
	if err := cmd.Run(); err != nil {
		return fmt.Errorf("failed to add NAT rule: %v", err)
	}

	// 添加转发规则
	cmd = exec.Command("iptables", "-A", "FORWARD", 
		"-p", "tcp", "-d", strings.Split(remoteAddr, ":")[0], 
		"--dport", strings.Split(remoteAddr, ":")[1], "-j", "ACCEPT")
	if err := cmd.Run(); err != nil {
		return fmt.Errorf("failed to add forward rule: %v", err)
	}

	return nil
}

func deleteForward(localPort string) error {
	// 列出所有NAT规则
	cmd := exec.Command("iptables", "-t", "nat", "-L", "PREROUTING", "--line-numbers")
	output, err := cmd.Output()
	if err != nil {
		return fmt.Errorf("failed to list rules: %v", err)
	}

	// 查找匹配的规则
	lines := strings.Split(string(output), "\n")
	for _, line := range lines {
		if strings.Contains(line, "dpt:"+localPort) {
			fields := strings.Fields(line)
			if len(fields) > 0 {
				// 删除NAT规则
				cmd = exec.Command("iptables", "-t", "nat", "-D", "PREROUTING", fields[0])
				if err := cmd.Run(); err != nil {
					return fmt.Errorf("failed to delete NAT rule: %v", err)
				}
			}
		}
	}

	return nil
}

func listForwards() error {
	cmd := exec.Command("iptables", "-t", "nat", "-L", "PREROUTING")
	cmd.Stdout = os.Stdout
	return cmd.Run()
}

func main() {
	if len(os.Args) < 2 {
		fmt.Println("Usage: fwdctl [add|del|list] [args]")
		os.Exit(1)
	}

	switch os.Args[1] {
	case "add":
		if len(os.Args) != 4 {
			fmt.Println("Usage: fwdctl add <local-port> <remote-ip:port>")
			os.Exit(1)
		}
		if err := addForward(os.Args[2], os.Args[3]); err != nil {
			fmt.Println("Error:", err)
			os.Exit(1)
		}
	case "del":
		if len(os.Args) != 3 {
			fmt.Println("Usage: fwdctl del <local-port>")
			os.Exit(1)
		}
		if err := deleteForward(os.Args[2]); err != nil {
			fmt.Println("Error:", err)
			os.Exit(1)
		}
	case "list":
		if err := listForwards(); err != nil {
			fmt.Println("Error:", err)
			os.Exit(1)
		}
	default:
		fmt.Println("Unknown command:", os.Args[1])
		os.Exit(1)
	}
}

高级功能

  1. 持久化规则

    # 保存当前规则
    fwdctl save
    
    # 恢复保存的规则
    fwdctl restore
    
  2. 批量操作

    # 从文件批量添加规则
    fwdctl batch-add rules.txt
    
  3. 规则检查

    # 检查特定端口是否被转发
    fwdctl check 8080
    

注意事项

  1. 需要以root权限运行fwdctl
  2. 确保系统已安装iptables
  3. 持久化规则需要额外的步骤(如安装iptables-persistent)

fwdctl通过简化复杂的iptables命令,使得端口转发管理变得更加直观和高效,特别适合需要频繁管理转发规则的服务器管理员使用。

回到顶部