Linux : IPTABLES

防火墙规则input,forward,output

1.input 用于处理进入路由器的数据包,即数据包目标IP地址是到达路由器一个接口的IP地址,经过路由器的数据包不会在input-chains处理。

2.forward 用于处理通过路由器的数据包

3.output 用于处理源于路由器并从其中一个接口出去的数据包

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 (注意:如果22端口未加入允许规则,SSH链接会直接断开。) 
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)  
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-save > ipt.rule
然后iptables -F 清空规则 免得影响我们实验
1、本机ping通外网,外网ping不通本机iptables -I INPUT -p icmp --icmp-type 8 -j DROP 
DROP比较暴力,插入上面的规则后,用Windows去ping我们的实验机器,直接显示“请求超时”
如果我们用 iptables -I INPUT -p icmp --icmp-type 8 -j REJECT  (REJECT拒绝数据包通过,必要的时候会给发送端一个回应信息,比方说抓了对方的人,给对方带句话,人是我们抓的。)
如果用REJECT的话。ping 的回显是如下所示,无法连到端口
来自 192.168.0.185 的回复: 无法连到端口。

2、只允许指定的ip通过SSH登录到本机
iptables -A INPUT -p tcp --dport 22 -s ! 192.168.9.2 -j DROP
上面的规则是能实现只允许192.168.9.2通过SSH 登录到本机,但有如下的警告
Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`).
本人英语一级的水平 不知道什么意思,估计是个温馨提示什么的。
这里要注意,虚拟机用NAT模式的话,从真机进入虚拟机的源IP,应该是VMnet8的IP地址。

3、双网卡实现连通两个不同的网段,假设eth0连接192.168.0.0,eth1连接10.0.0.0,规则如下
iptables -A FORWARD -i eth0 -o eth1  -j ACCEPT

4、开放一个端口段,有些变态的监控需要很多端口(记得数据包要有去有回才能通)
iptables -A INPUT -p tcp --dport 3000:3389 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 3000:3389 -j ACCEPT

5、阻止本机使用FTP
iptables -A OUTPUT -p tcp --dport 21 -j DROP

6、阻塞发送到特定IP地址的流量
iptables -A OUTPUT -d 59.51.78.211 -j DROP
最后 iptables-restore < ipt.rule 恢复系统默认防火墙。

》》》》IPTABLES的NAT表:

准备工作:目的:
为了理解一点iptables的nat链的作用;

准备:
3台vmware虚拟机,系统都是centos6.7 x32,都为桥接模式,因为有真实路由器,网关:192.168.1.1
第1台作为网关,命令:hostname gate # eth1 192.168.1.150,eth0 10.0.0.1
第2台作为客户机,命令:hostname client # 10.0.0.241
第3台作为外网服务器,命令:hostname server # 192.168.1.103

原理图:

<ignore_js_op> 


在gate上操作:
编辑ifcfg-eth0,改动以下几行,eth0作为内网网卡:
IPADDR=10.0.0.1
NETMASK=255.255.255.0
#GATEWAY=192.168.1.1
#DNS1=略
#DNS2=8.8.4.4

编辑ifccfg-eht1,改动以下几行,eth1作为外网网卡:
IPADDR=192.168.1.150
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
DNS1=运营商dns的ip
DNS2=8.8.4.4

重启网卡:
service network restart

开启内核转发功能:
echo "1" > /proc/sys/net/ipv4/ip_forward

添加iptables,nat表规则:
iptables -t nat -F # 清空nat表

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.1.150 # 必须加在postrouting链


在client上操作:
编辑ifcfg-eth0,网关改成gate主机的ip地址:
IPADDR=10.0.0.241
NETMASK=255.255.255.0
GATEWAY=10.0.0.1

重启网络:
service network restart

从内网(client主机)ping外网:
ping真实路由器(此时真实路由器相当于外网中的一台主机):
ping 192.168.1.1 # 可ping通

ping另一台虚拟机,主机名server(这台主机也相当于外网的主机):
ping 192.168.1.103 # 可ping通

ping虚拟机server时的线路分析猜测:
client虚拟机出发——》经过windows系统——》windows主机的网线——》到达真实路由器——》转发出去——》原路回来后虚拟机server的eth1接收——》从网卡eth1发给eht0再从eht0出发——》windows主机网线——》路由器接收——》转发——》client虚拟机接收

从ping的时间可以验证这条线路(只是猜测,不一定对):
1,从client去ping 192.168.103:0.7ms 左右
2,从gate 去ping  192.168.103:0.4ms 左右

从外网ping内网:
# 从主机server(192.168.1.103)去ping内网的主机client(10.0.0.241)
ping 10.0.0.241 # 无法ping通

访问server主机上的nginx:
在client虚拟机上操作:
curl 192.168.1.103 # 103是server的ip

在server上看nginx日志:
tail -1 /var/log/nginx/access.log
# 可以看到来源ip是gate虚拟机的ip,192.168.1.150
192.168.1.150 - - [28/Oct/2015:22:59:18 +0800] "GET / HTTP/1.1" 200 16 "-" "curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2" "-"

SNAT转发的作用:可以隐藏客户机ip且起到路由器的作用


另外ip伪装也是类似的:
# 在gate机器上清空nat表后加入如下一行,-o eht1 指定了出口网卡是eht1,即外网网卡,也可以不指定
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth1 -j MASQUERADE

# 或如下一行,这样源地址10.0.0.0网段24的地址会做SNAT转换,数据包源地址变成eth1网卡的地址 .150
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE


ip伪装的解释:
MASQUERADE,地址伪装,算是snat中的一种特例,可以实现自动化的snat。
在iptables中有着和SNAT相近的效果,但也有一些区别,但使用SNAT的时候,出口ip的地址范围可以是一个,也可以是多个,例如:

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3的ip然后发出去,
iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source192.168.5.3

如下命令表示把所有10.8.0.0网段的数据包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等几个ip然后发出去
iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source192.168.5.3-192.168.5.5

这就是SNAT的使用方法,即可以NAT成一个地址,也可以NAT成多个地址,但是,对于SNAT,不管是几个地址,必须明确的指定要SNAT的ip,假如当前系统用的是ADSL动态拨号方式,那么每次拨号,出口ip192.168.5.3都会改变,而且改变的幅度很大,不一定是192.168.5.3到192.168.5.5范围内的地址,这个时候如果按照现在的方式来配置iptables就会出现问题了,因为每次拨号后,服务器地址都会变化,而iptables规则内的ip是不会随着自动变化的,每次地址变化后都必须手工修改一次iptables,把规则里边的固定ip改成新的ip,这样是非常不好用的。

MASQUERADE就是针对这种场景而设计的,他的作用是,从服务器的网卡上,自动获取当前ip地址来做NAT。
比如下边的命令:
iptables-t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
如此配置的话,不用指定SNAT的目标ip了,不管现在eth0的出口获得了怎样的动态ip,MASQUERADE会自动读取eth0现在的ip地址然后做SNAT出去,这样就实现了很好的动态SNAT地址转换

MASQUERADE伪装:同样可以隐藏客户机ip且起到路由器的作用


DNAT作用:
例如将上面实验中的gate虚拟机作为一个公网防火墙,来保护局域网内的真实主机(比如web服务器);

在gate机器(192.168.1.150)上添加规则:
iptables -t nat -A PREROUTING -d 192.168.1.150 -j DNAT --to-destination 10.0.0.241

在client机器(10.0.0.241)启动nginx并测试:
/etc/init.d/nginx start

从server机器(192.168.1.103,此时作为客户端)去访问web:
curl 192.168.1.150
# 结果
111111111master...client

在client(此时作为防火墙后的真实web服务器)上查看nginx日志:
<ignore_js_op>file:///C:/Users/bfff3/AppData/Local/YNote/data/1165175299@qq.com/eff5d79acc8944ad85c25d33eef3e12c/clipboard.png

直接从客户端ping真实web:
可以看到无法ping通
<ignore_js_op> 

 

 

SNAT策略概述:

 

SNAT策略的典型应用环境

 

局域网主机共享单个公网IP地址接入Internet

 

SNAT策略的原理:

 

源地址转换(Source Network Address Translation)是linux防火墙的一种地址转换操作,也是iptables命令中的一种数据包控制类型,并根据指定条件修改数据包的源IP地址。

 

实验环境拓扑:

 

 

实验分析:

 

a:只开启路由转发,未做地址转换的情况:

 

 

分析:

 

  • 从局域网PC机访问Internet的数据包经过网关转发后其源IP地址保持不变;

  • 当Internet中的主机收到这样的请求数据包后,响应数据包将无法正确返回,从而导致访问失败。

 

b:开启路由转发,并设置SNAT转换的情况:

 

 

分析:

 

  • 局域网PC机访问Internet的数据包到达网关服务器时,会先进行路由选择;

  • 如果该数据包需要从外网接口eth0向外转发,则将其源IP地址192.168.10.2修改为网关的外网接口地址210.106.46.151,然后发送给目标主机。

  • 这种访问方式的优点:

  • Internet中的服务器并不知道局域网PC机的实际IP地址,中间的转换完全由网关主机完成,起到了保护内部网络的作用。

 

SNAT策略的应用:

 

前提条件:

 

  • 局域网各主机正确设置IP地址/子网掩码

  • 局域网各主机正确设置默认网关地址

  • Linux网关支持IP路由转发

 

实现方法:

 

编写SNAT转换规则

 

SNAT共享固定IP地址上网:

 

实验环境描述:

 

  • Linux网关服务器两块网卡eth0:210.106.46.151连接Internet、eth1:192.168.10.1连接局域网,开启IP路由功能

  • 局域网PC机的默认网关设为192.168.10.1,并设置正确的DNS服务器。

  • 内网和外网分别新建客户机,分别指定对应的网关地址,在外网客户机上开启httpd服务,在内网客户机中访问httpd服务,最后查看httpd客户机的访问记录;

  • 要求:192.168.10.0/24网段的PC机能够通过共享方式正常访问internet。

 

实验步骤:

 

1:打开网关的路由转发(IP转发是实现路由功能的关键所在):

 

打开路由转发的两种方式

 

永久打开修改/proc文件系统中的ip_forward,当值为1时表示开启,为0表示关闭):

 

 

 

临时开启,临时生效:

 

 

2:正确设置SNAT策略(若要保持SNAT策略长期有效,应将相关命令写入rc.local中):

 

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j SNAT --to-source 210.106.46.151

 

 

 

 

3:测试SNAT共享接入的结果:

 

上诉操作完成后,使用局域网PC就可以正常访问Internet中的网站。

 

 

对于被访问的网站服务器,在日志文件中将会记录以网关主机210.106.46.151访问。

 

 

共享动态IP地址上网

 

  • MASQUERADE —— 地址伪装

  • 适用于外网IP地址��固定的情况

  • 对于ADSL拨号连接,接口通常为ppp0、ppp1

  • 将SNAT规则改为MASQUERADE即可

 

实例:

 

[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ppp0 -j MASQUERADE

 

 

如果网关使用固定的公网IP地址,建议选择SNAT策略而不是MASQUERADE策略,以减少不必要的系统开销

 

posted @ 2015-11-01 19:50  Nyan  阅读(649)  评论(0编辑  收藏  举报