Iptables
详解

目前的
Linux
防火墙机制主要是以
iptables
为主的,而
iptables
可以使用指令来下达,也可以透过编写
shell script
来进行指令的整合编辑。
1
、防火墙顺序规则。
2
IPtables
通常包括三个表格(
Fliter
NAT
Mangle
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
这个表格。
3
iptables
命令详解
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, u
dp, 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
这个最常用!表示这个数据包是与我们主机发送出去的数据包有关
[email=root@linux]
root@linux
[/email]
~]# 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
6
iptables
NAT
功能
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