免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 8757 | 回复: 22
打印 上一主题 下一主题

请教iptables如何只让给定的ip和mac上网? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-12-23 13:54 |只看该作者 |倒序浏览
现在我有一台redhat 9.0,两块网卡,eth0和ppp0,其中ppp0是adsl拨号,现在我已经通过iptables使局域网所有机器都能上网,但是有很多非法的用户也能通过设置网关的方法来上网,现在有这样的需求,只有指定的10个ip(与mac绑定)可以上网,其余都不让上网,但是可以访问服务器,应当如何写这个脚本?我是这样写的,但是好像不行:
iptables -P FORWARD DROP
iptables -A FORWARD -s 192.168.0.2 -m -mac --mac-source xxxxxxx -j ACCEPT
iptables -A FORWARD -s 192.168.0.3 -m -mac --mac-source xxxxxxx -j ACCEPT
……
请问高手应当如何使用呢?

论坛徽章:
0
2 [报告]
发表于 2004-12-23 14:32 |只看该作者

请教iptables如何只让给定的ip和mac上网?

iptables -A INPUT -m mac  --mac  xxxxxxx -j ACCEPT

就可以

论坛徽章:
0
3 [报告]
发表于 2004-12-23 14:55 |只看该作者

请教iptables如何只让给定的ip和mac上网?

你的包回来以后怎么办?
回来以后就变成
iptables -A FORWARD -d 192.168.0.2 -mac --mac-source ............

首先绑定ip和mac地址,其次直接过滤ip就可以,或者干脆直接过滤mac地址

在有些系统中有这样的需求,希望内部网中的某几个IP地址连接互联网,而又希望这些IP地址不被非法用户盗用。可以通过下面的解决办法实现:

    首先使用ipchains或者iptables来设定只允许合法的IP地址连出。

    对于合法IP建立IP/Mac捆绑。要讨论这个问题我们首先需要了解ARP协议的工作原理,arp协议是地址解析协议(Address Resolution Protocol)的缩写,其作用及工作原理如下:

    在底层的网络通信中,两个节点想要相互通信,必须先要知道源与目标的MAC地址。为了让系统能快速地找到一个远程节点的MAC地址,每一个本地的内核都保存有一个即时的查询表(称为ARP缓存)。ARP中有影射远程主机的IP地址到其对应的MAC地址的一个列表。地址解析协议(ARP)缓存是一个常驻内存的数据结构,其中的内容是由本地系统的内核来管理和维护的。默认的情况下,ARP缓存中保留有最近十分钟本地系统与之通信的节点的IP地址(和对应的MAC地址)。

    当一个远程主机的MAC地址存在于本地主机的ARP 缓存中,转换远程节点的IP地址为MAC地址不会遇到问题。然而在许多情况下,远程主机的MAC地址并不存在于本地的ARP缓存中,系统会怎么处理呢?在知道一个远程主机的IP地址,但是MAC地址不在本地的ARP缓存中的时候,以下的过程用来获取远程节点的MAC地址:本地主机发送一个广播包给网络中的所有的节点,询问是否有对应的IP地址。一个节点(只有一个)会回答这个ARP广播信息。在回应的信息包里就会包含有这个远程主机的MAC地址。在收到这个返回包后,本地节点就会在本地ARP缓存中记录远程节点的MAC地址。

    如果我们将IP/MAC对应关系建立为固定的,也就是对那些合法IP地址建立静态的MAC对应关系,那么即使非法用户盗用了IP地址linux路由器在回应这些IP发出的连接请求时则不会通过arp协议询问其mac地址而是使用Linux建立的静态MAC地址、发出应答数据这样盗用IP者则不会得到应答数据从而不能使用网络服务。

    建立静态IP/MAC捆绑的方法是:建立/etc/ethers文件,其中包含正确的IP/MAC对应关系,格式如下:

192.168.2.32 08:00:4E:B0:24:47

    然后再/etc/rc.d/rc.local最后添加:arp -f即可

    2.4内核的iptables可以对IP和Mac同时进行限定,使用该功能对合法IP的规则同时限定IP地址和Mac地址即可。

论坛徽章:
0
4 [报告]
发表于 2004-12-23 23:34 |只看该作者

请教iptables如何只让给定的ip和mac上网?

我用的就是眼皮猪的方法,只是为了提高处理效能,在FORWARD链的第一句放行了所有已经建立的连接,只有新发起的请求才进行IP检测,通过统计数据可以看出只有很少的数据包穿过CHKIP链;同样为了提高效能,采用了分层的处理结构,也就是说单独定义了CHKIP链,只在需要的时候才查询IP。

  1. #! /bin/bash

  2. /sbin/modprobe ip_conntrack_ftp
  3. /sbin/modprobe ip_nat_ftp
  4. /sbin/iptables -P INPUT DROP
  5. /sbin/iptables -P OUTPUT ACCEPT
  6. /sbin/iptables -P FORWARD DROP
  7. /sbin/iptables -N RATELIMIT
  8. /sbin/iptables -N CHKIP

  9. # allow the third handshake
  10. /sbin/iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

  11. # NAT
  12. /sbin/iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o ppp0 -j MASQUERADE

  13. # Redirect to CHKIP
  14. /sbin/iptables -A FORWARD -s 172.16.1.0/24 -i eth1 -o ppp0 -j CHKIP
  15. /sbin/iptables -A FORWARD -p icmp -j ACCEPT

  16. # CHKIP to allow autherised IP
  17. /sbin/iptables -A CHKIP -s 172.16.1.106/32 -j ACCEPT
  18. /sbin/iptables -A CHKIP -s 172.16.1.10/32 -j ACCEPT
  19. /sbin/iptables -A CHKIP -s 172.16.1.188/32 -j ACCEPT
  20. /sbin/iptables -A CHKIP -s 172.16.1.119/32 -j ACCEPT
  21. /sbin/iptables -A CHKIP -s 172.16.1.88/32 -j ACCEPT
  22. /sbin/iptables -A CHKIP -s 172.16.1.208/32 -j ACCEPT
  23. /sbin/iptables -A CHKIP -s 172.16.1.232/32 -j ACCEPT
  24. /sbin/iptables -A CHKIP -s 172.16.1.64/32 -j ACCEPT
  25. /sbin/iptables -A CHKIP -j DROP

  26. # Prevent Deny of Sevice attack.
  27. # Syn-flood protection:
  28. iptables -A RATELIMIT -p tcp --syn -m limit --limit 1/s -j ACCEPT
  29. # Furtive port scanner:
  30. iptables -A RATELIMIT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
  31. # Ping of death:
  32. iptables -A RATELIMIT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT

  33. # enable packet forwarding
  34. echo 1 >; /proc/sys/net/ipv4/ip_forward
复制代码


统计信息

  1. Chain FORWARD (policy DROP 56 packets, 22225 bytes)
  2. pkts bytes target     prot opt in     out     source               destination
  3. 7627K 3517M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0          state RELATED,ESTABLISHED
  4. 140K   11M CHKIP      all  --  eth1   *       172.16.1.0/24        0.0.0.0/0

  5. Chain CHKIP (2 references)
  6. pkts bytes target     prot opt in     out     source               destination
  7.    42  2057 ACCEPT     all  --  *      *       172.16.1.106         0.0.0.0/0
  8.     0     0 ACCEPT     all  --  *      *       172.16.1.10          0.0.0.0/0
  9.     0     0 ACCEPT     all  --  *      *       172.16.1.188         0.0.0.0/0
  10. 59141 5951K ACCEPT     all  --  *      *       172.16.1.119         0.0.0.0/0
  11. 15670  876K ACCEPT     all  --  *      *       172.16.1.88          0.0.0.0/0
  12.     0     0 ACCEPT     all  --  *      *       172.16.1.208         0.0.0.0/0
  13.     0     0 ACCEPT     all  --  *      *       172.16.1.232         0.0.0.0/0
  14.   338 22881 ACCEPT     all  --  *      *       172.16.1.64          0.0.0.0/0
  15. 83700 6693K DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0
复制代码

论坛徽章:
0
5 [报告]
发表于 2004-12-24 11:16 |只看该作者

请教iptables如何只让给定的ip和mac上网?

lyking:

       你先像双眼皮的猪那样绑定了ip和mac么?绑定了以后是不是只用ip或者只用mac就能限制?不需要二者同时限制?

论坛徽章:
0
6 [报告]
发表于 2004-12-24 11:28 |只看该作者

请教iptables如何只让给定的ip和mac上网?

限制一个就可以了...
不过如果你不绑定的话,可以只需要用mac限制就可以了...
arp表在
/proc/net/arp里边可以看的到,如果没有你想要的ip的话
ping一下它就有啦...

论坛徽章:
0
7 [报告]
发表于 2004-12-24 12:51 |只看该作者

请教iptables如何只让给定的ip和mac上网?

iptables -P FORWARD DROP
iptables -A FORWARD -s 192.168.0.169 -j ACCEPT

发现不行啊!

论坛徽章:
0
8 [报告]
发表于 2004-12-24 13:32 |只看该作者

请教iptables如何只让给定的ip和mac上网?

我是先将IP和MAC绑定,再限制IP的。也可已直接限制IP,将完整的防火墙配置贴上来看看。

论坛徽章:
0
9 [报告]
发表于 2004-12-24 14:43 |只看该作者

请教iptables如何只让给定的ip和mac上网?

服务器两块网卡eth0局域网,ppp0拨号ADSL,比如现在需要让192.168.0.169等10个ip可以无限制上网并无限制访问服务器(示例只给一个),其余ip可以无限制访问服务器,我是这么做的
1.生成/etc/ethers,内容如下
192.168.0.169 00:02:E3:50:C4:01
2./etc/rc.d/rc.local最后一行加上
arp -f
3.编写脚本/etc/rc.d/init.d/iptables,内容如下:
#!/bin/sh
#
# chkconfig: 2345 08 92
# description: Starts and stops iptables

OPT_=$1

start(){
  /bin/echo "$0 : (start)"
  /bin/echo 1 >; /proc/sys/net/ipv4/ip_forward
  /sbin/iptables -F
  /sbin/iptables -P FORWARD DROP
  /sbin/iptables -A FORWARD -s 192.168.0.169 -j ACCEPT

  /sbin/iptables -t nat -F
  /sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
}

stop(){
  /bin/echo "$0 : (stop)"
  /sbin/iptables -t nat -F
  /sbin/iptables -F
  /bin/echo 0 >; /proc/sys/net/ipv4/ip_forward
}

case "$OPT_" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  *)
    /bin/echo ''
    /bin/echo "Usage: $0 [start|stop]"
    /bin/echo "       Invalid argument ==>; \"${OPT_}\""
    /bin/echo ''
    ;;
esac
exit 0

但是发现谁都不能上网了,包括这个192.168.0.169,但都能访问服务器,去掉红色的两行后,都能访问internet了,很奇怪

论坛徽章:
0
10 [报告]
发表于 2004-12-24 14:51 |只看该作者

请教iptables如何只让给定的ip和mac上网?

第一行:FORWARD链默认全部DROP
第二行:只允许源地址为192.168.0.169的出去

既然默认都 drop啦,那么192.168.0.169的包的确是可以出去,但是返回的server响应的包怎么办?也通不过呀....


访问服务器只跟INPUT链和OUTPUT链有关系,跟forward没关系...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP