在Ubuntu 16.04上轻松进行IPTables配置和示例

介绍

iptables是用于配置Linux内核的集成防火墙的强大工具。它预装在大多数Ubuntu发行版中,但是,如果您使用自定义的Ubuntu版本或在容器中运行,则很可能必须手动安装它。

sudo apt-get install iptables iptables-persistent

安装后,如果询问您是否保存当前规则,则此刻无关紧要,因为稍后将要删除或创建新规则。

提示

您可以使用netcat命令(在服务器不同的计算机上)测试打开或关闭了哪些端口。

nc -z -w5 -v SERVER_IP PORT
  • nc 是netcat命令。
  • -z 只是发送没有有效载荷的数据包。
  • -w5 等待最多5秒钟以得到响应。
  • -v 详细模式。
  • 替换SERVER_IP为您的服务器地址。
  • 替换PORT为要测试的端口是否打开的端口(例如22)。

在您的服务器上,您可以使用netstat命令查看当前正在侦听连接的端口。

sudo netstat -tulpn

注意:尽管netstat可以轻松找到要使用的端口,但是您应该了解服务器上当前已安装的应用程序以及正在侦听哪些端口,但不必允许在netstat输出中找到每个端口

句法

sudo iptables -A INPUT -p tcp -m tcp --dport 22 --m geoip --src-cc PE -j ACCEPT
  • -A INPUT添加规则的INPUT链条,链条是一组规则,我们用最本指南上的那些会INPUTOUTPUTPREROUTING
  • -p tcptcp,因为这条规则将适用于,你也可以使用其他协议,如协议udpicmpall
  • -m tcp使用tcp模块。iptables通过模块支持其他功能,其中一些功能已预先安装,iptables而其他功能(例如geoip模块)。
  • --dport 22以开头的命令--表示先前使用的模块的其他选项,在这种情况下,我们将告诉该tcp模块仅适用于port 22
  • -m geoip使用geoip模块。它将限制国家/地区的数据包(第5步中的更多信息)。
  • --src-cc PE告诉geoip模块将传入的数据包限制为来自秘鲁的数据包。有关更多国家/地区代码,请ISO 3166 country codes在互联网上搜索。
  • -j ACCEPT-j参数iptables指示如果数据包与先前参数中指定的约束匹配,该怎么办。在这种情况下,将ACCEPT这些数据包,其他选项REJECTDROP等等。您可以通过在iptables jump targets互联网上搜索找到更多选项。

1.基础

列出所有规则。

sudo iptables -L

列出用于创建当前使用的规则的所有命令,这些命令对于编辑或删除规则很有用。

sudo iptables -S

要删除特定规则,请从中选择一个规则sudo iptables -S并替换-A-D

# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

sudo iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT

列出INPUT链中所有编号的规则。

sudo iptables -L INPUT --line-numbers

删除编号规则。

sudo iptables -D INPUT 2

清除所有规则。

sudo iptables -F

警告:如果通过SSH连接,则可能会失去连接

仅清除OUTPUT链中的规则。

sudo iptables -F OUTPUT

2.创建初始规则

SSHeth0界面上允许

sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
  • -i eth0 将规则应用于特定接口,以允许从任何接口删除此命令。

将传入数据包限制为特定IP(即10.0.3.1/32)。

sudo iptables -A INPUT -i eth0 -s 10.0.3.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
  • -s 10.0.3.1/32 指定允许连接的IP /子网。

设置默认链规则。

警告:如果在远程服务器上工作,请确保在应用正确的SSH规则之前,请执行此操作

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP 
sudo iptables -P OUTPUT ACCEPT 
  • -P INPUT DROP 拒绝所有传入的数据包(即没有人能够连接到您正在运行的服务器,例如Apache,SQL等)。
  • -P FORWARD DROP 拒绝所有转发的数据包(即,当您将系统用作路由器时)。
  • -P OUTPUT ACCEPT允许所有传出数据包(即执行HTTP请求时)。

允许回送接口上的所有流量(推荐)。

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

3.使规则持久化

保存当前iptables规则。

sudo netfilter-persistent save
sudo netfilter-persistent reload

如果您在容器内运行,该netfilter-persistent命令很可能将不起作用,因此您需要重新配置iptables-persistent软件包。

sudo dpkg-reconfigure iptables-persistent

4.允许传出连接

允许DNS查询。

sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT

使用state模块允许RELATEDESTABLISHED传出数据包。

sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

允许所需的端口;在这种情况下,HTTP端口。

sudo iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT

您可能想使用更多端口。

  • FTP:TCP 21端口
  • HTTPS:TCP在端口443
  • DHCP:UDP 67端口
  • NTP:UDP端口123

注意:如果要允许apt-get,可能需要允许FTPHTTPS

只允许返回RELATEDESTABLISHED建立连接的流量(建议这样做,因为有时需要双向通信)。

sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
其他有用的规则

允许来自外部的ping请求。

sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

eth0端口2200上的流量转发至10.0.3.21:22(如果要公开在容器内运行的SSH服务器,则很有用)。

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2200 -j DNAT --to-destination 10.0.3.21:22

如果您使用SSH成功​​登录到服务器,将创建一个持久连接(即,即使您连接超过1小时也不会建立新连接)。如果失败,然后尝试再次登录,将创建一个新的连接。通过限制每小时的新连接,这将阻止连续的SSH登录尝试。

sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 4 -j DROP

将端口443上的所有请求重定向到端口4430(如果要绑定到443不带端口的端口,则很有用root)。

sudo iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 4430
sudo iptables -A INPUT -p tcp -m tcp --dport 4430 -m geoip --src-cc PE -j ACCEPT
  • ens3 网络接口。
  • -m geoip 国家/地区阻止模块(请参阅步骤5)。

警告:请勿使用lo,操作系统将丢弃重定向到回送接口的所有数据包

5.允许或封锁整个国家

5.1安装 xtables-addons

您可以xtables-addons使用多种方法安装模块,请随意使用最适合您的安装方法。

  • 使用安装apt-get

    sudo apt-get install xtables-addons-common
    
  • 使用安装module-assistant

    sudo apt-get install module-assistant xtables-addons-source
    sudo module-assistant --verbose --text-mode auto-install xtables-addons
    
  • 从源安装。

    sudo apt-get install git bc libncurses5-dev libtext-csv-xs-perl autoconf automake libtool xutils-dev iptables-dev
    git clone git://git.code.sf.net/p/xtables-addons/xtables-addons
    cd xtables-addons
    ./autogen.sh
    ./configure
    make
    sudo make install
    

建立一个“国家”数据库。

sudo apt-get install libtext-csv-xs-perl unzip
sudo mkdir /usr/share/xt_geoip
sudo /usr/lib/xtables-addons/xt_geoip_dl
sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
sudo rm GeoIPCountryCSV.zip GeoIPCountryWhois.csv GeoIPv6.csv

重新启动系统。

sudo reboot

xtables-addons已成功安装,第一次重新启动后,运行depmod否则国家封锁将无法正常工作(这个只需要在第一次)。

sudo depmod 

在创建脚本以每月/etc/cron.monthly/geoip-updater更新geoip数据库。

#!/usr/bin/env bash
# this script is intended to run with sudo privileges

echo 'Removing old database---------------------------------------------------'
rm -rf /usr/share/xt_geoip/*
mkdir -p /usr/share/xt_geoip

echo 'Downloading country databases-------------------------------------------'
mkdir /tmp/geoip-updater
cd /tmp/geoip-updater
/usr/lib/xtables-addons/xt_geoip_dl

echo 'Building geoip database-------------------------------------------------'
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv

echo 'Removing temporary files------------------------------------------------'
cd /tmp
rm -rf /tmp/geoip-updater

使/etc/cron.monthly/geoip-updater可执行。

sudo chmod +x /etc/cron.monthly/geoip-updater

5.2示例规则

_注意:如果您iptables: No chain/target/match by that name在尝试应用geoip规则时收到错误消息,则可能是xtables-addons未正确安装。请尝试其他安装方法。

阻止来自中国,香港,俄罗斯和韩国的所有传入数据包。

sudo iptables -A INPUT -m geoip --src-cc CN,HK,RU,KR -j DROP

允许80除以上国家/地区之外的所有其他端口进入的数据包。

sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

仅允许来自秘鲁的ens3端口接口上的传入数据包22(可以自由选择要接受来自例如US美国的数据包的国家/地区代码)。

sudo iptables -A INPUT -i ens3 -p tcp -m tcp --dport 22 -m geoip --src-cc PE -j ACCEPT

仅允许443来自秘鲁的端口上的传入数据包。

sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m geoip --src-cc PE -j ACCEPT


Leave a Comment

如何在CentOS 7上安装Oxwall

如何在CentOS 7上安装Oxwall

Oxwall是一个开源社交网络软件平台,可用于免费构建自定义社交网站(SNS)。在这篇文章中,

如何在Ubuntu 16.10上安装Review Board

如何在Ubuntu 16.10上安装Review Board

使用其他系统?Review Board是一个免费且开源的工具,用于检查源代码,文档,图像等。这是基于网络的软件战

如何在Debian 9 LAMP VPS上安装October 1.0 CMS

如何在Debian 9 LAMP VPS上安装October 1.0 CMS

使用其他系统?October 1.0 CMS是基于Laravel框架构建的简单,可靠,免费和开源的内容管理系统(CMS)

如何使用Ubuntu 15.10在Vultr服务器上安装Xubuntu桌面

如何使用Ubuntu 15.10在Vultr服务器上安装Xubuntu桌面

Xubuntu是XFCE + Ubuntu!XFCE是Ubuntu的轻量级GUI /桌面。Vultr服务器需要其他依赖项,默认情况下未安装这些依赖项。

如何在Debian 9上安装Monica

如何在Debian 9上安装Monica

使用其他系统?Monica是一个开源的个人关系管理系统。可以将其视为CRM(销售团队使用的一种流行工具

如何使用SSL和安全密码保护由Nginx驱动的网站

如何使用SSL和安全密码保护由Nginx驱动的网站

简介SSL(代表安全套接字层)及其后续版本TLS(代表传输层安全性)是需要加密的加密协议。

如何在Fedora 26 LAMP VPS上安装MODX Revolution

如何在Fedora 26 LAMP VPS上安装MODX Revolution

使用其他系统?MODX Revolution是一种快速,灵活,可扩展,免费和开源的企业级内容管理系统(CMS),由

如何在Ubuntu 17.04上安装JuliaLang

如何在Ubuntu 17.04上安装JuliaLang

朱莉娅(Julia)通常称为JuliaLang,是一种用于数值计算的编程语言。Julia的速度和C一样快,但是却不牺牲可读性

在Ubuntu 14.04上安装Ruby on Rails

在Ubuntu 14.04上安装Ruby on Rails

Ruby on Rails(RoR)是用Ruby编程语言编写的框架,可让您将Ruby与HTML,CSS和类似的程序结合使用。

在Fedora 28上安装Anchor CMS

在Fedora 28上安装Anchor CMS

使用其他系统?Anchor是用PHP编写的轻量级开源博客CMS。Anchors源代码托管在GitHub上。本指南将向您展示

将Debian 9升级到Debian 10

将Debian 9升级到Debian 10

简介Debian 10(Buster)是Debian 9(Stretch)的后继产品。它于2019年7月6日发布。在本教程中,我们将升级一个existin

如何管理Linux服务器时区设置

如何管理Linux服务器时区设置

在Linux服务器上正确设置日期和时间非常重要。您的服务器日志和其他重要信息都将反映时区

如何在Ubuntu 16.04上安装Taiga项目管理工具

如何在Ubuntu 16.04上安装Taiga项目管理工具

使用其他系统?Taiga是用于项目管理的免费和开源应用程序。与其他项目管理工具不同,Taiga使用增量

在Ubuntu上配置Nagios:第1部分-Nagios服务器

在Ubuntu上配置Nagios:第1部分-Nagios服务器

本文是有关在Ubuntu 14.04上安装和配置Nagios的2部分系列文章的一部分。第1部分:Nagios服务器第2部分:远程主机概述Nagio

如何访问Vultr VPS

如何访问Vultr VPS

Vultr提供了几种不同的方式来访问VPS以进行配置,安装和使用。访问凭据VPS ar的默认访问凭据

如何在Debian 9上安装Grav CMS

如何在Debian 9上安装Grav CMS

使用其他系统?Grav是用PHP编写的开源平面文件CMS。Grav源代码公开托管在GitHub上。本指南将向您展示如何

如何在Fedora 26 LAMP VPS上安装Pagekit 1.0 CMS

如何在Fedora 26 LAMP VPS上安装Pagekit 1.0 CMS

使用其他系统?Pagekit 1.0 CMS是一个美观,模块化,可扩展,轻量级,免费和开源的内容管理系统(CMS),具有

如何在Ubuntu 16.04 LAMP VPS上安装BigTree CMS

如何在Ubuntu 16.04 LAMP VPS上安装BigTree CMS

使用其他系统?BigTree CMS 4.2是一种快速,轻量级,免费和开源的企业级内容管理系统(CMS),具有广泛的功能。

如何在CentOS 7上设置vsFTPd

如何在CentOS 7上设置vsFTPd

FTP是用于通过Internet传输文件的有用协议,本指南将向您展示如何设置vsFTPd(非常安全的文件传输协议守护程序)o

在Debian / Ubuntu中使用Rsync设置文件镜像

在Debian / Ubuntu中使用Rsync设置文件镜像

简介如果您经营一个重要的网站,则最好将文件镜像到辅助服务器。如果您的主服务器有网络

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg

在Arch Linux上使用Makepkg可以避免系统污染,确保仅安装必要的依赖关系。

如何在Ubuntu 16.04上安装OpenSIPS控制面板

如何在Ubuntu 16.04上安装OpenSIPS控制面板

快速学习如何在Ubuntu 16.04上安装OpenSIPS控制面板,为VoIP提供商提供支持的功能。

在Fedora 28上安装Akaunting

在Fedora 28上安装Akaunting

学习如何在Fedora 28上安装Akaunting,一款适合小型企业和自由职业者的开源会计软件。

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

如何在CentOS 7上安装Mailtrain新闻通讯应用程序

使用其他系统?Mailtrain是一个基于Node.js和MySQL / MariaDB构建的开源自托管新闻通讯应用程序。

诊断Minecraft服务器延迟和低TPS

诊断Minecraft服务器延迟和低TPS

了解導致Minecraft延遲的原因和解決方案,包括優化伺服器性能和減少滯後的步驟。

AI 能否應對越來越多的勒索軟件攻擊?

AI 能否應對越來越多的勒索軟件攻擊?

勒索軟件攻擊呈上升趨勢,但人工智能能否幫助應對最新的計算機病毒?AI 是答案嗎?在這裡閱讀知道是 AI 布恩還是禍根

ReactOS:這是 Windows 的未來嗎?

ReactOS:這是 Windows 的未來嗎?

ReactOS,一個開源和免費的操作系統,這裡有最新版本。它能否滿足現代 Windows 用戶的需求並打倒微軟?讓我們更多地了解這種老式但更新的操作系統體驗。

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

通過 WhatsApp 桌面應用程序 24*7 保持聯繫

Whatsapp 終於為 Mac 和 Windows 用戶推出了桌面應用程序。現在您可以輕鬆地從 Windows 或 Mac 訪問 Whatsapp。適用於 Windows 8+ 和 Mac OS 10.9+

人工智能如何將流程自動化提升到新的水平?

人工智能如何將流程自動化提升到新的水平?

閱讀本文以了解人工智能如何在小型公司中變得流行,以及它如何增加使它們成長並為競爭對手提供優勢的可能性。

macOS Catalina 10.15.4 補充更新引發的問題多於解決

macOS Catalina 10.15.4 補充更新引發的問題多於解決

最近,Apple 發布了 macOS Catalina 10.15.4 補充更新以修復問題,但似乎該更新引起了更多問題,導致 mac 機器變磚。閱讀這篇文章以了解更多信息