Linux防火墙【SNAT、DNAT】
一、网络防火墙
iptables/netfilter 利用filter表的FORWARD链,可以充当网络防火墙
注意的问题:
- (1)请求-响应报文均会经由FORWARD链,要注意规则的方向性;
- (2)如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行。
示例一:实现内网和外网可以相互访问
1.内网机器安排httpd服务,启动服务,修改主机名,生成主页文件
点击查看代码
7-3 和 7-4 两台内网机器:
[root@node3 ~]# yum install httpd -y;systemctl enable --now httpd;hostnamectl set-hostname web1; echo web1 > /var/www/html/index.html
[root@node4 ~]# yum install httpd -y;systemctl enable --now httpd;hostnamectl set-hostname web1; echo web2 > /var/www/html/index.html
[root@node1 ~]# curl 192.168.204.30 //用7-1验证,向7-3发起网络请求
web1
[root@node1 ~]# curl 192.168.204.40 //用7-1验证,向7-4发起网络请求
web2
2.修改内网机器网关,指向网关机器的内网地址
点击查看代码
[root@node3 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //修改7-3网卡配置
GATEWAY=192.168.204.20 //网关指向7-2
[root@node3 ~]# systemctl restart network //重启网络
[root@node3 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.204.20 0.0.0.0 UG 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.204.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@node4 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //修改7-4网卡配置
GATEWAY=192.168.204.20 //网关指向7-2
[root@node4 ~]# systemctl restart network //重启网络
[root@node4 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.204.20 0.0.0.0 UG 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.204.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
3.配置网关防火墙 服务器
点击查看代码
7-2添加外网网卡(仅主机模式)12.0.0.1
[root@node2 ~]# cd /etc/sysconfig/network-scripts/
[root@node2 network-scripts]# ls
[root@node2 network-scripts]# cp ifcfg-ens33 ifcfg-ens36 //复制网卡配置文件
[root@node2 network-scripts]# vim ifcfg-ens36 //修改配置
[root@node2 network-scripts]# systemctl restart network //重启网络
[root@node2 network-scripts]# ip a
4.外网机器设置
点击查看代码
7-1 IP设置为12.0.0.100 :
[root@node1 ~]# systemctl enable --now httpd //注意要设置!!!不然后面无法开启httpd服务
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
IPADDR=12.0.0.100
NETMASK=255.255.255.0
GATEWAY=12.0.0.1
[root@node1 ~]# systemctl restart network
然后在虚拟机中将7-1改为仅主机模式
[root@node1 ~]# ping 12.0.0.1 //ping7-2看能否ping通
PING 12.0.0.1 (12.0.0.1) 56(84) bytes of data.
64 bytes from 12.0.0.1: icmp_seq=1 ttl=64 time=0.748 ms
64 bytes from 12.0.0.1: icmp_seq=2 ttl=64 time=0.426 ms
64 bytes from 12.0.0.1: icmp_seq=3 ttl=64 time=0.679 ms
5.网关机器添加路由转发功能
点击查看代码
[root@node1 ~]# ping 192.168.204.30 //7-1设置为仅主机模式后,ping7-3不通,需要开启路由转发功能
PING 192.168.204.30 (192.168.204.30) 56(84) bytes of data.
7-2 添加路由转发功能:
[root@node2 network-scripts]# sysctl -a //查看所有内核参数
[root@node2 network-scripts]# sysctl -a |grep ip_forward
net.ipv4.ip_forward = 0 //参数
net.ipv4.ip_forward_use_pmtu = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens36.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0.stable_secret"
sysctl: reading key "net.ipv6.conf.virbr0-nic.stable_secret"
[root@node2 network-scripts]# vim /etc/sysctl.conf //修改内核参数
[root@node2 network-scripts]# sysctl -p //生效
net.ipv4.ip_forward = 1
[root@node1 ~]# ping 192.168.204.30 //开启路由转发功能后7-1能够ping通7-3
PING 192.168.204.30 (192.168.204.30) 56(84) bytes of data.
64 bytes from 192.168.204.30: icmp_seq=1 ttl=63 time=1.20 ms
64 bytes from 192.168.204.30: icmp_seq=2 ttl=63 time=1.33 ms
64 bytes from 192.168.204.30: icmp_seq=3 ttl=63 time=1.00 ms
6.实现内外网互通
点击查看代码
[root@node1 ~]# curl 192.168.204.30 //外网能够访问内网
web1
[root@node1 ~]# curl 192.168.204.40
web2
[root@node1 ~]# systemctl start httpd //开启7-1的httpd服务
[root@node1 ~]# echo "7-1 7-1" > /var/www/html/index.html //网页内容为7-1 7-1
[root@node3 ~]# curl 12.0.0.100 //7-3查看7-1的网页,内网可以访问外网
7-1 7-1
[root@node4 ~]# curl 12.0.0.100 //7-3查看7-1的网页,内网可以访问外网
7-1 7-1
示例2:实现内网可以访问外网,外网不可以访问内网
添加规则,外网不能访问内网
点击查看代码
7-2网关机器添加规则:
[root@node2 ~]# iptables -A FORWARD ! -s 192.168.204.0/24 -d 192.168.204.0/24 -m state --state NEW -j REJECT
//!取反
7-1:
[root@node1 ~]# curl 192.168.204.30 //外网不能访问内网
curl: (7) Failed connect to 192.168.204.30:80; 拒绝连接
[root@node1 ~]# curl 192.168.204.40
curl: (7) Failed connect to 192.168.204.40:80; 拒绝连接
示例3:针对特定的内网机器允许访问
添加规则,只允许-1访问7-3的80端口
点击查看代码
7-2网关机器添加规则:
[root@node2 network-scripts]# iptables -I FORWARD ! -s 192.168.204.0/24 -d 192.168.204.30 -m state --state NEW -p tcp --dport 80 -j ACCEPT
[root@node1 ~]# curl 192.168.204.30 //7-1能够访问7-3
web1
[root@node1 ~]# curl 192.168.204.40 //7-1不能访问7-4
curl: (7) Failed connect to 192.168.204.40:80; 拒绝连接
二、NAT
NAT(network address translation)网络地址转换,支持PREROUTING,INPUT,POSTROUTING,OUTPUT四个链。
请求报文:修改源/目标IP,
响应报文:修改源/目标IP,根据跟踪机制自动实现
NAT的实现分为下面类型:
- SNAT:source NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP
- DNAT:destination NAT 支持PREROUTING,OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
- PNAT: port nat,端口和IP都进行修改
1.SNAT
1.1 SNAT原理与应用
SNAT原理:源地址转换,根据指定条件修改数据包的源IP地址,通常被叫做源映谢
SNAT 应用环境:局域网主机共享单个公网IP地址接入Internet (私有IP不能在Internet中正常路由)
1.2 SNAT转换前提条件
局域网各主机已正确设置IP地址、子网掩码、默认网关地址
Linux网关开启IP路由转发
(linxu系统本身是没有转发功能,只有路由发送数据)
1.3 SNAT 实验
实验环境:
- centos7-1 (外网服务器) ens33 IP地址(仅主机):12.0.0.100
- centos7-2 (网关服务器) ens33 IP地址(nat):192.168.204.20 ;ens36 IP地址(仅主机):12.0.0.1
- centos7-3 (内网服务器) ens33 IP地址(nat):192.168.204.30
实验效果:
- 7-3可以访问7-1,并且7-1的日志当中客户端是12.0.0.1
实验步骤:
1.7-3 内网服务器设置
点击查看代码
7-3安装httpd服务,启动服务,修改主机名,生成主页文件:
[root@node3 ~]# systemctl stop firewalld
[root@node3 ~]# setenforce 0
[root@node3 ~]# yum install httpd -y; systemctl enable --now httpd; hostnamectl set-hostname web1 ; echo "7-3 7-3" > /var/www/html/index.html
[root@web1 ~]# curl 127.0.0.1 //访问自己
7-3 7-3
[root@web1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //修改配置文件
GATEWAY=192.168.204.20 //网关指向7-2
[root@web1 ~]# systemctl restart network //重启服务
2.7-2 网关服务器设置
点击查看代码
7-2网关服务器添加一块网卡(仅主机)
[root@node2 ~]# cd /etc/sysconfig/network-scripts/
[root@node2 network-scripts]# ls
[root@node2 network-scripts]# cp ifcfg-ens33 ifcfg-ens36 //复制网卡配置文件
[root@node2 network-scripts]# vim ifcfg-ens36 //修改配置文件
[root@node2 network-scripts]# systemctl restart network //重启服务
7-2开启`路由转发`:
[root@node2 network-scripts]# sysctl -a |grep ip_forward //查看内核参数
net.ipv4.ip_forward = 0
.......................
[root@node2 network-scripts]# vim /etc/sysctl.conf //修改内核参数
[root@node2 network-scripts]# sysctl -p //生效
net.ipv4.ip_forward = 1
3.7-1 外网服务器设置
点击查看代码
7-1安装httpd服务,启动服务,修改主机名,生成主页文件:
[root@node1 ~]# yum install httpd -y;systemctl enable --now httpd; echo "7-1 7-1" > /var/www/html/index.html
[root@node1 ~]# curl 127.0.0.1 //可以访问自己
7-1 7-1
[root@node1 ~]# curl 192.168.204.30 //可以访问7-3
7-3 7-3
7-1改为仅主机模式
[root@node1 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 //修改网卡配置文件
[root@node1 ~]# systemctl restart network
4.测试内外网能否相关访问
点击查看代码
测试一下7-1和7-3能否互相访问:
[root@node1 ~]# curl 192.168.204.30
7-3 7-3
[root@web1 ~]# curl 12.0.0.100
7-1 7-1
注意:只是模拟环境中能够相互访问,外网机器的访问日志中出现的是内网地址,实际不可能存在。
所以要做SNAT,将内网机器的源地址由内网转换为公网。
5.7-2 网关服务器添加防火墙策略
点击查看代码
7-2添加防火墙策略
写法1:固定的公网IP地址
[root@node2 ~]# iptables -t nat -A POSTROUTING -s 192.168.204.0/24 -o ens36 -j SNAT --to 12.0.0.1
//将源地址为192.168.204.0段的私网地址 全部转化为网关地址
写法2:公网IP地址不固定
[root@node2 ~]# iptables -t nat -A POSTROUTING -s 192.168.204.0/24 -o ens36 -j MASQUERADE
//如果地址不固定可以设置 伪装
6.验证日志
点击查看代码
验证:
[root@web1 ~]# curl 12.0.0.100 //7-3访问7-1
7-1 7-1
[root@node1 ~]# tail -f /var/log/httpd/access_log //此时7-1的日志中新增一条12.0.0.1的访问记录
127.0.0.1 - - [23/May/2024:10:31:16 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
192.168.204.30 - - [23/May/2024:10:56:57 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
12.0.0.1 - - [23/May/2024:11:11:41 +0800] "GET / HTTP/1.1" 200 8 "-" "curl/7.29.0"
//最后一行出现的是公网地址,SANT实验成功
2.DNAT
2.1 DNAT原理与应用
DNAT原理:目的地址转换,根据指定条件修改数据包的目的IP地址,保证了内网服务器的安全,通常被叫做目的映谢。
DNAT应用环境:在Internet中发布位于局域网内的服务器
2.2 DNAT转换前提条件
- 局域网的服务器能够访问Internet
- 网关的外网地址有正确的DNS解析记录
- Linux网关开启IP路由转发
2.3 DNAT 实验
实验环境:
- centos7-1 (外网服务器) ens33 IP地址(仅主机):12.0.0.100
- centos7-2 (网关服务器) ens33 IP地址(nat):192.168.204.20 ;ens36 IP地址(仅主机):12.0.0.1
- centos7-3 (内网服务器) ens33 IP地址(nat):192.168.204.30
实验效果:
- 7-1能访问公网地址12.0.0.1,访问12.0.0.1等于访问192.168.204.30
实验步骤:
点击查看代码
添加规则前:
[root@node1 ~]# curl 12.0.0.1 //外网无法访问公网
curl: (7) Failed connect to 12.0.0.1:80; 拒绝连接
添加规则:
[root@node2 ~]# iptables -t nat -A PREROUTING -i ens36 -d 12.0.0.1 -p tcp --dport 80 -j DNAT --to 192.168.204.30
//从 ens36 网卡进入的流量,目的地址是12.0.0.1的并且访问tcp的 目的端口是80的流量,就跳转到 192.168.204.30
添加规则后:
[root@node1 ~]# curl 12.0.0.1 //可以访问
7-3 7-3
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?