iptables(二)常用的示例

iptables(一)原理与常用的选项
在上面这篇文章,写了很多选项和格式,但是没有给出示例,在这里将会给出大量实例

试验环境
系统CentOS7
IP:192.168.253.128

链管理

  • 在filter表上自定义一条新链,链名IN_WEB
iptables -t filter -N IN_WEB    
  • 重命名自定义的链,将IN_WEB改名为WEB,必须保证为空链。否则会失败
iptables -t filter -E IN_WEB WEB
  • 删除filter表上自定义链的WEB
iptables -t filter -X WEB
  • 设置filter表上FORWARD链默认策略为DROP
iptables -t filter -P FORWARD DROP
  • 清空用户自定义的所有空链
iptables -X

查看

查看filter表所有规则,要求1.以数字格式显示地址与端口号2.显示详细信息。3显示规则的序号

iptables -t filter -nvL --line-numbers

清空所有的防火墙规则

iptables -F 

清空计数

iptables -Z  

开启22端口

iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT ##从22端口进来的数据包,都允许通过 
iptables -t filter -I OUTPUT -p tcp --sport 22 -j ACCEPT ##从22端口出去的数据包,都允许

设置白名单

白名单就是只有名单上的人才可以访问,黑名单就是除了名单上的,都可以访问。
我们可以用-P设置默认策略,默认策略一般是ACCEPT,我们假设一种场景,我们设置了22端口ACCEPT,这时候如果我们-P指定默认策略是DROP,这时候我们再一不小心iptables -F 清空了所有规则,这时候因为默认策略是DROP,并且规则已经被情况。所以默认就拒绝了所有链接。这时候我们就连不上去了。
所以我们可以用另一种方法设置白名单,iptables匹配条件的时候是至上而下。一条一条匹配,我们可以利用这个特性,在最后一条写拒绝所有链接。这样只要前面不匹配的,自然就到了最后一条,而最后一条是拒绝,也就做到了白名单的目的。而且有一个好处就是,这时候如果我们不小心-F清空所有规则,这时候因为默认策略是ACCEPT,所以我们还是连的上机器。

假设我们只允许22端口访问,其他全部拒绝

iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT ##从22端口进来的数据包,都允许通过 
iptables -t filter -I OUTPUT -p tcp --sport 22 -j ACCEPT ##从22端口出去的数据包,都允许出去
iptables -t filter  -A OUTPUT  -p all --src 192.168.253.128  -j DROP  ##出去的数据包全部丢弃
iptables -t filter  -A INPUT  -p all --dst  192.168.253.128  -j DROP  ##进来的数据包全部丢弃

仅允许192.168.253.129主机访问80端口

iptables -I INPUT -p tcp --src 192.168.253.129 --dport 80 -j ACCEPT
iptables -I OUTPUT -p tcp --dst 192.168.253.129 --sport 80 -j ACCEPT

自己可以ping别人,不允许别人ping自己

ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用
ICMP报文主要通过icmp-type来标志报文类型
icmp-type有2部分组成 一部分是类型TYPE,另一部分是代码CODE

TYPECODEDescription
00Echo Reply——回显应答(Ping应答)
30Network Unreachable——网络不可达
31Host Unreachable——主机不可达
32Protocol Unreachable——协议不可达
33Port Unreachable——端口不可达
35Source routing failed——源站选路失败
36Destination network unknown——目的网络未知
37Destination host unknown——目的主机未知
38Source host isolated (obsolete)——源主机被隔离(作废不用)
39Destination network administratively prohibited——目的网络被强制禁止
310Destination host administratively prohibited——目的主机被强制禁止
311Network unreachable for TOS——由于服务类型TOS,网络不可达
312Host unreachable for TOS——由于服务类型TOS,主机不可达
313Communication administratively prohibited by filtering——由于过滤,通信被强制禁止
314Host precedence violation——主机越权
315Precedence cutoff in effect——优先中止生效
40Source quench——源端被关闭(基本流控制)
50 Redirect for network——对网络重定向
51Redirect for host——对主机重定向
52Redirect for TOS and network——对服务类型和网络重定向
53Redirect for TOS and host——对服务类型和主机重定向
80Echo request——回显请求(Ping请求)

常用的就是0和8 其中0表示回应,8表示请求

iptables -t filter -I INPUT -d 192.168.253.128 -p icmp --icmp-type 0 -j ACCEPT
iptables -t filter -I OUTPUT -s 192.168.253.128 -p icmp --icmp-type 8 -j ACCEPT
iptables -t filter  -A OUTPUT  -p all --src 192.168.253.128  -j DROP  
iptables -t filter  -A INPUT  -p all --dst  192.168.253.128  -j DROP 

multiport扩展

同时开放多个端口,20,21,22,80

iptables -t filter -I INPUT -d  192.168.253.128 -p tcp  -m multiport --dport 20:22,80 -j ACCEPT
iptables -t filter -I OUTPUT -s 192.168.253.128 -p tcp -m multiport --sport 20:22,80 -j ACCEPT

iprange扩展

拒绝192.168.253.129-192.168.253.130主机访问

iptables -I INPUT -d 192.168.253.128 -p tcp --dport 80 -m iprange --src-range 192.168.253.129-192.168.253.130 -j REJECT

string扩展

可以利用httpd做一个实验
我们先写一个测试页

echo "Hello" > /var/www/html/test.html

然后启动httpd服务

systemctl  start  httpd

然后我们访问试试
这里写图片描述
我们现在基于字符串进行过滤,只要存在Hello字符串的数据包就拒绝

iptables -A OUTPUT -s 192.168.253.128  -p tcp --sport 80 -m string --algo bm --string "Hello" -j REJECT

这时候我们在192.168.253.129主机上再次访问
这里写图片描述
这里就访问不到了

time扩展

每个星期,星期五星期六星期天的早上8点到下午18点访问192.168.253.128主机80端口的所有请求都丢弃

iptables -A INPUT    -d 192.168.253.128 -p tcp --dport 80 -m time --timestart 8:00 --timestop 18:00 --weekdays Fri,Sat,Sun --kerneltz -j DROP

connlimit扩展

限制21端口,大于2个连接时,后面的连接直接拒绝。

iptables -A INPUT -d 192.168.253.128 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT

limit扩展

iptables -I INPUT  -d 192.168.253.128 -p icmp --icmp-type 8 -m limit --limit-burst 5 --limit 20/minute -j ACCEPT  ##允许别人ping自己,速率为每分钟20个,也就是每3秒接受一个请求。接受的请求最多不超过5个。
iptables -I OUTPUT  -s 192.168.253.128 -p icmp --icmp-type 0 -j ACCEPT##允许回复请求
iptables -A INPUT -p icmp -j REJECT ##不满足上面的要求的icmp报文全部拒绝。
防止SYN洪水攻击

syn洪水攻击

iptables -A INPUT -p tcp --syn -m limit --limit 5/second -j ACCEPT

state扩展

使用state模块的时候,我们会明显感觉到,把规则简单化了很多
比如我们要开放22和80端口,其他链接都拒绝

iptables -I INPUT -d 192.168.253.128 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 192.168.253.128  -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -p all -j REJECT 
iptables -A OUTPUT -p all -j REJECT 

实现这个功能主要是依赖一个链接追踪表。所以我们会发现一个问题,如果链接量很大。这时候我们这个表就可能会很大。将会降低服务器的使用效率。怎么解决这个问题呢?

追踪连接的文件:/proc/net/nf_conntrack
解决方法有2个
第一:加大追踪连接的数值
调整内核参数

net.ipv4.nf_conntrack_max = 393216
net.ipv4.netfilter.nf_conntrack_max = 393216

第二:降低追踪连接的时长

net.ipv4.netfilter.nf_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
开放被动模式的ftp服务

被动模式下,ftp命令端口和一个大于1024的特权端口肯定是相关的。所以可以利用这个相关的状态,实现开放ftp服务被动模式
(1) 装载ftp连接追踪的专用模块:

modproble  nf_conntrack_ftp

(2) 放行命令连接(假设Server地址为192.168.253.128)

iptables -A INPUT -d 192.168.253.128 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 192.168.253.128 -p tcp --sport 21 -m state --state ESTABLISHED -j ACCEPT

(3) 放行数据连接(假设Server地址为192.168.253.128):

iptables -A INPUT -d 192.168.253.128 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I OUTPUT -s 192.168.253.128 -m state --state ESTABLISHED -j ACCEPT

使用自定义链

自定义一个新链,链名为IN_WEB,里面存放一条规则,拒绝192.168.253.129主机访问80端口。

首先自定义IN_WEB链

iptables -N IN_WEB

在新链中添加一条规则

iptables -I IN_WEB -s 192.168.253.129 -p tcp --dport 80 -j REJECT 

当访问80端口则调用IN_WEB链

iptables -t filter -I INPUT  -p tcp --dport 80 -j IN_WEB

记录日志

iptables -I INPUT -s 192.168.253.129 -p tcp  --dport 80  -j LOG --log-prefix  "web"  ##定义记录的日志前缀有个web 方便找
[root@localhost ~]# iptables -A INPUT -s 192.168.253.129 -p tcp  --dport 80  -j REJECT  ##设置匹配成功则拒绝

日志都存放在/var/log/messages

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值