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 ACCEPTiptables [-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 ∶ 就是来源主机的 MAC5 、其余的一些防***手段。 除了 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 done6 、 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 。