SNAT策略的典型应用环境
局域网主机共享单个公网IP地址接入Internet

SNAT策略的原理
源地址转换,Source Network Address Translation
修改数据包的源地址
局域网共享上网

iptables防火墙(二)_第1张图片

未作SNAT转换时的情况
iptables防火墙(二)_第2张图片

进行SNAT转换后的情况
iptables防火墙(二)_第3张图片

前提条件
局域网各主机正确设置IP地址/子网掩码
局域网各主机正确设置默认网关地址
Linux网关支持IP路由转发

实现方法
编写SNAT转换规则

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24  -o eth0 -j SNAT --to-source 218.29.30.31
POSTRIYTING;路由选择后再处理
192.168.1.0/24;局域网短地址
193.eth0;外网接口名称
194.218.29.30.31;外网接口IP

-
验证SNAT结果
在局域网主机 192.168.1.234 中能够访问外网的Web服务器 58.63.236.45
查看Web主机 58.63.236.45 的访问日志,记录的来访者应是网关主机的外网IP地址 218.29.30.31

MASQUERADE —— 地址伪装
适用于外网IP地址非固定的情况
对于ADSL拨号连接,接口通常为 ppp0、ppp1
将SNAT规则改为MASQUERADE即可

DNAT策略的典型应用环境
在Internet中发布位于企业局域网内的服务器

DNAT策略的原理
目标地址转换,Destination Network Address Translation
修改数据包的目标地址
进行DNAT转换后的情况
iptables防火墙(二)_第4张图片

在Internet中发布内网服务器
iptables防火墙(二)_第5张图片
前提条件
局域网的Web服务器能够访问Internet
网关的外网IP地址有正确的DNS解析记录
Linux网关支持IP路由转发

实现方法
编写DNAT转换规则

[root@localhost ~]# iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 
-p tcp --dport 80 -j DNAT --to-destination 192.168.1.6
PRETOUTING;路由选择之前处理
218.29.30.31;外网接口IP地址
80;发布服务器端口
192.168.1.6;web主机内网IP地址

验证DNAT结果
在外网客户机 173.96.97.98 中能够访问位于企业内网的Web服务,访问地址为 http://218.29.30.31/
查看Web服务器 192.168.1.6 的访问日志,记录了外网客户机的IP地址 173.96.97.98
iptables防火墙(二)_第6张图片

发布时修改目标端口
在DNAT规则中以“IP:Port”的形式指定目标地址

[root@localhost ~]# 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
 2346;访问的目的端口
 :22;实际提供服务的端口

-
导出(备份)规则
iptables-save工具

[root@localhost ~]# iptables-save 
 Generated by iptables-save v1.4.7 on Wed Sep 24 08:25:33 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [54:7037]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 
COMMIT
 Completed on Wed Sep 24 08:25:33 2014
[root@localhost ~]# iptables-save > /opt/iprules_all.txt

-
导入(还原)规则
iptables-restore工具
可结合重定向输入指定规则来源
[root@localhost ~]# iptables-restore < /opt/iprules_all.txt

iptables服务
脚本位置:/etc/init.d/iptables
规则文件位置:/etc/sysconfig/iptables

[root@localhost ~]# service iptables start
iptables:应用防火墙规则:                                          [确定]

[root@localhost ~]# service iptables stop
iptables:将链设置为政策 ACCEPT:filter                   [确定]
iptables:清除防火墙规则:                                           [确定]
iptables:正在卸载模块:                                               [确定]

[root@localhost ~]# service iptables status
iptables:未运行防火墙

——
1.定义基本变量
便于脚本的维护、重用

#!/bin/bash
INET_IF= "eth0"
INET_IP="218.29.30.31"
LAN_IF="eth1"
LAN_IP= "192.168.1.1"
LAN_NET="192.168.1.0/24"
LAN_WWW_IP="192.168.1.6"
IPT="/sbin/iptables"
MOD="/sbin/modprobe"
CTL="/sbin/sysctl“
……

2.加载必要的内核模块
将频繁用到的模块载入内核

……
$MOD ip_tables
$MOD ip_conntrack
$MOD ipt_REJECT
$MOD ipt_LOG
$MOD ipt_iprange
$MOD xt_tcpudp
$MOD xt_state
$MOD xt_multiport
$MOD xt_mac
$MOD ip_nat_ftp
$MOD ip_conntrack_ftp
……

支持FTP访问的地址转换连接状态跟踪

3.调整/proc参数
Linux内核控制及调优

$CTL -w net.ipv4.ip_forward=1
$CTL -w net.ipv4.ip_default_ttl=128
$CTL -w net.ipv4.icmp_echo_ignore_all=1
$CTL -w net.ipv4.icmp_echo_ignore_broadcasts
$CTL -w net.ipv4.tcp_syncookies=1
$CTL -w net.ipv4.tcp_syn_retries=3
$CTL -w net.ipv4.tcp_synack_retries=3
$CTL -w net.ipv4.tcp_fin_timeout=60
$CTL -w net.ipv4.tcp_max_syn_backlog=3200

优化TCP响应能力

4. 具体的防火墙规则
按表、链分别设置规则,包括默认策略
……

$IPT -t filter -X
$IPT -t nat -X
$IPT -t filter -F
$IPT -t nat -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-destination $LAN_WWW_IP
-t 清空原有规则
-P 设置默认策略
-t nat 其他具体规则

-
“主机型”防火墙脚本
针对本机进行保护
filter表中的INPUT、OUTPUT链

[root@localhost ~]# vi /opt/myipfw.hostonly
#!/bin/bash
 1. 定义基本变量
IPT= "/sbin/iptables"
……
 2 定义默认策略
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
$IPT -P OUTPUT ACCEPT
3 设置filter表中的各种规则
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT