golang简单直观的Linux服务器IPTables转发管理插件fwdctl的使用
fwdctl - Golang简单直观的Linux服务器IPTables转发管理插件
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
更多关于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)
}
}
高级功能
-
持久化规则:
# 保存当前规则 fwdctl save # 恢复保存的规则 fwdctl restore
-
批量操作:
# 从文件批量添加规则 fwdctl batch-add rules.txt
-
规则检查:
# 检查特定端口是否被转发 fwdctl check 8080
注意事项
- 需要以root权限运行fwdctl
- 确保系统已安装iptables
- 持久化规则需要额外的步骤(如安装iptables-persistent)
fwdctl通过简化复杂的iptables命令,使得端口转发管理变得更加直观和高效,特别适合需要频繁管理转发规则的服务器管理员使用。