rt.
要给服务器设置指定的 ip 可以连接.
然后再拒绝所有的 ip 试探或连接?
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 |
2
ryd994 2015-11-11 21:51:00 +08:00
@fangdingjun -P INPUT DROP 放最后,很多系统默认 iptables 是空的
|
5
adrianzhang 2015-11-12 12:09:03 +08:00
是要放最后的, iptables 规则是一条条解析的, drop 放第一条那就什么都进不去了。
|
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 |
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 就把这一行删除吧 |
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 一般不需要控制 |
9
kmahyyg 2015-11-12 13:25:35 +08:00
谁能给一个 firewalld 的吗?
|
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 |
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 再执行一次保存 |
12
zho6 2015-11-12 14:11:28 +08:00
受教了 原来还有这么容易的方法
|
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 還可以把所有開放的服務放在一條自定義的鏈中,這樣在以後開放新服務的時候可以直接往那條鏈插而不用擔心插入的位置。 |
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 |
16
LazyZhu 2015-11-12 15:54:52 +08:00
@fangdingjun
-A 改成 -I 就可以, 哈哈 |
17
fangdingjun 2015-11-12 16:03:36 +08:00
看来没有人用 iptables-save, iptables-restore
|
18
ryd994 2015-11-12 16:23:55 +08:00
@raysonx 没事 flush 干嘛,而且真要 flush 了重启就好。判断-i 比判断 state 要快多了,所以 lo 应该在 state 前面。我一般是把 NEW 全部放到一个单独的链里,不必每次都判断 NEW
@fangdingjun 都在用,楼上我早就提过 iptables-persistant 服务了 另外, firewalld 更容易管理 |
21
julyclyde 2015-11-12 18:04:19 +08:00
要分清 结论性的 target 和 通过性的 target
DROP 是结论; REJECT 也是结论。有结论之后就不会执行后面的内容了 |
22
ryd994 2015-11-12 23:52:29 +08:00 via Android
|
23
neworld07 OP @fangdingjun 很感谢你。你帮我解决了这个问题。
最关键的一条:-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 之前因为没有了这一条规则导致服务器不能联网,虽然是指定连接了! 再次感谢! |
24
neworld07 OP 感谢大家的回复。该帖已经结贴!!
|