登录
首页 >  文章 >  linux

Linux防火墙设置与安全防护技巧

时间:2025-07-28 18:20:29 223浏览 收藏

还在为Linux服务器安全担忧?本教程为你详解Linux防火墙设置,助你打造坚固的安全防线!本文重点介绍如何利用firewalld和iptables管理网络流量,推荐使用更易用、灵活的firewalld,通过检查状态、配置区域、添加服务/端口等步骤,轻松实现端口开放、IP阻止等常见场景。若需底层控制或在老旧系统上操作,iptables依然是利器。除了防火墙配置,本文还分享SSH加固、SELinux/AppArmor、系统更新、日志监控等安全技巧,助你构建完整的Linux安全体系,有效防御网络攻击,保障服务器稳定运行。掌握这些Linux防火墙设置与安全技巧,让你的服务器安全无忧!

Linux设置防火墙的核心在于使用firewalld或iptables管理流量。推荐优先使用firewalld,其支持动态修改规则、区域概念直观易用;若需底层控制或老旧系统,则使用iptables。配置firewalld包括检查状态、设置区域、添加服务/端口、重载规则及查看列表;iptables则涉及链规则操作、默认策略设置与规则保存。常见场景包括开放端口、阻止IP、端口转发等,同时需结合SSH加固、SELinux/AppArmor、系统更新、日志监控等措施构建完整安全体系。

Linux如何设置网络防火墙?_Linux安全防护实战技巧

在Linux上设置网络防火墙,核心在于精细化管理进出服务器的网络流量。这通常依赖于内核的netfilter框架,而我们日常操作则通过iptables命令行工具,或是更现代、更抽象的firewalld服务来实现。简单来说,就是告诉你的Linux系统,哪些数据包可以进来,哪些可以出去,哪些应该被无情地丢弃。这是Linux安全防护最基础也是最关键的一环,就像你家大门上的锁,得拧紧了。

Linux如何设置网络防火墙?_Linux安全防护实战技巧

解决方案

对于现代Linux发行版,我个人更倾向于推荐使用firewalld。它比直接操作iptables要友好得多,也更灵活,支持运行时动态修改规则而无需重启服务。当然,如果你在一些较旧的系统上,或者需要极致的底层控制,iptables依然是你的利器。

使用firewalld配置防火墙:

Linux如何设置网络防火墙?_Linux安全防护实战技巧
  1. 检查firewalld状态: 在大多数新系统上,firewalld通常是默认安装并运行的。

    sudo systemctl status firewalld

    如果未运行或未安装,你需要:

    Linux如何设置网络防火墙?_Linux安全防护实战技巧
    sudo yum install firewalld # CentOS/RHEL
    sudo apt install firewalld # Debian/Ubuntu
    sudo systemctl enable --now firewalld
  2. 理解区域(Zones):firewalld的核心概念是“区域”。每个区域定义了一套信任级别和允许的服务/端口。比如,public区域通常用于不信任的外部网络,而internaltrusted区域则用于更受信任的内部网络。

    sudo firewall-cmd --get-active-zones
    sudo firewall-cmd --get-default-zone

    你可以为不同的网卡接口绑定不同的区域。

  3. 添加服务或端口: 这是最常见的操作。比如,开放SSH(默认端口22)和HTTP(默认端口80)服务。

    • 开放服务:
      sudo firewall-cmd --zone=public --add-service=ssh --permanent
      sudo firewall-cmd --zone=public --add-service=http --permanent
      sudo firewall-cmd --zone=public --add-service=https --permanent

      --permanent参数表示永久生效,否则重启firewalld或系统后规则会失效。

    • 开放特定端口: 如果你想开放一个非标准端口,比如一个应用运行在TCP 8080端口:
      sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
  4. 重新加载firewalld使永久规则生效:

    sudo firewall-cmd --reload
  5. 查看当前规则:

    sudo firewall-cmd --zone=public --list-all

使用iptables配置防火墙(作为参考,或在firewalld不适用时):

iptables直接操作内核的netfilter规则链。主要有INPUT(入站)、OUTPUT(出站)和FORWARD(转发)链。

  1. 查看当前规则:

    sudo iptables -L -n -v
  2. 允许特定入站连接(例如SSH):

    sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

    这条规则的意思是:在INPUT链的末尾(-A),如果协议是TCP(-p tcp),目标端口是22(--dport 22),就接受(-j ACCEPT)这个数据包。

  3. 允许已建立的连接: 这是非常重要的一步,允许已经建立的会话继续通信。

    sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  4. 设置默认策略(通常是拒绝):

    sudo iptables -P INPUT DROP
    sudo iptables -P FORWARD DROP
    # 注意:OUTPUT链通常设置为ACCEPT,除非你有特殊需求。
    sudo iptables -P OUTPUT ACCEPT

    极度小心:在设置默认策略为DROP之前,务必确保你已经允许了SSH等必要的入站连接,否则你可能会把自己锁在外面。

  5. 保存iptables规则(不同系统方法不同):iptables的规则默认不会在重启后保留。

    • CentOS/RHEL:
      sudo yum install iptables-services
      sudo systemctl enable iptables
      sudo iptables-save > /etc/sysconfig/iptables
    • Debian/Ubuntu:
      sudo apt install iptables-persistent
      sudo netfilter-persistent save

firewalld和iptables,我该选哪个?

这确实是很多Linux用户纠结的问题。我个人觉得,对于大多数日常的服务器管理和应用部署,firewalld无疑是更现代、更省心的选择。它的区域概念让网络安全配置变得直观,你可以很方便地为不同的网络接口或场景定义不同的安全策略。比如,你的服务器可能同时连接着内部信任网络和外部公共网络,firewalld能让你轻松地对这两个接口应用截然不同的规则集。而且,它支持运行时动态修改规则,无需重启服务,这对于生产环境来说简直是福音,能大大减少服务中断的风险。

但如果你需要对网络包进行非常底层、非常精细的控制,或者在一些老旧的Linux系统上工作,iptables依然是你的不二之选。它直接与内核的netfilter模块交互,提供了极致的灵活性和控制力。比如,你想做复杂的NAT(网络地址转换)、流量整形、或者基于特定数据包内容的过滤,iptables能让你写出非常复杂的规则链。它就像一把瑞士军刀,功能强大但需要更深入的理解才能驾驭。我见过不少高级网络工程师,在处理一些特殊网络问题时,最终还是会回到iptables的怀抱。所以,我的建议是:如果你追求易用性和管理效率,选firewalld;如果你需要极致的控制和底层操作,或者系统环境所限,那就深入学习iptables

常见的防火墙配置场景与实战命令

说实话,刚开始接触防火墙的时候,那些规则链和动作把我搞得一头雾水。但用多了,你会发现其实也就那么回事,无非就是告诉内核,哪个包该放行,哪个该扔掉。下面我们来看看几个非常实用的配置场景。

  1. 开放特定服务端口: 这是最最常见的需求,比如你要部署一个Web服务,需要开放80和443端口;或者你的应用跑在某个自定义端口上。

    • firewalld示例(开放HTTP和自定义端口):
      sudo firewall-cmd --zone=public --add-service=http --permanent
      sudo firewall-cmd --zone=public --add-service=https --permanent
      sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
      sudo firewall-cmd --reload

      这里--permanent很重要,别忘了它,否则重启就没了。

    • iptables示例(开放HTTP和自定义端口):
      sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
      sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
      sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
      # 别忘了保存规则,否则重启后会丢失
      # sudo netfilter-persistent save 或 sudo service iptables save
  2. 阻止某个IP地址的访问: 当你的日志里出现某个IP地址频繁恶意扫描或攻击时,直接把它拉黑是最直接的办法。

    • firewalld示例(阻止IP 192.168.1.100):
      sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" drop' --permanent
      sudo firewall-cmd --reload

      rich-rule提供了更强大的规则表达能力。

    • iptables示例(阻止IP 192.168.1.100):
      sudo iptables -A INPUT -s 192.168.1.100 -j DROP
      # 这条规则应该放在允许规则的前面,否则可能不生效
      # sudo iptables -I INPUT 1 -s 192.168.1.100 -j DROP # 插入到第一条
  3. 端口转发(NAT): 如果你想将外部访问某个端口的请求转发到内部的另一个端口或另一台机器上,这在Docker容器或内网服务对外暴露时很常用。

    • firewalld示例(将外部80端口转发到内部192.168.1.200的8080端口):
      sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=192.168.1.200 --permanent
      # 还需要开启IP转发功能
      sudo sysctl -w net.ipv4.ip_forward=1
      echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
      sudo firewall-cmd --zone=public --add-masquerade --permanent # 开启伪装,用于NAT
      sudo firewall-cmd --reload
    • iptables示例(将外部80端口转发到内部192.168.1.200的8080端口):
      sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.200:8080
      sudo iptables -A FORWARD -p tcp -d 192.168.1.200 --dport 8080 -j ACCEPT
      # 同样需要开启IP转发
      sudo sysctl -w net.ipv4.ip_forward=1
      echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
      # 如果是本机转发到本机端口,则不需要DNAT,直接REDIRECT
      # sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080

      端口转发涉及到NAT表,稍微复杂一些,但功能非常强大。

除了防火墙,Linux安全防护还有哪些坑和技巧?

光靠防火墙可不够,那只是第一道防线。很多时候,真正的麻烦来自内部,或者那些看似不经意的配置漏洞。我见过不少服务器,防火墙配置得滴水不漏,结果SSH弱口令直接被爆破了,那真是防不胜防啊。所以,除了防火墙,还有一些“坑”和“技巧”是你在Linux安全防护中必须考虑的:

  1. SSH服务强化: 这是远程管理服务器的命脉,也是最容易被攻击的入口。

    • 禁用密码登录,只允许密钥登录: 这是最强的防护,杜绝了暴力破解。 修改/etc/ssh/sshd_configPasswordAuthentication no
    • 禁用root用户直接登录:PermitRootLogin no
    • 修改默认SSH端口: 虽然不能阻止有心人的端口扫描,但能过滤掉大量的脚本小子。 Port 2222 (改成你喜欢的非标准端口)
    • 使用fail2ban 这是一个非常有用的工具,它能监控日志文件,发现多次登录失败的IP,然后自动将其添加到防火墙黑名单中,阻止进一步的尝试。
      sudo apt install fail2ban # Debian/Ubuntu
      sudo yum install fail2ban # CentOS/RHEL
      sudo systemctl enable --now fail2ban
  2. SELinux或AppArmor: 这些是Linux内核级别的强制访问控制(MAC)系统,提供了比传统DAC(自主访问控制,如文件权限)更细粒度的安全策略。它们能限制进程能访问的文件、端口等资源,即使程序被攻破,也能大大限制其破坏范围。

    • SELinux: 复杂但强大,尤其在CentOS/RHEL上是默认开启的。
      sestatus # 查看SELinux状态
      setenforce 1 # 开启Enforcing模式
    • AppArmor: 相对简单易用,在Ubuntu等系统上常见。
      sudo aa-status # 查看AppArmor状态

      学习并适当配置它们,能为你的系统提供额外的安全层。

  3. 定期更新系统和应用: 老生常谈,但非常重要。很多漏洞都是通过旧版本软件的已知缺陷被利用的。

    sudo apt update && sudo apt upgrade # Debian/Ubuntu
    sudo yum update # CentOS/RHEL

    打补丁是防御已知攻击最有效的方式之一。

  4. 日志监控与审计: 防火墙日志、系统日志(/var/log/auth.log/var/log/secure)、应用日志,都是发现异常行为的关键线索。建立一个完善的日志管理和监控机制,比如使用ELK Stack或Splunk,能让你在第一时间发现潜在的攻击。

  5. 最小化安装原则: 只安装你需要的服务和软件包。安装的软件越多,潜在的攻击面就越大。能不装的,就别装。

安全是一个持续的过程,没有一劳永逸的方案。防火墙是基础,但绝不是全部。结合其他安全实践,才能真正构建起一个健壮的Linux防护体系。

好了,本文到此结束,带大家了解了《Linux防火墙设置与安全防护技巧》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>