# 繋がらなくなりました
## 問題
あなたはサーバホスティング会社に勤めているシステムエンジニアです。
顧客より、下記のとおり依頼をいただきました。
```
前任者退職に伴って確認しようと思いサーバ内を確認していたところ、
間違えて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
```