ufw配置自动管理端口转发和DNAT+MASQUERADE
- 端口A转发到本地的端口B
- 端口A转发到另一台机器的端口B(需借助DNAT)
一般情况下, 我们配置ufw来实现端口转发时会在修改 /etc/ufw/before.rules 文件, 增加*nat部分.
但当ufw reload或重启ufw时, ufw并不会自动帮我们清除原本的*nat规则, 导致每次刷新ufw都会产生一份新的*nat, 重启一次增加一份.
除非手动执行iptables -F -t nat来清除旧规则, 但这又会导致另一个问题, docker创建的规则也会被这个命令清理.
再除非你创建一个新Chain......
上面的操作不管怎么套娃, 都避免不了手动执行某个命令, 因此我期望寻找一种让ufw自动管理的方案, 于是就有了这篇文章.
思路构建
- 首先我不想让ufw默认允许转发, 也就是说我不想修改
/etc/default/ufw文件 - 其次, 我不想修改
/etc/ufw/sysctl.conf文件, 因为我在/etc/sysctl.conf中开启了net.ipv4.ip_forward
我们知道MASQUERADE规则需要配置在POSTROUTING中, REDIRECT和DNAT规则需要配置在POSTROUTING中.
所以我们需要自定义两个新的Chain, 分别附加到 PREROUTING 和 POSTROUTING 两个部分.
我们仍然将规则编写在/etc/ufw/before.rules中, 并附加在自己的这两个Chain中
每次ufw创建规则前, 自动删除我们自定义的这两个Chain的所有规则, 之后ufw会再次将/etc/ufw/before.rules中自定义的规则添加
before.init 自动删除
首先我们要修改的是 /etc/ufw/before.init 这个文件, 虽然ufw并没有自动帮我们删除的功能, 但是它贴心的准备了这个文件, 用于在ufw初始化之前执行一些指令.
我们需要为这个文件添加执行权限, 这样ufw才会执行这个文件
chmod a+x /etc/ufw/before.init
在这个文件中, 我们主要修改的就是case中start和stop这两个部分.
- 创建了
ufw-nat-pre附加到PREROUTING - 创建了
ufw-nat-post附加到POSTROUTING
我的完整case如下, 如果想重新起名直接替换即可
case "$1" in
start)
# typically required
if iptables -t nat -L -n >/dev/null 2>&1;then
printf "*nat\n"\
":PREROUTING ACCEPT [0:0]\n"\
":POSTROUTING ACCEPT [0:0]\n"\
"COMMIT\n" | iptables-restore -n
fi
# flush the chains (if they exist)
if iptables -t nat -L ufw-nat-pre -n >/dev/null 2>&1; then
iptables -t nat -D PREROUTING -j ufw-nat-pre 2>/dev/null || true
iptables -t nat -F ufw-nat-pre 2>/dev/null || true
iptables -t nat -X ufw-nat-pre 2>/dev/null || true
else
# setup nat chains
printf "*nat\n"\
":ufw-nat-pre - [0:0]\n"\
"-A PREROUTING -j ufw-nat-pre\n"\
"COMMIT\n" | iptables-restore -n
fi
if iptables -t nat -L ufw-nat-post -n >/dev/null 2>&1; then
iptables -t nat -D POSTROUTING -j ufw-nat-post 2>/dev/null || true
iptables -t nat -F ufw-nat-post 2>/dev/null || true
iptables -t nat -X ufw-nat-post 2>/dev/null || true
else
# setup nat chains
printf "*nat\n"\
":ufw-nat-post - [0:0]\n"\
"-A POSTROUTING -j ufw-nat-post\n"\
"COMMIT\n" | iptables-restore -n
fi
;;
stop)
# typically required
if iptables -t nat -L ufw-nat-pre -n >/dev/null 2>&1; then
iptables -t nat -D PREROUTING -j ufw-nat-pre 2>/dev/null || true
iptables -t nat -F ufw-nat-pre 2>/dev/null || true
iptables -t nat -X ufw-nat-pre 2>/dev/null || true
fi
if iptables -t nat -L ufw-nat-post -n >/dev/null 2>&1; then
iptables -t nat -D POSTROUTING -j ufw-nat-post 2>/dev/null || true
iptables -t nat -F ufw-nat-post 2>/dev/null || true
iptables -t nat -X ufw-nat-post 2>/dev/null || true
fi
;;
status)
# optional
;;
flush-all)
# optional
;;
*)
echo "'$1' not supported"
echo "Usage: before.init {start|stop|flush-all|status}"
;;
esac
before.rules 自定义规则
首先我们要修改的是 /etc/ufw/before.rules 这个文件, 直接在文件的末尾添加即可
如何添加iptables规则需要自行搜索或询问AI, 我这里仅提供示例便于读者知道自定义规则怎么添加, 以及添加在什么地方
注意端口转发到另一个IP的端口需要在两个部分都配置
*nat
:ufw-nat-pre - [0:0]
# 本机的 20000 端口的 tcp 和 udp 转发到本机的 22 端口
-A ufw-nat-pre -p tcp --dport 20000 -j REDIRECT --to-port 22
-A ufw-nat-pre -p udp --dport 20000 -j REDIRECT --to-port 22
# 本机的 20001 端口的 tcp 和 udp 转发到 1.1.1.1 的 22 端口 (注意: 还需要配置 ufw-nat-post
-A ufw-nat-pre -p tcp --dport 20001 -j DNAT --to-destination 1.1.1.1:22
-A ufw-nat-pre -p udp --dport 20001 -j DNAT --to-destination 1.1.1.1:22
# end
COMMIT
*nat
:ufw-nat-post - [0:0]
# 本机的 20001 端口的 tcp 和 udp 转发到 1.1.1.1 的 22 端口 (注意: 还需要配置 ufw-nat-pre
-A ufw-nat-post -d 1.1.1.1 -p tcp --dport 22 -j MASQUERADE
-A ufw-nat-post -d 1.1.1.1 -p udp --dport 22 -j MASQUERADE
# end
COMMIT
完成
注意: 如果先前就创建了规则且没有删除, 或者不小心把docker的规则删掉了, 可以重启下系统来刷新
这样我们就可以愉快的在 before.rules 添加规则, 然后使用 ufw reload 重载规则了
同时发布在个人博客中 https://blog.akvicor.com/posts/ufw/forward/
ufw配置自动管理端口转发和DNAT+MASQUERADE的更多相关文章
- docker自动开启端口转发功能
yum -y install epel-release yum -y install docker-io service docker start docker pull haproxy # 此时自动 ...
- 利用etcd及confd实现配置自动管理
ETCD etcd 架设etcd集群 静态启动etcd集群需要每个成员在集群中知道另一个成员.在许多情况下,集群成员的IP可能提前未知.在这种情况下,可以使用etcd集群的自动发现服务.一旦etcd集 ...
- docker配置远程管理端口
date: 2019-07-19 17:30:01 author: headsen chen notice :个人原创 Ubuntu18用这篇文章 ubuntu 16用另外一篇文章 ubuntu 1 ...
- [日常工作]WorkStation 使用端口转发的方式使用宿主机IP地址提供服务
1. 虚拟机内的地址如果经常变化,或者是想使用宿主机进行网络服务 但是又不想有人能够访问具体的服务器提供机器.. 可以使用宿主机转发虚拟机的端口的方式来进行处理. workstation 比较好实现 ...
- rinetd 一个linux下的端口转发工具
inux下使用iptables实现端口转发,配置较为复杂,使用rinetd工具可以实现快速配置和修改端口转发. 例:本机ip:1.1.1.1 需要实现访问本机的8080端口,自动转发到2.2.2.2 ...
- 转:windows 下 netsh 实现 端口映射(端口转发)
本文转自:本文出自 “httpyuntianjxxll.spac..” 博客,请务必保留此出处http://333234.blog.51cto.com/323234/1135361 -----hapr ...
- Oracle DB 自动管理共享内存
• 启用Oracle Enterprise Manager (EM) 内存参数 • 设置自动优化的内存参数 • 使用手动优化的SGA 参数覆盖最小大小 • 使用SGA Advisor 设置SGA_TA ...
- Windows端口转发
1. PortTunnel 2. windows 自带的 netsh -----windows下也有一个小工具:portforward.exe,图形界面容易操作,个人平常使用可以,但是也没有办法实现与 ...
- Linux下使用Nginx端口转发出现502错误的一种解决办法
今天圈里的一个朋友在配置完nfinx80端口转发到5000后,发现一个问题 问题描述: 正确配置了Nginx80端口转5000端口,在CentOS上把.Net core WebAPI站点上传到cent ...
- CentOS7下用firewall-cmd控制端口与端口转发
1.firewalld 守护进程 2.控制端口/服务 3.伪装IP 4.端口转发 实现目标:服务器A和服务器B都是内网互通的,但是只有服务器A是有外网然后现在做端口转发实现服务器B能使用服务器A的外网 ...
随机推荐
- Linux Vim 最全面教程:从入门到精通
一.引言 Vim 是一款功能强大且在 Linux 系统中广泛使用的文本编辑器.它有着高效的编辑模式.丰富的快捷键以及众多强大的功能,对于想要深入学习 Linux 系统操作以及进行文本处理相关工作的新手 ...
- 一文搞懂 APP 算法备案
今天来给大家好好科普一下超重要的 APP 算法备案,这可是和我们日常使用 APP 以及 APP 运营都息息相关的知识点哦! 什么是算法备案 简单来讲,算法备案就相当于 APP 运营者要把自家 APP ...
- MySQL - 数据更新场景
Excel文件数据更新到表A的某两个字段 Excel文件中Sheet1页有两列,一列是序号,另一列是手机号.表A中有对应的序号列和手机号列. 1.首先,使用Navicat将Excel数据导入数据库,注 ...
- maven - [02] settings.xml配置
maven处理配置的优先级顺序 (1)全局settings.xml(优先级★☆☆☆☆) 位于Maven安装目录的conf/settings.xml,提供系统级的默认配置,比如本地仓库位置.远程仓库列表 ...
- 【Python】尝试切换py版本
失败 问chatgpt,怎么把abaqus python 版本切换到py3.6,结果失败. chatgpt给出的建议: 修改abaqus_v6.env,明显扯淡!我就尝试在custom_v6.env中 ...
- 【Unit2】电梯调度(多线程设计)-作业总结
第一次作业 1.1 题目概述 5座楼,每座楼单电梯,类型相同,请求不跨楼层 1.2 个人处理思路 红色加粗为线程类,绿色块为临界区(共享对象) /...鄙人还在加班加点的赶制中.qwq./ 1.3 B ...
- Linux 下载安装CUDA Toolkit 12.8,配置Nvidia Driver
cuda下载地址 https://developer.nvidia.com/cuda-downloads nvidia-smi Mon Mar 17 02:08:35 2025 +---------- ...
- Chrome浏览器使用AdGuard去除百度热搜
前言 百度的热搜会分散注意力,chrome 的 AdGuard 插件可以屏蔽广告,还可以屏蔽百度热搜 设置 > 用户过滤器 > 添加以下代码,即可屏蔽百度热搜 baidu.com##div ...
- gland go list-m:无法识别的导入路径
可以使用go代理:https://goproxy.io 或者阿里云的镜像站:https://mirrors.aliyun.com/goproxy/ 重启即可
- 通用的SpringBoot集成的文件上传与下载
废话不多说--直接看代码 controller package com.webank.wedatasphere.qualitis.controller.thymeleaf; import com.we ...