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的外网 ...
随机推荐
- WPF DataTemplate DataContext 绑定问题
当使用DataTemplate时,需要用数据绑定,设置数据绑定的方式可参考: https://supportcenter.devexpress.com/ticket/details/t736087/d ...
- Python中requests库的安装
这篇博客指导读者如何通过管理员权限的CMD命令行,进入Python主目录并使用pip安装requests库.在PyCharm中,如果IDE未检测到requests,用户需要在此安装,或者考虑更新Pyt ...
- Java微信小程序登录接口获取openid
根据官方文档,wx.login()的回调函数中,需要我们传递生成的用户登录凭证到code2accessToken的接口中 小程序登录方法 code2accessToken的方法中要求传入如下参数 ...
- Vulnhun靶机-kioptix level 4-sql注入万能密码拿到权限ssh连接利用mysql-udf漏洞提权
一.环境搭建 然后选择靶机所在文件夹 信息收集 本靶机ip和攻击机ip 攻击机:192.168.108.130 靶机:192.168.108.141 扫描ip 靶机ip为:192.168.108.14 ...
- 解密ZAB协议:Zookeeper一致性的核心实现
一致性问题 设计一个分布式系统必定会遇到一个问题-- 因为分区容忍性(partition tolerance)的存在,就必定要求我们需要在系统可用性(availability)和数据一致性(consi ...
- Markdown 语法深度详解与实战演示
一.引言 在当今数字化的时代,高效地处理和呈现文本信息变得至关重要.Markdown 作为一种轻量级标记语言,因其简洁.易读.易写的特点,受到了广大开发者.写作者和内容创作者的喜爱.无论您是撰写博客. ...
- Docker 容器的数据卷 以及 数据卷容器
Docker 容器删除后,在容器中产生的数据还在吗? 答案是 不在 Docker 容器和外部机器可以直接交换文件吗? 在没有数据卷的情况下,答案是 不可以 如下图:外部机器:Windows系统(自己的 ...
- 震撼揭秘:LLM幻觉如何颠覆你的认知!
LLM幻觉 把幻觉理解为训练流水线中的一种涌现认知效应 Prashal Ruchiranga Robina Weermeijer 在 Unsplash 上的照片 介绍 在一个名为<深入剖析像Ch ...
- 基于Qt的在QGraphicsView中绘制带有可动拐点的连线的一种方法
摘要:本文详细介绍了基于Qt框架在`QGraphicsView`中实现带有可动拐点连线的绘制方法.通过自定义`CustomItem`和`CustomPath`类,结合`QGraphicsIte ...
- DeFi(去中心化金融)的硬核知识
1. DeFi流动性挖矿:躺着赚利息的"矿工" 简单来说,流动性挖矿就像你往银行存钱赚利息,但这里存的是加密货币,利息更高,还能随时提现.比如你往Uniswap这样的去中心化交 ...