学习了华为防火墙知识后,回想起Linux中也有很多相似的概念,同时刚好碰到一个项目前期没有考虑购买路由器/防火墙,所以就想到了利用Linux自带的Firewalld来实现防火墙的功能和NAT。

1.启用IP转发

更改配置

sudo vim /etc/sysctl.conf
 
net.ipv4.ip_forward = 1

使能配置

sysctl -p #命令生效

2.修改网卡的zone

sudo firewall-cmd --permanent --zone=external --change-interface=ens0
sudo firewall-cmd --permanent --zone=internal --change-interface=ens1

3.设置SNAT(IP地址转换)

设置特定区域的SNAT——IP伪装。

sudo firewall-cmd --zone=external --add-masquerade --permanent

查看特定区域的SNAT是否允许

sudo firewall-cmd --zone=external --query-masquerade --permanent

删除特定区域的SNAT功能

sudo firewall-cmd --zone=external --delete-masquerade --permanent

4.设置NAT规则

SNAT

内部访问外部,将source ip为src_net网段来的数据包伪装成external(即ens0)的地址

sudo firewall-cmd --zone=external --permanent \
--add-rich-rule='rule family="ipv4" source address="<src_net/mask>" masquerade’

src_net举例:192.168.100.0/24

或者设置NAT规则也可实现(设置POSTROUTING)

sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s <internal_ip|internal_net/mask> -j SNAT --to-source <external_ip>
或
sudo firewall-cmd --permanent --direct --passthrough ipv4 -t nat POSTROUTING -o ens0 -j MASQUERADE -s <internal_ip|internal_net/mask>

DNAT

外部访问内部,将访问本机'external_port'端口流量转发到'internal_ip'

sudo firewall-cmd --zone=external --permanent \
--add-forward-port=port=<external_port>:proto=tcp:toaddr=<internal_ip> 

或者设置NAT规则也可实现(设置PRERROUTING)

sudo firewall-cmd  --permanent --direct --passthrough ipv4 -t nat -A PREROUTING -d <external_ip> -j DNAT --to-destination <internal_ip>

外部访问内部,将访问本机'external_port'端口流量转发到'internal_ip'的'internal_port'

sudo firewall-cmd --zone=external --permanent \
--add-forward-port=port=<external_port>:proto=tcp:toport=<internal_port>:toaddr=<internal_ip> 

5.重载Firewall使配置生效

sudo firewall-cmd --reload

6.其它说明

区域的target

target是就是对该区域内流经的数据包作最终的处理动作,它可以设置为以下选项之一:

  • default:不做任何事情
  • ACCEPT:接受数据包
  • REJECT:拒绝数据包,返回拒绝的信息
  • DROP:丢弃数据包,并且不做任何答应

要设置区域的target,使用--zone选项指定区域,并使用--set-target选项指定目标。例如:

firewall-cmd --zone=public --set-target=DROP 

信任源IP

要允许来自特定IP地址(或范围)的所有传入流量,使用--zone选项指定区域,并使用--add-source选项指定源IP。例如:

firewall-cmd --zone=public --add-source=192.168.100.10