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的外网 ...
随机推荐
- [JOI 2020 Final] 火事 题解
给一篇题解.(下面这张图是从 luogu 上粘贴的,因为不太会画图) 其中纵坐标为 \(t\),横坐标为 \(a_i\). 发现同颜色块只有平行四边形和直角梯形(等腰直角三角形)两种情况. 可以将直角 ...
- NetPad:一个.NET开源、跨平台的C#编辑器
前言 今天大姚给大家分享一个基于.NET开源.跨平台的C#编辑器和游乐场:NetPad. 项目介绍 NetPad是一个基于.NET开源(MIT License).跨平台的C#编辑器和游乐场,它允许用户 ...
- Azure - [01] 订阅管理
题记部分 001 || 核心功能 (1)访问控制 Azure订阅通过基于角色的访问控制(RBAC)系统,允许管理员精细管理用户.组和应用程序对资源的访问权限.RBAC系统通过将权限分配给角色,再将 ...
- Linux - 批量清除失效软连接
红底白字,并且一闪一闪的都是失效的软连接,需要批量清除它们... 1.打印所有失效软连接 find ./* -type l -exec test ! -e {} \; -exec echo {} \; ...
- Windows 提权-SeImpersonatePrivilege 特权
本文通过 Google 翻译 SeImpersonatePrivilege – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...
- 宝塔导入mysql数据库后,phpmyadmin可以登录,本地Navicat无法登录
问题描述:宝塔导入mysql数据库后,phpmyadmin可以登录,本地Navicat无法登录 问题排查:1.检查服务器3306端口是否开启,如果为云服务器,需要登录云服务器后台安全组设置开启: 2. ...
- 基于C语言实现UDP服务器
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,适用于对实时性有较高要求的应用场景,如视频流传输.语音通信.在线游戏等.与TCP不同,UDP不保证数据的 ...
- ITSS 运维2.0 实践
最近公司在评审itss 2.0,参与了一部分工作,对工作过程中的问题梳理如下: 大的背景:评审itss 2.0会有评审 为什么公司会申请各种资质 首次申请资质后,公司可以申请一笔费用(x万元)! 申请 ...
- 三分钟构建高性能WebSocket服务 | 超优雅的Springboot整合Netty方案
前言 每当使用SpringBoot进行Weboscket开发时,最容易想到的就是spring-boot-starter-websocket(或spring-websocket).它可以让我们使用注解, ...
- TPC-H 研究和优化尝试
TPC-H测试提供了8张表,最近做这个测试,记录下过程中的关键点备忘. 1.整体理解TPC-H 8张表 2.建立主外键约束后测试22条SQL 3.分区表改造,确认分区字段 4.重新测试22条SQL 5 ...