• 在OpenWrt中使用iptables过滤特定字符串

    当前的需求如下:需要选择性地过滤掉远程客户端向NAT下的服务器发送的特定请求。
    网络拓扑:Client—Internet—WAN–OpenWrt Router–LAN–Server

    经过实践,方法如下:

    # 安装iptables-mod-filter
    opkg update
    opkg install iptables-mod-filter
    
    # 丢弃包含 abcd 字符串的数据包
    iptables -I FORWARD 1 -p tcp -m string --string "abcd" --algo bm -j DROP
    iptables -I FORWARD 1 -p udp -m string --string "abcd" --algo bm -j DROP
    
    # 恢复正常
    iptables -L --line-numbers
    iptables -D FORWARD 1   # 这个1是刚才输出的对应序号

    在执行命令后,在LAN抓包,发现对应的数据包果然不见了,证明命令生效。再执行后续的命令,在LAN抓包,又可恢复正常的不丢包状态。

    对于其他网络拓扑,可把FORWARD链改为INPUT或OUTPUT。

  • 使用iptables模拟Symmetric NAT

    如果想让一个P2P程序不能穿透,比较好的办法就是把NAT类型改为对称型的,即Symmetric.

    之前以为NAT类型对于一个路由器是固定的,后来google到了使用iptables模拟的方法,当然Symmetric NAT也有很多不同的具体实现形式,这里模拟的是其中的一种。

    系统为OpenWrt,执行命令

    WAN_IF = “eth0”  # 你的WAN接口
    iptables -t nat -A POSTROUTING -o $WAN_IF -j MASQUERADE --random

    即可。

     

    测试的结果是,对于同一个LAN IP:Port,对不同的Dst IP,映射到的WAN Port会差异比较大;而如果只改Dst Port,端口增量不大,可能为1。

     

    相关参考:
    http://albert-oma.blogspot.bg/2013/12/nat-router.html