iptables详解

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
这个最常用!表示这个数据包是与我们主机发送出去的数据包有关
root@linux
~]# 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

你可能感兴趣的:(iptables详解)