rt.
要给服务器设置指定的 ip 可以连接.
然后再拒绝所有的 ip 试探或连接?
用搜索引擎能搜到很多 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
-P INPUT DROP 放最后,很多系统默认 iptables 是空的
没有关系吧。
逻辑上,先禁再放开。
ssh 当场阵亡
是要放最后的, iptables 规则是一条条解析的, drop 放第一条那就什么都进不去了。
分享我网站服务器上 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
补充:
/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 就把这一行删除吧
1.你应该使用系统自带的服务 比如 iptables-persist
2. flush 之前先-P ACCEPT
3. ESTABLISHED,RELATED 应该靠前,在 lo 后面就可以了
4.那几个 syn 规则是什么用途?
5.如果不是极其苛刻, output 一般不需要控制
谁能给一个 firewalld 的吗?
我没有自带的 iptables 服务
ESTABLISHED,RELATED 应该靠前,在 lo 后面就可以了 这个规定没有冲突 如果有冲突是有前后顺序的差别的 这个靠前靠后都可以
syn 规则过滤一些提定常用 sys 攻击
-A OUTPUT -p udp -j DROP 这是只禁了对外的 UDP 没有禁 TCP
……一般发行版都有的吧
ESTABLISHED,RELATED 靠前是因为方便后面可以放更复杂的规则,性能更好。 lo 一般不需要过滤,所以直接允许
firewalld 使用默认的就好,自定义端口的话:
在 /etc/firewalld/services/ 新建 服务.xml 如果要覆盖现有服务的话就从 /usr/lib/firewalld/services/复制一份过来
内容一般这样就行:
语法参考 man firewalld.service
service firewalld reload
firewall-cmd --add-service=服务
确认结果没有问题之后,加 --permanent 再执行一次保存
受教了 原来还有这么容易的方法
把 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 />-A INPUT -p tcp -m tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT />-A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT />然後放行 ICMP :
-A INPUT -p icmp -j ACCEPT
丢棄無效的包:
-A INPUT -m conntrack --ctstate INVALID -j DROP
最後一條用於禁止所有其他的包:
-A INPUT -j REJECT --reject-with icmp-host-prohibited
還可以把所有開放的服務放在一條自定義的鏈中,這樣在以後開放新服務的時候可以直接往那條鏈插而不用擔心插入的位置。
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 />firewall-cmd --direct --add-rule ipv6 filter INPUT_direct 1 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT #IPv6
見樓上
-A 改成 -I 就可以, 哈哈
看来没有人用 iptables-save, iptables-restore
没事 flush 干嘛,而且真要 flush 了重启就好。判断-i 比判断 state 要快多了,所以 lo 应该在 state 前面。我一般是把 NEW 全部放到一个单独的链里,不必每次都判断 NEW
都在用,楼上我早就提过 iptables-persistant 服务了
另外, firewalld 更容易管理
以前管理學校機器的時候出現過這種情況。重啟機器需要找學校領導和各种人員許可,然後大老遠跑到機房去重啟。
我只想 drop ping 包或者特定 ip 包
要分清 结论性的 target 和 通过性的 target
DROP 是结论; REJECT 也是结论。有结论之后就不会执行后面的内容了
你们这远程管理………
服务器主板有些都自带远程,从机房跳板机进去就行
ping 可以在 allow icmp 里。更复杂的可以使用 firewalld rich language 。再不行可以 direct rule
很感谢你。你帮我解决了这个问题。
最关键的一条:-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
之前因为没有了这一条规则导致服务器不能联网,虽然是指定连接了!
再次感谢!
感谢大家的回复。该帖已经结贴!!