在Ubuntu上,简单的IPTables配置和例子

・14 分钟阅读

介绍

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打开,请将PORT替换为您要测试的端口(例如22 ),

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

 
sudo netstat -tulpn

 

语法


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

  • -A INPUT会规则添加到INPUTchain,chain是一组规则,我们最在本指南上使用的是INPUT,OUTPUT和PREROUTING ,
  • -p tcptcp设置为此规则应用的协议,也可以使用其他协议,如udpicmpall
  • -m tcp使用tcp模块,iptables通过模块支持其他功能,其中一些已经预先安装了iptables和其他的功能,比如,geoip模块,
  • --dport 22--开头的命令表示以前使用的模块的附加选项,在本例中我们会告诉tcp模块只应用于端口22
  • -m geoip使用geoip模块,它会以(步骤5中的更多信息)为基础限制数据包,
  • --src-cc PE告诉geoip模块将传入数据包限制为来自Peru(秘鲁)的数据包,更多国家代码搜索 ISO 3166 country codes 互联网上,
  • -j ACCEPT-j参数告诉iptables如果包匹配以前参数中指定的约束,那么这个参数将做什么,在这种情况下,它会ACCEPT包,其他选项是REJECTDROP和更多,你可以通过在互联网上搜索iptables jump targets找到更多的选项,

1.基础

列出所有规则。

 
sudo iptables -L

 

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

 
sudo iptables -S

 

删除特定规则从sudo iptables -S中选择规则并用-D替换-A


# -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/subnet ,

设置默认链规则。

警告:在处理远程服务器之前,请确保应用了正确的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 at port 21
  • https :tcp at port 443
  • dhcp :udp at port 67
  • ntp :udp at port 123

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

仅允许RELATED返回的流量,并且已存在ESTABLISHED连接(推荐的因为有时需要双向通信)。


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 (如果你想绑定到不带root的端口443,则为有用)。


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

只允许来自端口22ens3接口上的传入数据包来自秘鲁(可以自由选择你希望接受数据包的国家代码,例如,美国的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

Anne655 profile image