![NAT/マスカレードによる UFW ルール](https://rvso.com/image/912806/NAT%2F%E3%83%9E%E3%82%B9%E3%82%AB%E3%83%AC%E3%83%BC%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%20UFW%20%E3%83%AB%E3%83%BC%E3%83%AB.png)
私は、プライベート ネットワーク上のコンピューターをインターネット上で接続できるものに制限することで、Ubuntu を一種のルーターとして使用しようとしています。
Ubuntu ボックスには 2 つの NIC があり、1 つはインターネットに接続しており (enp0s3)、もう 1 つはこの単一のプライベート PC に接続しています (enp0s8)。
まず、プライベート ボックスから Ubuntu 経由で DNS を許可できるかどうかを確認したいと思いました。いくつかの指示に従って、次のような「ルート許可」ルールを追加しました。
ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), deny (outgoing), allow (routed)
New profiles: skip
To Action From
-- ------ ----
8.8.8.8 on enp0s3 ALLOW FWD Anywhere on enp0s8
8.8.4.4 on enp0s3 ALLOW FWD Anywhere on enp0s8
10.0.1.5 on enp0s8 ALLOW FWD Anywhere on enp0s3
10.0.1.5 は私のプライベート PC です。Wireshark を使用すると、enp0s3 と enp0s8 の両方で DNS 要求が行われていることがわかりますが、enp0s3 の要求には応答がありません。
そこで、もう少し調べてみたところ、NAT とマスカレードを設定する必要があることがわかったので、rules.before に次の内容を追加しました。
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic through eth0 - Change to match you out-interface
-A POSTROUTING -s 10.0.1.0/24 -o enp0s3 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't
# be processed
COMMIT
これはうまくいきましたが、うまくいきすぎました。これですべてのトラフィックが出て私のプライベート PC に戻り、デフォルトで送信が拒否され、その他の UFW ルールはすべてバイパスされるようです。
私の質問は簡単です。プライベート PC が、提供されている NAT などの Ubuntu 経由で接続できるようにしたいのですが、最初に ufw コマンドラインを使用して構成したと思われる送信制限を適用したいのです。NAT が機能した後、UFW ルールを何らかの方法で適用できる方法はありますか?
ティア。
完全な before.rules ファイルは次のとおりです。変更したのは NAT テーブル ルールのみです。
#
# rules.before
#
# Rules that should be run before the ufw command line added rules. Custom
# rules should be added to one of these chains:
# ufw-before-input
# ufw-before-output
# ufw-before-forward
#
# NAT table rules
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic through eth0 - Change to match you out-interface
-A POSTROUTING -s 10.0.1.0/24 -o enp0s3 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't
# be processed
COMMIT
# Don't delete these required lines, otherwise there will be errors
*filter
:ufw-before-input - [0:0]
:ufw-before-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-not-local - [0:0]
# End required lines
# allow all on loopback
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-output -o lo -j ACCEPT
# quickly process packets for which we already have a connection
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# drop INVALID packets (logs these in loglevel medium and higher)
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP
# ok icmp codes for INPUT
-A ufw-before-input -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-input -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-input -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-input -p icmp --icmp-type echo-request -j ACCEPT
# ok icmp code for FORWARD
-A ufw-before-forward -p icmp --icmp-type destination-unreachable -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type time-exceeded -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type parameter-problem -j ACCEPT
-A ufw-before-forward -p icmp --icmp-type echo-request -j ACCEPT
# allow dhcp client to work
-A ufw-before-input -p udp --sport 67 --dport 68 -j ACCEPT
#
# ufw-not-local
#
-A ufw-before-input -j ufw-not-local
# if LOCAL, RETURN
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN
# if MULTICAST, RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN
# if BROADCAST, RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN
# all other non-local packets are dropped
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP
# allow MULTICAST mDNS for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 224.0.0.251 --dport 5353 -j ACCEPT
# allow MULTICAST UPnP for service discovery (be sure the MULTICAST line above
# is uncommented)
-A ufw-before-input -p udp -d 239.255.255.250 --dport 1900 -j ACCEPT
# don't delete the 'COMMIT' line or these rules won't be processed
COMMIT
答え1
ルーティング/転送ルールは完全に分離通常のファイアウォールルールに変更しました。NAT関連のものをafter.rulesに移動し、「ルーティング」トラフィックのデフォルトルールを「拒否」に変更しました。POSTROUTINGが発生するようです。後デフォルトの拒否ルールが適用されます。したがって、デフォルト ルールによって何かが拒否された場合、NAT ルーティングは行われません。もちろん、ユーザー ルール (「ufw route allow ...」など) を追加して、デフォルトの拒否が適用される前にトラフィックを許可することもできます。その場合、トラフィックは期待どおりにルーティングされます。