20个Linux防火墙应用技巧

简介:

Netfilter作为Linux内置的主机防火墙,它可以使用iptables命令处理IPv4协议,也可以使用ip6tables命令处理IPv6协议。在iptables之前,Linux 2.2中使用ipchains来配置防火墙,Linux 2.0中则使用ipfwadm,它基于BSD的ipfw命令实现。

以下命令在RHEL 6.x上执行通过,但也适用于其他Linux发行版。

1.显示防火墙的状态

以root权限运行下面的命令:

# iptables -L -n -v

参数说明:

  • -L:列出规则。

  • -v:显示详细信息。此选项会显示接口名称、规则选项和TOS掩码,以及封包和字节计数。

  • -n:以数字形式显示IP地址和端口,不使用DNS解析。

如果希望输出的结果中显示行号,可以运行:

# iptables -L -n -v --line-nmubers

这样,就可以按照行号在防火墙中添加、删除规则。

要显示输入或输出链规则,可以运行:

# iptables -L INPUT -n -v  
# iptables -L OUTPUT -n -v --line-numbers

2.停止、开启和重启防火墙

如果你使用的是RHEL/Fedora/CentOS系统,可以运行:

# service iptables stop  # service iptables start  # service iptables restart

我们也可以使用iptables命令停止防火墙并删除所有规则:

# iptables -F  
# iptables -X  
# iptables -t nat -F  
# iptables -t nat -X  
# iptables -t mangle -F  
# iptables -t mangle -X  
# iptables -P INPUT ACCEPT  
# iptables -P OUTPUT ACCEPT  
# iptables -P FORWARD ACCEPT

参数说明:

  • -F:删除所有的规则

  • -X:删除链

  • -t table_name:匹配表(称为nat或mangle)

  • -P:设置默认策略(如DROP、REJECT或ACCEPT)

3.删除防火墙规则

以带行号的形式显示已有的防火墙规则,请运行:

# iptables -L INPUT -n --line-numbers  
# iptables -L OUTPUT -n --line-numbers  
# iptables -L OUTPUT -n --line-numbers | less  
# iptables -L OUTPUT -n --line-numbers | grep 202.54.1.1

下面我们使用行号删除规则:

# iptables -D INPUT 4

将IP地址202.54.1.1从规则中删除:

# iptables -D INPUT -s 202.54.1.1 -j DROP

参数说明:

  • -D:从选择的链中删除一条或多条规则

4.插入防火墙规则

首先运行下面的命令:

# iptables -L INPUT -n --line-numbers

得到运行结果:

Chain INPUT (policy DROP)  num  target    prot opt source     destination  1   DROP      all  --  202.54.1.1  0.0.0.0/0  2   ACCEPT    all  --  0.0.0.0/0    0.0.0.0/0

在行1和行2之间插入规则:

# iptables -I INPUT 2 -s 202.54.1.2 -j DROP

查看更新后的规则,会发现插入成功,下面是示例:

Chain INPUT (policy DROP)  Num  target    prot opt source    destination    1     DROP    all  --  202.54.1.1  0.0.0.0/0  
2     DROP    all  --  202.54.1.2  0.0.0.0/0 
3     ACCEPT  all  --  0.0.0.0/0    0.0.0.0/0

5.保存防火墙规则

在RHEL/Fedora/CentOS Linux下,可以使用下面的命令保存防火墙规则:

# service iptables save

在其它Linux发行版(如Ubuntu)上,可以使用iptables-save命令保存防火墙规则:

# iptables-save > /root/my.active.firewall.rules  

# cat /root/my.active.firewall.rules

6.重新加载防火墙规则

我们可以使用iptables-restore命令重新加载使用iptables-save命令保存的防火墙规则

# iptables-restore < /root/my.active.firewall.rules

我们还可以利用这种特性来快速部署防火墙规则。

7.设置默认防火墙策略

我们首先来配置一个防火墙策略,它默认丢弃所有的网络数据包:

# iptables -P INPUT DROP  
# iptables -P OUTPUT DROP  
# iptables -P FORWARD DROP  
# iptables -L -v -n 
#连接失败,因为防火墙丢弃所有的网络数据包  
# ping cyberciti.biz  
# wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

在此基础上,我们只关闭入站连接:

# iptables -P INPUT DROP  
# iptables -P FORWARD DROP  
# iptables -P OUTPUT ACCEPT  
# iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT  
# iptables -L -v -n  
#ping和wget可以正常工作  
# ping cyberciti.biz  
# wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.2-rc5.tar.bz2

8.在公网网络接口上停用私有网络地址

我们可以从公网网络接口上删除私有IPv4网段,以防止IP欺骗。运行下面的命令,没有源路由地址的数据包会被丢弃:

# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP  

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

下面是私有网络IPv4地址范围,请确认在公网接口予以屏蔽:

  • 10.0.0.0/8 -j (A)

  • 172.16.0.0/12 (B)

  • 192.168.0.0/16 (C)

  • 224.0.0.0/4 (多播 D)

  • 240.0.0.0/5 (E)

  • 127.0.0.0/8 (回环)

9.屏蔽IP地址访问

如果我们想屏蔽一个IP地址,比如1.2.3.4,可以运行:

# iptables -A INPUT -s 1.2.3.4 -j DROP  # iptables -A INPUT -s 192.168.0.0/24 -j DROP

10.屏蔽入栈端口请求

如果我们想80端口上屏蔽所有的服务请求,可以运行:

# iptables -A INPUT -p tcp --dport 80 -j DROP  

# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

只想屏蔽IP地址1.2.3.4对80端口的请求,可以运行:

# iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP  

# iptables -A INPUT -i eth1 -p tcp -s 192.168.1.0/24 --dport 80 -j DROP

11.屏蔽出栈IP地址

现在我们来演示如何屏蔽对主机名和IP地址的出栈访问。

首先,我们来获取一个域名的IP地址:

# host -t a cyberciti.biz

输出示例:

cyberciti.biz has address 75.126.153.206

要屏蔽访问域名cyberciti.biz的网络数据包,可以运行:

# iptables -A OUTPUT -d 75.126.153.206 -j DROP

下面是使用子网掩码的示例:

# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP # iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP

下面我们以屏蔽facebook.com为例,进行说明。首先,我们需要facebook的所有IP地址:

# host -t a www.facebook.com

示例输出:

www.facebook.com has address 69.171.228.40

找出IP地址69.171.228.40的CIDR:

# whois 69.171.228.40 | grep CIDR

示例输出:

CIDR:69.171.224.0/19

现在我们来阻止对facebook.com的访问:

# iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

我们也可以直接屏蔽域名:

# iptables -A OUTPUT -p tcp -d www.facebook.com -j DROP  # iptables -A OUTPUT -p tcp -d facebook.com -j DROP

12.记录并丢弃数据包

在公网网络接口上记录并丢弃IP地址欺骗数据包:

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "  

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

默认情况下日志记录在/var/log/messages文件中:

# tail -f /var/log/messages  # grep --color 'IP SPOOF' /var/log/messages

我们还可以用-m参数对日志记录进行限制,以防止日志文件过度膨胀。

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "  
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

13.根据MAC地址允许或阻止数据包的传入

我们可以根据MAC地址允许或阻止数据包的传入:

# iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP

14.屏蔽ICMP ping请求

我们可以通过允许下面的命令屏蔽ping请求:

# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP # iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP

也可以按照特定的网段和主机限制ping请求:

# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

以下命令只接受受限制的ping请求:

#假定默认INPUT策略为丢弃数据包  
# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT  
# iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT  
# iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT  
#所有的服务器都对ping请求作出应答  
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

15.开启端口序列

下面的命令可以允许7000到7010范围内的TCP端口访问:

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

16.允许一系列IP地址访问

下面的命令可以允许IP地址范围

#运行IP地址范围192.168.1.100 到192.168.1.200 访问80端口  

# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT  

#NAT示例  

# iptables -t nat -A POSTROUTING -j SNAT --to-source 192.168.1.20-192.168.1.25

17.建立连接并重启防火墙

当重启iptables服务时,它会断开所有已建立的连接。这是因为在重启防火墙时,会卸载IPTABLES_MODULES_UNLOAD模块。

要解决这个问题,可以编辑/etc/sysconfig/iptables-config

IPTABLES_MODULES_UNLOAD = no

18.使用Crit日志级别

# iptables -A INPUT -s 1.2.3.4 -p tcp --destination-port 80 -j LOG --log-level crit

19.屏蔽或开启常见端口

屏蔽或开启常用的TCP、UDP端口:

#可以使用DROP替换ACCEPT,实现端口屏蔽。  
#打开22端口(SSH)  # iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT  # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT  
#打开TCP/UDP631端口(打印服务)  
# iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT  
# iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT  
# 打开123端口,允许局域网用户进行NTP时间同步  
# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT  
#打开25端口(SMTP)  
# iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT 
# 打开DNS端口 # iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT # iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT  
#打开http/https端口  # iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT 
# iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT  
#打开TCP110端口(POP3)  
# iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT  
#打开TCP143端口  
# iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT  
#为局域网用户开启Samba访问  
# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT # iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT  
#为局域网用户开启代理服务器访问  
# iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT  
#为局域网用户开启MySQL访问  
# iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

20.限制客户端IP的并发连接数

我们可以使用connlimit模块限制客户端IP的并发连接数。下面的命令允许每个客户端只能并发3个ssh连接:

# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

设置HTTP并发连接为20个:

# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

参数说明:

  • --connlimit-above 3:连接数超过3个自动匹配

  • --connlimit-mask 24:子网掩码匹配

更好的使用iptables

首先,我们要学会查看man手册:

$ man iptables

 我们还可以这样查看帮助:

# iptables -h

我们还可以查看特定命令的帮助:

# iptables -j DROP -h

测试防火墙

测试端口是否开放:

# netstat -tulpn

测试TCP 80端口是否开放:

# netstat -tulpn | grep :80

如果80端口未开放,请确保启动Apache服务器:

# service httpd start

并确保打开iptables防火墙80端口:

# iptables -L INPUT -v -n | grep 80

如果80端口没有开放,可以运行下面的命令:

# iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT 
  # service iptables save

下面使用telnet命令测试是否可以连接到80端口:

$ telnet www.cyberciti.biz 80

下面是示例输出:

Trying 75.126.153.206...  Connected to www.cyberciti.biz.  Escape character is '^]'.  ^]  telnet> quit  Connection closed.

最后,我们也推荐使用嗅探工具(如tcpdump、ngrep)对防火墙设置进行测试。

以上只是一些基本的防火墙配置策略,如果你想构造更复杂的防火墙策略,需要对TCP/IP和Linux内核配置文件sysctl.conf进行更深入的学习。(张志平/编译)











本文转自 chengxuyonghu 51CTO博客,原文链接:http://blog.51cto.com/6226001001/1575983,如需转载请自行联系原作者
目录
相关文章
|
14天前
|
机器学习/深度学习 自然语言处理 Linux
【专栏】Linux 中的机器学习:Whisper适用于语音助手、翻译等领域,随着技术发展,其应用前景广阔
【4月更文挑战第28天】本文探讨了在Linux环境下,先进自动语音识别系统Whisper的运用与实现高效ASR。Whisper基于PyTorch,支持多语言识别,具有高准确性和实时性。文中介绍了安装配置Whisper的步骤,包括安装依赖、下载代码、配置环境变量及编译安装。通过数据准备、模型训练和识别,可实现语音识别功能。Whisper适用于语音助手、翻译等领域,随着技术发展,其应用前景广阔。
|
3天前
|
Linux 编译器 调度
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
本文介绍了如何将POSIX应用程序编译为在Xenomai实时内核上运行的程序。
18 1
xenomai内核解析--双核系统调用(二)--应用如何区分xenomai/linux系统调用或服务
|
3天前
|
消息中间件 存储 Linux
linux实时应用如何printf输出不影响实时性?
本文探讨了Linux实时任务中为何不能直接使用`printf(3)`,并介绍了实现不影响实时性的解决方案。实时任务的执行时间必须确定且短,但`printf(3)`的延迟取决于多个因素,包括用户态glibc缓冲、内核态TTY驱动和硬件。为确保实时性,通常将非实时IO操作交给低优先级任务处理,通过实时进程间通信传递信息。然而,即使这样,`printf(3)`在glibc中的实现仍可能导致高优先级任务阻塞。Xenomai 3提供了一个实时的`printf()`实现,通过libcobalt库在应用编译链接时自动处理,预分配内存,使用共享内存和线程特有数据来提高效率和实时性。
12 0
linux实时应用如何printf输出不影响实时性?
|
5天前
|
安全 Linux Shell
Linux常用命令详解与实战应用
【5月更文挑战第7天】本文详述了Linux常用命令,包括文件与目录操作(ls, cd, pwd, cp, mv, rm)、文本处理(cat, grep, sed)及系统管理(top, df, du)命令。通过实例演示了如何使用这些命令,帮助读者理解和掌握Linux操作,提升系统管理效率。学习和熟练运用这些基础命令,是高效使用Linux的关键。
|
11天前
|
Linux Shell 调度
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
【Linux系列】fork( )函数原理与应用详解——了解【父子进程及其特性】(代码演示,画图帮助理解,思维导图,精简)(11)
|
12天前
|
存储 缓存 Linux
linux几种典型应用对系统资源使用的特点
【4月更文挑战第22天】几种典型应用对系统资源使用的特点
24 1
|
13天前
|
Linux Shell 应用服务中间件
LINUX的应用与实践
LINUX的应用与实践
18 0
|
14天前
|
安全 Linux 网络安全
【专栏】在 Linux 中,端口连接服务和应用,过多开放的端口可能带来安全隐患,教你一招找出所有开放的端口,然后直接干掉!
【4月更文挑战第28天】在 Linux 中,端口连接服务和应用,过多开放的端口可能带来安全隐患。要找出开放端口,可使用 `netstat -anp`、`lsof -i` 或 `nmap` 命令。关闭端口可通过停止相关服务、修改防火墙规则或禁用网络接口。注意不要随意关闭重要端口,操作前备份数据。保持端口安全对系统安全至关重要。
|
19天前
|
Linux 网络安全 数据安全/隐私保护
Linux 如何关闭防火墙(开启管理员权限)
Linux 如何关闭防火墙(开启管理员权限)
10 0
|
5月前
|
运维 网络协议 安全
小白带你学习linux的防火墙
小白带你学习linux的防火墙
152 1