参考文档:
《Ubuntu 防火墙IP转发做NAT,内网集群共享网络(简单)》
《focal (8) ufw-framework.8.gz手册》
项目需要一台路由器以实现NAT共享访问外网和端口映射访问内网,索性用ubuntu20.04服务器使用ufw防火墙实现功能。
硬件:至少两个网口的服务器
软件:ubuntu 20.04+ufw
名词解释:
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.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.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.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
4.2.2编辑 /etc/ufw/before.rules,并在nat段里增加
-A PREROUTING -p tcp -i eno2 --dport 62022 -j DNAT --to-destination 10.0.0.3:22
4.2.3 增加ufw规则
ufw route allow in on eno2 to 10.0.0.3 port 22
ufw allow 62022
4.2.4 重启ufw
ufw reload
vim /etc/ssh/sshd_config
port 22
port 64422
service ssh restart
ufw allow 64422
ufw reload
vim /etc/ssh/sshd_config
#port 22
service ssh restart
iptables -F -t nat