import { AddRegular, CheckmarkRegular, DeleteRegular, GlobeRegular, WarningRegular, } from "@fluentui/react-icons"; import type { SecuritySettings } from "../../types"; import { useI18n } from "../../lib/i18n"; import { Button } from "../ui/Button"; import { Input } from "../ui/Input"; import { Switch } from "../ui/Switch"; import { CardDecor, CardIcon, CardTitle } from "./Cards"; import { SegmentedTabs } from "./controls"; export interface NetworkAccessForm { mode: SecuritySettings["mode"]; allowedCidrs: string[]; trustProxyHeaders: boolean; } const LABEL_CLASS = "text-xs font-bold text-gray-500 uppercase tracking-wider"; // 网络访问控制:默认仅放行内网网段,可切换对公网开放,并支持额外放行网段。 export function NetworkAccessCard({ value, clientIp, clientAllowed, loading, saving, onChange, onSave, }: { value: NetworkAccessForm; clientIp: string; clientAllowed: boolean; loading: boolean; saving: boolean; onChange: (patch: Partial) => void; onSave: () => void; }) { const { t } = useI18n(); const cidrs = value.allowedCidrs; const setCidrs = (next: string[]) => onChange({ allowedCidrs: next }); return (
{loading ? (
{t("正在加载访问策略…")}
) : (
onChange({ mode: mode as NetworkAccessForm["mode"] })} />

{value.mode === "public" ? t("允许任意来源 IP 访问(含公网)。仅在已设置强密码且网络环境可信时使用。") : t("默认仅允许内网网段访问:10/8、172.16/12、192.168/16、169.254/16、127/8、::1、fe80::/10、fc00::/7。")}

{value.mode === "public" ? (
{t("对公网开放会显著扩大攻击面,请务必使用强密码并尽快切回内网优先。")}
) : null}

{t("在内置内网网段之外始终放行的 CIDR 或单个 IP;也允许通知推送访问这些目标地址(例如 198.18.0.0/15)。")}

{cidrs.length === 0 ? (
{t("暂无额外放行网段")}
) : null} {cidrs.map((cidr, index) => (
setCidrs(cidrs.map((item, i) => (i === index ? event.target.value : item))) } placeholder="192.168.0.0/16" className="flex-1 font-mono" />
))}
{t("信任代理请求头")}

{t("仅在系统位于可信反向代理之后时开启,按 X-Forwarded-For 判定来源;否则客户端可伪造该头绕过内网限制。")}

onChange({ trustProxyHeaders })} ariaLabel={t("信任代理请求头")} />
{!clientAllowed && (
{clientIp || "--"} {t("当前连接将被拒绝,保存后可能无法继续访问")}
)}
)}
); }