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

TYPE CODE Description
0 0 Echo Reply——回显应答(Ping应答)
3 0 Network Unreachable——网络不可达
3 1 Host Unreachable——主机不可达
3 2 Protocol Unreachable——协议不可达
3 3 Port Unreachable——端口不可达
3 5 Source routing failed——源站选路失败
3 6 Destination network unknown——目的网络未知
3 7 Destination host unknown——目的主机未知
3 8 Source host isolated (obsolete)——源主机被隔离(作废不用)
3 9 Destination network administratively prohibited——目的网络被强制禁止
3 10 Destination host administratively prohibited——目的主机被强制禁止
3 11 Network unreachable for TOS——由于服务类型TOS,网络不可达
3 12 Host unreachable for TOS——由于服务类型TOS,主机不可达
3 13 Communication administratively prohibited by filtering——由于过滤,通信被强制禁止
3 14 Host precedence violation——主机越权
3 15 Precedence cutoff in effect——优先中止生效
4 0 Source quench——源端被关闭(基本流控制)
5 0 Redirect for network——对网络重定向
5 1 Redirect for host——对主机重定向
5 2 Redirect for TOS and network——对服务类型和网络重定向
5 3 Redirect for TOS and host——对服务类型和主机重定向
8 0 Echo 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主机上再次访问
iptables(二)常用的示例_第1张图片
这里就访问不到了

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

iptables(二)常用的示例_第2张图片

你可能感兴趣的:(iptables)