インターネット共有
関連記事
この記事ではあるマシンと他のマシンでインターネット接続を共有する方法を解説します。
目次
要件
サーバーとして機能するマシンにはネットワークデバイスを別に設定する必要があります。このネットワークデバイスにはインターネットアクセスにアクセスするマシンへの正常な w:データリンク層 が必要です:
- 複数のマシンにインターネットを共有するために スイッチ がデータリンク層を提供できます
- ワイヤレスデバイスも同様に複数のマシンへ接続を共有できます。ソフトウェアアクセスポイント を参照して下さい。
- 一つのマシンで共有する場合は、クロスオーバーケーブル で十分です。2台のコンピュータのイーサネットカードが MDI-X 機能を持つ場合、クロスオーバーケーブルは不要で通常のイーサネットケーブルが使えます。rootで
ethtool interface | grep MDI
を実行すると判別し易くなります。
設定
このセクションでは、クライアントのコンピュータに接続するネットワークデバイスの名前は net0、インターネットに接続するネットワークデバイスの名前は internet0 としています。
サーバーコンピュータには、最後の #クライアント PC に IP アドレスを割り当てる ステップを除くすべての設定がされています。
固定 IP アドレス
サーバーコンピュータ上で、他のマシンに接続したインターフェイスに固定 IPv4 アドレスを割り当てます。他のインターフェイスのネットマスクが /24 より大きい場合を除き、アドレスの頭3バイトは両インターフェイスのアドレスの頭3バイトと違っている必要があります。
# ip link set up dev net0 # ip addr add 192.168.123.100/24 dev net0 # 任意のアドレス
起動時に固定 ip を割り当てたい場合、ネットワークマネージャ を使います。
パケット転送の有効化
現在のパケット転送の設定をチェック:
# sysctl -a | grep forward
インターフェース毎に別々の IPv4/IPv6 オプションがあるように、デフォルト毎、インターフェース毎に転送を制御するオプションが存在することに注意して下さい。
次のコマンドを実行して一時的にパケット転送を有効化:
# sysctl net.ipv4.ip_forward=1
再起動した後も設定が残るようにするには /etc/sysctl.d/30-ipforward.conf
を編集:
/etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1 net.ipv6.conf.default.forwarding=1 net.ipv6.conf.all.forwarding=1
設定した後は、再起動してから転送が有効になっているか確認するのを推奨します。
NAT の有効化
iptables を使う
公式リポジトリから iptables パッケージをインストールしてください。iptables を使って NAT を有効化:
# iptables -t nat -A POSTROUTING -o internet0 -j MASQUERADE # iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # iptables -A FORWARD -i net0 -o internet0 -j ACCEPT
詳細は iptables の記事を読んで下さい (特に、ルールの保存と、起動時に自動的にルールを適用させる方法の項)。iptables についてはシンプルなステートフルファイアウォールのページでも詳しい解説をしています。
nftables を使う
nftables を インストール して下さい。nftables で NAT を有効にするには、新規/既存のテーブルに prerouting と postrouting チェインを作成する必要があります(両方のチェインが空の場合でも必要):
# nft add table ip nat # nft add chain ip nat prerouting { type nat hook prerouting priority 0 \; } # nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
その後、internet0
用に net0
アドレスをマスカレードする必要があります:
# nft add rule nat postrouting oifname internet0 masquerade
転送に対しさらにいくつかの firewall による制限を追加できます ( Nftables#シンプルな IPv4/IPv6 ファイアウォール で設定されているような、フィルターテーブルが存在することが前提です):
# nft add chain inet filter forward { type filter hook forward priority 0 \; policy drop} # nft add rule filter forward ct state related,established accept # nft add rule filter forward iifname net0 oifname internet0 accept
nftables における NAT の詳細は nftables Wiki を見て下さい。変更を永続化するには nftables に従って下さい。
クライアント PC に IP アドレスを割り当てる
定期的に、複数のマシンで、設定したマシンのインターネット共有を使う場合、dhcpd や dnsmasq のような dhcp サーバーをインストールすると良いでしょう。その後、各クライアント PC で DHCP クライアント(例えば dhcpcd)を設定してください。
DHCP サーバでは UDP ポート 67 への着信を許可する必要があります。DNS リクエストのために UDP/TCP ポート 53 への着信も許可する必要があります。
# iptables -I INPUT -p udp --dport 67 -i net0 -j ACCEPT # iptables -I INPUT -p udp --dport 53 -s 192.168.123.0/24 -j ACCEPT # iptables -I INPUT -p tcp --dport 53 -s 192.168.123.0/24 -j ACCEPT
特に定期的に使うというわけではないのであれば、手動でクライアントに IP を追加する方法もあります。
手動で IP を追加
DHCP を使う代わりに、クライアント PC で、IP アドレスとデフォルトルートを追加:
# ip addr add 192.168.123.201/24 dev eth0 # 任意のアドレス、最初の3ブロックは前述のアドレスと一致している必要があります # ip link set up dev eth0 # ip route add default via 192.168.123.100 dev eth0 # 最初と同じアドレス
全てのクライアントで DNS サーバーを設定してください。詳しくは resolv.conf を参照。
これでクライアント PC はインターネットに接続されるはずです。
トラブルシューティング
PC に接続することはできながら、データを送信することはできない場合 (例えば、クライアント PC がサーバー PC に DHCP リクエストを送った場合、サーバー PC はリクエストを受け取ってクライアントに IP を返すが、クライアントがそれを受け取れずに、タイムアウトしてしまう等)、干渉する Iptables ルールが設定されていないか確認してください。