Total Pageviews

Tuesday, 28 February 2012

SSH翻墙主机的iptables防火墙的设置

因为做实验的这个VPS只用于SSH翻墙,并且一般翻墙仅限于Web浏览及各种基于Web的应用,所以,以下策略仅开放SSH的22端口并对其它的东西做了相应的限制。
初始化防火墙

第一步,我们总是要把一些知道的和不知道的先通通打倒了再说,于是,请如此:   

#清除现有的规则
~#: iptables -F
~#: iptables -X
~#: iptables -Z

#设定默认策略为丢弃包
~#: iptables -P FORWARD DROP
~#: iptables -P OUTPUT DROP
~#: iptables -P INPUT DROP

以上是一些初始化的动作,以下是具有具体功能的策略。
防火墙规则参考一

#允许本地回环
~#: iptables -A INPUT -i lo -p all -j ACCEPT

#允许22端口接受连接
~#: iptables -A INPUT -p tcp --dport 22 -j ACCEPT

#允许传入的数据包状态
~#: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#允许传出的数据包状态
~#: iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#允许传入PING的ICMP包
~#: iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

这几条规则实现的效果是:

    22端口允许用户主动发起TCP连接,一般用于提供SSH服务,如果你的SSH端口不是22,请修改;
    其它端口需要ESTABLISHED、RELATED两种状态的数据包才能通过,而通常这两种状态的数据包在TCP协议上的定义是已经建立了连接的后续数据包,也就说,别人无法对你的任何端口主动发起连接,但是由你主动发起连接的数据包可以通过,比如说看网页的数据;
    包状态NEW允许SSH用户对外的主动发起连接;
    允许外部用户PING本机,这个嘛,方便自己测试,要不挂了都不知道。
    关于数据包状态,我是参考这里 http://liubin.blog.51cto.com/282313/110394 。

这样,虽然防住了外面进来的问题,但一定程度上来说,用户通过SSH登录以后就可以干他想干的事情了,对于应用的范围不能达到一个控制的目的,比如 说,我前面提到的“一般和谐仅限于Web浏览及各种基于Web的应用”,是的,和谐嘛,也就是用这些了,顶天了再来个FTP或者跳板另外的SSH,于 是,21便想到了稍微BT一点的限制,请看参考二。
防火墙规则参考二

#允许本地回环
~#: iptables -A INPUT -i lo -p all -j ACCEPT

#允许22端口的数据进出
~#: iptables -A INPUT -p tcp --dport 22 -j ACCEPT
~#: iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT

#允许状态正常的数据包进入
~#: iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#允许访问外部的80、81、8080、443等端口
~#: iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
~#: iptables -A OUTPUT -p tcp --dport 81 -j ACCEPT
~#: iptables -A OUTPUT -p tcp --dport 8080 -j ACCEPT
~#: iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

#允许UDP数据包外发,由于浏览器发起的是1024~65536之间的随机端口,无法限制为具体端口
~#: iptables -A OUTPUT -p udp -j ACCEPT

#允许PING测试的数据包进出
~#: iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
~#: iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT

好吧,规则二实际上能实现跟规则一差不多的效果,就是让SSH和谐用户能正常浏览Web内容及使用Web应用,那区别在哪里呢?之前提到了规则一的 SSH用户只要登录进系统,就可以对外发起任何连接了,而规则二只允许用户发起目标端口为80、81、8080、443(https)的TCP连接和任意 UDP连接,这样就能有效的限制用户对于SSH的应用范围。

小结
基本上,两个规则都实现了主机仅提供SSH服务(参考一)用于浏览网页(参考二)的目的,并且使用iptables对服务器的其它端口都进行了一些 屏蔽,同时提供两种规则方式来实现不同的需求,实际上仅仅这样还是不够的,因为让用户登录到shell里面毕竟还是有一定风险的,特别是一些弱密码的用户 也有被暴力猜解的风险,我个人是使用fail2ban的方案来解决暴力猜解的问题,请参考《小内存优化VPS的LNMP及fail2ban配置》,同时还有denyhosts也是用于防止暴力猜解的,可以参考:《Linux VPS上DenyHosts阻止SSH暴力攻击》。

参考引用:
1. Google: http://www.google.com/ncr
2. iptables 状态机制的描述:http://liubin.blog.51cto.com/282313/110394
3. 定制iptables防火墙策略:http://ailixing.blog.51cto.com/188828/37309
----------------------------------------------------------------------------------

1、安装iptables防火墙

如果没有安装iptables需要先安装,CentOS执行:
yum install iptables
Debian/Ubuntu执行:
apt-get install iptables

2、清除已有iptables规则

iptables -F
iptables -X
iptables -Z

3、开放指定的端口

#允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
# 允许已建立的或相关连的通行
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#允许所有本机向外的访问
iptables -A OUTPUT -j ACCEPT
# 允许访问22端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
#允许访问80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许FTP服务的21和20端口
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 20 -j ACCEPT
#如果有其他端口的话,规则也类似,稍微修改上述语句就行
#禁止其他未允许的规则访问
iptables -A INPUT -j REJECT
iptables -A FORWARD -j REJECT

4、屏蔽IP

#如果只是想屏蔽IP的话“3、开放指定的端口”可以直接跳过。
#屏蔽单个IP的命令是
iptables -I INPUT -s 123.45.6.7 -j DROP
#封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP
#封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP
#封IP段即从123.45.6.1到123.45.6.254的命令是
iptables -I INPUT -s 123.45.6.0/24 -j DROP

4、查看已添加的iptables规则

iptables -L -n
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M) vps侦探
n:只显示IP地址和端口号,不将ip解析为域名

5、删除已添加的iptables规则

将所有iptables以序号标记显示,执行:
iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT 8

6、iptables的开机启动及规则保存

CentOS上可能会存在安装好iptables后,iptables并不开机自启动,可以执行一下:
chkconfig --level 345 iptables on
将其加入开机启动。
CentOS上可以执行:service iptables save保存规则。
另外更需要注意的是Debian/Ubuntu上iptables是不会保存规则的。
需要按如下步骤进行,让网卡关闭是保存iptables规则,启动时加载iptables规则:
创建/etc/network/if-post-down.d/iptables 文件,添加如下内容:
#!/bin/bash
iptables-save > /etc/iptables.rules
执行:chmod +x /etc/network/if-post-down.d/iptables 添加执行权限。
创建/etc/network/if-pre-up.d/iptables 文件,添加如下内容:
#!/bin/bash
iptables-restore < /etc/iptables.rules
执行:chmod +x /etc/network/if-pre-up.d/iptables 添加执行权限。
关于更多的iptables的使用方法可以执行:iptables --help或网上搜索一下iptables参数的说明.
 --------------------------------------------------------------------------------------
iptables 是与最新的 2.6.x 版本Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。iptables 的一个重要优点是,它使用户可以完全控制防火墙配置和信息包过滤。您可以定制自己的规则来满足您的特定需求,从而只允许您想要的网络流量进入系统。另 外,iptables 是免费的,这对于那些想要节省费用的人来说十分理想,它可以代替昂贵的防火墙解决方案,并且其性能不输于一些专业的硬件防火墙。  
iptables的管理命令介绍 
在iptables防火墙中,它所有功能都是通过命令的形式实现的,因此iptables命令格式非常重要。iptables命令的操作对象包括: 
规则表(table):由规则链的集合组成,不同的规则表用于实现不同的功能 
规则链(chain):由规则的集合组成,保存在规则表中;不同规则链代表了不同的数据包流向。 
规则(rule):用于对防火墙策略进行设置,流经某个数据链的数据将按照先后顺序进行过滤。 
一条完整的iptables命令由以下几个部分组成: 
iptables [-t 表名] <命令> [链名] [规则号] [规则] [-j 目标] 
-t选项用于指定所使用的表,iptables防火墙默认有filter、nat和mangle这3张表,也可以是用户自定义的表。表中包含了分布在各个位置的链,iptables命令所管理的规则就是存在于各种链中的。该选项不是必需的,如果未指定一个具体的表,则默认使用的是filter表。 
命令选项是必须要有的,它告诉iptables要做什么事情,是添加规则、修改规则还是删除规则。有些命令选项后面要指定具体的链名称,而有些可以省略,此时,是对所有的链进行操作。还有一些命令要指定规则号。具体的命令选项名称及其与后续选项的搭配形式如下所示。 
针对规则链<命令>的操作有: 
-L 列出链中所有的规则 
-F 清除链中的所有规则 
-P 设置链的默认动作(ACCEPT/REJECT/DROP) 
-Z 计数器清零 
-N 定义一个新的规则链 
-X 删除定义的规则链
 
针对规则<命令>的操作有: 
-A 追加一个规则 
-I 插入一个规矩 
-D 删除一个规则 
-R 在指定的链中用新的规则置换掉某一规则号的旧规则 
查询iptables防火墙的状态(列出所有规则) 
iptables –L 
image 
由上图可知,iptables设有三个[链名],即input、forward和output,默认规则均为accept放行,我们可以分别通过这三个规则链调用不同的策略。 
以上是有关iptables命令格式中有关命令和规则链选项部分的解释。iptables命令格式中的规则部分由很多选项构成,主要指定一些IP数据包的特征。例如,上一层的协议名称、源IP地址、目的IP地址、进出的网络接口名称等,下面列出构成[规则号] [规则]的常见选项。 
-p <协议类型>:指定上一层协议,可以是icmp、tcp、udp和all。 
-s <IP地址/掩码>:指定源IP地址或子网。 
-d <IP地址/掩码>:指定目的IP地址或子网。 
-i <网络接口>:指定数据包进入的网络接口名称。 
-o <网络接口>:指定数据包出去的网络接口名称。
 
注意:上述选项可以进行组合,每一种选项后面的参数前可以加"!",表示取反。 
对于-p选项来说,确定了协议名称后,还可以有进一步的子选项,以指定更细的数据包特征。常见的子选项如下所示。 
-p tcp --sport <port>:指定TCP数据包的源端口。 
-p tcp --dport <port>:指定TCP数据包的目的端口。 
-p tcp --syn:具有SYN标志的TCP数据包,该数据包要发起一个新的TCP连接。 
-p udp --sport <port>:指定UDP数据包的源端口。 
-p udp --dport <port>:指定UDP数据包的目的端口。 
-p icmp --icmp-type <type>:指定icmp数据包的类型,可以是echo-reply、echo-request等。
 
上述选项中,port可以是单个端口号,也可以是以port1:port2表示的端口范围。每一选项后的参数可以加"!",表示取反。 
最后,iptables命令中的-j选项可以对满足规则的数据包执行指定的操作,其后的[-j 目标]可以是以下内容: 
-j ACCEPT:将与规则匹配的数据包放行,并且该数据包将不再与其他规则匹配,而是跳向下一条链继续处理。 
-j REJECT:拒绝所匹配的数据包,并向该数据包的发送者回复一个ICMP错误通知。该处理动作完成后,数据包将不再与其他规则匹配,而且也不跳向下一条链。 
-j DROP:丢弃所匹配的数据包,不回复错误通知。该处理动作完成后,数据包将不再与其他规则匹配,而且也不跳向下一条链。 
-j LOG:将与规则匹配的数据包的相关信息记录在日志(/var/log/message)中,并继续与其他规则匹配。
 
举例: 

在配置iptables之前,首先查询iptabels软件包有没有安装(默认已安装) 
rpm -q iptables 
iptables服务启动脚本/etc/rc.d/init.d/iptables 
配置文件位置 /etc/sysconfig/iptables-config 
策略文件位置 /etc/sysconfig/iptables (默认文件不存在) 
iptables命令即时生效,但是不保存的话重启后就会消失,保存命令: 
iptables-save > /etc/sysconfig/iptables 
将命令保存在iptables策略文件中,重启后可立即应用。也可以使用以下命令进行保存: 
service iptables save 
将iptables-save命令保存的防火墙策略恢复到当前系统中 
iptables-restore 
开启iptables防火墙 
service iptables start 
基于单个服务器的iptables防火墙配置 
基于单个服务器防火墙的配置主要包括回环口的处理、状态检测以及协议和端口的处理。 
例如一个普通的web服务器的典型防护配置: 
iptables -A INPUT -i lo -j ACCEPT   \\允许访问服务器的lo回环口 
iptables -A INPUT -p tcp -m multiport --port 22,80 -j ACCEPT   \\开放服务器的22和80端口 
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT   \\状态检测,允许建立连接和相关连接 
iptables -P INPUT DROP  \\不匹配以上条件的数据包全部丢弃 
这里涉及到iptables防火墙的一些 [扩展规则],iptables软件包提供了一套扩展的规则选项。使用时需要通过-m选项指定模块的名称,再使用该模块提供的选项。下面列出几个模块名称和其中的选项,大部分的选项也可以通过"!"取反。 
-m multiport --sports <port, port, …>  
功能:指定数据包的多个源端口,也可以以port1:port2的形式指定一个端口范围。 
-m multiport --dports <port, port, …> 
功能:指定数据包的多个目的端口,也可以以port1:port2的形式指定一个端口范围。 
-m multiport --ports <port, port, …> 
功能:指定数据包的多个端口,包括源端口和目的端口,也可以以port1:port2的形式指定一个端口范围。 
-m state --state <state> 
功能:指定满足某一种状态的数据包,state可以是INVALID、ESTABLISHED、NEW和RELATED等,也可以是它们的组合,用","分隔。 
-m connlimit  --connlimit-above <n> 
功能:用于限制客户端到一台主机的TCP并发连接总数,n是一个数值。 
-m  mac  --mac-source  <address> 
功能:指定数据包的源MAC地址。 
现在我们在虚拟机环境下进行测试,仍然引用之前那个静态路由的环境 

在RHEL-B上输入刚才的4条命令 
iptables -A INPUT -i lo -j ACCEPT  
iptables -A INPUT -p tcp -m multiport --port 22,80 -j ACCEPT   
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT   
iptables -P INPUT DROP  
查看INPUT规则: 

RHEL-B上开启vsftpd和httpd服务(分别为21端口和80端口) 
service httpd start 
service vsftpd start
 
RHEL-A上使用命令测试,发现都是成功的 
telnet 192.168.20.1 80 
telnet 192.168.20.1 22
 
使用ftp命令去连接 
ftp 192.168.20.1 
发现许久连接不上,说明ftp的21端口没有开启。当然如果去ping的话,也是失败的。这意味着iptables防火墙的命令生效,只开放了ssh和http服务。 
保存刚才的iptables策略,即会生成/etc/sysconfig/iptables文件 
service iptables save 
image 
image 
这样一个简单的基于主机的iptables防火墙就配置成功了.


上一篇讲了iptables防火墙对于单个主机的应用,现在来学习一下将iptables防火墙作为网关防火墙使用。这时iptables防火墙不仅仅是保护一台主机了,而是保护整个网络,充当网关这样的角色。责任相当更加重大,同时需求也提升了很多。 
linux防火墙的NAT功能 
    有关NAT地址转换的知识在这里就不多说了,我们知道这个一般都是在路由器上实现的,而linux主机同样可以实现这个功能。iptables防火墙中有3张内置的表:filter、nat和mangle,其中的nat表实现了地址转换的功能。nat表包含PREROUTING、OUTPUT和POSTROUTING 3条链,里面包含的规则指出了如何对数据包的地址进行转换。 
1、SNAT 
    源NAT的规则在POSTROUTING链中定义。这些规则的处理是在路由完成后进行的,可以使用"-j SNAT"目标动作对匹配的数据包进行源地址转换。如果希望内网10.10.1.0/24出去的数据包其源IP地址都转换外网接口eth0的固定公网IP地址218.75.26.35,采用"-j POSTOUTING”目标动作,则需要执行以下iptables命令: 
iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o eth0 -j SNAT --to-source 218.75.26.35 
以上命令中,"-t nat"指定使用的是nat表,"-A POSTROUTING"表示在POSTROUTING链中添加规则,"--to-source 218.75.26.35"表示把数据包的源IP地址转换为218.75.26.35,而根据-s选项的内容,匹配的数据包其源IP地址应该是属于 10.10.1.0/24子网的。还有,"-o eth0"指定了只有从eth0接口出去的数据包才做源NAT转换,转换后的公网地址直接是eth0的公网IP地址。 
************************************************************************************** 
除了转换为eth0的公网地址外,也可以使用其他地址,例如,218.75.26.34。此时,需要为eth0创建一个子接口,并把IP地址设置为218.75.26.34,使用的命令如下所示: 
ifconfig eth0:1 218.75.26.34 netmask 255.255.255.240 
以上命令使eth0接口拥有两个公网IP。也可以使用某一IP地址范围作为转换后的公网地址,此时要创建多个子接口,并对应每一个公网地址。 而"--to-source"选项后的参数应该以"a.b.c.x-a.b.c.y"的形式出 现。************************************************************************************** 
前面介绍的是数据包转换后的公网IP是固定的情况。如果公网IP地址是从ISP服务商那里通过ADSL拨号动态获得的,则每一次拨号所得到的地址是不同 的,并且网络接口也是在拨号后才产生的。在这种情况下,前面命令中的"--to-source"选项将无法使用。为了解决这个问题,iptables提供 了另一种称为IP伪装的源NAT,其实现方法是采用"-j MASQUERADE"目标动作,具体命令如下所示。 
iptables -t nat -A POSTROUTING -s 10.10.1.0/24 -o ppp0 -j MASQUERADE 
以上命令中,MASQUERADE意为伪装,ppp0是拨号成功后产生的虚拟接口,其IP地址是从ISP服务商那里获得的公网IP。"-j MASQUERADE"表示把数据包的源IP地址改为ppp0接口的IP地址。 
2、DNAT 
    目的NAT改变的是数据包的目的IP地址,当来自Internet的数据包访问NAT服务器网络接口的公网IP时,NAT服务器会把这些数据包的目的地址 转换为某一对应的内网IP,再路由给内网计算机。这样,使用内网IP地址的服务器也可以为Internet上的计算机提供网络服务了。如果大家学习过硬件 防火墙的话,会知道有一个DMZ区域,可以将内部对外的服务器放在这个区域映射出去。同理,iptables防火墙也可以实现同样的功能。"-j DNAT"指定了目标动作是DNAT,表示要对数据包的目的IP进行修改,它的子选项"--to 10.10.2.3"表示修改后的IP地址是10.10.2.3。于是,目的IP修改后,接下来将由路由模块把数据包路由给10.10.2.3服务器。假 设IP为10.10.2.3的计算机需要为Internet提供网络服务,此时,可以规定一个公网IP地址,使其与10.10.2.3建立映射关系,采用"-j PREROUTING”目标动作。假设使用的公网IP是218.75.26.34,则配置目的NAT的命令如下: 
iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32 -j DNAT --to 10.10.2.3 
    以上是在PREROUTING链中添加规则,这条链位于路由模块的前面,因此是在路由前改变了数据包的目的IP,这将对路由的结果造成影响。由于网络接口 eth0与Internet连接,因此,"-i eth0"保证了数据包是来自Internet的数据包。"-d 218.75.26.34/32"表示数据包的目的地是到218.75.26.34主机,而这个IP应该是eth0某个子接口的地址,这样才能由NAT服 务器接收数据包,否则,数据包将会因为无人接收而丢弃。 
    以上是让一个公网IP完全映射到内网的某个IP上,此时同10.10.2.3主机直接位于Internet,并且使用218.75.26.34地址是没有 区别的。因此这种方式虽然达到了地址转换的目的,但实际上并没有带来多大好处,因为使用NAT的主要目的是为了能够共用公网IP地址,以节省日益紧张的 IP地址资源。为了达到共用IP地址的目的,可以使用端口映射。端口映射是把一个公网IP地址的某一端口映射到内网某一IP地址的某一端口上去。它使用起 来非常灵活,两个映射的端口其端口号可以不一样,而且同一个公网IP的不同端口可以映射到不同的内网IP地址上去。例如,主机10.10.2.3只为外网 提供Web服务,因此,只需要开放80端口,而主机10.10.2.9为外网提供了FTP服务,因此需要开放21号端口。在这种情况下,完全可以把公网 IP地址218.75.26.34的80号和21号端口分别映射到10.10.2.3和10.10.2.9的80号和21号端口,以便两台内网服务器可以 共用一个公网IP。具体命令如下所示。 
iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32 -p tcp --dport 80 -j DNAT --to 10.10.2.3:80  
iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32 -p tcp --dport 21 -j DNAT --to 10.10.2.9:21
    以上命令中,目的地址是218.75.26.34的TCP数据包。当目的端口是80时,将转发给10.10.2.3主机的80端口;当目的端口是21时, 将转发给10.10.2.9主机的21号端口。当然,两个映射的端口完全可以不一样。例如,如果还有一台主机10.10.2.8也通过80端口提供Web 服务,并且映射的IP地址也是218.75.26.34,此时需要把218.75.26.34的另一个端口,如8080,映射到10.10.2.8的80 端口,命令如下: 
iptables -t nat -A PREROUTING -i eth0 -d 218.75.26.34/32 -p tcp --dport 8080 -j DNAT --to 10.10.2.8:80  
注意:上面介绍的只是有关iptables中的DNAT配置,在实际应用中,还需要其他一些配置的配合才能真正成功。例如,filter表的3个链应该允许相应的数据包通过,应该为每一个外网IP创建eth0接口的子接口等。  
此外,对于FTP服务来说,由于21号端口只是建立控制连接时用到的端口,真正传输数据时要使用其他端口。而且在被动方式下,客户端向FTP服务器发起连 接的端口号是随机的,因此,无法通过开放固定的端口来满足要求。为了解决这个问题,可以在Linux系统中载入以下两个模 块:modprobeip_conntrack_ftp和modprobeip_nat_ftp。这两个模块可以监控FTP控制流,以便能事先知道将要建 立的FTP数据连接所使用的端口,从而可以允许相应的数据包通过,即使防火墙没有开放这个端口。 
实验案例 
如图,RHEL-A是企业内网的一台服务器,RHEL-B是外网一台主机,RHEL-C是企业出口网关,Router代表运 营商路由器。企业内部使用私有地址,网关处需要进行NAT转换才可以访问,RHEL-C的eth0接口只有一个公网IP。要求RHEL-A能够访问外网的 RHEL-B,RHEL-B在浏览器上输入RHEL-C的外网IP时可直接访问RHEL-A的80端口(前提保证RHEL-A的http服务开启)。 

首先在RHEL-C上开启路由功能 
echo 1 >  /proc/sys/net/ipv4/ip_forward 
1、在RHEL-C上做SNAT进行源地址转换 
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j SNAT --to-source 198.2.3.2 
2、在RHEL-C上配置默认路由 
route add -net 0.0.0.0 netmask 0.0.0.0 gw 198.2.3.1 
3、在RHEL-B上配置默认路由 
route add –net 0.0.0.0 netmask 0.0.0.0 gw 203.2.3.1 
查看RHEL-C的nat规则表: 

此时如果没有其他问题的话,RHEL-A是可以Ping通外网以及RHEL-B的。现在开通RHEL-B的vsftpd服务,用RHEL-A去访问 

访问没有问题,在RHEL-B上查看进程连接 
netstat–na | more 
可以发现有下面这么一条记录: 
image 
说明RHEL-A是通过网关RHEL-C的外网IP 198.2.3.2对RHEL-B的21端口进行访问的,SNAT配置成功! 
4、在RHEL-C上做DNAT,将RHEL-A的80端口映射出去 
iptables -t nat -A PREROUTING -i eth1 -d 198.2.3.2/32 -p tcp --dport 80 -j DNAT --to 192.168.10.1:80
这时用RHEL-B的firefox浏览器访问http://198.2.3.2,如果成功显示RHEL-A的web页面,那么内部服务器映射外网是成功的,DNAT配置成功! 
----------------------------------------------------------------------------------

iptables设置远程桌面端口映射 禁止特定mac地址访问

远程桌面:
1
2
3
iptables -t nat -A PREROUTING -d 210.26.24.98 -p tcp --dport 3389 -j DNAT --to 192.168.200.199:3389
iptables -t nat -A POSTROUTING -d 192.168.200.199 -p tcp --dport 3389 -j SNAT --to 210.26.24.98

内网192.168.200.199
外网210.26.24.98
网页映射:
1
2
3
iptables -t nat -A PREROUTING -d 210.26.24.98 -p tcp --dport 80 -j DNAT --to 192.168.200.199:80
 iptables -t nat -A POSTROUTING -d 192.168.200.199 -p tcp --dport 80 -j SNAT --to 210.26.24.98
内网192.168.200.199
外网210.26.24.98
以规则mac地址禁用客户机:

iptables -A INPUT -m mac --mac-source 00:00:00:00:00:01 -j DROP