Azure ਵਿੱਚ ਤਿੰਨ ਵੱਖਰੀਆਂ ਚੀਜ਼ਾਂ ਨੂੰ ਗੇਟਵੇ ਪਤਾ ਕਿਹਾ ਜਾਂਦਾ ਹੈ। ਨਿੱਜੀ ਪਤਾ GatewaySubnet ਤੋਂ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ। ਜਨਤਕ ਪਤਾ ਇੱਕ ਵੱਖਰਾ ਜਨਤਕ IP ਸਰੋਤ ਹੈ ਜਿਸ ਵੱਲ ਗੇਟਵੇ ਦੀ IP ਸੰਰਚਨਾ ਇਸ਼ਾਰਾ ਕਰਦੀ ਹੈ। ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਅਤੇ ਕਲਾਊਡ ਵਾਤਾਵਰਣ ਉਹ ਸੰਦਰਭ ਹੈ ਜਿਸ ਨਾਲ ਤੁਹਾਡਾ ਸ਼ੈੱਲ ਇੱਕ ਲੱਭਦਾ ਹੈ। ਇੱਕ ਬਦਲੋ ਅਤੇ ਬਾਕੀ ਦੋ ਆਪਣੀ ਥਾਂ ਰਹਿੰਦੀਆਂ ਹਨ, ਇਸੇ ਲਈ ਪਤਿਆਂ ਦਾ ਕੰਮ ਅਕਸਰ ਅੱਧ ਵਿੱਚ ਰੁਕ ਜਾਂਦਾ ਹੈ।

ਮੈਂ ਇਹ ਬਦਲਾਅ ਚਾਰ ਪੜਾਵਾਂ ਵਿੱਚ ਕਰਦਾ ਹਾਂ: ਚੀਜ਼ਾਂ ਦੀ ਸੂਚੀ, ਫੈਸਲਾ ਕਿ ਜਨਤਕ IP ਮੌਜੂਦਾ ਗੇਟਵੇ ਉੱਤੇ ਜਾਵੇਗਾ ਜਾਂ ਗੇਟਵੇ ਦੁਬਾਰਾ ਬਣੇਗਾ, ਪੁਰਾਣਾ ਪਤਾ ਹੱਥ ਵਿੱਚ ਹੁੰਦਿਆਂ ਬਦਲਾਅ ਲਾਗੂ ਕਰਨਾ, ਅਤੇ ਫਿਰ ਕੁਝ ਵੀ ਮਿਟਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਦੋਵੇਂ ਸਿਰਿਆਂ ਤੋਂ ਹਰ ਟਨਲ ਦੀ ਜਾਂਚ। ਲੋਕ ਜਿਹੜਾ ਪੜਾਅ ਛੱਡਦੇ ਹਨ ਉਹ ਸੂਚੀ ਹੈ।

ਤਿੰਨਾਂ ਵਿੱਚੋਂ ਕਿਹੜੀ ਚੀਜ਼ ਤੁਸੀਂ ਅਸਲ ਵਿੱਚ ਬਦਲ ਰਹੇ ਹੋ

ਪੋਰਟਲ ਖੋਲ੍ਹਣ ਤੋਂ ਪਹਿਲਾਂ ਚੀਜ਼ ਦਾ ਨਾਮ ਲਓ। VPN ਗੇਟਵੇ ਆਪਣਾ ਨਿੱਜੀ ਪਤਾ ਉਸ ਸਬਨੈੱਟ ਤੋਂ ਲੈਂਦਾ ਹੈ ਜਿਸਦਾ ਨਾਮ ਠੀਕ GatewaySubnet ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ Azure ਉਹ ਉਸੇ ਪ੍ਰੀਫਿਕਸ ਤੋਂ ਦਿੰਦਾ ਹੈ; ਇਸਨੂੰ ਪਿੰਨ ਕਰਨ ਲਈ ਕੋਈ ਆਮ ਖੇਤਰ ਨਹੀਂ। ਪਤਾ ਸਿਰਫ਼ ਇਸ ਲਈ ਸਥਿਰ ਦਿਸਦਾ ਹੈ ਕਿਉਂਕਿ ਸਬਨੈੱਟ ਸਥਿਰ ਹੈ। ਸਬਨੈੱਟ ਨੂੰ ਦੁਬਾਰਾ ਪਤਾ ਦਿਓ ਜਾਂ ਗੇਟਵੇ ਦੁਬਾਰਾ ਬਣਾਓ, ਇਹ ਉਨ੍ਹਾਂ ਨਾਲ ਚਲਾ ਜਾਂਦਾ ਹੈ।

ਜਨਤਕ ਪਤਾ ਸੋਧਣਯੋਗ ਹੈ, ਪਰ ਸੋਧ ਕਾਨੂੰਨੀ ਹੈ ਜਾਂ ਨਹੀਂ ਇਹ SKU ਨਿਯਮ ਤੈਅ ਕਰਦੇ ਹਨ। Basic ਗੇਟਵੇ Basic ਗਤੀਸ਼ੀਲ ਜਨਤਕ IP ਨਾਲ ਜੁੜਦਾ ਹੈ, VpnGw SKU ਨੂੰ Standard ਸਥਿਰ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਜ਼ੋਨ-ਵਾਧੂ ਗੇਟਵੇ ਨੂੰ ਉਹੀ ਜ਼ੋਨ ਵਾਲਾ Standard ਜਨਤਕ IP ਚਾਹੀਦਾ ਹੈ। ਗਲਤ SKU ਟਨਲ ਡਿੱਗਣ ਤੋਂ ਪਹਿਲਾਂ ਰੱਦ ਹੁੰਦਾ ਹੈ।

ObjectWhere it livesWhat a change forces
Private addressGatewaySubnet prefix, assigned at deploymentSubnet resize or rebuild, then routes, NSGs and peer review
Public addressPublic IP resource referenced by the IP configurationGateway reprovision, peer and allowlist edits, new client profiles
Subscription contextYour PowerShell or CLI sessionNothing in Azure, and it clears most not-found errors

ਕੁਝ ਵੀ ਹਿੱਲਣ ਤੋਂ ਪਹਿਲਾਂ ਸੂਚੀ

ਪਹਿਲਾਂ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਸਾਬਤ ਕਰੋ, ਕਿਉਂਕਿ ਇਸ ਤੋਂ ਬਿਨਾਂ ਬਾਕੀ ਸੂਚੀ ਬੇਕਾਰ ਹੈ। ਗੇਟਵੇ, ਉਸਦੀ IP ਸੰਰਚਨਾ ਅਤੇ ਉਸ ਉੱਤੇ ਖ਼ਤਮ ਹੁੰਦੇ ਹਰ ਕਨੈਕਸ਼ਨ ਨੂੰ ਦਰਜ ਕਰੋ, ਅਤੇ ਨਤੀਜਾ ਬਦਲਾਅ ਰਿਕਾਰਡ ਦੇ ਕੋਲ ਰੱਖੋ।

Get-AzContext | Select-Object Subscription, Tenant, Environment
Get-AzVirtualNetworkGateway -ResourceGroupName rg-hub -Name gw-hub |
  Select-Object Name, Sku, EnableActiveActive, IpConfigurations
Get-AzVirtualNetworkGatewayConnection -ResourceGroupName rg-hub |
  Select-Object Name, ConnectionStatus, ConnectionType

ਸਰੋਤ ID ਨਾਵਾਂ ਤੋਂ ਵੱਧ ਮਹੱਤਵਪੂਰਨ ਹਨ। ਕਨੈਕਸ਼ਨ ਗੇਟਵੇ ਅਤੇ ਸਥਾਨਕ ਨੈੱਟਵਰਕ ਗੇਟਵੇ ਦੇ ਹਵਾਲੇ ਰੱਖਦਾ ਹੈ, ਅਤੇ ਉਹ ID ਉਨ੍ਹਾਂ ਸਕ੍ਰਿਪਟਾਂ, ਚੇਤਾਵਨੀਆਂ ਅਤੇ ਨੀਤੀ ਅਲਾਟਮੈਂਟਾਂ ਵਿੱਚ ਦਿਸਦੇ ਹਨ ਜਿਨ੍ਹਾਂ ਨੂੰ ਕੋਈ ਯਾਦ ਨਹੀਂ ਰੱਖਦਾ। Azure ਤੋਂ ਬਾਹਰ ਦੀ ਵੀ ਸੂਚੀ ਬਣਾਓ: ਪਤੇ ਵੱਲ ਜਾਣ ਵਾਲਾ DNS ਨਾਮ, ਸਾਥੀ ਦੀ ਇਜਾਜ਼ਤ ਸੂਚੀ, ਅਤੇ ਪੁਰਾਣਾ IP ਪਿੰਨ ਕਰਨ ਵਾਲਾ ਸ਼ਾਖਾ ਫਾਇਰਵਾਲ।

ਚੱਲ ਰਹੇ ਗੇਟਵੇ ਉੱਤੇ ਜਨਤਕ IP ਬਦਲਣਾ

ਪਹਿਲਾਂ ਬਦਲਵਾਂ ਪਤਾ ਉਸੇ ਖੇਤਰ ਵਿੱਚ ਅਤੇ ਗੇਟਵੇ ਨਾਲ ਮੇਲ ਖਾਂਦੇ ਜ਼ੋਨ ਸੈੱਟ ਨਾਲ ਬਣਾਓ, ਅਤੇ ਪੁਰਾਣਾ ਸਰੋਤ ਥਾਂ ਸਿਰ ਰਹਿਣ ਦਿਓ। ਫਿਰ IP ਸੰਰਚਨਾ ਦੁਬਾਰਾ ਬਣਾਓ ਅਤੇ ਇੱਕ ਹੀ ਕਾਲ ਵਿੱਚ ਅੱਪਡੇਟ ਭੇਜੋ। ਉਹ ਕਾਲ ਪੂਰਾ ਸੰਰਚਨਾ ਸੰਗ੍ਰਹਿ ਬਦਲ ਦਿੰਦੀ ਹੈ, ਇਸ ਲਈ ਸਰਗਰਮ-ਸਰਗਰਮ ਗੇਟਵੇ ਨੂੰ ਦੋਵੇਂ ਚਾਹੀਦੇ ਹਨ, ਨਹੀਂ ਤਾਂ ਇੱਕ ਟਨਲ ਰਹੇਗਾ ਅਤੇ ਦੂਜਾ ਜਾਵੇਗਾ।

$gw = Get-AzVirtualNetworkGateway -ResourceGroupName rg-hub -Name gw-hub
$pip = New-AzPublicIpAddress -Name pip-gw-hub-2 -ResourceGroupName rg-hub `
  -Location westeurope -AllocationMethod Static -Sku Standard
$conf = New-AzVirtualNetworkGatewayIpConfig -Name gwipconfig1 `
  -SubnetId $gw.IpConfigurations[0].Subnet.Id -PublicIpAddressId $pip.Id
Set-AzVirtualNetworkGateway -VirtualNetworkGateway $gw -IpConfigurations $conf

ਗੇਟਵੇ ਦੁਬਾਰਾ ਤਿਆਰ ਹੁੰਦਿਆਂ ਟਨਲ ਡਿੱਗਦੇ ਹਨ। ਦੂਰ ਦੇ ਪਾਸੇ ਨੂੰ ਸਮਾਂ-ਸਾਰਣੀ ਚਾਹੀਦੀ ਹੈ: ਸਾਥੀ ਫਾਇਰਵਾਲ ਪੁਰਾਣਾ ਪਤਾ ਦਿੰਦਾ ਰਹਿੰਦਾ ਹੈ ਜਦ ਤੱਕ ਕੋਈ ਸੋਧ ਨਾ ਕਰੇ, ਅਤੇ ਜਿਸਦਾ ਦੂਰਲਾ ਸਿਰਾ ਪਿਛਲਾ IP ਉਮੀਦ ਕਰਦਾ ਹੈ ਉਹ ਕਨੈਕਸ਼ਨ Azure ਕਿੰਨਾ ਵੀ ਸਿਹਤਮੰਦ ਦਿਸੇ ਹੇਠਾਂ ਰਹਿੰਦਾ ਹੈ। ਵਿੰਡੋ ਤੋਂ ਪਹਿਲਾਂ DNS TTL ਘਟਾਓ।

ਪੁਆਇੰਟ-ਟੂ-ਸਾਈਟ ਕਲਾਇੰਟਾਂ ਨੂੰ ਨਵੀਂ ਪ੍ਰੋਫ਼ਾਈਲ ਚਾਹੀਦੀ ਹੈ, ਕਿਉਂਕਿ ਡਾਊਨਲੋਡ ਕੀਤਾ ਪੈਕੇਜ ਐਂਡਪੁਆਇੰਟ ਰੱਖਦਾ ਹੈ। ਗੇਟਵੇ ਅੱਗੇ ਕਸਟਮ DNS ਨਾਮ ਹੋਵੇ ਤਾਂ ਮੁੜ ਵੰਡ ਬਚਦੀ ਹੈ: ਨਾਮ ਰੱਖੋ, ਰਿਕਾਰਡ ਬਦਲੋ।

ਗੇਟਵੇ ਨੂੰ ਦੂਜੀ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਵਿੱਚ ਭੇਜਣਾ

ਸਰੋਤ ਭੇਜਣਾ ਇੱਕ ਸਮੂਹ ਭੇਜਦਾ ਹੈ, ਅਤੇ ਗੇਟਵੇ ਇਕੱਲਾ ਉਸਦਾ ਸਭ ਤੋਂ ਘੱਟ ਲਾਭਦਾਇਕ ਮੈਂਬਰ ਹੈ। ਵਰਚੁਅਲ ਨੈੱਟਵਰਕ, ਜਨਤਕ IP ਸਰੋਤ, ਸਥਾਨਕ ਨੈੱਟਵਰਕ ਗੇਟਵੇ ਅਤੇ ਕਨੈਕਸ਼ਨ ਇਕੱਠੇ ਸਫ਼ਰ ਕਰਦੇ ਹਨ ਕਿਉਂਕਿ ਹਰ ਇੱਕ ਦੂਜੇ ਦਾ ਹਵਾਲਾ ਰੱਖਦਾ ਹੈ। ਟਾਰਗਿਟ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਉਸੇ ਟੈਨੈਂਟ ਵਿੱਚ ਹੋਣੀ ਚਾਹੀਦੀ ਹੈ, Microsoft.Network ਉੱਥੇ ਰਜਿਸਟਰ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ, ਅਤੇ ਦੋਵੇਂ ਪਾਸੇ ਲਿਖਣ ਦੀ ਪਹੁੰਚ ਚਾਹੀਦੀ ਹੈ।

ਕੁਝ ਵੀ ਬਦਲਣ ਤੋਂ ਪਹਿਲਾਂ ਵੈਰੀਫਿਕੇਸ਼ਨ ਚੱਲਦਾ ਹੈ, ਇਸ ਲਈ ਰੱਦ ਕੀਤਾ ਭੇਜਣਾ ਸਰੋਤਾਂ ਨੂੰ ਥਾਂ ਸਿਰ ਛੱਡ ਦਿੰਦਾ ਹੈ। ਇਸੇ ਲਈ ਦੁਬਾਰਾ ਬਣਾਉਣ ਤੋਂ ਪਹਿਲਾਂ ਭੇਜਣਾ ਇੱਕ ਕੋਸ਼ਿਸ਼ ਦੇ ਯੋਗ ਹੈ: ਸਫਲ ਭੇਜਣਾ ਜਨਤਕ IP ਨਾਲ ਲੈ ਜਾਂਦਾ ਹੈ, ਜਿਸ ਨਾਲ ਸਾਥੀ ਅਤੇ ਇਜਾਜ਼ਤ ਸੂਚੀਆਂ ਕੰਮ ਕਰਦੀਆਂ ਰਹਿੰਦੀਆਂ ਹਨ, ਜਦਕਿ ਦੁਬਾਰਾ ਬਣਿਆ ਗੇਟਵੇ ਉਹੀ ਪਤਾ ਘੱਟ ਹੀ ਮੋੜਦਾ ਹੈ।

az resource move --destination-group rg-hub `
  --destination-subscription-id 00000000-0000-0000-0000-000000000000 `
  --ids /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-hub/providers/Microsoft.Network/virtualNetworkGateways/gw-hub

ਵੈਰੀਫਿਕੇਸ਼ਨ ਅਸਫਲਤਾ ਨੂੰ ਦੁਹਰਾਉਣ ਦੀ ਥਾਂ ਪੜ੍ਹੋ। ਆਮ ਕਾਰਨ ਪਿੱਛੇ ਛੱਡੀ ਨਿਰਭਰਤਾ, ਨਾ ਭੇਜਣਯੋਗ ਸਰੋਤ ਕਿਸਮ, ਜਾਂ ਕਿਸੇ ਸਰੋਤ ਸਮੂਹ ਉੱਤੇ ਤਾਲਾ ਹਨ। ਜੇ ਭੇਜਣਾ ਅਸੰਭਵ ਹੈ, ਟਾਰਗਿਟ ਵਿੱਚ ਦੁਬਾਰਾ ਬਣਾਓ ਅਤੇ ਬਦਲੋ: ਟੈਸਟ ਸਬਨੈੱਟ ਤੋਂ ਰੂਟਿੰਗ ਅਤੇ ਪ੍ਰਮਾਣਿਕਤਾ ਦੀ ਪੁਸ਼ਟੀ ਕਰੋ, ਪੁਰਾਣੇ ਕਨੈਕਸ਼ਨ ਮਿਟਾਉਣ ਦੀ ਥਾਂ ਰੋਕੋ, ਫਿਰ ਪੁਰਾਣਾ ਰਾਹ ਅਗਲੀ ਵਿੰਡੋ ਵਿੱਚ ਹਟਾਓ।

ਜਦੋਂ ਗੇਟਵੇ ਗੁੰਮ ਜਾਪੇ, ਸੰਦਰਭ ਜਾਂਚੋ

ਨਹੀਂ ਮਿਲਿਆ ਤਰੁੱਟੀ ਆਮ ਤੌਰ 'ਤੇ ਦਾਇਰੇ ਦੀ ਤਰੁੱਟੀ ਹੈ। ਕਈ ਸਬਸਕ੍ਰਿਪਸ਼ਨਾਂ ਵਾਲਾ ਖਾਤਾ cmdlet ਨੂੰ ਗਲਤ ਵੱਲ ਭੇਜਦਾ ਹੈ, ਅਤੇ ਸੁਨੇਹਾ ਸਰੋਤ ਨੂੰ ਦੋਸ਼ ਦਿੰਦਾ ਹੈ। ਇਸਦੀ ਥਾਂ ਪੂਰੀ ਸਰੋਤ ID ਨਾਲ ਚੀਜ਼ ਲੱਭੋ: ID ਆਪਣੀ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਰੱਖਦੀ ਹੈ, ਇਸ ਲਈ ਜੇ ਇਹ ਹੱਲ ਹੋਵੇ ਤਾਂ ਕੁਝ ਗੁੰਮ ਨਹੀਂ ਅਤੇ ਤੁਹਾਡਾ ਡਿਫ਼ਾਲਟ ਸੰਦਰਭ ਗਲਤ ਹੈ।

ਦੋ ਹੋਰ ਬੇਮੇਲ ਇਸੇ ਤਰ੍ਹਾਂ ਪੜ੍ਹੇ ਜਾਂਦੇ ਹਨ। ਵਪਾਰਕ ਕਲਾਊਡ ਗੇਟਵੇ ਸਰਕਾਰੀ ਜਾਂ ਚੀਨ ਵਾਤਾਵਰਣ ਵੱਲ ਸੈਸ਼ਨ ਵਿੱਚ ਨਹੀਂ ਹੁੰਦਾ, ਅਤੇ ਪੁਰਾਣੇ ਮਾਡਿਊਲ ਸੰਸਕਰਣ API ਵੱਲੋਂ ਪਹਿਲਾਂ ਹੀ ਮੋੜੇ ਜਾਂਦੇ ਸਰੋਤ ਆਕਾਰ ਛੱਡ ਦਿੰਦੇ ਹਨ। ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਪਿੰਨ ਕਰੋ, ਵਾਤਾਵਰਣ ਮਿਲਾਓ, ਫਿਰ ਕੇਸ ਖੋਲ੍ਹੋ।

Set-AzContext -SubscriptionId 11111111-1111-1111-1111-111111111111
Get-AzResource -ResourceId /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/rg-hub/providers/Microsoft.Network/virtualNetworkGateways/gw-hub

ਸਫ਼ਾਈ ਤੋਂ ਪਹਿਲਾਂ ਦੋਵੇਂ ਸਿਰਿਆਂ ਤੋਂ ਜਾਂਚੋ

ਕਨੈਕਟਿਡ ਇੱਕ ਹਾਲਤ ਹੈ, ਸਬੂਤ ਨਹੀਂ। ਹਰ ਕਨੈਕਸ਼ਨ ਲਈ ਟਨਲ ਸਥਿਤੀ, ਗਤੀਸ਼ੀਲ ਰੂਟਿੰਗ ਹੋਵੇ ਤਾਂ BGP ਪੀਅਰ ਸਥਿਤੀ, ਅਤੇ ਵਰਕਲੋਡ ਸਬਨੈੱਟ ਉੱਤੇ ਪ੍ਰਭਾਵੀ ਰੂਟ ਜਾਂਚੋ। ਫਿਰ ਟਨਲ ਉੱਤੇ ਨਿਰਭਰ ਐਪਲੀਕੇਸ਼ਨ ਰਾਹੀਂ ਇੱਕ ਸੱਚੀ ਬੇਨਤੀ ਭੇਜੋ। ਲੋੜੀਂਦਾ ਪ੍ਰੀਫਿਕਸ ਰੂਟ ਸਾਰਣੀ ਵਿੱਚ ਨਾ ਹੋਣ ਦੇ ਬਾਵਜੂਦ ਕਨੈਕਸ਼ਨ ਆਪਣੇ ਆਪ ਨੂੰ ਕਨੈਕਟਿਡ ਦੱਸ ਸਕਦਾ ਹੈ।

Get-AzVirtualNetworkGatewayBGPPeerStatus -VirtualNetworkGatewayName gw-hub -ResourceGroupName rg-hub
Get-AzEffectiveRouteTable -NetworkInterfaceName nic-app -ResourceGroupName rg-app

ਪੁਰਾਣਾ ਜਨਤਕ IP ਮਿਟਾਉਣ ਦੀ ਥਾਂ ਫਾਲਬੈਕ ਵਿੰਡੋ ਬੰਦ ਹੋਣ ਤੱਕ ਵੱਖ ਰੱਖੋ, ਅਤੇ ਸਾਥੀ ਤੇ ਫਾਇਰਵਾਲ ਸੋਧਾਂ ਕ੍ਰਮ ਵਿੱਚ ਵਾਪਸ ਕਰਨ ਯੋਗ ਲਿਖੋ।

  • ਸੰਦਰਭ ਗੇਟਵੇ ਦੀ ਮਾਲਕ ਸਬਸਕ੍ਰਿਪਸ਼ਨ ਉੱਤੇ ਪਿੰਨ ਕੀਤਾ
  • ਪੁਰਾਣਾ ਜਨਤਕ IP ਰੱਖਿਆ, ਉਸਦੀਆਂ ਨਿਰਭਰਤਾਵਾਂ ਲਿਖੀਆਂ
  • ਹਰ ਕਨੈਕਸ਼ਨ ਹਰਾ ਅਤੇ ਉਸ ਰਾਹੀਂ ਇੱਕ ਸੱਚੀ ਬੇਨਤੀ
  • ਪੁਆਇੰਟ-ਟੂ-ਸਾਈਟ ਵਰਤੋਂਕਾਰ ਨਵੀਂ ਪ੍ਰੋਫ਼ਾਈਲ ਉੱਤੇ ਭੇਜੇ
  • DNS ਰਿਕਾਰਡ ਬਦਲਿਆ ਅਤੇ ਉਸਦਾ ਪਿਛਲਾ ਮੁੱਲ ਦਰਜ ਹੋਇਆ

ਸੰਬੰਧਿਤ ਲੇਖ