目录
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表的各种规则
在上述 SNAT 转换地址的过程中,网关服务器会根据之前建立的 SNAT 映射,将响应数据包正确返回局域网中的源主机。因此,只要连接的第一个包被 SNAT 处理了,那么这个连接及对应数据流的其他包也会自动地被进行 SNAT 处理。另一方面,Internet 中的服务器并不知道局域网 PC 的实际 IP 地址,中间的转换完全由网关主机完成,一定程度上也起到了保护内部网络的作用。
根据上述环境,推荐的操作步骤如下。
[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 ~]#
[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 ~]#
[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.136.131/24 -o ppp0 -j MASQUERADE
[root@node1 ~]#
DNAT(Destination Network Address Translation,目标地址转换)是 Linux 防火墙的另一种地址转换操作,同样也是 iptables 命令中的一种数据包控制类型,其作用是根据指定条件修改数据包的目标 IP 地址和目标端口。
在 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 提供服务了。
根据上述环境,推荐的操作步骤如下。
[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 ~]#
[root@node1 ~]# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@node1 ~]# sysctl -p
[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 ~]#
[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 ###备份所有表的规则
[root@node1 ~]# iptables-restore < /opt/iprules_all.txt ###从备份文件恢复规则
[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 方式
[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 ~]#
[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 命令的路径
$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 连接跟踪
$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 请求的队列长度
$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
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
$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
$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