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策略,以减少不必要的系统开销