• 端口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中, REDIRECTDNAT规则需要配置在POSTROUTING中.

所以我们需要自定义两个新的Chain, 分别附加到 PREROUTINGPOSTROUTING 两个部分.

我们仍然将规则编写在/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

在这个文件中, 我们主要修改的就是casestartstop这两个部分.

  • 创建了 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的更多相关文章

  1. docker自动开启端口转发功能

    yum -y install epel-release yum -y install docker-io service docker start docker pull haproxy # 此时自动 ...

  2. 利用etcd及confd实现配置自动管理

    ETCD etcd 架设etcd集群 静态启动etcd集群需要每个成员在集群中知道另一个成员.在许多情况下,集群成员的IP可能提前未知.在这种情况下,可以使用etcd集群的自动发现服务.一旦etcd集 ...

  3. docker配置远程管理端口

    date: 2019-07-19  17:30:01 author: headsen chen notice :个人原创 Ubuntu18用这篇文章 ubuntu 16用另外一篇文章 ubuntu 1 ...

  4. [日常工作]WorkStation 使用端口转发的方式使用宿主机IP地址提供服务

    1. 虚拟机内的地址如果经常变化,或者是想使用宿主机进行网络服务 但是又不想有人能够访问具体的服务器提供机器.. 可以使用宿主机转发虚拟机的端口的方式来进行处理. workstation 比较好实现 ...

  5. rinetd 一个linux下的端口转发工具

    inux下使用iptables实现端口转发,配置较为复杂,使用rinetd工具可以实现快速配置和修改端口转发. 例:本机ip:1.1.1.1 需要实现访问本机的8080端口,自动转发到2.2.2.2 ...

  6. 转:windows 下 netsh 实现 端口映射(端口转发)

    本文转自:本文出自 “httpyuntianjxxll.spac..” 博客,请务必保留此出处http://333234.blog.51cto.com/323234/1135361 -----hapr ...

  7. Oracle DB 自动管理共享内存

    • 启用Oracle Enterprise Manager (EM) 内存参数 • 设置自动优化的内存参数 • 使用手动优化的SGA 参数覆盖最小大小 • 使用SGA Advisor 设置SGA_TA ...

  8. Windows端口转发

    1. PortTunnel 2. windows 自带的 netsh -----windows下也有一个小工具:portforward.exe,图形界面容易操作,个人平常使用可以,但是也没有办法实现与 ...

  9. Linux下使用Nginx端口转发出现502错误的一种解决办法

    今天圈里的一个朋友在配置完nfinx80端口转发到5000后,发现一个问题 问题描述: 正确配置了Nginx80端口转5000端口,在CentOS上把.Net core WebAPI站点上传到cent ...

  10. CentOS7下用firewall-cmd控制端口与端口转发

    1.firewalld 守护进程 2.控制端口/服务 3.伪装IP 4.端口转发 实现目标:服务器A和服务器B都是内网互通的,但是只有服务器A是有外网然后现在做端口转发实现服务器B能使用服务器A的外网 ...

随机推荐

  1. [JOI 2020 Final] 火事 题解

    给一篇题解.(下面这张图是从 luogu 上粘贴的,因为不太会画图) 其中纵坐标为 \(t\),横坐标为 \(a_i\). 发现同颜色块只有平行四边形和直角梯形(等腰直角三角形)两种情况. 可以将直角 ...

  2. NetPad:一个.NET开源、跨平台的C#编辑器

    前言 今天大姚给大家分享一个基于.NET开源.跨平台的C#编辑器和游乐场:NetPad. 项目介绍 NetPad是一个基于.NET开源(MIT License).跨平台的C#编辑器和游乐场,它允许用户 ...

  3. Azure - [01] 订阅管理

    题记部分 001 || 核心功能 (1)访问控制   Azure订阅通过基于角色的访问控制(RBAC)系统,允许管理员精细管理用户.组和应用程序对资源的访问权限.RBAC系统通过将权限分配给角色,再将 ...

  4. Linux - 批量清除失效软连接

    红底白字,并且一闪一闪的都是失效的软连接,需要批量清除它们... 1.打印所有失效软连接 find ./* -type l -exec test ! -e {} \; -exec echo {} \; ...

  5. Windows 提权-SeImpersonatePrivilege 特权

    本文通过 Google 翻译 SeImpersonatePrivilege – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...

  6. 宝塔导入mysql数据库后,phpmyadmin可以登录,本地Navicat无法登录

    问题描述:宝塔导入mysql数据库后,phpmyadmin可以登录,本地Navicat无法登录 问题排查:1.检查服务器3306端口是否开启,如果为云服务器,需要登录云服务器后台安全组设置开启: 2. ...

  7. 基于C语言实现UDP服务器

    UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,适用于对实时性有较高要求的应用场景,如视频流传输.语音通信.在线游戏等.与TCP不同,UDP不保证数据的 ...

  8. ITSS 运维2.0 实践

    最近公司在评审itss 2.0,参与了一部分工作,对工作过程中的问题梳理如下: 大的背景:评审itss 2.0会有评审 为什么公司会申请各种资质 首次申请资质后,公司可以申请一笔费用(x万元)! 申请 ...

  9. 三分钟构建高性能WebSocket服务 | 超优雅的Springboot整合Netty方案

    前言 每当使用SpringBoot进行Weboscket开发时,最容易想到的就是spring-boot-starter-websocket(或spring-websocket).它可以让我们使用注解, ...

  10. TPC-H 研究和优化尝试

    TPC-H测试提供了8张表,最近做这个测试,记录下过程中的关键点备忘. 1.整体理解TPC-H 8张表 2.建立主外键约束后测试22条SQL 3.分区表改造,确认分区字段 4.重新测试22条SQL 5 ...