目录
1. SNAT 策略及应用
1.1 SNAT策略概述
1. 只开启路由转发,未设置地址转换的情况
2. 开启路由转发,并设置SNAT转换的情况
1.2 SNAT策略的应用
1. 2.1 共享固定IP上网
(1)打开网关的路由转发
(2)设置正确的SNAT策略
(3)测试SNAT共享接入结果
1.2.2 共享动态IP 地址上网
2. DNAT策略及应用
2.1 DNAT 策略概述
2.2 DNAT策略的应用
2.2.1 发布企业内部的Web服务器
(1)打开网关的路由转发
(3)测试DNAT发布结果
2.2.2 发布企业内部的 OpenSSH服务器
(1)配置OpenSSH服务
(2)打开网关的路由转发
(3) 正确设置DNAT策略
(4)测试DNAT发布结果
3. 规则的导入、导出
3.1 规则的备份及还原
3.1.1 iptables-save 命令
3.1.2 iptables-restore 命令
3.2 使用iptables服务
3.2.1 自动启用防火墙规则
3.2.2 清空所有防火墙规则
4. 使用防火墙脚本
4.1 防火墙脚本的构成
4.1.1 定义基本变量
4.1.2 加载内核模块
4.1.3 调整/proc 参数
4.1.4 设置具体的iptables规则
(1)清理已有规则
(2)设置规则链的默认策略
(3)设置nat表中的各种规则
(4)设置filter表的各种规则
1. SNAT 策略及应用
1.1 SNAT策略概述
1. 只开启路由转发,未设置地址转换的情况
2. 开启路由转发,并设置SNAT转换的情况
在上述 SNAT 转换地址的过程中,网关服务器会根据之前建立的 SNAT 映射,将响应数据包正确返回局域网中的源主机。因此,只要连接的第一个包被 SNAT 处理了,那么这个连接及对应数据流的其他包也会自动地被进行 SNAT 处理。另一方面,Internet 中的服务器并不知道局域网 PC 的实际 IP 地址,中间的转换完全由网关主机完成,一定程度上也起到了保护内部网络的作用。
1.2 SNAT策略的应用
1. 2.1 共享固定IP上网
- Linux 网关服务器通过两块网卡 ens33、ens37 分别连接 Internet 和局域网,其中 ens33的 IP 地址为 218.29.30.31,ens37 的 IP 地址为 192.168.1.1。
- 所有局域网 PC 的默认网关设为 192.168.1.1,且已经设置了正确的 DNS 服务器。
- 要求 192.168.1.0/24 网段的 PC 能够通过共享方式正常访问 Internet。
根据上述环境,推荐的操作步骤如下。
(1)打开网关的路由转发
[root@node1 ~]# cat /etc/sysctl.conf
...... ## 省略
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@node1 ~]#
[root@node1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
或者
[root@node1 ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
[root@node1 ~]#
(2)设置正确的SNAT策略
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.136.131/24 -o ens33 -j SNAT --to-source 218.39.30.31
[root@node1 ~]#
(3)测试SNAT共享接入结果
1.2.2 共享动态IP 地址上网
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.136.131/24 -o ppp0 -j MASQUERADE
[root@node1 ~]#
2. DNAT策略及应用
DNAT(Destination Network Address Translation,目标地址转换)是 Linux 防火墙的另一种地址转换操作,同样也是 iptables 命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标 IP 地址和目标端口。
2.1 DNAT 策略概述
在 Internet 环境中,企业所注册的网站域名(如 www.benet.com)必须对应合法的公网 IP 地址(如 218.29.30.31)。在这种情况下,Internet 中的客户机将无法访问公司内网的服务器,除非在网关服务器中正确设置 DNAT 策略。
使用 DNAT 策略的效果如下:当 Internet 中的客户机提交的 HTTP 请求到达企业的网关服务器时,网关首先判断数据包的目标地址和目标端口,若发现该数据包需要访问本机的80 端口,则将其目标 IP 地址(如 218.29.30.31)修改为内网中真正的网站服务器的 IP 地址(如 192.168.1.6),然后才发送给内部的网站服务器,如图 3.5 所示。
在上述 DNAT 转换地址的过程,网关服务器会根据之前建立的 DNAT 映射,修改返回的 HTTP 应答数据包的源 IP 地址,最后再返回给 Internet 中的客户机。Internet 中的客户机并不知道企业网站服务器的真实局域网地址,中间的转换完全由网关主机完成。通过设置恰当的 DNAT 策略,企业内部的服务器就可以面向 Internet 提供服务了。
2.2 DNAT策略的应用
2.2.1 发布企业内部的Web服务器
- 公司注册的网站域名为 www.benet.com,IP 地址为 218.29.30.31(网卡 ens33)。
- 公司的网站服务器位于局域网内,IP 地址为 192.168.1.6。
- 要求能够从 Internet 中通过访问 www.benet.com 来查看公司的网站内容。
根据上述环境,推荐的操作步骤如下。
(1)打开网关的路由转发
[root@node1 ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@node1 ~]#
(2)正确设置DNAT策略
[root@node1 ~]# iptables -t nat -A PREROUTING -i ens33 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.201.131
[root@node1 ~]#
(3)测试DNAT发布结果
2.2.2 发布企业内部的 OpenSSH服务器
- 网关的公网 IP 地址为 218.29.30.31,在 2345 端口启用 OpenSSH 服务。
- 网站服务器位于局域网内,IP 地址为 192.168.1.6,在 22 端口启用 OpenSSH 服务。要求能够从 Internet 中远程管理网关服务器和网站服务器,访问 218.29.30.31 的 2345端口时对应网关服务器,而访问 218.29.30.31 的 2346 端口时对应网站服务器。
(1)配置OpenSSH服务
(2)打开网关的路由转发
[root@node1 ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p
(3) 正确设置DNAT策略
[root@node1 ~]# iptables -t nat -A PREROUTING -i ens33 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.201.131:22
[root@node1 ~]#
(4)测试DNAT发布结果
3. 规则的导入、导出
3.1 规则的备份及还原
3.1.1 iptables-save 命令
[root@node1 ~]# iptables-save
# Generated by iptables-save v1.4.21 on Fri Dec 29 10:06:31 2023
*mangle
:PREROUTING ACCEPT [1161:92458]
:INPUT ACCEPT [1161:92458]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [723:64195]
:POSTROUTING ACCEPT [756:69795]
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Fri Dec 29 10:06:31 2023
# Generated by iptables-save v1.4.21 on Fri Dec 29 10:06:31 2023
*nat
:PREROUTING ACCEPT [3:687]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [14:1064]
:POSTROUTING ACCEPT [14:1064]
-A PREROUTING -d 218.29.30.31/32 -i ens33 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.201.131
-A PREROUTING -d 218.29.30.31/32 -i ens33 -p tcp -m tcp --dport 2346 -j DNAT --to-destination 192.168.201.131:22
-A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535
-A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE
......
[root@node1 ~]# iptables-save > /opt/iprules_all.txt ###备份所有表的规则
3.1.2 iptables-restore 命令
[root@node1 ~]# iptables-restore < /opt/iprules_all.txt ###从备份文件恢复规则
3.2 使用iptables服务
3.2.1 自动启用防火墙规则
[root@node1 ~]# iptables-save > /etc/sysconfig/iptables
[root@node1 ~]# systemctl enable iptables
[root@node1 ~]# systemctl list-unit-files | grep iptables
iptables.service enabled
[root@node1 ~]#
[root@node1 ~]# systemctl start iptables ## 启动防火墙服务
[root@node1 ~]# service iptables start
Redirecting to /bin/systemctl start iptables.service
## 也支持service iptables start 方式启动,实际上还是跳转到了systemctl 方式
3.2.2 清空所有防火墙规则
[root@node1 ~]# systemctl stop iptables.service
[root@node1 ~]# systemctl status iptables.service
● iptables.service - IPv4 firewall with iptables
Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
Active: inactive (dead) since 五 2023-12-29 10:15:39 CST; 6s ago
Process: 2575 ExecStop=/usr/libexec/iptables/iptables.init stop (code=exited, status=0/SUCCESS)
Main PID: 631 (code=exited, status=0/SUCCESS)
12月 29 09:40:52 node1 systemd[1]: Starting IPv4 firewall with iptables...
12月 29 09:40:52 node1 iptables.init[631]: iptables: Applying firewall rules: [ 确定 ]
12月 29 09:40:52 node1 systemd[1]: Started IPv4 firewall with iptables.
12月 29 10:15:39 node1 systemd[1]: Stopping IPv4 firewall with iptables...
12月 29 10:15:39 node1 iptables.init[2575]: iptables: Setting chains to policy ACCEPT: mangle nat filter [ 确定 ]
12月 29 10:15:39 node1 iptables.init[2575]: iptables: Flushing firewall rules: [ 确定 ]
12月 29 10:15:39 node1 systemd[1]: Stopped IPv4 firewall with iptables.
[root@node1 ~]#
4. 使用防火墙脚本
4.1 防火墙脚本的构成
4.1.1 定义基本变量
[root@node1 ~]# vim /opt/myipfw.sh //创建脚本文件
#!/bin/bash
INET_IF= "ens33" //外网接口
INET_IP= "218.29.30.31" //外网接口地址
LAN_IF= "ens37" //内网接口
LAN_IP= "192.168.1.1" //内网接口地址
LAN_NET= "192.168.1.0/24" //内网网段
LAN_WWW_IP= "192.168.1.6" //网站服务器的内部地址
IPT= "/sbin/iptables" //iptables 命令的路径
MOD= "/sbin/modprobe" //modprobe 命令的路径
CTL= "/sbin/sysctl" //sysctl 命令的路径
4.1.2 加载内核模块
$MOD ip_tables //iptables 基本模块
$MOD ip_conntrack //连接跟踪模块
$MOD ipt_REJECT //拒绝操作模块
$MOD ipt_LOG //日志记录模块
$MOD ipt_iprange //支持 IP 范围匹配
$MOD xt_tcpudp //支持 TCP、UDP 协议
$MOD xt_state //支持状态匹配
$MOD xt_multiport //支持多端口匹配
$MOD xt_mac //支持 MAC 地址匹配
$MOD ip_nat_ftp //支持 FTP 地址转换
$MOD ip_conntrack_ftp //支持 FTP 连接跟踪
4.1.3 调整/proc 参数
$CTL -w net.ipv4.ip_forward=1 //打开路由转发功能
$CTL -w net.ipv4.ip_default_ttl=128 //修改 ICMP 响应超时
$CTL -w net.ipv4.icmp_echo_ignore_all=1 //拒绝响应 ICMP 请求
$CTL -w net.ipv4.icmp_echo_ignore_broadcasts //拒绝响应 ICMP 广播
$CTL -w net.ipv4.tcp_syncookies=1 //启用 SYN Cookie 机制
$CTL -w net.ipv4.tcp_syn_retries=3 //最大 SYN 请求重试次数
$CTL -w net.ipv4.tcp_synack_retries=3 //最大 ACK 确认重试次数
$CTL -w net.ipv4.tcp_fin_timeout=60 //TCP 连接等待超时
$CTL -w net.ipv4.tcp_max_syn_backlog=3200 //SYN 请求的队列长度
4.1.4 设置具体的iptables规则
(1)清理已有规则
$IPT -t filter –X //删除各表中自定义的链
$IPT -t nat -X
$IPT -t mangle -X
$IPT -t raw -X
$IPT -t filter –F //清空各表中已有的规则
$IPT -t nat -F
$IPT -t mangle -F
$IPT -t raw -F
(2)设置规则链的默认策略
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
(3)设置nat表中的各种规则
$IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-source $INET_IP
$IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-dest
ination $LAN_WWW_IP
(4)设置filter表的各种规则
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p udp --dport 53 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 80 -j ACCEPT
$IPT -A FORWARD -s $LAN_NET -o $INET_IF -p tcp --dport 20:21 -j ACCEPT
$IPT -A FORWARD -d $LAN_NET -i $INET_IF -m state --state ESTABLISHED, RELATED
-j ACCEPT
......
[root@node1 ~]# chmod +x /opt/myipfw.sh //添加执行权限
[root@node1 ~]# /opt/myipfw.sh //执行脚本文件
[root@node1 ~]# iptables -nL FORWARD //查看部分防火墙规则
Chain FORWARD (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- 192.168.1.0/24 0.0.0.0/0 udp dpt:53
ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 192.168.1.0/24 0.0.0.0/0 tcp dpts:20:21
ACCEPT all -- 0.0.0.0/0 192.168.1.0/24 state RELATED,ESTABLISHED