ご覧のとおり、機能している構成と機能していない構成の唯一の違いは-m conntrack --ctstate NEW,ESTABLISHED,RELATED
です。 -m conntrack --ctstate NEW,ESTABLISHED
を使用すると、それも機能しません...しかし、なぜですか?!
いくつかのテストの後、conntrack
を使用するすべてのルールが機能しないことに気付きました...iptables
を使用する場合にのみSSHがconntrack
によってブロックされる理由を説明できますか?
ありがとう:-)
#!/ bin/bash SERVER_IP = "XXXX" iptables -F iptables -X #デフォルトのフィルターポリシーの設定 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP #以前の接続を許可する iptables -A INPUT -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT iptables -A OUTPUT -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT #ループバックで無制限のトラフィックを許可する iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT #着信sshのみを許可 iptables -A INPUT -p tcp -s 0/0 -d $ {SERVER_IP} --dport 22 -j ACCEPT iptables -A INPUT -p tcp -s 0/0 -d $ {SERVER_IP} --dport 22 -j LOG --log-prefix "[ACCEPT INPUT] [SSH]" #makeこのボックスから何も出入りしないことを確認してください iptables -A INPUT -j LOG --log-prefix "[DROP INPUT] [DEFAULT]" iptables -A INPUT -j DROP
#!/ bin/bash SERVER_IP = "XXXX" iptables -F iptables -X #デフォルトのフィルターポリシーの設定 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP #以前の接続を許可する iptables -A INPUT -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT iptables -A OUTPUT -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT #ループバックで無制限のトラフィックを許可する iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT #着信sshのみを許可 iptables -A INPUT -p tcp -s 0/0 -d $ {SERVER_IP} --dport 22 -m conntrack --ctstate NEW、ESTABLISHED、RELATED -j ACCEPT iptables -A INPUT -p tcp -s 0/0 -d $ {SERVER_IP} --dport 22 -m conntrack --ctstate NEW、ESTABLISHED、RELATED -j LOG --log-prefix "[ACCEPT INPUT ] [SSH] " #このボックスから何も出入りしないことを確認してください iptables -A INPUT -j LOG --log-prefix "[DROP INPUT] [DEFAULT]" iptables -A INPUT -j DROP
[編集]
ログファイルで私はこのようなものを見ることができるので:
[DROP][INPUT] IN=eth0 OUT= MAC=0c:c4:...:00 SRC=X.X.X.X DST=X.X.X.X LEN=67 TOS=0x08 PREC=0x20 TTL=41 ID=39550 DF PROTO=TCP SPT=51093 DPT=22 WINDOW=229 RES=0x00 ACK PSH URGP
[DROP][INPUT]
は、私のiptables構成ファイルの最後のルールです。
今回は、なぜこれが機能しないのかわからないまま、それを機能させる方法を知っています。 iptables
サービスを再起動すると、スクリプトが機能します:systemctl restart iptables
。
この単純なスクリプトに取り組む前に、私は別のスクリプトをもっと長く実装しようとしていました。 PREROUTINGや他の習慣のような他のチェーンに新しいルールを適用します。このスクリプトは、おそらくテーブルを最大限に埋めることによって、iptables
がcstate
またはconntrack
での作業を停止するように強制したに違いありませんか?
ご回答ありがとうございます!firewalld
を削除してiptables
を優先したところ、いくつかの依存関係も削除したようです。削除してからiptablesを再度インストールすると、構成が機能的になりました。
[編集]実際、これはまだ機能していません:-(
ログで、「SYN」と「ACKSYN」のパケットがiptables
によってドロップされていることに気付きました。
Dec 17 08:03:38 loki kernel:[DROP] [INPUT] [DEFAULT] IN = eth0 OUT = MAC = 0c:c4:...:00 SRC = myIP DST = serverIP LEN = 52 TOS = 0x00 PREC = 0x00 TTL = 120 ID = 12527 DF PROTO = TCP SPT = 51942 DPT = 22 WINDOW = 64240 RES = 0x00 SYN URGP = 0 12月17日08:03:38lokiカーネル:[DROP] [OUTPUT] [DEFAULT] IN = OUT = eth0 SRC = serverIP DST = myIP LEN = 52 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 0 DF PROTO = TCP SPT = 22 DPT = 51942 WINDOW = 29200 RES = 0x00 ACK SYN URGP = 0 Dec 17 08:03:38 loki kernel:[INPUT] [DROP] [NOT SYN] IN = eth0 OUT = MAC = 0c:c4:...:00 SRC = myIP DST = serverIP LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 120 ID = 12528 DF PROTO = TCP SPT = 51942 DPT = 22 WINDOW = 256 RES = 0x00 ACK URGP = 0 Dec 17 08:03:38 loki kernel:[ACCEPT] [INPUT] [SSH] IN = eth0 OUT = MAC = 0c:c4 :...:00 SRC = myIP DST = serverIP LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 120 ID = 12528 DF PROTO = TCP SPT = 51942 DPT = 22 WINDOW = 256 RES = 0x00 ACK URGP = 0 Dec 17 08:03:38 loki sshd [5074]:serverIPポート22 Dec 17 08:0のmyIPポート51942からの接続3:39 loki sshd [5074]:myIPポートからmyUSERのパスワードを受け入れた51942 ssh2 Dec 17 08:03:39 loki systemd-logind:ユーザーmyUSERの新しいセッション307。 Dec 17 08 :03:39 loki systemd:ユーザーmyUSERのセッション307を開始しました。
私のルールでわかるように、サーバーへの接続を維持するために、テストのために実際にパケをドロップしませんでした。ここで使用されるスクリプトは次のとおりです。
#!/ bin/bash # #========= #すべてリセット #========= # iptables = "iptables" ip6tables = "ip6tables" #ハードリセット $ iptables -P INPUT ACCEPT $ iptables -P FORWARD ACCEPT $ iptables -P OUTPUT ACCEPT $ iptables -F $ iptables -X #$ iptables -t nat -F #$ iptables -t mangle -F ##ドロップブロードキャスト(ログなし) $ iptables -A INPUT -m pkttype--pkt-typeブロードキャスト-jDROP $ iptables -A FORWARD -m pkttype--pkt-タイプブロードキャスト-jDROP $ iptables -A INPUT -d 255.255.255.255 -j DROP $ iptables -A FORWARD -d 255.255.255.255 -j DROP #接続を開いたままにします #RELATEDを使用しませんか? https://Gist.github.com/azlux/6a70bd38bb7c525ab26efe7e3a7ea8ac $iptables -A INPUT -m conntrack --ctstate ESTABLISHED、RELATED -j ACCEPT $ iptables -A OUTPUT -mconntrack- ctstate ESTABLISHED、RELATED -j ACCEPT # #=============== #localhost [.____を許可する。]#=============== # $ iptables -A INPUT -i lo -j ACCEPT $ iptables -A OUTPUT -o lo -j ACCEPT # #==== #IPv6 #==== # $ ip6tables -P INPUT DROP $ ip6tables -A OUTPUT -j REJECT $ ip6tables -P FORWARD DROP # #=========== #ポートを許可する #=========== # ## NEW NOT SYNC $ iptables -A INPUT -p tcp! --syn -m conntrack --ctstate NEW -j LOG --log-prefix "[INPUT] [DROP] [NOT SYN]" ## DNS(ログなし) $ iptables -A OUTPUT -p udp -s 0/0 --dport 53 -m conntrack --ctstate NEW、RELATED、ESTABLISHED -j ACCEPT $ iptables -A INPUT -p udp --sport 53 -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT ## SSH $ iptables -A INPUT -p tcp -s 0/0- dport 22 -m conntrack --ctstate NEW、RELATED、ESTABLISHED -j LOG --log-prefix "[ACCEPT] [INPUT] [SSH]" $ iptables -A INPUT -p tcp -s 0/0 --dport 22 -m conntrack --ctstate NEW、RELATED、ESTABLISHED -j ACCEPT $ iptables -A OUTPUT -p tcp --sport 22 -m conntrack --ctstate RELATED、ESTABLISHED -j ACCEPT # #================= #DROPパケットをログに記録 #==== ============= # $ iptables -A INPUT -j LOG --log-prefix = "[DROP] [INPUT] [DEFAULT]" $ iptables -A FORWARD -j LOG --log-prefix = "[DROP] [FORWARD] [DEFAU LT] " $ iptables -A OUTPUT -j LOG --log-prefix =" [DROP] [OUTPUT] [DEFAULT] " exit 0