Ubuntu防火墙 UFW做NAT转换,IP伪装,端口重定向,端口映射
ip伪装:在ubuntu里,nat被称为ip伪装,意为"允许来自内网口eno1上使用私网地址(如10.0.0.0/20)的计算机共享外网口eno2上的单个IP地址"
端口重定向:要将外网口eno2上的某个端口转发到位于内网地址10.0.0.X上的某个端口,比如将外网口eno2上的tcp端口80转发到位于10.0.0.3的Web服务器。

2 UFW基本操作:
2.1查看当前状态和防火墙规则

ufw status    #Status: active服务激活;如果没有配置规则,将不显示防火墙规则

2.2设置默认动作

ufw default allow/deny    #对未配置的端口执行默认允许/拒绝动作

2.3添加允许/拒绝端口的规则

ufw allow 22/tcp    #允许22 tcp封包;还可以换成22/udp,表示允许22端口udp封包
ufw deny 22       #拒绝22端口 (udp+tcp)

2.4删除允许/拒绝端口的规则

ufw delete allow/deny 20    #删除规则同添加一致 添加22/tcp就删除22/tcp,不能删除22

2.5启动/关闭/重载防火墙
通过ssh远程连接建议先设置22/tcp允许规则再启动防火墙服务

ufw enable/disable/reload

3防火墙配置转发
3.1首先开启系统的IP转发

vim /etc/sysctl.conf

net.ipv4.ip_forward = 1    #增加或修改该字段,值设为1

3.2生效

sysctl -p

3.3设置防火墙的转发(修改俩个配置文件)
3.3.1修改 /etc/default/ufw
vim /etc/default/ufw

DEFAULT_FORWARD_POLICY="ACCEPT"    #该值设为ACCEPT

注意:
# 默认规则内容都包含在 *filter…COMMIT内
# 添加如下内容时注意 *nat…COMMIT不能放在 *filter…COMMIT内
#10.0.0.0/20是内网网段

3.3.2修改 /etc/ufw/before.rules

vim /etc/ufw/before.rules
#在末尾增加以下字段

*nat
:PREROUTING - [0:0]
:POSTROUTING - [0:0]
-A POSTROUTING -s 10.0.0.0/20 -o eno2 -j MASQUERADE
COMMIT

3.3.3重启防火墙,成功

ufw disable
ufw enable

4设置端口重定向:
4.1将外网口eno2上的tcp端口80转发到位于10.0.0.3的Web服务器。
4.1.1编辑/etc/ufw/sysctl.conf

vim /etc/ufw/sysctl.conf

net.ipv4.ip_forward=1

4.1.2编辑 /etc/ufw/before.rules,并在nat段里增加
vim /etc/ufw/before.rules

-A PREROUTING -p tcp -i eno2 --dport 80 -j DNAT --to-destination 10.0.0.3:80

4.1.3增加ufw规则

ufw route allow in on eno2 to 10.0.0.3 port 80 proto tcp
ufw allow 80
#删除以上ufw添加的从eno2口进来并转发到10.0.0.3端口80的数据:
ufw route delete allow in on eno2 to 10.0.0.3 port 80 proto tcp
#拒绝从eno2口进来转发到主机10.0.0.3端口22的数据:
ufw route reject in on eno2 to 10.0.0.3 port 80

4.1.4重启ufw

ufw reload

Go语言教程之边写边学:映射map

在本教程中,您将了解什么是map数据类型以及何时在Golang中使用它。

映射是一种数据结构,它为您提供键/值对的无序集合(映射有时也称为PHP中的关联数组、Java中的哈希表或Python中的字典)。映射用于通过其关联的键查找值。您可以基于键将值存储到映射中。

映射的优势在于它能够根据键快速检索数据。键的工作方式类似于索引,指向与该键关联的值。

映射是使用哈希表实现的,哈希表提供了对数据元素的更快查找,您可以通过提供键轻松检索值。映射是无序集合,无法预测键/值对的返回顺序。对映射的每次迭代都可能返回不同的顺序。

 

map初始化

在Golang中,地图是用大括号写的,它们有键和值。

package main
 
import "fmt"
 
var employee = map[string]int{"Mark": 10, "Sandy": 20}
 
func main() {
	fmt.Println(employee)
}

 

空map声明

创建将字符串作为键类型且int作为值类型的员工map

package main
 
import "fmt"
 
func main() {
	var employee = map[string]int{}
	fmt.Println(employee)        // map[]
	fmt.Printf("%T\n", employee) // map[string]int
}

 

使用make函数进行map声明

make函数将映射的类型作为参数,并返回初始化的映射。

package main
 
import "fmt"
 
func main() {
	var employee = make(map[string]int)
	employee["Mark"] = 10
	employee["Sandy"] = 20
	fmt.Println(employee)
 
	employeeList := make(map[string]int)
	employeeList["Mark"] = 10
	employeeList["Sandy"] = 20
	fmt.Println(employeeList)
}

 

map长度

要确定map有多少项(键值对),请使用内置的len()函数。len()函数将为未初始化的映射返回零。

package main
 
import "fmt"
 
func main() {
	var employee = make(map[string]int)
	employee["Mark"] = 10
	employee["Sandy"] = 20
 
	employeeList := make(map[string]int)
 
	fmt.Println(len(employee))     // 2
	fmt.Println(len(employeeList)) // 0
}

 

访问元素

您可以通过引用map的键名称(在方括号内)来访问map的项目。

package main
 
import "fmt"
 
func main() {
	var employee = map[string]int{"Mark": 10, "Sandy": 20}
 
	fmt.Println(employee["Mark"])
}

 

添加元素

通过使用新的索引键并为其分配值,可以将项添加到map中。

package main
 
import "fmt"
 
func main() {
	var employee = map[string]int{"Mark": 10, "Sandy": 20}
	fmt.Println(employee)
 
	employee["Rocky"] = 30
	employee["Josef"] = 40
 
	fmt.Println(employee)
}

 

更新值

您可以通过引用特定项的键名称来更新其值。

将mark更改为50

package main
 
import "fmt"
 
func main() {
	var employee = map[string]int{"Mark": 10, "Sandy": 20}
	fmt.Println(employee)
 
	employee["Mark"] = 50
	fmt.Println(employee)
}

 

删除元素

内置的delete()函数从与提供的键关联的给定map中删除项目。

package main
 
import "fmt"
 
func main() {
	var employee = make(map[string]int)
	employee["Mark"] = 10
	employee["Sandy"] = 20
	employee["Rocky"] = 30
	employee["Josef"] = 40
 
	fmt.Println(employee)
 
	delete(employee, "Mark")
	fmt.Println(employee)
}

 

遍历map

for…range循环语句可用于获取映射的索引和元素。

每次迭代返回一个键及其相关元素内容。

package main
 
import "fmt"
 
func main() {
    var employee = map[string]int{"Mark": 10, "Sandy": 20,
        "Rocky": 30, "Rajiv": 40, "Kate": 50}
    for key, element := range employee {
        fmt.Println("Key:", key, "=>", "Element:", element)
    }
}

 

清空map

有两种方法可以从map中清除所有项目。

package main
 
func main() {
	var employee = map[string]int{"Mark": 10, "Sandy": 20,
		"Rocky": 30, "Rajiv": 40, "Kate": 50}
 
	// 方法1
	for k := range employee {
		delete(employee, k)
	}
 
	// 方法2
	employee = make(map[string]int)
}

 

对map键进行排序

创建的键切片,用于存储映射的键值,然后对切片进行排序。用于按键顺序打印地图值的排序切片。

package main
 
import (
	"fmt"
	"sort"
)
 
func main() {
	unSortedMap := map[string]int{"India": 20, "Canada": 70, "Germany": 15}
 
	keys := make([]string, 0, len(unSortedMap))
 
	for k := range unSortedMap {
		keys = append(keys, k)
	}
	sort.Strings(keys)
 
	for _, k := range keys {
		fmt.Println(k, unSortedMap[k])
	}
}

 

对map值进行排序

要对map的键值进行排序,您需要将它们存储在切片中,然后对切片进行排序。

package main
 
import (
	"fmt"
	"sort"
)
 
func main() {
	unSortedMap := map[string]int{"India": 20, "Canada": 70, "Germany": 15}
 
	values := make([]int, 0, len(unSortedMap))
 
	for _, v := range unSortedMap {
		values = append(values, v)
	}
 
	sort.Ints(values)
 
	for _, v := range values {
		fmt.Println(v)
	}
}

 

合并map

package main
 
import "fmt"
 
func main() {
	first := map[string]int{"a": 1, "b": 2, "c": 3}
	second := map[string]int{"a": 1, "e": 5, "c": 3, "d": 4}
 
	for k, v := range second {
		first[k] = v
	}
 
	fmt.Println(first)
}
  • 当前日期:
  • 北京时间:
  • 时间戳:
  • 今年的第:18周
  • 我的 IP:3.23.100.174
农历
五行
冲煞
彭祖
方位
吉神
凶神
极简任务管理 help
+ 0 0 0
Task Idea Collect