[i=s] 本帖最后由 w12928293 于 2011-11-3 11:23 编辑 [/i]
系统是Debian,用squid配合iptables做透明代理,两块网卡,eth0外网,eth1内网,在设iptables的FORWARD链默认策略为DROP时,客户端就不能上网了,改成ACCEPT就正常,应该是转发被截止了,但是不知道应该添加什么规则。
小弟刚上手linux半个月,被windows祸害了十几年。。。也不懂脚本,直接是写一条规则就保存一下。
贴上iptables的规则情况 还请大家抽时间看看 多谢了。
另外再请教一个问题,这个iptables的日志保存在什么位置? /var/log/messages里吗? 是不是我没有开启日志记录?
w12928293 于 2011-11-04 09:09:12发表:
4# okzokz123
多谢朋友,最近确实把头都整大了。
嘿嘿 你的设置肯定比我的好,我的现在还停留在能用阶段,啊哈哈
w12928293 于 2011-11-04 09:08:53发表:
多谢楼上的朋友,最近确实把头都整大了。
嘿嘿 你的设置肯定比我的好,我的现在还停留在能用阶段,啊哈哈
okzokz123 于 2011-11-03 16:21:42发表:
我的debian6_squid设置(水平有限未做过多设置)
okzokz123 于 2011-11-03 16:14:01发表:
iptable+squid很适合
真正实现防火墙功能的是 netfilter,它是Linux内核中实现包过滤 的内部结构。
IPTABLE 分INPUT OUTPUT FORWORD PREROUTING POSTROUTING (链)
规则链:
1. INPUT----进来的数据包应用此规则链中的策略。
2. OUTPUT----外出的数据包应用此规则链中的策略。
3. FORWARD----转发数据包时应用此规则链中的策略。
4. PREROUTING----对数据包作路由选择前应用此链中的规则。(所有的数据包进来的时侯都先由这个链处理)
5. POSTROUTING----对数据包作路由选择后应用此链中的规则。(所有的数据包出来的时侯都先由这个链处理)
规则表:
(1) filter表----三个链:INPUT、FORWARD、OUTPUT
作用:过滤数据包。内核模块:iptables_filter。
(2) nat表----三个链:PREROUTING、POSTROUTING、OUTPUT
作用:用于网络地址转换(IP、端口)。内核模块:iptable_nat。
(3) mangle表----五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS。内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
(4) raw表----两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理。内核模块:iptable_raw。
iptables传输数据包的过程
1.当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
2.如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
3.如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
规则表之间的优先顺序: raw----mangle----nat----filter
规则链之间的优先顺序 :
第一种情况:入站数据流向
从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。第二冲情况:转发数据流向
来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理。
第三种情况:出站数据流向
防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
防火墙处理数据包的四种方式:
1. ACCEPT 允许数据包通过。
2. DROP 直接丢弃数据包,不给任何回应信息。
3. REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
4. LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。
一.基本格式
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
常用命令选项如下:
-A 【append】 在指定的连的结尾添加规则
-D 【delete】删除指定连中的规则,可以按规则号或规则内容匹配
-I 【insert】插入一条新规则,默认是在最前面
-R 【replace】 替换某一条规则
-L 【list】列出所有规则
-F 【flush】清空所有规则
-N 【new】自定义一条规则连
-X 【--delete-chain】 删除用户自定义规则连
-P 【policy】设置默认策略
-n 【numeric】以数字方式显示,如:显示ip,但不显示主机名
-v 【verbose】显示详细信息
-V 【version】查看iptable的版本信息
--line-number 查看规则连是,显示列表号
-Z 清空计数器值
***
-t 加表
-j 操作行为
--to-source SNAT用,表示改成的SNAT源地址
--to-destination DNAT用,表示改成的DANT目标地址
-p 跟协议 protocol 指出要匹配的协议,可以是tcp, udp, icmp, all, 前缀!为逻辑非,表示除该协议外的所有协议.
-s 源IP address[/mask] 指定源地址或者地址范围.
-sport 指定源端口号或范围,可以用端口号也可以用/ETC/SERVICES文件中的名字.
-d 目标IP address[/mask] 指定目的地址或者地址范围.
-dport 指定目的端口号或范围,可以用端口号也可以用/ETC/SERVICES文件中的名字.
-icmp-type 指定匹配规则的ICMP信息类型(可以使用 iptables -p icmp -h 查看有效的ICMP类型名)
-i 匹配单独或某种类型的接口,此参数忽略时,默认符合所有接口,接口可以使用"!"来匹配捕食指定接口来的包.参数interface是接口名,如 eth0, eht1, ppp0等,指定一个目前不存在的接口是完全合法的,规则直到接口工作时才起作用,折中指定对于PPP等类似连接是非常有用的."+"表示匹配所有此类型接口.该选项只针对于INPUT,FORWARD和PREROUTING链是合法的.
-o 匹配规则的对外网络接口,该选项只针对于OUTPUT,FORWARD,POSTROUTING链是合法的.
--syn 仅仅匹配设置了SYN位, 清除了ACK, FIN位的TCP包. 这些包表示请求初始化的TCP连接.阻止从接口来的这样的包将会阻止外来的TCP连接请求.但输出的TCP连接请求将不受影响.这个参数仅仅当协议类型设置为了TCP才能使用. 此参数可以使用"!"标志匹配已存在的返回包,一般用于限制网络流量,即只允许已有的,向外发送的连接所返回的包.
二.举例
# iptable -t filter -F【清空filter表中所有规则】
# iptable -t filter -Z【清空filter表中的计数器值】
#iptable -t filter -X 【清除filter表中自定义连】
# iptable -t filter -P INPUT DROP 【设置INPUT连默认策略为DROP】
# iptable -t filter -P OUTPUT DROP
# iptable -t filter -P FORWROD DROP
# iptable -t filter -A INPUT -p tcp -j ACCEPT 【在INPUT连最后添加一条允许tcp协议的数据包进入的规则】
# iptable -t filter -R INPUT 1 -p tcp -j DROP 【替换INPUT连的第1条规则为拒绝tcp数据包进入】
# iptable -t nat -vnL --line-number 【以详细的、数字的格式列出nat表中的所有规则】
# iptable -t nat -D POSTROUTING 1 【删除nat表POSTROUTING 连中的第1条规则】
三.条件匹配
1. 协议匹配:用于检查数据包使用的协议,符合规则就允许,反之拒绝。允许使用的协议名在/etc/protocols文件中。
常用的协议有tcp,udp,icmp,ip 和all。 [-p 协议名 ]
# iptable -I INPUT -p icmp -j REJECT //拒绝进入防火墙本身的icmp数据包
# iptable -A FORWARD -p udp -j ACCEPT //允许转发udp的所有数据包
2. 地址匹配:用于检查数据包的地址是否符合规则,包括源地址和目的地址。[-s 源地址, -d 目的地址]
# iptable -A FORWARD -s 10.0.0.0/8 -j DROP //拒绝转发来自10.0.0.0/8 网段的数据包
# iptable -A FORWARD -d 80.0.0.0/8 -j DROP //拒绝转发目的是80.0.0.0/8 网段的数据包
3.端口匹配:用于检查数据包的tcp或udp端口,需要和 “-p 协议类型” 一起使用[-sport 源端口,-dport 目的端口]
# iptables -A FORWARD -s 10.0.0.0/8 -p tcp --dport 80 -j ACCEPT //允许转发来自10.0.0.0/8网段,目的端口是80的数据包
# iptables -I FORWARD -s 10.0.0.0/8 -p tcp --sport 21 -j ACCEPT //允许转发来自10.0.0.0/8网段,源端口是21的数据包
4.接口匹配:用于检查数据包从防火墙那个接口进入或出去,来判断是否允许。
# iptables -A FORWARD -i eth0 -s 10.0.0.0/8 -p tcp --dport 80 -j ACCEPT //允许转发从eth0进入,来自10.0.0.0/8网段,使用tcp 协议,目的端口椒80的数据包
# iptables -A INPUT -i eth0 -s 80.0.0.0/8 -j DORP //拒绝从eth0进入,来自80.0.0.0/8的数据包
5.SNAT转换:一般linux充当网关服务器时使用
SNAT只能用在nat表的POSTROUTING连,用于对源地址进行转换。要结合 --to 使用。
# iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -j SNAT --to 202.106.1.1 //将来自10.0.0.0/8网段的所有数据包的源地址转为202.106.1.1
# iptables -t nat -A POSTROUTING -i eth0 -s 80.0.0.0/8 -p tcp --dport 25 -j SNAT --to 202.106.1.1 //将来自eth0接口,10.0.0.0/8网段,目的端口25,tcp协议的数据包的源地址转为202.106.1.1
6.DNAT转换:只能用在nat表中的PREROUTING连,用于对目的地址或端口进行转换。
# iptables -t nat -A PREROUTING -i eth1 -d 202.106.1.1 -p tcp --dport 80 -j DNAT --to 10.0.0.10 //将从eth1 进入,目的地址是202.106.1.1,使用tcp 协议,目的端口是80的数据包的目的地址转为10.0.0.1
7.MASQUERADE:伪装,是SNAT的特例。
# iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth1 -j MASQUERADE //将来自10.0.0.0/8网段,从eth1出去的数据包的源地址伪装为eth1接口地址
四.拓展模块
1.按来源MAC地址匹配
# iptables -t filter -A FORWARD -m --mac-source 00:02:b2:03:a5:f6 -j DROP //拒绝转发来自该MAC地址的数据包
2.按多端口或连续端口匹配
20: 表示20以后的所有端口
20:100 表示20到100的端口
:20 表示20之前的所有端口
-m multiport [--prots, --sports,--dports]
# iptables -A INPUT -p tcp -m multiport --dports 21,20,25,53,80 -j ACCEPT //多端口匹配
# iptables -A INPUT -p tcp -dport 20: -j ACCEPT
# iptables -A INPUT -p tcp -sport 20:80 -j ACCEPT
# iptables -A INPUT -p tcp -sport :80 -j ACCEPT
3.还可以按数据包速率和状态匹配
-m limit --limit 匹配速率 如: -m limit --limit 50/s -j ACCEPT
-m state --state 状态 如: -m state --state INVALID,RELATED -j ACCEPT
1. 使用拨号带动局域网上网
小型企业、网吧等多使用拨号网络上网,通常可能使用代理,但是考虑到成本、对协议的支持等因素,建议使用ip欺骗方式带动区域网上网。
成功升级内核后安装iptables,然后执行以下脚本:
#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp
#进行ip伪装
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
2. ip映射
假设有一家ISP提供园区Internet接入服务,为了方便管理,该ISP分配给园区用户的IP地址都是伪IP,但是部分用户要求建立自己的WWW服务器对外发布信息。我们可以再防火墙的外部网卡上绑定多个合法IP地址,然后通过ip映射使发给其中某一个IP地址的包转发至内部某一用户的WWW服务器上,然后再将该内部WWW服务器响应包伪装成该合法IP发出的包。
我们假设以下情景:
该ISP分配给A单位www服务器的ip为:伪ip:192.168.1.100 真实ip:202.110.123.100
该ISP分配给B单位www服务器的ip为:伪ip:192.168.1.200 真实ip:202.110.123.200
linux防火墙的ip地址分别为:
内网接口eth1:192.168.1.1
外网接口eth0:202.110.123.1
然后我们将分配给A、B单位的真实ip绑定到防火墙的外网接口,以root权限执行以下命令:
ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0
ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0
成功升级内核后安装iptables,然后执行以下脚本:
#载入相关模块
modprobe ip_tables
modprobe ip_nat_ftp
首先,对防火墙接收到的目的ip为202.110.123.100和202.110.123.200的所有数据包进行目的NAT(DNAT):
iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100
iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200
其次,对防火墙接收到的源ip地址为192.168.1.100和192.168.1.200的数据包进行源NAT(SNAT):
iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100
iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200
这样,所有目的ip为202.110.123.100和202.110.123.200的数据包都将分别被转发给192.168.1.100和 192.168.1.200;而所有来自192.168.1.100和192.168.1.200的数据包都将分别被伪装成由 202.110.123.100和202.110.123.200,从而也就实现了ip映射。
iptables -t nat -A POSTROUTING -s 内网地址网段 -o 外网接口 -j SNAT --to-source 外网接口地址
还有你做了映射后 你应该可以访问外面的web了 如果你只允许内网访问外网的某些特定服务的话 为了安全你得把 filter的 FORWARD 链的默认规则改成DROP
具体是
iptables -P FORWARD DROP
然后
允许dhcp的包通过
iptables -A FORWARD -s 内网地址 -o 外网接口 -p udp --dport 67 -j ACCEPT
iptables -A FORWARD -s 内网地址 -o 外网接口 -p udp --dport 68 -j ACCEPT
iptables -A FORWARD -i 外网接口 -p udp --sport 67 -j ACCEPT
iptables -A FORWARD -i 外网接口 -p udp --sport 68 -j ACCEPT
允许服务端口出去 和允许服务端口进来
如果你要添加别的服务出去的话你只要改 -p 和 -dport(出的) sport(进的)
w12928293 于 2011-11-03 11:22:37发表:
# Generated by iptables-save v1.4.8 on Thu Nov 3 19:11:20 2011
*nat
:PREROUTING ACCEPT [145573:27647378]
:POSTROUTING ACCEPT [725:43576]
:OUTPUT ACCEPT [780:47216]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
-A POSTROUTING -s 192.168.100.0/24 -j SNAT --to-source 192.168.2.40
COMMIT
# Completed on Thu Nov 3 19:11:20 2011
# Generated by iptables-save v1.4.8 on Thu Nov 3 19:11:20 2011
*filter
:INPUT DROP [10:1193]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -s 192.168.100.0/24 -p tcp -m tcp --dport 3128 -j ACCEPT
-A INPUT -s 192.168.100.0/24 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 192.168.100.0/24 -i eth1 -p tcp -m tcp --dport 3128 -m state --state NEW,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 32768:61000 -m state --state ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p udp -m udp --sport 53 -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
-A OUTPUT -d 192.168.100.0/24 -p tcp -m tcp --sport 3128 -j ACCEPT
-A OUTPUT -d 192.168.100.0/24 -p tcp -m tcp --sport 80 -j ACCEPT
-A OUTPUT -d 192.168.100.0/24 -o eth1 -p tcp -m tcp --sport 3128 -m state --state ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --sport 32768:61000 -m state --state NEW,ESTABLISHED -j ACCEPT
-A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT
COMMIT
# Completed on Thu Nov 3 19:11:20 2011