V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
neworld07
V2EX  ›  Linux

iptables 拒绝所有的连接,再指定 ip 连接?

  •  
  •   neworld07 · 2015-11-11 16:46:57 +08:00 · 10527 次点击
    这是一个创建于 3303 天前的主题,其中的信息可能已经有所发展或是发生改变。

    rt.
    要给服务器设置指定的 ip 可以连接.
    然后再拒绝所有的 ip 试探或连接?

    24 条回复    2015-11-21 04:31:35 +08:00
    fangdingjun
        1
    fangdingjun  
       2015-11-11 16:56:16 +08:00   ❤️ 2
    用搜索引擎能搜到很多 iptables 相关的文章,仔细研究一下你就明白了

    以下 3 条就行
    iptables -P INPUT DROP
    iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    iptables -A INPUT -p tcp -s 192.168.1.20 -j ACCEPT
    ryd994
        2
    ryd994  
       2015-11-11 21:51:00 +08:00
    @fangdingjun -P INPUT DROP 放最后,很多系统默认 iptables 是空的
    GNiux
        3
    GNiux  
       2015-11-12 08:21:10 +08:00 via iPhone
    @ryd994 没有关系吧。

    逻辑上,先禁再放开。
    ryd994
        4
    ryd994  
       2015-11-12 09:50:58 +08:00 via Android
    @GNiux ssh 当场阵亡
    adrianzhang
        5
    adrianzhang  
       2015-11-12 12:09:03 +08:00
    是要放最后的, iptables 规则是一条条解析的, drop 放第一条那就什么都进不去了。
    zho6
        6
    zho6  
       2015-11-12 12:52:49 +08:00
    分享我网站服务器上 iptables 脚本
    /sbin/iptables -F -t filter
    /sbin/iptables -F -t nat
    /sbin/iptables -P INPUT DROP
    /sbin/iptables -P OUTPUT ACCEPT
    /sbin/iptables -A INPUT -i lo -j ACCEPT
    /sbin/iptables -A INPUT -s 指定 IP -j ACCEPT
    /sbin/iptables -A INPUT -p icmp -j ACCEPT
    /sbin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp -m multiport --ports 110,25,8010,8100,10800 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp --dport 65300:65400 -j ACCEPT
    /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    /sbin/iptables -A INPUT -p tcp --syn -m ttl --ttl-eq 117 -j DROP
    /sbin/iptables -A INPUT -p tcp --syn -m length --length :40 -j DROP
    /sbin/iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
    /sbin/iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
    /sbin/iptables -A OUTPUT -p udp --dport 123 -j ACCEPT
    /sbin/iptables -A OUTPUT -p udp -j DROP
    zho6
        7
    zho6  
       2015-11-12 12:57:39 +08:00
    补充:
    /sbin/iptables -A INPUT -p tcp -m multiport --ports 110,25,8010,8100,10800 -j ACCEPT
    /sbin/iptables -A INPUT -p tcp --dport 65300:65400 -j ACCEPT

    以上二条开多了端口,请根据需要增减
    65300:65400 这一段端口是 ftp passive 模式指定使用的一段端口 不开 ftp 就把这一行删除吧
    ryd994
        8
    ryd994  
       2015-11-12 13:20:33 +08:00 via Android
    @zho6 1.你应该使用系统自带的服务 比如 iptables-persist
    2. flush 之前先-P ACCEPT
    3. ESTABLISHED,RELATED 应该靠前,在 lo 后面就可以了
    4.那几个 syn 规则是什么用途?
    5.如果不是极其苛刻, output 一般不需要控制
    kmahyyg
        9
    kmahyyg  
       2015-11-12 13:25:35 +08:00
    谁能给一个 firewalld 的吗?
    zho6
        10
    zho6  
       2015-11-12 13:48:29 +08:00
    @ryd994
    我没有自带的 iptables 服务
    ESTABLISHED,RELATED 应该靠前,在 lo 后面就可以了 这个规定没有冲突 如果有冲突是有前后顺序的差别的 这个靠前靠后都可以
    syn 规则过滤一些提定常用 sys 攻击
    -A OUTPUT -p udp -j DROP 这是只禁了对外的 UDP 没有禁 TCP
    ryd994
        11
    ryd994  
       2015-11-12 14:02:49 +08:00
    @zho6 ……一般发行版都有的吧
    ESTABLISHED,RELATED 靠前是因为方便后面可以放更复杂的规则,性能更好。 lo 一般不需要过滤,所以直接允许

    @kmahyyg firewalld 使用默认的就好,自定义端口的话:
    在 /etc/firewalld/services/ 新建 服务.xml 如果要覆盖现有服务的话就从 /usr/lib/firewalld/services/复制一份过来
    内容一般这样就行:
    <?xml version="1.0" encoding="utf-8"?>
    <service>
    <port protocol="tcp" port="1234"/>
    </service>
    语法参考 man firewalld.service


    service firewalld reload
    firewall-cmd --add-service=服务
    确认结果没有问题之后,加 --permanent 再执行一次保存
    zho6
        12
    zho6  
       2015-11-12 14:11:28 +08:00
    受教了 原来还有这么容易的方法
    raysonx
        13
    raysonx  
       2015-11-12 15:02:08 +08:00
    @fangdingjun
    @ryd994
    @GNiux
    @adrianzhang
    把 INPUT 鏈的默認 policy 設置為 DROP ,哪天手一抽在 SSH 下執行了 iptables -F 分分鐘教做人。可以在 INPUT 鏈的最後加一條 DROP 或 REJECT 。
    我的習慣是:
    第一條規則先放行所有已建立的連接,這樣有利於性能:
    -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    然後放行 lo :
    -A INPUT -i lo -j ACCEPT
    接著放行開放的服務:
    -A INPUT -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT #SSH
    -A INPUT -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT #HTTPS
    -A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT #HTTP
    然後放行 ICMP :
    -A INPUT -p icmp -j ACCEPT
    丢棄無效的包:
    -A INPUT -m conntrack --ctstate INVALID -j DROP
    最後一條用於禁止所有其他的包:
    -A INPUT -j REJECT --reject-with icmp-host-prohibited

    還可以把所有開放的服務放在一條自定義的鏈中,這樣在以後開放新服務的時候可以直接往那條鏈插而不用擔心插入的位置。
    raysonx
        14
    raysonx  
       2015-11-12 15:21:25 +08:00
    firewalld 簡單多了。 firewalld 以 zone 為單位管理網絡包,一個 zone 可以包含一組的網絡卡或 IP 段。
    系統默認會把你的網絡卡置於 public zone ,而 public zone 默認會放行 ssh , dhcpv6-client 服務,並開放 ICMP 封包。
    可以用 firewall-cmd --list-all 查開默認 zone 所有開放的服務。
    如果要放行 HTTP ,直接
    firewall-cmd --add-service http
    放行 HTTPS
    firewall-cmd --add-service http
    放行 SMTP
    firewall-cmd --add-service smtp
    上面的方式只是臨時放行,執行後立即生效,下次重啟 firewalld 後會丢失。
    要永久保存需要加--permanent 參數。但是加--permanent 的命令不會立即生效,你需要重新 reload 一下服務
    firewall-cmd --reload
    或者將 firewalld 重啟
    systemctl restart firewalld

    ---我是分割線-----

    如果只將某些服務開放給某一段 IP 或者某張網卡,可以將那張網卡或者 IP 段加入另一個 zone ,然後將服務開放給那一個 zone 。比如:
    將 eth1 加入 internal zone:
    firewall-cmd --zone internal --add-interface eth1 --permanent
    將 10.0.0.0/8 IP 段加入 internal zone:
    firewall-cmd --zone internal --add-source 10.0.0.0/8 --permanent
    開放 samba 服務給 internal zone:
    firewall-cmd --zone internal --add-service samba --permanent
    重新 reload 一下服務
    firewall-cmd --reload

    ---我是分割線-----
    另外可以手動加 iptables 規則。
    下面演示用直接加 iptables 規則的方法放行 HTTPS :
    firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 1 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT #IPv4
    firewall-cmd --direct --add-rule ipv6 filter INPUT_direct 1 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT #IPv6
    raysonx
        15
    raysonx  
       2015-11-12 15:21:44 +08:00
    @kmahyyg 見樓上
    LazyZhu
        16
    LazyZhu  
       2015-11-12 15:54:52 +08:00
    @fangdingjun
    -A 改成 -I 就可以, 哈哈
    fangdingjun
        17
    fangdingjun  
       2015-11-12 16:03:36 +08:00
    看来没有人用 iptables-save, iptables-restore
    ryd994
        18
    ryd994  
       2015-11-12 16:23:55 +08:00
    @raysonx 没事 flush 干嘛,而且真要 flush 了重启就好。判断-i 比判断 state 要快多了,所以 lo 应该在 state 前面。我一般是把 NEW 全部放到一个单独的链里,不必每次都判断 NEW

    @fangdingjun 都在用,楼上我早就提过 iptables-persistant 服务了
    另外, firewalld 更容易管理
    raysonx
        19
    raysonx  
       2015-11-12 17:11:12 +08:00
    @ryd994 以前管理學校機器的時候出現過這種情況。重啟機器需要找學校領導和各种人員許可,然後大老遠跑到機房去重啟。
    kmahyyg
        20
    kmahyyg  
       2015-11-12 17:51:21 +08:00
    @ryd994 我只想 drop ping 包或者特定 ip 包
    julyclyde
        21
    julyclyde  
       2015-11-12 18:04:19 +08:00
    要分清 结论性的 target 和 通过性的 target
    DROP 是结论; REJECT 也是结论。有结论之后就不会执行后面的内容了
    ryd994
        22
    ryd994  
       2015-11-12 23:52:29 +08:00 via Android
    @raysonx 你们这远程管理………
    服务器主板有些都自带远程,从机房跳板机进去就行

    @kmahyyg ping 可以在 allow icmp 里。更复杂的可以使用 firewalld rich language 。再不行可以 direct rule
    neworld07
        23
    neworld07  
    OP
       2015-11-21 04:30:01 +08:00
    @fangdingjun 很感谢你。你帮我解决了这个问题。
    最关键的一条:-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
    之前因为没有了这一条规则导致服务器不能联网,虽然是指定连接了!

    再次感谢!
    neworld07
        24
    neworld07  
    OP
       2015-11-21 04:31:35 +08:00
    感谢大家的回复。该帖已经结贴!!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1060 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 20:09 · PVG 04:09 · LAX 12:09 · JFK 15:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.