CentOS / Redhat 上的 Iptables 防火墙配置详解

1. Iptables 配置文件¶

RHEL / CentOS / Fedora Linux 发行版中默认的配置文件是:

/etc/sysconfig/iptables – 系统执行脚本通过读取该文件来激活防火墙功能。
2. 基本操作:显示默认规则¶

在命令行窗口输入下面的指令:

iptables --line-numbers -n -L
其中 –line-numbers 参数表示给每行规则前面加个编号; -n 表示以数字形式显示 IP 地址和端口等内容;-L 表示列出所有链(chain)中的规则。可以通过 iptables --help 来查看所有可用参数的含义。

可以得到类似下面的输出(其中 # 号开头的行为注释说明):

# 下面是入站链(Chain INPUT)
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
# 下面的 RH-Firewall-1-INPUT 是该入站链 INPUT 的一条规则
# 即,将所有入站的连接交由后面的 RH-Firewall-1-INPUT 链 来处理
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0
# 转发链
Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination
1    RH-Firewall-1-INPUT  all  --  0.0.0.0/0            0.0.0.0/0
# 出站链
Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
# 下面 1~8 是入站链 RH-Firewall-1-INPUT 中的所有规则(rule)
Chain RH-Firewall-1-INPUT (2 references)
num  target     prot opt source               destination
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           icmp type 255
3    ACCEPT     udp  --  0.0.0.0/0            1.2.3.4             udp dpt:5353
4    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:53
5    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
6    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
7    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:53
8    REJECT     all  --  0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
3. 基本操作:启用防火墙¶

这里的指令都是从 Linux 控制终端(命令行)直接输入的。

输入下面的两条指令来启用防火墙:

chkconfig iptables on
service iptables start
其中上一条是将 iptables 加入到系统服务,随系统启动而启动;下一条是直接启动 iptables 服务。

重起防火墙:

service iptables restart
停止防火墙:

service iptables stop
4. 基本操作:其它 iptables 操作指令¶

其它常用的通过 Linux 命令行(控制终端)对 iptables 进行操作的指令,请参考 Linux iptables 添加规则的指令。

5. 理解防火墙¶

上面列出的防火墙(iptables)中有 4 个链:

INPUT – 这是默认用来处理进入系统的数据包的规则集合。可以用来开启或关闭传入端口(如 80、443、25 和 110 等)和 IP 地址/子网(如 1.2.3.4/29)。
OUTPUT – 这是默认用来处理由系统产生(发出)的数据包的规则集合。可以用来开启或关闭传出端口和 IP 地址/子网。
FORWARD – 这也是一个默认的链,当数据包需要通过别的接口发送的时候就使用它。例如,网卡 eth0 连接到 ADSL/Cable 猫,eth1 连接到本地 LAN 的时候,可以使用 FORWARD 链沟通 LAN 与互联网,实现发送与接收。
RH-Firewall-1-INPUT - 这是一个用户自定义的链。它被 INPUT 、 OUTPUT 和 FORWARD 链调用。
包匹配规则¶
每个包都从链的第一条规则开始匹配。
当它匹配到一条规则的时候才会被处理。
如果匹配到一条规则,会被跳转到特定的目标(如 REJECT, ACCEPT, DROP)。
目标含义¶
ACCEPT 表示接受该数据包。
REJECT 表示丢弃该数据包,并且向远程主机发送一条错误信息。
DROP 表示丢弃该数据包,并且不向远程主机或发送者提供错误信息。
6. 配置 /etc/sysconfig/iptables 文件¶

虽然可以通过 iptables 指令来编辑防火墙规则,可是对于大量的规则来说一条一条的输入总是很麻烦,实际上可以直接按照正确格式编辑 iptables 的配置文件,然后重新加载 iptables 即可使之生效。

要编辑 /etc/sysconfig/iptables,输入:

# vi /etc/sysconfig/iptables
可以看到文件中存储的前述默认规则显示如下:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 1.2.3.4 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
其中 -j 参数表示 jump 跳转到。

可以看到其中的规则形式与我们通过命令行来输入的规则是一样的,因为启用 iptables 的时候就是将此文件中的指令一行一行的自动加载的,就像批处理一样。

DROP 所有通信¶
找到规则:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
上述规则表示默认接受(ACCEPT)所有三个链(INPUT、FORWARD、OUTPUT)上的通信。可以将前面两个改为默认丢弃(DROP)(因为本机发出的通信一般是默认接受的,不需要改动):

:INPUT DROP [0:0]
:FORWARD DROP [0:0]
记录(LOG)并丢弃(DROP)发送欺骗信息的源地址¶
在最后一行 COMMIT 之前添加如下规则:

-A INPUT -i eth0 -s 10.0.0.0/8 -j LOG --log-prefix "IP DROP SPOOF "
-A INPUT -i eth0 -s 172.16.0.0/12 -j LOG --log-prefix "IP DROP SPOOF "
-A INPUT -i eth0 -s 192.168.0.0/16 -j LOG --log-prefix "IP DROP SPOOF "
-A INPUT -i eth0 -s 224.0.0.0/4 -j LOG --log-prefix "IP DROP MULTICAST "
-A INPUT -i eth0 -s 240.0.0.0/5 -j LOG --log-prefix "IP DROP SPOOF "
-A INPUT -i eth0 -d 127.0.0.0/8 -j LOG --log-prefix "IP DROP LOOPBACK "
-A INPUT -i eth0 -s 169.254.0.0/16  -j LOG --log-prefix "IP DROP MULTICAST "
-A INPUT -i eth0 -s 0.0.0.0/8  -j LOG --log-prefix "IP DROP "
-A INPUT -i eth0 -s  240.0.0.0/4  -j LOG --log-prefix "IP DROP "
-A INPUT -i eth0 -s  255.255.255.255/32  -j LOG --log-prefix "IP DROP  "
-A INPUT -i eth0 -s 168.254.0.0/16  -j LOG --log-prefix "IP DROP "
-A INPUT -i eth0 -s 248.0.0.0/5  -j LOG --log-prefix "IP DROP "
记录并丢弃所有通信包¶
找到下面的行:

-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
它表示默认将所有不符合之前规则的通信数据包 REJECT 掉。这是一种比较礼貌的做法。通常那些不符合前述规则的包也不是什么好东西,所以我们可以直接丢弃而不回复出错信息。将其编辑为:

-A RH-Firewall-1-INPUT -j LOG
-A RH-Firewall-1-INPUT -j DROP
COMMIT
上面第一行先记录,第二就直接将其丢弃。这实际上是针对所有通信的一种默认操作。

开启端口¶
要开启 80 端口(HTTP 服务器端口),在 COMMIT 一行之前(准确说应该是在默认操作之前,下同)添加如下规则:

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 80 -j ACCEPT
-p tcp 表示仅针对 tcp 协议的通信。–dport 指定端口号。

要开启 53 端口(DNS 服务器端口),在 COMMIT 一行之前添加如下规则:

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 53 -j ACCEPT
-A RH-Firewall-1-INPUT -m udp -p tcp --dport 53 -j ACCEPT
同时针对 tcp 和 udp 协议开启 53 端口。

要开启 443 端口(HTTPS 加密连接服务器端口),在 COMMIT 一行之前添加如下规则:

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 443 -j ACCEPT
要开启 25 端口(SMTP 邮件服务器端口),在 COMMIT 一行之前添加如下规则:

-A RH-Firewall-1-INPUT -m tcp -p tcp --dport 25 -j ACCEPT
另外还可以更加具体的进行规定,比如:

仅允许来自 192.168.1.0/24 的 SSH 连接¶
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 22 -j ACCEPT
为 192.168.1.0/24 开启打印服务通信¶
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
允许合法的 NTP 客户端访问服务器¶
-A RH-Firewall-1-INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT
开启 FTP 端口 21 (ftp)¶
-A RH-Firewall-1-INPUT -m state --state NEW -p tcp --dport 21 -j ACCEPT
保存并关闭该文件(Ctrl+C, :wq)。编辑 /etc/sysconfig/iptables-config,输入:

# vi /etc/sysconfig/iptables-config
确保 ftp 模块已经加载:

IPTABLES_MODULES="ip_conntrack_ftp"
要重新启动防火墙,输入以下指令:

# service iptables restart
# iptables -vnL --line-numbers
7. 编辑 /etc/sysctl.conf 以抵御 DoS 和 Syn 攻击¶

编辑文件 /etc/sysctl.conf 以帮助抵御一些类型攻击是挺有效的,添加或者更改为如下参数设置:

 
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts = 1
#net.ipv4.icmp_ignore_bogus_error_messages = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
8. 变通的配置方式¶

下面是另一种变通的方式来配置防火墙,这样就不需要编辑 /etc/sysconfig/iptables 等文件了,而是创建一个类似于下面代码的脚本:

#!/bin/bash
# 一个防火墙自动配置脚本样例
IPT="/sbin/iptables"
SPAMLIST="blockedip"
SPAMDROPMSG="BLOCKED IP DROP"
SYSCTL="/sbin/sysctl"
BLOCKEDIPS="/root/scripts/blocked.ips.txt"

# 防御一些攻击
echo "Setting sysctl IPv4 settings..."
$SYSCTL net.ipv4.ip_forward=0
$SYSCTL net.ipv4.conf.all.send_redirects=0
$SYSCTL net.ipv4.conf.default.send_redirects=0
$SYSCTL net.ipv4.conf.all.accept_source_route=0
$SYSCTL net.ipv4.conf.all.accept_redirects=0
$SYSCTL net.ipv4.conf.all.secure_redirects=0
$SYSCTL net.ipv4.conf.all.log_martians=1
$SYSCTL net.ipv4.conf.default.accept_source_route=0
$SYSCTL net.ipv4.conf.default.accept_redirects=0
$SYSCTL net.ipv4.conf.default.secure_redirects=0
$SYSCTL net.ipv4.icmp_echo_ignore_broadcasts=1
#$SYSCTL net.ipv4.icmp_ignore_bogus_error_messages=1
$SYSCTL net.ipv4.tcp_syncookies=1
$SYSCTL net.ipv4.conf.all.rp_filter=1
$SYSCTL net.ipv4.conf.default.rp_filter=1
$SYSCTL kernel.exec-shield=1
$SYSCTL kernel.randomize_va_space=1

echo "Starting IPv4 Firewall..."
$IPT -F
$IPT -X
$IPT -t nat -F
$IPT -t nat -X
$IPT -t mangle -F
$IPT -t mangle -X

# 加载模块
modprobe ip_conntrack

[ -f "$BLOCKEDIPS" ] && BADIPS=$(egrep -v -E "^#|^$" "${BLOCKEDIPS}")

# interface connected to the Internet
PUB_IF="eth0"

#Unlimited traffic for loopback
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT

# DROP all incomming traffic
$IPT -P INPUT DROP
$IPT -P OUTPUT DROP
$IPT -P FORWARD DROP

if [ -f "${BLOCKEDIPS}" ];
then
# 创建一个新的 iptables 列表
$IPT -N $SPAMLIST

for ipblock in $BADIPS
do
   $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG "
   $IPT -A $SPAMLIST -s $ipblock -j DROP
done

$IPT -I INPUT -j $SPAMLIST
$IPT -I OUTPUT -j $SPAMLIST
$IPT -I FORWARD -j $SPAMLIST
fi

# Block sync
$IPT -A INPUT -i ${PUB_IF} -p tcp ! --syn -m state --state NEW  -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Drop Sync"
$IPT -A INPUT -i ${PUB_IF} -p tcp ! --syn -m state --state NEW -j DROP

# Block Fragments
$IPT -A INPUT -i ${PUB_IF} -f  -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fragments Packets"
$IPT -A INPUT -i ${PUB_IF} -f -j DROP

# Block bad stuff
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL ALL -j DROP

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets"
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL NONE -j DROP # NULL packets

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets"
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP #XMAS

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan"
$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags FIN,ACK FIN -j DROP # FIN packet scans

$IPT  -A INPUT -i ${PUB_IF} -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

# Allow full outgoing connection but no incomming stuff
$IPT -A INPUT -i ${PUB_IF} -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -o ${PUB_IF} -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

# Allow ssh
$IPT -A INPUT -i ${PUB_IF} -p tcp --destination-port 22 -j ACCEPT

# Allow http / https (open port 80 / 443)
$IPT -A INPUT -i ${PUB_IF} -p tcp --destination-port 80 -j ACCEPT
#$IPT -A INPUT -o ${PUB_IF} -p tcp --destination-port 443 -j ACCEPT

# allow incomming ICMP ping pong stuff
$IPT -A INPUT -i ${PUB_IF} -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$IPT -A OUTPUT -o ${PUB_IF} -p icmp --icmp-type 0 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow port 53 tcp/udp (DNS Server)
$IPT -A INPUT -i ${PUB_IF} -p udp --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#$IPT -A OUTPUT -o ${PUB_IF} -p udp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT

$IPT -A INPUT -i ${PUB_IF} -p tcp --destination-port 53 -m state --state NEW,ESTABLISHED,RELATED  -j ACCEPT
#$IPT -A OUTPUT -o ${PUB_IF} -p tcp --sport 53 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Open port 110 (pop3) / 143
$IPT -A INPUT -i ${PUB_IF} -p tcp --destination-port 110 -j ACCEPT
$IPT -A INPUT -i ${PUB_IF} -p tcp --destination-port 143 -j ACCEPT

##### START 在下面添加上自己的特殊规则 ######
#
#
##### END 自己特殊规则结束 ############

# Do not log smb/windows sharing packets - too much logging
$IPT -A INPUT -p tcp -i ${PUB_IF} --dport 137:139 -j REJECT
$IPT -A INPUT -p udp -i ${PUB_IF} --dport 137:139 -j REJECT

# log everything else and drop
$IPT -A INPUT -j LOG
$IPT -A FORWARD -j LOG
$IPT -A INPUT -j DROP

exit 0

时间: 2024-07-29 21:39:17

CentOS / Redhat 上的 Iptables 防火墙配置详解的相关文章

ubuntu (linux)iptables防火墙配置详解

iptables简介 iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表. filter负责过滤数据包,包括的规则链有,input,output和forward: nat则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output: mangle表则主要应用在修改数据包内容上,用来做流量整形的,默认的规则链有:INPUT,OUTPUT,NAT,POSTROUTING,PREROUTING: inpu

基于 CentOS Mysql 安装与主从同步配置详解

CentOS Mysql 安装 Mysql (Master/Slave) 主从同步 1.为什么要使用主从同步 1.如果主服务器出现问题,可以快速切换到从服务器提供的服务 2.可以在从服务器上执行查询操作,降低主服务器的访问压力 3.可以在从服务器上执行备份,以避免备份期间影响主服务器的服务 注意:一般只有更新不频繁的数据或者对实时性要求不高的数据可以通过从服务器查询,实时性要求高的数据仍然需要从主服务器获得. Window 数据库主从(Master/Slave)同步安装与配置详解 2. Cent

linux透明防火墙配置详解

一般而言,防火墙的两个网络接口应分属两个不同的网络,根据系统管理员定义的访问规则在两个接口之间转发数据包,或者拒绝.丢弃数据包.实际上,防火墙不单单是访问控制的功能,而且还充当了路由器的角色.当然,这并非有什么不妥当的地方,但是当你企图把你配置好的linux防火墙放入运行网络,来保护现有系统安全的时候,你不得不重新考虑和更改你的网络架构.另外一个可能的麻烦是,当防火墙发生意外时,如果没有防火墙的硬件备份的话,那么你将面临巨大的心理压力,因为防火墙的故障,整个网络瘫痪了.假如你把防火墙配置成透明模

iptables防火墙原理详解

1. netfilter与iptables Netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤.数据包处理.地址伪装.透明代理.动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤.包速率限制等.Iptables/Netfilter的这些规则可以通过灵活组合,形

宽带ADSL防火墙配置详解

如今是黑客平民化的时代,呆在自己家里上网都有可能会"中枪",时不时的攻击你一下,一定会让你头大.好在许多的宽带猫都内置了防火墙功能,只要我们开启该功能,就可以让我们的ADSL上网更加安全,更加有保障. 一.登陆宽带猫. 登陆宽带猫的方法很多,为了便于文章说明,我们这里以所见即所得的WEB管理方式登陆. 打开IE浏览器,在地址栏内输入宽带猫的IP后按回车键,出现如图1所示的登陆框,输入用户名和密码后单击"确定"按钮.这时我们就可以看到宽带猫的配置界面了. 提示:宽带猫

CentOS 7上安装监控工具monit步骤详解

服务器运维时我们通常使用Zabbix作监视,在这里安装及配置monit,当检测到进程的停止时可自动启动进程. 推荐使用rpmforge源安装monit,因为rpmforge的monit版本较新. 安装monit # cd /tmp # rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el7.rf.x86_64.rpm # yum install --enablerepo=rpmforge m

CentOS下内核TCP参数优化配置详解

那是不是所有执行主动关闭的SOCKET都会进入TIME_WAIT状态呢?有没有什么情况使主动关闭的SOCKET直接进入CLOSED状态呢?答案是主动关闭的一方在发送最后一个ACK后就会进入TIME_WAIT状态,并停留2MSL(Max Segment LifeTime)时间,这个是TCP/IP必不可少的,也就是"解决"不了的. TCP/IP的设计者如此设计,主要原因有两个: 防止上一次连接中的包迷路后重新出现,影响新的连接(经过2MSL时间后,上一次连接中所有重复的包都会消失). 为了

CENTOS中SVN服务器SUBVERSION的配置详解

配置起来就稍稍复杂了一些,但也不是很难,主要就是几个配置文件. 我们看一下subversion的配置文件. 1.svnserve.conf 这是每个版本库的配置文件. 位置在每个库的conf目录中,目录结构如下. repository-path/conf/svnserve.conf 通过man svnserve.conf我制作了下面的conf文件供大家参考. [general] #设定未授权用户的权限,none无权限,read只读,write读写.默认为只读权限.可以根据自己的情况设定. #an

Win8高级安全Windows防火墙配置详解

Win8高级安全windows防火墙 此图为高级安全windows防火墙打开后界面,与win7一样. Windows 8针对每一个程序为用户提供了三种实用的网络连接方式: - 允许连接:程序或端口在任何的情况下都可以被连接到网络. - 只允许安全连接:程序或端口只有IPSec保护的情况下才允许连接到网络. - 阻止连接:阻止此程序或端口的任何状态下连接到网络. 三种方式一眼便知,只要你设定了某程序为"阻止连接"状态,该程序自然也就从此无法连入网络,想要自动更新或是联网工作那是不可能的事