一、NAT基本概述
nat:Network Address Translatin,网络地址转换
nat是在网络层以及传输层实现的;更多的它操纵的是网络层的内容。
虽然说nat也可以实现所谓让那些私网地址的客户端经过地址转换以后访问互联网上的主机,不过,nat早期所实现的主要目的不是为了让你访问互联网,而是为了隐藏本地网络中的主机的。所以nat最初出现的目的是为了安全性的。
proxy:代理
代理通常是在应用层实现的;通常它代理对于某一特定应用的请求。
二、NAT的工作模型
既然叫网络地址转换,其实它就是实现地址重写的,说白了就是将地址改为非原来的、非原有的地址,而nat技术(不需描述其细节,了解即可)目前常见的来讲,有两种类型:
SNAT:只修改请求报文的源地址(只是相对于请求报文一方来说的,如果我们要考虑到响应的话,其实SNAT必然对应着DNAT,DNAT必然对应着SNAT);
DNAT:只修改请求报文的目标地址;
还有一种叫PAT(Port Address Transaction),事实上,SNAT或DNAT是可以与此同时,同时实现PAT即该端口功能的。
三、SNAT策略简介
1.SNAT策略的典型应用环境
局域网主机共享单个公网IP地址接入Internet
2. SNAT策略的原理
源地址转换,Source Network Address Translation
修改数据包的源地址
3. 未启用SNAT
4. 启用SNAT
5.实现方式
#1.前提条件
• 局域网各主机正确设置IP地址/子网掩码
• 局域网各主机正确设置默认网关地址
• Linux网关支持IP路由转发
#2.实现方法:编写SNAT转换规则
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
6.地址伪装
#1.MASQUERADE —— 地址伪装
• 适用于外网 IP地址 非固定的情况
• 对于ADSL 拨号连接,接口通常为 ppp0、ppp1
• 将SNAT规则改为 MASQUERADE 即可
#2.实现方法:编写SNAT转换规则
# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
四、DNAT 策略
1.DNAT策略的典型应用环境
在Internet中发布位于企业局域网内的服务器
2.DNAT策略的原理
目标地址转换,Destination Network Address Translation
修改数据包的目标地址
3.DNAT策略
4. 启用DNAT
5.实现方式
#1.前提条件
• 局域网的Web服务器能够访问Internet
• 网关的外网IP地址有正确的DNS解析记录
• Linux网关支持IP路由转发
#2.实现方法:编写DNAT转换规则
# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
6.发布时修改目标端口
在DNAT规则中以“IP:Port”的形式指定目标地址
# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 2346 -j DNAT --to-destination 192.168.1.6:22
五、iptables防火墙备份与还原
#1.导出(备份)规则:iptables-save工具,可结合重定向输出保存到指定文件
#2.导入(还原)规则:iptables-restore工具,可结合重定向输入指定规则来源
1.备份操作
[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@m01 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@m01 ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ]
[root@m01 ~]# cat 1.iptables
# Generated by iptables-save v1.4.21 on Thu Feb 10 15:45:15 2022
*filter
:INPUT ACCEPT [160:11102]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [93:9158]
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
COMMIT
# Completed on Thu Feb 10 15:45:15 2022
# Generated by iptables-save v1.4.21 on Thu Feb 10 15:45:15 2022
*nat
:PREROUTING ACCEPT [46:8391]
:INPUT ACCEPT [36:7871]
:OUTPUT ACCEPT [745:50913]
:POSTROUTING ACCEPT [745:50913]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
COMMIT
# Completed on Thu Feb 10 15:45:15 2022
2.还原操作
[root@m01 ~]# iptables -F
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@m01 ~]# iptables-restore < 1.iptables
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
六、iptables脚本部署
[root@m01 ~]# vim iptables.sh
#!/bin/bash
echo "============================System type================================="
# 只支持Centos系统
system_type=`egrep -i "centos" /etc/redhat-release |awk '{print $1}'`
function support_distro(){
if [ $? -eq 0 ];then
echo "The system type is $system_type"
else
echo "Sorry,iptables scripts only support centos system now."
exit 1
fi
}
support_distro
echo "============================Install iptables============================"
# 安装iptables服务
yum install -y iptables-services
# 加载系统内核模块
kerbel_mode_array=("ip_tables" "iptable_filter" "iptable_nat" "ip_conntrack" "ip_conntrack_ftp" "ip_nat_ftp" "ipt_state" "ipt_MASQUERADE")
function laod_kernel_module(){
for ((i=0;i<${#kerbel_mode_array[*]};i++))
do
modprobe "${kerbel_mode_array[$i]}"
done
}
laod_kernel_module
# 关闭firewalld服务
systemctl stop firewalld.service
systemctl disable firewalld.service
# 开启firewalld服务
systemctl start iptables.service
systemctl enable iptables.service
echo "============================iptables configure=========================="
# 获取SSH端口
if grep -w "^Port" /etc/ssh/sshd_config >/dev/null;then
ssh_port=`grep -w "^Port" /etc/ssh/sshd_config |sed "s/#Port\s//g"`
else
ssh_port=22
fi
# 获取DNS服务器IP
if [ -s /etc/resolv.conf ];then
nameserver1=`cat /etc/resolv.conf |grep nameserver |awk 'NR==1{print $2}'`
nameserver2=`cat /etc/resolv.conf |grep nameserver |awk 'NR==2{print $2}'`
fi
IPT="/sbin/iptables"
# 清空filter表、nat表规则
$IPT -t filter -F
$IPT -t nat -F
$IPT -t filter -X
$IPT -t nat -X
# 禁止进,允许出,允许回环网卡
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
$IPT -A INPUT -i lo -j ACCEPT
# 允许已建立的或相关连接的通行
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 限制80端口单个IP的最大连接数为10
$IPT -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
# 防止DOS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃
$IPT -A INPUT -p icmp -m limit --limit 3/s -j LOG --log-level INFO --log-prefix "ICMP packet IN: "
$IPT -A INPUT -p icmp -j DROP
# 允许80(HHTP)/ 873(RSYNC)/ 443(HTTPS)/ 20,21(FTP)/ 25(SMTP)端口的连接
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 20 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
$IPT -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT
# 允许SSH端口的连接,脚本自动侦测目前的SSH端口,否则默认为22端口
$IPT -A INPUT -p tcp -m tcp --dport $ssh_port -j ACCEPT
# 允许ping
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
$IPT -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT
# 允许DNS
[ ! -z "$nameserver1" ] && $IPT -A OUTPUT -p udp -m udp -d $nameserver1 --dport 53 -j ACCEPT
[ ! -z "$nameserver2" ] && $IPT -A OUTPUT -p udp -m udp -d $nameserver2 --dport 53 -j ACCEPT
# 禁止BT连接
$IPT -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24
# 打开转发
sysctl -w net.ipv4.ip_forward=1 &>/dev/null
# 打开 syncookie (轻量级预防 DOS 攻击)
sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null
# 设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数)
sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null
# 设置支持最大连接数为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节)
sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null
# 放行公司所用公网IP
$IPT -I INPUT -s 112.65.109.46 -j ACCEPT
$IPT -I FORWARD -s 112.65.109.46 -j ACCEPT
# 保存iptables规则并重启
service iptables save
service iptables restart
echo "============================iptables configure completed================"
七、iptables端口转发
1.端口转发
[root@m01 ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 5555 -j DNAT --to-destination 172.16.1.7:22
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
2.IP转发
iptables -t nat -A PREROUTING -d 10.0.1.61 -j DNAT --to-destination 172.16.1.7
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
3.内部共享上网
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61