# 繋がらなくなりました ## 問題 あなたはサーバホスティング会社に勤めているシステムエンジニアです。 顧客より、下記のとおり依頼をいただきました。 ``` 前任者退職に伴って確認しようと思いサーバ内を確認していたところ、 間違えてFWサーバとwebサーバを再起動してしまいました。 再起動前はwebページに正常にアクセスできていたのですが、アクセスできなくなってしまったため、 いい感じに直していただきたいです。 しかし、セキュリティを考えていた設定とかもあると思うので、外部アクセスなどへはそのまま利用してほしいです。 あと、監視サーバからのURL監視も通るようにしてほしいです。こちらは特に制限をかける必要はありません。 でも、サーバの担当者が出張中で認証情報がわからないので、監視サーバへはログインできないです。 また、再発しないように設定いただけると嬉しいです。 変更した設定などはコマンドレベルでご報告いただけますようお願いします。 ``` - 対応してほしいところ 上記依頼に則った上で、下記を満たすように修正してください。 - VNCから以下のwebページへHTTPアクセスが正常に通るようにしてください。 対象URL: http://www.qwe.example/ - monitorから正常に監視ができるようにしてください。 - FWサーバ 2222番ポートへの接続で、webへssh接続できるようにしてください。 - 構成 - アクセス可能 VNC(踏み台、クライアントPCと想定してください) firewall01 (192.168.0.100/10.111.100.1 admin:USerPw@19) web01 (10.111.100.10 admin:USerPw@19 ※FWサーバよりアクセス可能)\ - アクセス不可 monitor(192.168.0.200) ※ 例示用URLのため、VNCのhostsに記載して名前解決しています。 ※ 192.168.128.0/17 のIP帯からwebサーバへのランダムアクセスを行っています。 問題環境の都合上ではありますが、一般userのアクセスと考えて対応してください。 - ▼構成図 ``` ( Internet ) | +-----+-----+ +-----+-----+ | VNC | | Monitor | +-----+-----+ +-----+-----+ | | ------+------------------+------- 192.168.0.0/16 | +-----+-----+ | FW | +-----+-----+ | ------+-------------------------- 10.111.100.0/24 | +-----+-----+ | WEB | +-----+-----+ ``` ## やったこと ``` [admin@web01 ~]$ systemctl --failed UNIT LOAD ACTIVE SUB DESCRIPTION ● kdump.service loaded failed failed Crash recovery kernel arming LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 1 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'. ``` これは放置で良さそう? ``` [admin@web01 ~]$ curl 10.111.100.10 ``` これは通る ``` [admin@firewall01 ~]$ curl http://10.111.100.10 curl: (7) couldn't connect to host ``` 通らない web01にappachが居る /var/www/wordpressに.phpがある ``` [admin@web01 ~]$ sudo firewall-cmd --list-all --permanent public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ``` 80番ポート開放されてなさそう https://qiita.com/maekun/items/56f088c7d012f4fbad3e えいやっ ``` [admin@web01 ~]$ sudo firewall-cmd --zone=public --permanent --add-service=http success [admin@web01 ~]$ sudo systemctl restart firewalld.service ``` ``` [admin@firewall01 ~]$ curl http://10.111.100.10 ``` が通るようになった 再起動テストも通った 次FWの設定 iptablesなるものを使うらしい /etc/sysconfig/iptables.save があるなぁ でもこれ関係ないかな ``` [admin@firewall01 ~]$ sudo iptables -L Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED INPUT_ALLOW tcp -- 192.168.0.0/24 anywhere tcp dpt:ssh LOG tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW LOG level info prefix `iptables : --SYN DENY ' DROP tcp -- anywhere anywhere tcp flags:!FIN,SYN,RST,ACK/SYN state NEW INPUT_ALLOW all -- 192.168.0.0/24 anywhere INPUT_ALLOW all -- 192.168.100.0/24 anywhere INPUT_ALLOW udp -- anywhere anywhere udp spt:domain INPUT_ALLOW udp -- anywhere anywhere udp dpt:domain INPUT_ALLOW tcp -- anywhere anywhere state NEW tcp dpt:http INPUT_ALLOW tcp -- anywhere anywhere state NEW tcp dpt:https STEALTH_SCAN tcp -- anywhere anywhere tcp flags:SYN,ACK/SYN,ACK state NEW STEALTH_SCAN tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/NONE STEALTH_SCAN tcp -- anywhere anywhere tcp flags:FIN,SYN/FIN,SYN STEALTH_SCAN tcp -- anywhere anywhere tcp flags:SYN,RST/SYN,RST STEALTH_SCAN tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,PSH,ACK,URG/FIN,SYN,RST,ACK,URG STEALTH_SCAN tcp -- anywhere anywhere tcp flags:FIN,RST/FIN,RST STEALTH_SCAN tcp -- anywhere anywhere tcp flags:FIN,ACK/FIN STEALTH_SCAN tcp -- anywhere anywhere tcp flags:PSH,ACK/PSH STEALTH_SCAN tcp -- anywhere anywhere tcp flags:ACK,URG/URG PING_OF_DEATH icmp -- anywhere anywhere icmp echo-request ACCEPT icmp -- anywhere anywhere icmp echo-request tcp -- !192.168.0.0/24 anywhere tcp dpt:EtherNet/IP-1 flags:FIN,SYN,RST,ACK/SYN recent: SET name: SSH_ATTACK side: source LOG tcp -- !192.168.0.0/24 anywhere tcp dpt:EtherNet/IP-1 flags:FIN,SYN,RST,ACK/SYN recent: CHECK seconds: 60 hit_count: 3 name: SSH_ATTACK side: source LOG level warning prefix `iptables : SSH_ATTACK ' DROP tcp -- !192.168.0.0/24 anywhere tcp dpt:EtherNet/IP-1 flags:FIN,SYN,RST,ACK/SYN recent: CHECK seconds: 60 hit_count: 3 name: SSH_ATTACK side: source tcp -- !192.168.0.0/24 anywhere tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN recent: SET name: SSH_ATTACK side: source LOG tcp -- !192.168.0.0/24 anywhere tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN recent: CHECK seconds: 60 hit_count: 3 name: SSH_ATTACK side: source LOG level warning prefix `iptables : SSH_ATTACK ' DROP tcp -- !192.168.0.0/24 anywhere tcp dpt:ssh flags:FIN,SYN,RST,ACK/SYN recent: CHECK seconds: 60 hit_count: 3 name: SSH_ATTACK side: source Chain FORWARD (policy ACCEPT) target prot opt source destination FORWARD_ALLOW tcp -- 192.168.0.0/16 anywhere state NEW tcp dpt:ssh SYN_CHECK tcp -- 192.168.0.0/16 10.111.100.10 tcp dpt:http FORWARD_ALLOW tcp -- 192.168.0.200 10.111.100.10 state NEW tcp dpt:http FORWARD_ALLOW tcp -- !192.168.0.200 10.111.100.10 state NEW tcp dpt:http FORWARD_ALLOW tcp -- 192.168.0.0/16 10.111.100.10 state NEW tcp dpt:ssh FORWARD_ALLOW tcp -- anywhere 10.111.100.10 tcp dpt:https ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT tcp -- anywhere anywhere tcp spt:http ACCEPT tcp -- anywhere anywhere tcp spt:ssh ACCEPT tcp -- anywhere anywhere tcp spt:EtherNet/IP-1 ACCEPT icmp -- anywhere anywhere icmp echo-reply ACCEPT icmp -- anywhere anywhere icmp echo-request ACCEPT all -- anywhere anywhere ACCEPT all -- anywhere anywhere Chain FORWARD_ALLOW (5 references) target prot opt source destination LOG all -- anywhere anywhere LOG level warning prefix `iptables : FORWARD_ALLOW ' ACCEPT all -- anywhere anywhere Chain INPUT_ALLOW (7 references) target prot opt source destination LOG all -- anywhere anywhere LOG level warning prefix `iptables : INPUT_ALLOW ' ACCEPT all -- anywhere anywhere Chain PING_OF_DEATH (1 references) target prot opt source destination RETURN icmp -- anywhere anywhere icmp echo-request limit: up to 1/sec burst 10 mode srcip htable-expire 250000 LOG all -- anywhere anywhere LOG level warning prefix `iptables : PING_OF_DEATH ' DROP all -- anywhere anywhere Chain STEALTH_SCAN (9 references) target prot opt source destination LOG all -- anywhere anywhere LOG level warning prefix `iptables : STEALTH_SCAN ' DROP all -- anywhere anywhere Chain SYN_CHECK (1 references) target prot opt source destination ACCEPT tcp -- anywhere anywhere tcp state RELATED,ESTABLISHED REJECT tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN recent: CHECK seconds: 20 name: SYN_ATTACK side: source reject-with icmp-port-unreachable SYN_FLOOD tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN recent: CHECK seconds: 15 hit_count: 5 name: SYN_sorce side: source tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN recent: SET name: SYN_sorce side: source RETURN tcp -- anywhere anywhere tcp Chain SYN_FLOOD (1 references) target prot opt source destination LOG all -- anywhere anywhere recent: SET name: SYN_ATTACK side: source LOG level warning prefix `iptables : SYN_FLOOD ' REJECT all -- anywhere anywhere reject-with icmp-port-unreachable ``` やることは * VNCから以下のwebページへHTTPアクセスが正常に通るようにしてください。 * 80番ポートに来たやつをFORWORD? * monitorから正常に監視ができるようにしてください。 * source見て全許可? * FWサーバ 2222番ポートへの接続で、webへssh接続できるようにしてください。 * FORWORD? * https://mo.kerosoft.com/0203 * ``` iptables -t nat -A PREROUTING -m tcp -p tcp --dst 192.168.0.100 --dport 2222 -j DNAT --to-destination 10.111.100.10:22 iptables -t nat -A POSTROUTING -m tcp -p tcp --dst 10.111.100.10 --dport 22 -j SNAT --to-source 10.111.100.1 iptables -A FORWARD -m tcp -p tcp --dst 10.111.100.10 --dport 22 -j ACCEPT ``` * 実は最後から1番目もいらないのでは * `FORWARD_ALLOW tcp -- 192.168.0.0/16 10.111.100.10 state NEW tcp dpt:ssh`がデフォルトである ``` [admin@firewall01 ~]$ sudo ptables -t nat -n -L [sudo] password for admin: Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- 192.168.0.100 0.0.0.0/0 tcp dpt:2222 to:10.111.10.10:22 <=これミスっぽい DNAT tcp -- 192.168.0.100 0.0.0.0/0 tcp dpt:80 to:10.111.10.10:80 DNAT tcp -- 0.0.0.0/0 192.168.0.100 tcp dpt:2222 to:10.111.100.10:22 Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT tcp -- 10.111.100.10 0.0.0.0/0 tcp dpt:22 to:192.168.0.100 SNAT tcp -- 10.111.100.10 0.0.0.0/0 tcp dpt:80 to:192.168.0.100 SNAT tcp -- 10.111.100.10 0.0.0.0/0 tcp dpt:53 to:192.168.0.100 SNAT udp -- 10.111.100.10 0.0.0.0/0 udp dpt:53 to:192.168.0.100 SNAT tcp -- 0.0.0.0/0 10.111.100.10 tcp dpt:22 to:10.111.100.1 Chain OUTPUT (policy ACCEPT) target prot opt source destination ``` ## 解答 お疲れさまです。:thonk_spin.ex-large.rotate.parrot:です。 問題「つながらなくなりました!」の回答をお送りいたします。 ### 作業 #### 手順1 webサーバ内で ``` sudo firewall-cmd --zone=public --permanent --add-service=http sudo systemctl restart firewalld.service ``` を実行 #### 手順2 FWサーバ内で ``` iptables-restore < /etc/systemctl/iptables.save service iptables save ``` を実行 ### 原因と作業の根拠 まずwebサーバの設定についてです。 FWサーバからwebページのcurlが通らないことを確認しました。 ``` [admin@firewall01 ~]$ curl http://10.111.100.10 curl: (7) couldn't connect to host ``` webサーバを調査したところ、webサーバの80番ポートが開放されていないことが分かりました。 ``` [admin@web01 ~]$ sudo firewall-cmd --list-all --permanent public target: default icmp-block-inversion: no interfaces: sources: services: dhcpv6-client ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules: ``` これを解決するために、webサーバで ``` [admin@web01 ~]$ sudo firewall-cmd --zone=public --permanent --add-service=http success [admin@web01 ~]$ sudo systemctl restart firewalld.service ``` を実行し、webサーバの80番ポートを開放し、`--permanent`で永続化しました。 次に、FWサーバの設定についてです。 `/etc/systemctl/iptables.save`に正しいと思われる設定が記述されていました。今回の経緯から考え、この設定が前任者がセキュリティを考慮して設定したものと思われた為、以下のコマンドでこれを適用し永続化しました。 ``` # iptables-restore < /etc/systemctl/iptables.save # service iptables save ``` これにより、webページへのHTTPアクセス、FWサーバ2222番ポート経由のwebへのssh接続が解決しました。 monitorからの監視も正常に行えていると考えています。 --- ``` # Generated by iptables-save v1.4.7 on Thu Dec 5 10:38:09 2019 *filter :INPUT DROP [0:0] :FORWARD ACCEPT [0:0] :OUTPUT DROP [0:0] :FORWARD_ALLOW - [0:0] :INPUT_ALLOW - [0:0] :PING_OF_DEATH - [0:0] :STEALTH_SCAN - [0:0] :SYN_CHECK - [0:0] :SYN_FLOOD - [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -s 192.168.0.0/24 -i eth0 -p tcp -m tcp --dport 22 -j INPUT_ALLOW -A INPUT -i eth0 -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j LOG --log-prefix "iptables : --SYN DENY " --log-level 6 -A INPUT -i eth0 -p tcp -m tcp ! --tcp-flags FIN,SYN,RST,ACK SYN -m state --state NEW -j DROP -A INPUT -s 192.168.0.0/24 -i eth1 -j INPUT_ALLOW -A INPUT -s 192.168.100.0/24 -i eth1 -j INPUT_ALLOW -A INPUT -p udp -m udp --sport 53 -j INPUT_ALLOW -A INPUT -p udp -m udp --dport 53 -j INPUT_ALLOW -A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j INPUT_ALLOW -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j INPUT_ALLOW -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j STEALTH_SCAN -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j STEALTH_SCAN -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j STEALTH_SCAN -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j STEALTH_SCAN -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK,URG -j STEALTH_SCAN -A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j STEALTH_SCAN -A INPUT -p tcp -m tcp --tcp-flags FIN,ACK FIN -j STEALTH_SCAN -A INPUT -p tcp -m tcp --tcp-flags PSH,ACK PSH -j STEALTH_SCAN -A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG -j STEALTH_SCAN -A INPUT -p icmp -m icmp --icmp-type 8 -j PING_OF_DEATH -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A INPUT ! -s 192.168.0.0/24 -p tcp -m tcp --dport 2222 --tcp-flags FIN,SYN,RST,ACK SYN -m recent --set --name SSH_ATTACK --rsource -A INPUT ! -s 192.168.0.0/24 -p tcp -m tcp --dport 2222 --tcp-flags FIN,SYN,RST,ACK SYN -m recent --rcheck --seconds 60 --hitcount 3 --name SSH_ATTACK --rsource -j LOG --log-prefix "iptables : SSH_ATTACK " -A INPUT ! -s 192.168.0.0/24 -p tcp -m tcp --dport 2222 --tcp-flags FIN,SYN,RST,ACK SYN -m recent --rcheck --seconds 60 --hitcount 3 --name SSH_ATTACK --rsource -j DROP -A INPUT ! -s 192.168.0.0/24 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m recent --set --name SSH_ATTACK --rsource -A INPUT ! -s 192.168.0.0/24 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m recent --rcheck --seconds 60 --hitcount 3 --name SSH_ATTACK --rsource -j LOG --log-prefix "iptables : SSH_ATTACK " -A INPUT ! -s 192.168.0.0/24 -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m recent --rcheck --seconds 60 --hitcount 3 --name SSH_ATTACK --rsource -j DROP -A FORWARD -s 192.168.0.0/16 -p tcp -m state --state NEW -m tcp --dport 22 -j FORWARD_ALLOW -A FORWARD -s 192.168.0.0/16 -d 10.111.100.10/32 -p tcp -m tcp --dport 80 -j SYN_CHECK -A FORWARD -s 192.168.0.200/32 -d 10.111.100.10/32 -p tcp -m state --state NEW -m tcp --dport 80 -j FORWARD_ALLOW -A FORWARD ! -s 192.168.0.200/32 -d 10.111.100.10/32 -p tcp -m state --state NEW -m tcp --dport 80 -j FORWARD_ALLOW -A FORWARD -s 192.168.0.0/16 -d 10.111.100.10/32 -p tcp -m state --state NEW -m tcp --dport 22 -j FORWARD_ALLOW -A FORWARD -d 10.111.100.10/32 -p tcp -m tcp --dport 443 -j FORWARD_ALLOW -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT -A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT -A OUTPUT -p tcp -m tcp --sport 2222 -j ACCEPT -A OUTPUT -p icmp -m icmp --icmp-type 0 -j ACCEPT -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT -A OUTPUT -o eth0 -j ACCEPT -A OUTPUT -o eth1 -j ACCEPT -A FORWARD_ALLOW -j LOG --log-prefix "iptables : FORWARD_ALLOW " -A FORWARD_ALLOW -j ACCEPT -A INPUT_ALLOW -j LOG --log-prefix "iptables : INPUT_ALLOW " -A INPUT_ALLOW -j ACCEPT -A PING_OF_DEATH -p icmp -m icmp --icmp-type 8 -m hashlimit --hashlimit-upto 1/sec --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name t_PING_OF_DEATH --hashlimit-htable-expire 250000 -j RETURN -A PING_OF_DEATH -j LOG --log-prefix "iptables : PING_OF_DEATH " -A PING_OF_DEATH -j DROP -A STEALTH_SCAN -j LOG --log-prefix "iptables : STEALTH_SCAN " -A STEALTH_SCAN -j DROP -A SYN_CHECK -p tcp -m tcp -m state --state RELATED,ESTABLISHED -j ACCEPT -A SYN_CHECK -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m recent --rcheck --seconds 20 --name SYN_ATTACK --rsource -j REJECT --reject-with icmp-port-unreachable -A SYN_CHECK -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m recent --rcheck --seconds 15 --hitcount 5 --name SYN_sorce --rsource -j SYN_FLOOD -A SYN_CHECK -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m recent --set --name SYN_sorce --rsource -A SYN_CHECK -p tcp -m tcp -j RETURN -A SYN_FLOOD -m recent --set --name SYN_ATTACK --rsource -j LOG --log-prefix "iptables : SYN_FLOOD " -A SYN_FLOOD -j REJECT --reject-with icmp-port-unreachable COMMIT # Completed on Thu Dec 5 10:38:09 2019 # Generated by iptables-save v1.4.7 on Thu Dec 5 10:38:09 2019 *nat :PREROUTING ACCEPT [5:300] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A PREROUTING -s 192.168.0.100/32 -i eth0 -p tcp -m tcp --dport 2222 -j DNAT --to-destination 10.111.10.10:22 -A PREROUTING -s 192.168.0.100/32 -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.111.10.10:80 -A POSTROUTING -s 10.111.100.10/32 -o eth0 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.0.100 -A POSTROUTING -s 10.111.100.10/32 -o eth0 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.0.100 -A POSTROUTING -s 10.111.100.10/32 -o eth0 -p tcp -m tcp --dport 53 -j SNAT --to-source 192.168.0.100 -A POSTROUTING -s 10.111.100.10/32 -o eth0 -p udp -m udp --dport 53 -j SNAT --to-source 192.168.0.100 COMMIT # Completed on Thu Dec 5 10:38:09 2019 ```