iptables企业应用,先看拓扑图:
如图所示,使用虚拟机搭建的实验环境:
1.笔记本电脑(简称外网用户)模拟的是外网用户
2.中间服务器(简称网关)系统Linux,使用iptables防火墙,来当作内网的网关
3.Windows2003是内网中的一台服务器
4.内网的客户端电脑
其中 :
网关eth0通过桥接方式和笔记本电脑通信,而eth1使用custom (VMnet1 host-only)方式
Windows2003也是使用custom (VMnet1 host-only)方式
测试:
内网客户端ping 网关
网关本身可不可以上网
实验开始:
一、开启网关的内核转发数据包功能,默认Linux是不开启数据包转发功能
- [root@server1 ~]# echo "1" /proc/sys/net/ipv4/ip_forward #可以这么开启,不过重启之后就失效了,因为这个文件是内存中的
基于这种情况,要修改内核的配置文件vim /etc/sysctl.conf
- # Controls IP packet forwarding
- net.ipv4.ip_forward = 1 #找到这行,把0修改为1
- [root@server1 ~]# sysctl -p #这条命令可以把这些指令重新加载到内核中去
- net.ipv4.ip_forward = 1
- net.ipv4.conf.default.rp_filter = 1
- net.ipv4.conf.default.accept_source_route = 0
- kernel.sysrq = 0
- kernel.core_uses_pid = 1
- net.ipv4.tcp_syncookies = 1
- kernel.msgmnb = 65536
- kernel.msgmax = 65536
- kernel.shmmax = 4294967295
- kernel.shmall = 268435456
- [root@server1 ~]# cat /proc/sys/net/ipv4/ip_forward #现在查看这个文件的值为1
- 1
- [root@server1 ~]#
二、在网关上做SNAT使内网电脑可以连接到Internet
- [root@server1 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 192.168.18.110
客户端上网还有一个前提,就是iptables filter 表中的FORWARD链默认是ACCEPT状态,这么一条才可以使客户端上网。如果默认是DROP状态的话,那客户端也是无法上网的。
三、能让客户端上网的方法
方法一、把FORWARD的默认策略设置为DROP,然后一个一个服务开放,只能开放我们知道端口(用工具抓包,然后分析出IP地址和端口)的服务或者软件,这种情况会造成迅雷等软件无法使用(因为不知道迅雷下载时候用什么端口)
1.能ping
- iptables -t filter -A FORWARD -p icmp -j ACCEPT
2.能看网页
内网客户机出去的目标端口是80,53都放行
- iptables -t filter -A FORWARD -p tcp -i eth1 --dport 80 -s 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp -i eth1 --dport 53 -s 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p udp -i eth1 --dport 53 -s 192.168.0.0/24 -j ACCEPT
- 者 两者写其中一个即可
- iptables -t filter -A FORWARD -p tcp --dport 80 -s 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --dport 53 -s 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p udp --dport 53 -s 192.168.0.0/24 -j ACCEPT
解析后回来的源端口是80,53的都给与放行
- iptables -t filter -A FORWARD -p tcp -i eth0 --sport 80 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p udp -i eth0 --sport 53 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp -i eth0 --sport 53 -d 192.168.0.0/24 -j ACCEPT
- 或者,两者写其中一个即可
- iptables -t filter -A FORWARD -p tcp --sport 80 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p udp --sport 53 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --sport 53 -d 192.168.0.0/24 -j ACCEPT
3.能收发邮件
- iptables -t filter -A FORWARD -p tcp --dport 25 -s 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --sport 25 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --sport 110 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --dport 110 -s 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --sport 143 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --dport 143 -s 192.168.0.0/24 -j ACCEPT
有其他端口的类似设置就可以了,一出一进配合。
4.上QQ
QQ登录时可以使用2种情况,udp 8000 /tcp 80、443,会自动检测那个端口开放着,那个开放,就用那个端口登录
UDP 8000
- iptables -t filter -A FORWARD -p udp --dport 8000 -s 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p udp --sport 8000 -d 192.168.0.0/24 -j ACCEPT
- tcp 80(跟网页端口一样80,所以只要能看网页,那就能上QQ)
- iptables -t filter -A FORWARD -p tcp --sport 80 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --dport 80 -s 192.168.0.0/24 -j ACCEPT
- tcp 443
- iptables -t filter -A FORWARD -p tcp --sport 443 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --dport 443 -s 192.168.0.0/24 -j ACCEPT
更严格的措施,就是找出QQ登录服务器的地址,然后设置:
- iptables -t filter -A FORWARD -p tcp --dport 443 -s 192.168.0.0/24 -d 119.147.45.43 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --sport 443 -s 119.147.45.43 -d 192.168.0.0/24 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --dport 80 -s 192.168.0.0/24 -d 112.95.240.16 -j ACCEPT
- iptables -t filter -A FORWARD -p tcp --sport 80 -s 112.95.240.16 -d 192.168.0.0/24 -j ACCEPT
这种情况会造成比较多的软件无法使用,只有一个一个找出软件的IP地址和端口,才能使用,不建议这么设置
方法二、也是把FORWARD链的默认策略设置为DROP,然后手工添加要上网的IP地址(当然也可以用脚本批量添加),这样没有进行设置的客户端就无法上网,这种情况可以使用迅雷下载,还可以限制迅雷的速度,推荐使用这种方法
做以上设置是很严格了,但是好多应用不能用,而且迅雷这种软件根本就不知道用什么端口,连接那个IP地址,而且我们有事又需要用迅雷下载,这时我们就可以限制迅雷的下载速度,按照以下命令来:
a.让所有出去都可以出去
- [root@server1 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 192.168.18.110
- [root@server1 ~]# iptables -t filter -A FORWARD -i eth1 -s 192.168.0.0/24 -j ACCEPT
b.进来的要进行限速,对单个主机进行限速(要在网关的外网卡限制下载的速度,而在内网卡上限制上传的速度)
- [root@server1 ~]# iptables -t filter -A FORWARD -i eth0 -d 192.168.0.2 -m limit --limit 10/s --limit-burst 10 -j ACCEPT
按照这个命令,这个主机最大也就14.6KB/S,根据实际情况对速度进行调整
-m limit --limit 10/s --limit-burst 10 该选项就是对主机进行限速
--limit 10/s:
10/s是每秒发个10个包,又因网卡的MTU值为1500B,换算成KB,1500/1024=1.46KB,也就是每个包大小理想情况下是1.46KB,每秒10个包,那就是每秒1.46*10=14.6KB/S
--limit-burst 10 :最大峰值也是10个包
c.做端口映射,有时间需要把内网的服务器发布到外网,让外网的用户也能访问,这时就需要端口映射。
访问网关的8080端口,就是相当于访问,内网192.168.0.2的80端口
- [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.18.110 --dport 8080 -j DNAT --to 192.168.0.2:80
访问网关的3389端口,就相当于访问内网192.168.0.2的3389端口,这样就把3389端口映射出去了
- [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.18.110 --dport 3389 -j DNAT --to 192.168.0.2:3389
做端口映射时,POSTROUTING链其实可以不做SNAT,iptables就能把进来的包交给内网机器,而内网机器也将数据回复到外网的机器,原因是:iptables是一种状态型的防火墙,不用我们手动将设置数据包的转发方向,它也能很好的转发我们的数据包。
查看nat表和filter表
- [root@server1 ~]# iptables -t nat -nL
- Chain PREROUTING (policy ACCEPT)
- target prot opt source destination
- DNAT tcp -- 0.0.0.0/0 192.168.18.110 tcp dpt:8080 to:192.168.0.2:80
- DNAT tcp -- 0.0.0.0/0 192.168.18.110 tcp dpt:3389 to:192.168.0.2:3389
- Chain POSTROUTING (policy ACCEPT)
- target prot opt source destination
- SNAT all -- 192.168.0.0/24 0.0.0.0/0 to:192.168.18.110
- Chain OUTPUT (policy ACCEPT)
- target prot opt source destination
- [root@server1 ~]# iptables -t filter -nL
- Chain INPUT (policy ACCEPT)
- target prot opt source destination
- Chain FORWARD (policy DROP)
- target prot opt source destination
- ACCEPT all -- 192.168.0.0/24 0.0.0.0/0
- ACCEPT all -- 0.0.0.0/0 192.168.0.0/24
- Chain OUTPUT (policy ACCEPT)
- target prot opt source destination
- Chain RH-Firewall-1-INPUT (0 references)
- target prot opt source destination
注意:这时候,就算filter中的INPUT和OUTPUT链默认策略是DROP,那也不会影响端口映射的,因为INPUT链和OUTPUT链只会对进入自己和自己出去的做限制,这时候是转发,所以不会影响。
d.发布内网的FTP服务器到外网去
先看FTP的工作模式:主动模式和被动模式
主动模式(Active):客户端以一个大于1024端口的随机端口(假设n端口),向服务器的21端口发出请求,服务器用21端口进行回应,然后服务器会以20端口,来主动去连接客户端的(n+1)端口,然后就开始传输数据.只有这种模式下才会用到20端口。
现在通过iptables 来发布FTP,先看主动模式:
- [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.18.110 --dport 21 -j DNAT --to 192.168.0.2:21
- [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.18.110 --dport 20 -j DNAT --to 192.168.0.2:20
这时客户端如果设置为被动模式的话,是连接不到服务器
被动模式(Passive)
客户端以一个大于1024端口的随机端口(假设n端口),向服务器的21端口发出请求,服务器用21端口进行回应(这里面包含一个随机端口m,用于和客户端进行数据传输),然后客户端以n+1端口,连接服务器的m端口,最后传输数据。
以被动模式发布FTP,因为被动模式服务器端口是用随机端口和客户端进行数据传输,所以我们就不知道该发布什么端口出去,这时就需要借助2个模块来实现。ip_nat_ftp和ip_conntrack_ftp这2个模块,加载到内核当中去,就可以实现FTP的被动模式的发布。
- [root@server1 ~]# modprobe ip_nat_ftp
- [root@server1 ~]# modprobe ip_conntrack_ftp
- [root@server1 ~]# lsmod | grep ftp
- 2:ip_nat_ftp 7361 0
- 3:ip_conntrack_ftp 11569 1 ip_nat_ftp
- 14:ip_nat 20973 2 ip_nat_ftp,iptable_nat
- 15:ip_conntrack 53281 5 ip_nat_ftp,ip_conntrack_ftp,ip_conntrack_netbios_ns,iptable_nat,ip_nat
- 只需要发布21端口出去就可以了。
- [root@server1 ~]# iptables -t nat -A PREROUTING -p tcp -d 192.168.18.110 --dport 21 -j DNAT --to 192.168.0.2:21
这样客户端就可以以被动模式(FTP客户端可以设置被动模式和主动模式)来连接到服务器,这时如果用主动模式连接服务器,是连接不到的。
所以FTP工作于什么模式,完全在于FTP客户端的设置,而不在于服务器端,大多数情况下服务器端是不开放20端口,所以我们只能用被动模式去连接处于内网中的FTP服务器
方法三、把FORWARD链默认设置为ACCEPT,然后来限制某些服务的运行,这种情况下,无法限制迅雷的速度,因为一旦FORWARD链设置为ACCEPT的话,其他策略设置都不起作用,不推荐这种方法,还有如果上网行为严格的话,那么要找到那么软件的使用的端口及IP地址很是麻烦。
限制QQ登录,首先要找到QQ登录都使用那些地址
tcpdump -i eth1 host 192.168.0.2 -s 0 -w qq.pcap 使用这个命令可以抓包,就可以知道某个软件使用什么端口,IP地址信息,然后把qq.pcap下载下来,用wireshark来分析 (点 Statistics-Conversation-IPv4),就可以看到QQ使用了多个地址,默认使用了UDP 8000 端口,把这些地址记下,使用iptables 来做限制
- iptables -t filter -A FORWARD -p udp -s 192.168.0.0/24 -d 112.95.240.16 --dport 8000 -j DROP
- iptables -t filter -A FORWARD -p udp -s 192.168.0.0/24 -d 112.95.240.16 -m multiport --dport 8000,80,443 -j DROP
多端口要这么设置
然后把这些地址和这些端口,封掉,但是webQQ无法封,因为使用80端口,以此类推找到其他不能使用的软件的端口IP地址,禁止掉。
转载于:https://blog.51cto.com/linux5588/752084