Chinaunix首页 | 论坛 | 博客
  • 博客访问: 680457
  • 博文数量: 404
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1237
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-03 10:45
文章分类

全部博文(404)

文章存档

2017年(1)

2016年(27)

2015年(39)

2014年(55)

2013年(66)

2012年(216)

分类: LINUX

2014-09-23 22:39:13

原文地址:iptables详解 作者:alexzhu99

目前的Linux防火墙机制主要是以 iptables 为主的,而 iptables 可以使用指令来下达,也可以透过编写 shell script 来进行指令的整合编辑。

1、防火墙顺序规则。
2
IPtables通常包括三个表格(FliterNATMangle
filter主要跟 Linux 本机有关,是预设的 table 。通常下面有三个链(chain)
INPUT∶
主要与数据包想要进入我们 Linux 本机有关;
OUTPUT∶
主要与 Linux 本机所要送出的数据有关;
FORWARD∶
这个与 Linux 本机比较没有关系,他可以将数据包转发到后端的电脑中,与 nat 这个 table 相关

NAT主要用来做源与目的IP或者端口的转换,与linux本机无关。

PREROUTING在进行路由判断之前所要进行的规则(DNAT/REDIRECT) POSTROUTING在进行路由判断之后所要进行的规则(SNAT/MASQUERADE) OUTPUT与发送出去的封包有关

mangle这个表格主要是与特殊的封包的路由旗标有关, 早期仅有 PREROUTING OUTPUT 链,不过从 kernel 2.4.18 之后加入了 INPUT FORWARD 链。由于这个表格与特殊旗标相关性较高,所以像咱们这种单纯的环境当中,较少使用 mangle 这个表格。

3iptables命令详解

iptables [-t tables] [-L] [-nv]

-t ∶后面接 table ,例如 nat filter ,若省略此项目,则使用预设的 filter
-L ∶
列出目前的 table 的规则
-n ∶
不进行 IP HOSTNAME 的反查,显示讯息的速度会快很多!
-v ∶
列出更多的资讯,包括通过该规则的封包总位元数、相关的网路介面等

iptables [-t tables] [-FXZ]参数
-F ∶
清除所有的已订定的规则;
-X ∶
杀掉所有使用者 "自订" chain (应该说的是 tables
-Z ∶
将所有的 chain 的计数与流量统计都归零

iptables -P [INPUT,OUTPUT,FORWARD][ACCEPT,DROP](默认操作filter表格)

iptables -t -nat -P[PREROUTING,POSTROUTING,OUTPUT][ACCEPT,DROP]参数
-P ∶
定义默认策略( Policy )。注意,这个 P 为大写啊!
ACCEPT ∶
该封包可接受
DROP ∶
该封包直接丢弃,不会让 client 端知道为何被丢弃。

iptables [-AI ] [-io 网路介面] [-p 协议] [-s 来源IP/掩码] [-d 目标IP/掩码] -j [ACCEPT|DROP]

-AI 针对某的链进行规则的 "插入" "增加"
-A ∶
新增加一条规则,该规则增加在原本规则的最后面
-I ∶
插入一条规则。如果没有指定此规则的顺序,预设是插入变成第一条规则。例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关,请看底下。

-io :网路介面设定数据包进出的介面规范
-i ∶
数据包所进入的那网路介面,例如eth0, lo 等介面。需与 INPUT 配合;
-o ∶
数据包所传出的那个网路介面,需与 OUTPUT 链配合;
-p
:协议设定此规则适用于哪种数据包格式主要的数据包格式有∶ tcp, udp, icmp all
-s
:来源 IP/掩码设定此规则之数据包的来源项目,可指定单纯的 IP 或包括掩码。若规范为『不许』时,则加上 ! 即可,例如
-s ! 192.168.100.0/24
表示不许 192.168.100.0/24 之数据包来源;
-d
:目标 IP/掩码 -s ,只不过这里指的是目标的 IP 或网域。
-j ∶
后面接动作,主要的动作有接受 (ACCEPT)、丢弃 (DROP) 及记录 (LOG)

[root@linux ~]# iptables -A INPUT -i eth0 -s 192.168.1.10 -j DROP
[root@linux ~]# iptables -A INPUT -i eth0 -s 192.168.1.0/24 -j ACCEPT

iptables [-AI ] [-io 网路介面] [-p tcp,udp] [-s 来源IP/网域] [--sport 端口范围]
> [-d
目标IP/网域] [--dport 端口范围] -j [ACCEPT|DROP]
参数
--sport
端口范围限制来源的端口号码,端口号码可以是连续的,例如 1024:65535
--dport
端口范围限制目标的端口号码。

iptables -A INPUT -m state --state 状态参数
-m ∶
一些 iptables 的模组,主要常见的有
state ∶
状态模组
mac ∶
网路卡硬体位址 (hardware address)
--state ∶
一些数据包的状态,主要有
INVALID ∶
无效的数据包,例如资料破损的数据包状态
ESTABLISHED∶
已经连线成功的连线状态;
NEW ∶
想要新建立连线的数据包状态;
RELATED ∶
这个最常用!表示这个数据包是与我们主机发送出去的数据包有关

~]# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
[root@linux ~]# iptables -A INPUT -m state --state INVALID -j DROP

针对区域网路内的 aa:bb:cc:dd:ee:ff 主机开放其连线
[root@linux ~]# iptables -A INPUT -m mac --mac-source aa:bb:cc:dd:ee:ff -j ACCEPT
参数
--mac-source ∶
就是来源主机的 MAC

5、其余的一些防攻击手段。

除了 iptables 这个防火墙软体之外,其实咱们 Linux kernel 2.6 提供很多核心预设的攻击抵挡机制喔!由于是核心的网路功能,所以相关的设定资料都是放置在 /proc/sys/net/ipv4/ 这个目录当中。 至于该目录下各个档案的详细资料,可以参考核心的说明文件∶/usr/src/linux-{version}/networking/ip-sysctl.txt。通常可设定如下:

echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo "0" > $i
done

6iptablesNAT功能

NAT 的全名是 Network Address Translation,字面上的意思是『网路位址的转换』。什么是 NAT SNAT DNAT
NAT
主机的重点就在于 NAT table 的两条重要的链∶PREROUTING POSTROUTING。 那这两条链有什么重要的功能呢?重点在于修改 IP 嘛!但是这两条链修改的 IP 是不一样的! POSTROUTING 在修改来源 IP PREROUTING 则在修改目标 IP 。 由于修改的 IP 不一样,所以就称为 来源 NAT (Source NAT, SNAT) 及目标 NAT (Destination NAT, DNAT)。在实际使用中,来源NAT一般用来给局域网机器提供internet上网服务。目标NAT一般用来提供DMZ区提供网际网络服务(Ftp,http,mail等)。

7、范例。

[root@linux ~]# mkdir -p /usr/local/virus/iptables
[root@linux ~]# cd /usr/local/virus/iptables
[root@linux iptables]# vi iptables.rule
#!/bin/bash
#
请先输入您的相关参数,不要输入错误了!
EXTIF="eth1" #
这个是可以连上 Public IP 的网路介面
INIF="eth0" #
内部 LAN 的连接介面;若无请填 ""
INNET="192.168.1.0/24" #
内部 LAN 的网域,若没有内部 LAN 请设定为 ""
export EXTIF INIF INNET

# 第一部份,针对本机的防火墙设定!###########################
# 1.
先设定好核心的网络防攻击功能
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/log_martians; do
echo "1" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do
echo "0" > $i
done
for i in /proc/sys/net/ipv4/conf/*/send_redirects; do
echo "0" > $i
done
# 2.
清除规则、设定预设政策及开放 lo 与相关的设定值
PATH=/sbin:/usr/sbin:/bin:/usr/bin; export PATH
iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state RELATED -j ACCEPT

# 3. 启动额外的防火墙 script 模组
if [ -f /usr/local/virus/iptables/iptables.deny ]; then
sh /usr/local/virus/iptables/iptables.deny
fi
if [ -f /usr/local/virus/iptables/iptables.allow ]; then
sh /usr/local/virus/iptables/iptables.allow
fi
if [ -f /usr/local/virus/httpd-err/iptables.http ]; then
sh /usr/local/virus/httpd-err/iptables.http
fi
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT

# 4. 允许某些类型的 ICMP 封包进入
AICMP="0 3 3/4 4 11 12 14 16 18"
for tyicmp in $AICMP
do
iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
done

# 5. 允许某些服务的进入,请依照您自己的环境开启
# iptables -A INPUT -p TCP -i $EXTIF --dport 22 -j ACCEPT # SSH
# iptables -A INPUT -p TCP -i $EXTIF --dport 25 -j ACCEPT # SMTP
# iptables -A INPUT -p UDP -i $EXTIF --sport 53 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --sport 53 -j ACCEPT # DNS
# iptables -A INPUT -p TCP -i $EXTIF --dport 80 -j ACCEPT # WWW
# iptables -A INPUT -p TCP -i $EXTIF --dport 110 -j ACCEPT # POP3
# iptables -A INPUT -p TCP -i $EXTIF --dport 443 -j ACCEPT # HTTPS

# 第二部份,针对后端主机的防火墙设定!##############################
# 1.
先载入一些有用的模组
modules="ip_tables iptable_nat ip_nat_ftp ip_nat_irc ip_conntrack ip_conntrack_ftp ip_conntrack_irc"
for mod in $modules
do
testmod=`lsmod | grep "${mod} "`
if [ "$testmod" == "" ]; then
modprobe $mod
fi
done

# 2. 清除 NAT table 的规则吧!
iptables -F -t nat
iptables -X -t nat
iptables -Z -t nat
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT

# 3. 开放成为路由器,且为 IP 分享器!
if [ "$INIF" != "" ]; then
iptables -A INPUT -i $INIF -j ACCEPT #
这一行在让 NAT 主机可接受来自内部LAN数据包
echo "1" > /proc/sys/net/ipv4/ip_forward #
这一行则是在让你的 Linux 具有 router 能力
if [ "$INNET" != "" ]; then
for innet in $INNET
do
iptables -t nat -A POSTROUTING -s $innet -o $EXTIF -j MASQUERADE
#
这一行最关键!就是加入 nat table 封包伪装。重点在那MASQUERADE !这个设定值 就是『 IP #伪装成为封包出去 (-o) 的那块装置上的 IP 』!以上面的例子来说,就是 $EXTIF ,也就是 #eth1 啦! 所以封包来源只要来自$innet (也就是内部 LAN 的其他主机) ,只要该封包可透过 #eth1 传送出去, 那就会自动的修改 IP 的来源表头成为 eth1 public IP
done
fi
fi
#
如果你的 MSN 一直无法连线,或者是某些网站 OK 某些网站不 OK
#
可能是 MTU 的问题,那你可以将底下这一行给他取消注解来启动 MTU #制范围
# iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -m tcpmss
# --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu

# 4. 内部服务器的设定
# iptables -t nat -A PREROUTING -p tcp -i $EXTIF --dport 80 -j DNAT --to 192.168.1.210:80
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
#
倒数第二行将访问80的数据映射到192.168.1.210.最后一行是将访问80端口的数据重定向#8080端口。

[root@linux iptables]# vi iptables.allow
#!/bin/bash
#
底下则填写你允许进入本机的其他网域或主机啊!
iptables -A INPUT -i $EXTIF -s 140.116.44.0/24 -j ACCEPT

# 底下则是关于抵挡的档案设定法!
[root@linux iptables]# vi iptables.deny
#!/bin/bash
#
底下填写的是『你要抵挡的那个咚咚!』
iptables -A INPUT -i $EXTIF -s 140.116.44.254 -j DROP

[root@linux iptables]# chmod 700 iptables.*

如果你希望一开机就自动执行这个 script 的话,请将这个档案的完整档名写入 /etc/rc.d/rc.local 当中,有点像底下这样
[root@linux ~]# vi /etc/rc.d/rc.local
.....
其他省略.....
# 1. Firewall
/usr/local/virus/iptables/iptables.rule
.....
其他省略.....

OK

阅读(922) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~