配置iptables防火墙
管理iptables规则
1、 拒绝所有入站协议的数据包
[root@s2 ~]# iptables -P INPUT DROP
2、 允许系统管理员从192.168.10.100/24 网段使用SSH方式远程防火墙主机
[root@s2 ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.10.100/24 -j ACCEPT
3、 查看filter表INPUT链中的所有规则,同时显示各条规则的顺序号
[root@s2 ~]# iptables -L INPUT --line-numbers
4、 查看filter表各链中所有规则的相信信息,同时以数字的形式显示地址和端口信息
[root@s2 ~]# iptables –vnL注意-L选项放在最后,否则会将vn当成链名
Chain INPUT (policy DROP 47 packets, 10544 bytes)
pkts bytes target prot opt in out source destination
732 51752 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 566 packets, 57384 bytes)
pkts bytes target prot opt in out source destination
Chain RH-Firewall-1-INPUT (0 references)
pkts bytes target prot opt in out source destination
5、 删除filter表INPUT链中的第二条规则
[root@s2 ~]# iptables -D INPUT 2
6、 清空filter表、nat表、mangle表各链中的所有规则
[root@s2 ~]# iptables –F不指定表名时默认清空filter表
[root@s2 ~]# iptables -t nat -F
[root@s2 ~]# iptables -t mangle -F
7、 将filter表中FORWARD规则链的默认策略设为DROP
[root@s2 ~]# iptables -t filter -P FORWARD DROP
8、 将filter表中OUTPUT规则链的默认策略设为ACCEPT
[root@s2 ~]# iptables -P OUTPUT ACCEPT
9、 获得iptables相关选项用法的帮助信息
查看iptables命令中关于icmp协议的帮助信息
[root@s2 ~]# iptables -p icmp –h
10、在raw表中新增一条自定义的规则链,链名为TCP_PACKETS
[root@s2 ~]# iptables -t raw -N TCP_PACKETS
[root@s2 ~]# iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain TCP_PACKETS (0 references)
target prot opt source destination
11、清空用户自定义的所有规则链
[root@s2 ~]# iptables -t raw -X
条件匹配
1、通用(general)条件匹配
拒绝进入防火墙的所有icmp协议数据包
[root@s2 ~]# iptables -I INPUT -p icmp -j REJECT
2、允许防火墙转发除icmp协议以外的所有数据包(使用惊叹号! 可以将条件相反)
[root@s2 ~]# iptables -A FORWARD -p ! icmp -j ACCEPT
[root@s2 ~]# iptables -L FORWARD
Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT !icmp -- anywhere anywhere
3、拒绝转发来自192.168.1.11主机的数据,允许转发来自192.168.0.0/24网段的数据
[root@s2 ~]# iptables -A FORWARD -s 192.168.1.11 -j REJECT
[root@s2 ~]# iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
4、丢弃从外网接口(eth1)进入防火墙本机的源地址为私网
[root@s2 ~]# iptables -A INPUT -i eht1 -s 192.168.0.0/24 -j DROP
5、封锁某个IP网段,设置两小时后解锁
[root@s2 ~]# iptables -I INPUT -s 192.168.1.0/24 -j DROP
[root@s2 ~]# iptables -I FORWARD -s 192.168.1.0/24 -j DROP
[root@s2 ~]# at now +2 hours设置2小时后解锁
at> iptables -D INPUT 1
at> iptables -D FORWARD 1<EOT>
job 3 at 2010-04-25 19:52此处按Ctrl+D组合键提交任务
6、允许本机开放从TCP端口20~1024提供的应用服务
[root@s2 ~]# iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
[root@s2 ~]# iptables -A OUTPUT -p tcp --dport 20:1024 -j ACCEPT
7、作为网关使用时,允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包
[root@s2 ~]# iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
[root@s2 ~]# iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
--dport 目标端口 --sport 源端口
8、拒绝从外网接口(eth1)直接访问防火墙本机的数据包,但是允许响应防火墙TCP请求的数据包进入
[root@s2 ~]# iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK SYN -j REJECT
[root@s2 ~]# iptables -I INPUT -i eth1 -p tcp --tcp-flags ! SYN,RST,ACK SYN -j ACCEPT
--tcp-flags 用于查找数据包的TCP标记位
9、禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机(允许接受ICMP回应数据)
[root@s2 ~]# iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP
[root@s2 ~]# iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
[root@s2 ~]# iptables -A INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
Echo-Request 数值代码为8 Echo-Reply 数值代码为0 destination-Unreachable 数值代码为3,分别对应ICMP协议的请求、回显、目标不可达数据
10、禁止转发来自MAC地址为00-50-56-C0-00-01的主机的数据包。
[root@s2 ~]# iptables -A FORWARD -m mac --mac-source 00:50:56:C0:00:01 -j DROP
-m 模块关键字的形式调用显示匹配
11、允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250~1280
[root@s2 ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,25,11,1250:1280 -j ACCEPT--dports 端口列表 或 –sports端口列表
12、禁止转发源IP地址为192.168.1.20~192.168.1.199的TCP数据包
[root@s2 ~]# iptables -A INPUT -p tcp -m multiport --dport 20,21,25,11,1250:1280 -j ACCEPT--src-range IP地址范围 或者 --dst-rangeIP地址范围
13、禁止转发与正常TCP连接无关的非—syn请求数据包(如网络中可能存在的一些非法攻击数据包)
[root@s2 ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP state 检查数据包连接状态 常见的数据包状态主要包括NEW(与任何连接无关)、ESTABLISHED(响应请求或者已建立连接的)和RELATED(与已有连接有相关性的,如FTP数据连接)
14、拒绝访问防火墙的新数据包,但允许响应连接或已有连接相关的数据包
[root@s2 ~]# iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
15、在服务器中设置防火墙策略,只开放本机的Web服务(80端口)、FTP服务(20、21端口、20450、20480),放行外部主机发往服务器其他端口的应答数据包,将其他入站数据包均予以丢弃处理
[root@s2 ~]# iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
[root@s2 ~]# iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
[root@s2 ~]# iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
[root@s2 ~]# iptables -P INPUT DROP将默认策略设为DROP
数据包控制
1、对于尝试通过SSH方式登录防火墙主机的访问数据,记录日志信息并禁止其他访问
iptables -I INPUT -p tcp --dport 22 -j DROP
iptables -I INPUT -p tcp --dport 22 -j LOGLOG 在、var/log/messages文件中记录日志信息
2、为了避免日志记录过于频繁,通常结合LIMIT方式显示匹配(-吗limit)对日志写入频繁进行限制。以下规则用于将日志的频繁限制为平均三次/分钟,允许的峰值为八次
[root@s2 ~]# iptables -R INPUT 1 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 8 -j LOG
3、自定义一个新的链MyLAN1,转发自/至192.168.1.0、24网段的数据包均较给该链中的规则处理
[root@s2 ~]# iptables -t filter -N MyLAN1
[root@s2 ~]# iptables -A FORWARD -s 192.168.1.0/24 -j MyLAN1
[root@s2 ~]# iptables -A FORWARD -d 192.168.1.0/24 -j MyLAN1
[root@s2 ~]# iptables -A MyLAN1 -p icmp -j DROP
SNAT(源地址转换)修改数据包的源IP地址
DNAT(目标地址转换)修改数据包的目标IP地址
使用防火墙脚本
1、直接执行iptables-save命令时,将会把当前设置的防火墙信息输出到终端
[root@s2 ~]# iptables-save
# Generated by iptables-save v1.3.5 on Sun Apr 25 19:41:15 2010
*filter
:INPUT DROP [456:29475]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1855:180828]
:MyLAN1 - [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -m limit --limit 3/min --limit-burst 8 -j LOG
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A FORWARD -s 192.168.1.0/255.255.255.0 -j MyLAN1
-A FORWARD -d 192.168.1.0/255.255.255.0 -j MyLAN1
-A MyLAN1 -p icmp -j DROP
COMMIT
# Completed on Sun Apr 25 19:41:15 2010
2、将当前调好的iptables规则保存到配置文件,并通过iptables服务自动加载
[root@s2 ~]# iptables-save > /etc/sysconfig/iptables
[root@s2 ~]# service iptables restart
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
Applying iptables firewall rules: [ OK ]
Loading additional iptables modules: ip_conntrack_netbios_ns [ OK ]
[root@s2 ~]# chkconfig --level 35 iptables on
3、从保存的规则配置文件中导入iptables规则
[root@s2 ~]# [root@s2 ~]# chkconfig --level 35 iptables on
编写防火墙脚本
1、在脚本文件中预先将防火墙主机的IP地址、网络接口、局域网地址等定义为变量。
#!/bin/bash
INET_IP="214.16.18.20"
INET_IF="eth1"
LAN_IP="192.168.0.1"
LAN_IF="eth0"
2、在脚本文件中预先加载iptables需要用到的内核模块
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_raw
/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_iprange
/sbin/modprobe xt_tcpudp
/sbin/modprobe xt_state
/sbin/modprobe xt_multiport
/sbin/modprobe xt_mac
/sbin/modprobe xt_limit
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
3开启路由转发功能
在脚本文件中开启防火墙主机的路由转发功能
[root@s2 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@s2 ~]# cat /proc/sys/net/ipv4/ip_forward
1
通过修改/etc/sysctl.conf文件中的方式开启防火墙主机的路由转发功能。
net.ipv4.ip_forward = 1
4、用户设置的iptables规则
删除用户的自定义的链,清空以保存的规则,将filter表的默认策略恢复为允许
/sbin/iptables -X
/sbin/iptables -t nat -X
/sbin/iptables -t mangle -X
/sbin/iptables -t raw -X
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -t raw -F
/sbin/iptables -p INPUT ACCEPT
/sbin/iptables -p OUTPUT ACCEPT
/sbin/iptables -p FORWARD ACCEPT
上机实验部分
编写iptables脚本实现IP地址、端口过滤
1、将iptables的filter表中INPUT、FORWARD链的缺省策略设为DROP
[root@s2 ~]# iptables -P INPUT DROP
[root@s2 ~]# iptables -P FORWARD DROP
2、
(1)、允许从Internet访问网关服务器的指定端口,并记录访问日志没15分钟记录一次
[root@s2 ~]# iptables -A INPUT -p tcp --dport 22 -s 201.12.13.14/24 -j ACCEPT
[root@s2 ~]# iptables -I INPUT -p tcp --dport 22 -m limit --limit 15/minute -j LOG
(2)、允许来自内网IP为:192.168.1.5/24的主机访问网关的22号端口
[root@s2 ~]# iptables -A INPUT -p tcp --dport 22 -s 192.168.1.5/24 -j ACCEPT
(3)、允许MAC地址为00:0C:27:30:4E:5D的主机访问网关的22号端口
[root@s2 ~]# iptables -A INPUT -p tcp --dport 22 -m mac --mac-source 00:0C:27:30:4E:5D -j ACCEPT
(4)、仅允许局域网主机(LAN1:192.168.1.0/24)访问3128端口的代理服务
[root@s2 ~]# iptables -A INPUT -p tcp --dport 3128 -s 192.168.1.0/24 -j ACCEPT
(5)、允许局域网主机访问DNS服务器
[root@s2 ~]# iptables -A FORWARD -s 192.168.1.5/24 -d 192.168.2.2/24 -p udp --dport 53 -j ACCEPT
[root@s2 ~]# iptables -A FORWARD -s 192.168.2.2/24 -d 192.168.1.5/24 -p udp --dport 53 -j ACCEPT
3、开启路由转发
/etc/sysctl.conf
net.ipv4.ip_forward = 1
重新加载/etc/sysctl.conf文件中的sysctl配置
[root@s2 ~]# sysctl -p
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 4294967295
kernel.shmall = 268435456
4、编写脚本
net_ip="201.12.13.1/24"
inet_if="eth0"
inet2_ip="192.168.2.1"
inet2_if="eth1"
yuan_ip="201.12.13.14/24"
lan_ip="192.168.1.0/24"
lan_mac="00:0C:27:30:4E:5D"
dns="192.168.2.2/24"
/sbin/depmod -a
/sbin/modprobe ip_tables
/sbin/modprobe ip_conntrack
/sbin/modprobe iptable_filter
/sbin/modprobe iptable_nat
/sbin/modprobe iptable_mangle
/sbin/modprobe iptable_raw
/sbin/modprobe ipt_REJECT
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_iprange
/sbin/modprobe xt_tcpudp
/sbin/modprobe xt_state
/sbin/modprobe xt_multiport
/sbin/modprobe xt_mac
/sbin/modprobe xt_limit
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_nat_irc
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_conntrack_irc
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -A INPUT -p tcp --dport 22 -s $yuan_ip -j ACCEPT
/sbin/iptables -I INPUT -p tcp --dport 22 -m limit --limit 15/minute -j LOG
/sbin/iptables -A INPUT -p tcp --dport 22 -s $lan_ip -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 22 -m mac --mac-source $lan_mac -j ACCEPT
/sbin/iptables -A INPUT -p tcp --dport 3128 -s $lan_ip -j ACCEPT
/sbin/iptables -A FORWARD -s $lan_ip -d $dns -p udp --dport 53 -j ACCEPT
/sbin/iptables -A FORWARD -s $dns -d $lan_ip -p udp --dport 53 -j ACCEPT