インターネット公開サーバのセキュリティ設定、自宅サーバ：firewalld(WHITE-LIST方式)

インターネット公開の"自宅サーバ"のセキュリティ設定方針をまとめる。
こちらも参考に
[VPSサーバ](https://qiita.com/harasakih/items/cf5fdcfb23af480bc66b)
[サービスで制限](https://qiita.com/harasakih/items/01f4c404236694608a03)

基本的な考え方はここ [VPSサーバ](https://qiita.com/harasakih/items/cf5fdcfb23af480bc66b) と同じであるが、次のことが異なる

- IP-BLOCK-LISTでの制限はcore-routerで実施している
- 国内アドレスのみをWHITE-LISTとして許可している

# plan

| ZONE | TARGET | アクセス元と動作 | IPLIST | INTERFACE |
| :--  | :-- | :-- | :-- | :-- |
| domestic | default | アドレス指定で、特定サービスを許可 | ipset | (none) |
| trusted | ACCEPT | アドレス指定で、全許可<br>openvpn経由のアドレスを指定 | 直接指定 | tun+ |
| public | default | if & サービスを限定し許可 | 指定しない | eth0 |


# zoneごとの設定
## default動作:zone=domestic
ipsetを利用し、送信元IPアドレスをIP-WHITE-LISTをファイル化する

### ipsetのinstall
```bash:
yum install -y ipset
```

### firewalldの設定
ipset=DOMESTICを作成し、DOMESTICにIPアドレスリスト(whitelist.txt)を割り当てる

```bash:
firewall-cmd --permanent --new-ipset=DOMESTIC --type=hash:net
firewall-cmd --permanent --ipset=DOMESTIC --add-entries-from-file=/root/IPSET/whitelist.txt

# 設定内容を確認
firewall-cmd --permanent --info-ipset=DOMESTIC
```
zone=domesticを作成し、ipset:DOMESTICを割り当てる

```bash:
# ipsetの割当て
firewall-cmd --permanent --new-zone=domestic
firewall-cmd --permanent --zone=domestic --add-source=ipset:DOMESTIC
# サービス、ポートを追加
firewall-cmd --permanent --zone=domestic --add-service=ssh-alt 
firewall-cmd --permanent --zone=domestic --add-service=openvpn
firewall-cmd --permanent --zone=domestic --add-service=nginx
firewall-cmd --permanent --zone=domestic --add-port=2222/tcp
firewall-cmd --reload
# 設定内容の確認
firewall-cmd --list-all-zones
firewall-cmd --get-active-zones
```

### 保守作業
やり直し：ゾーンから

```bash:
firewall-cmd --permanent --delete-zone=domestic  
firewall-cmd --permanent --delete-ipset=DOMESTIC 
firewall-cmd --reload
firewall-cmd --get-active-zones
```

やり直し：IPSET

```bash:
firewall-cmd --permanent --zone=domestic --delete-ipset=DOMESTIC
firewall-cmd --permanent --zone=domestic --new-ipset=DOMESTIC --type=hash:net
```

ipsetファイルのリフレッシュ

```bash:
firewall-cmd --permanent --info-ipset=DOMESTIC | wc 
firewall-cmd --permanent --zone=domestic --ipset=DOMESTIC --add-entries-from-file=/root/IPSET/whitelist.txt
firewall-cmd --reload
firewall-cmd --permanent --info-ipset=DOMESTIC | wc 
```

## ipsetの最新化
ここからダウンロードして、```wget http://nami.jp/ipv4bycc/cidr.txt.gz```先頭が「JP」の行を編集する。


```bash:ipset_mkwhite.sh 
#!/bin/bash

IPSET_DATA=/root/IPSET/whitelist.txt

# 国別コードリストをダウンロード
cd /root/IPSET
if [ -s cidr.txt ]; then
    mv cidr.txt cidr.txt.old
fi
	  
wget http://nami.jp/ipv4bycc/cidr.txt.gz
gunzip cidr.txt.gz

TEMP=`mktemp /tmp/ipset.XXXXXX`

# ホワイトリストセットを作成

# ホワイトリストセットに日本のIPアドレスを登録
echo "192.168.0.0/16" > $TEMP
echo "10.8.0.0/24" >> $TEMP
echo "10.8.1.0/24" >> $TEMP
sed -n 's/^JP\t//p' /root/IPSET/cidr.txt >> $TEMP
#
rm $IPSET_DATA
mv $TEMP $IPSET_DATA
#
echo "...."
echo "$IPSET_DATA を最新化しました"
echo "次のコマンドで、firewalldのipsetを最新化すること"
echo "...."
echo "firewall-cmd --permanent --info-ipset=DOMESTIC | wc "
echo "firewall-cmd --permanent --zone=domestic --ipset=DOMESTIC --add-entries-from-file=/root/IPSET/whitelist.txt "
echo "firewall-cmd --reload ; firewall-cmd --permanent --info-ipset=DOMESTIC | wc "
```

ipsetファイルのサンプル

```bash:/root/IPSET/whitelist.txt
192.168.0.0/16
10.8.0.0/24
10.8.1.0/24
1.0.16.0/20
1.0.64.0/18
1.1.64.0/18
1.5.0.0/16
1.21.0.0/16
1.33.0.0/16
1.66.0.0/15
```

## ACCEPT動作:zone=trusted、openvpn@server向け
同一サーバでopenvpnサーバを動作させている。openvpn経由のアクセスにはLAN内部のアクセスを許可する。

### firewalldの設定

```bash:
firewall-cmd --permanent --zone=trusted --add-interface=tun+
firewall-cmd --permanent --zone=trusted --add-source=10.8.0.0/24
firewall-cmd --reload 
firewall-cmd --list-all-zones
firewall-cmd --get-active-zones 
```