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

2015-11-11 16:46:57 +08:00
 neworld07

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

10562 次点击
所在节点    Linux
24 条回复
fangdingjun
2015-11-11 16:56:16 +08:00
用搜索引擎能搜到很多 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
2015-11-11 21:51:00 +08:00
@fangdingjun -P INPUT DROP 放最后,很多系统默认 iptables 是空的
GNiux
2015-11-12 08:21:10 +08:00
@ryd994 没有关系吧。

逻辑上,先禁再放开。
ryd994
2015-11-12 09:50:58 +08:00
@GNiux ssh 当场阵亡
adrianzhang
2015-11-12 12:09:03 +08:00
是要放最后的, iptables 规则是一条条解析的, drop 放第一条那就什么都进不去了。
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
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
2015-11-12 13:20:33 +08:00
@zho6 1.你应该使用系统自带的服务 比如 iptables-persist
2. flush 之前先-P ACCEPT
3. ESTABLISHED,RELATED 应该靠前,在 lo 后面就可以了
4.那几个 syn 规则是什么用途?
5.如果不是极其苛刻, output 一般不需要控制
kmahyyg
2015-11-12 13:25:35 +08:00
谁能给一个 firewalld 的吗?
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
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
2015-11-12 14:11:28 +08:00
受教了 原来还有这么容易的方法
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
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
2015-11-12 15:21:44 +08:00
@kmahyyg 見樓上
LazyZhu
2015-11-12 15:54:52 +08:00
@fangdingjun
-A 改成 -I 就可以, 哈哈
fangdingjun
2015-11-12 16:03:36 +08:00
看来没有人用 iptables-save, iptables-restore
ryd994
2015-11-12 16:23:55 +08:00
@raysonx 没事 flush 干嘛,而且真要 flush 了重启就好。判断-i 比判断 state 要快多了,所以 lo 应该在 state 前面。我一般是把 NEW 全部放到一个单独的链里,不必每次都判断 NEW

@fangdingjun 都在用,楼上我早就提过 iptables-persistant 服务了
另外, firewalld 更容易管理
raysonx
2015-11-12 17:11:12 +08:00
@ryd994 以前管理學校機器的時候出現過這種情況。重啟機器需要找學校領導和各种人員許可,然後大老遠跑到機房去重啟。
kmahyyg
2015-11-12 17:51:21 +08:00
@ryd994 我只想 drop ping 包或者特定 ip 包

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/235392

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX