红联Linux门户
Linux帮助
当前位置: 红联Linux门户 > Debian

透明代理,FORWARD 默认为DROP时,客户端不能上网

发布时间:2011-11-03 11:21:36来源:红联作者:w12928293
[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里吗? 是不是我没有开启日志记录?
文章评论

共有 5 条评论

  1. w12928293 于 2011-11-04 09:09:12发表:

    4# okzokz123


    多谢朋友,最近确实把头都整大了。

    嘿嘿 你的设置肯定比我的好,我的现在还停留在能用阶段,啊哈哈

  2. w12928293 于 2011-11-04 09:08:53发表:

    多谢楼上的朋友,最近确实把头都整大了。

    嘿嘿 你的设置肯定比我的好,我的现在还停留在能用阶段,啊哈哈

  3. okzokz123 于 2011-11-03 16:21:42发表:

    我的debian6_squid设置(水平有限未做过多设置)

  4. 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(进的)

  5. 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