centos iptables 防火墙一些设置
时间:2015-06-22 18:55 来源:linux.it.net.cn 作者:IT
不得不提我们所用的环境是一个集成的linux环境,xampp还是比较老的1.7版本的,一直提意见换一个新一点(ps:因为他的64位的安装包没有)。每次还得装一些类库,才能跑起来。
今天遇到一个问题,apache已经正确的打开了,但是在外网访问不到,想了一下应该是防火墙的原因,把防火墙给关闭了,果然可以访问了,那就配置一下防火墙吧。
自己的一个细节问题,注意命令存放的位置
安装32位支持库
http://blog.csdn.net/stgeekpower/article/details/8077043
转载:http://cnzhx.net/blog/centos-redhat-iptables-firewall-configuration/
CentOS / Redhat 上的 Iptables 防火墙配置简介
发表于 2012-08-29 作者 Haoxian Zeng
更新于 2013-04-13
浏览 1,554 次
2
在 CentOS / RHEL / Fedora 等系统中如何配制一个基于主机的防火墙呢?这就要从 Netfilter(iptables)说起。Netfilter 是一个基于主机的 Linux 操作系统防火墙。该防火墙由称为 iptables 的程序所控制。Netfilter 的过滤是在内核级别上进行的,在此之前程序甚至无法处理网络包的数据。
Netfilter(iptables)是 Linux 发行版的一部分,默认开启。如果没有的话也可以很简单的来安装并启用它。
快捷目录
-
Iptables 配置文件
-
基本操作:显示默认规则
-
基本操作:启用防火墙
-
基本操作:其它 iptables 操作指令
-
理解防火墙
-
配置 /etc/sysconfig/iptables 文件
-
编辑 /etc/sysctl.conf 以抵御 DoS 和 Syn 攻击
-
变通的配置方式
-
推荐阅读
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
(责任编辑:IT)
不得不提我们所用的环境是一个集成的linux环境,xampp还是比较老的1.7版本的,一直提意见换一个新一点(ps:因为他的64位的安装包没有)。每次还得装一些类库,才能跑起来。
今天遇到一个问题,apache已经正确的打开了,但是在外网访问不到,想了一下应该是防火墙的原因,把防火墙给关闭了,果然可以访问了,那就配置一下防火墙吧。
自己的一个细节问题,注意命令存放的位置
安装32位支持库
http://blog.csdn.net/stgeekpower/article/details/8077043
转载:http://cnzhx.net/blog/centos-redhat-iptables-firewall-configuration/
CentOS / Redhat 上的 Iptables 防火墙配置简介
发表于 2012-08-29 作者 Haoxian Zeng
更新于 2013-04-13 浏览 1,554 次
2
在 CentOS / RHEL / Fedora 等系统中如何配制一个基于主机的防火墙呢?这就要从 Netfilter(iptables)说起。Netfilter 是一个基于主机的 Linux 操作系统防火墙。该防火墙由称为 iptables 的程序所控制。Netfilter 的过滤是在内核级别上进行的,在此之前程序甚至无法处理网络包的数据。 Netfilter(iptables)是 Linux 发行版的一部分,默认开启。如果没有的话也可以很简单的来安装并启用它。 快捷目录
1. Iptables 配置文件¶RHEL / CentOS / Fedora Linux 发行版中默认的配置文件是:
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 进行操作的指令,请参考 5. 理解防火墙¶上面列出的防火墙(iptables)中有 4 个链:
包匹配规则¶
目标含义¶
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 以帮助抵御一些类型攻击是挺有效的,添加或者更改为如下参数设置:
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 |